目录

 

1  xxx基于数据库审计基本信息

2  场景描述

3  使用范围规则

4  角色与职责

5  审计系统环境的部署

5.1 MySQL数据库部署

5.2 Replicate 部署

5.3 半同步复制配置

5.4 备份策略

 6 审计操作

6.1数据库层面审计操作

   6.2 general_log 日志审计操作

6.3 历史操作查询及安全

7  结论

 

 

马耳他基于数据库审计基本信息

 

       基本信息

数据库类型

MySQL数据库

涉及业务库

    马耳他online数据库

审计规则

    通过Slave节点的general日志

保留时间

     2年

操作执行人

 

撰写时间

2018.1.18

   注: 审计粒度一般,只能查询单位时间下得SQL操作,及数据完整性。

 

二: 场景描述

本文档的目的,源于对马耳他Online业务数据库得日常操作,数据的完整性以及数据安全的审计措施,因时区及网络资源等因素,此用于MySQL的审计环境不建议放在国内。同时环境在审计粒度上,仅限于数据库历史的日常操作、日常修改、历史数据的查询。

 

三:使用范围规则

本文档操作及指引,仅限于按要求部署的MySQL数据库服务器,同时在此审计粒度上,也适用于公司其他业务的MySQL数据库服务器。

系统的设计、维护、升级、演练等,整个实施过程中必须遵循此文档规范。

本系统所有账号、密码、权限按需分配,严格控制。设为局域网环境,禁止连

接internet 网络。

    系统及版本要求,参考马耳他现有资源部署基础环境。磁盘容量应满足数据备

份(保留2-3年数据容量) 及高可用性(raid5 或raid10)要求。

 

四:角色与职责

角色

职 责

操作需求

DBA



审计人员

通过对Slave节点及general log日志的查询,分析历史操作信息。

审计需求

其他人员

Read_only 规则,仅查询。

按需分配

 

五: 审计系统环境的部署

5.1 MySQL数据库部署

   详见文档 《MySQL数据库安装文档》

 

5.2 Replicate 部署

1) 定义:

 Master : 主库(马耳他对外提供业务的节点)

 Slave1 : 中继节点(马耳他实时同步的备节点)

 Slave2 : 审计节点(此次需部署配置的节点)

 

 2) 审计Slave 基于实时同步Slave 节点,Replicate复制模式为

 Master ->Slave1->Slave2 模式,其目的最大化的减少线上Master性能消耗,             

 所有操作不涉及Master,只涉及中继节点slave1和 审计节点slave2.

 

 3) 中继节点主要参数:

     log_slave_updates=1

       log_bin=/路径

       binlog_format = row

 

 4) 审计节点主要参数:

  Server_id = xx

  Read_only = Ture

  Log_bin = /xxx/mydb-audit-bin.dbf

  binlog_format = row

  sync_binlog=1

  expire_logs_days= Time(Day)

  autocommit = 1

 

 5) Replicate 配置:

 MYSQL> CHANGE MASTER TO MASTER_HOST=‘xxx’,MASTER_PORT= ,MASTER_USER=’xx’,MASTER_PASSWORD=’xx’,MASTER_LOG_POS= ,MASTER_LOG_FILE=‘xx’;

 MYSQL>START SLAVE;

 MYSQL>SHOW SLAVE STATUS\G;

5.3 半同步复制配置

  使用半同步复制的目的,使数据能实时同步。同时需满足条件。

  1),MySQL 数据库 必须在5.5及以上的版本。

  2),变量have_dynamic_loading 为 YES

  3), Replicate 同步已经存在

  首先加载插件:

 中继节点:

  MYSQL> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

  MYSQL> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;

  查看是否成功:

  MYSQL> show plugins;

      MYSQL> SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE ‘%semi%’;

      启动半同步复制:

      MYSQL> SET GLOBAL rpl_semi_sync_master_enabled =1;

      MYSQL> SET GLOBAL rpl_semi_sync_slave_enabled=1;

      MYSQL> STOP SLAVE IO_THREAD;  --slave2

      MYSQL> START SLAVE IO_THREAD; --slave2

5.4 部署要求

  除了每天定时的备份外,slave2 节点的二进制文件需定时定期备份。

  Slave2 节点 以read_only 模式开启,所有的数据操作只能读,而不能修改。控制权限管理包含系统登陆及数据库登陆。

  Mysql数据库root 用户仅限localhost 登陆。

MYSQL> set password for password(“new password”);

  创建只读用户,账号密码符合安全规则,并配置连接白名单策略。

MYSQL> CREATE USER AUDIT@’source_ip’ identified by ‘password’;

MYSQL> GRANT USAGE on *.* to AUDIT@’source_ip’;

MYSQL> GRANT SELECT ON *.* TO AUDIT@’source_ip’;

  数据库相应目录,权限管理。

Chown –R mysql:mysql  /(my.cnf,data,logfile)

Chattr +i my.cnf

5.5  数据备份要求

    审计节点SLAVE2 ,数据库按数据容量,采用全备+每天增量备份方式备份数

据。 通过备份工具Xtrabackup 备份及每天备份binlog日志。

    备份策略

    每周六,做一全备份。

    周一 – 周五,周日,每天增量备份。

    备份集保留周期为 1年

    恢复策略

    全恢复 = 全备份集+ 增量备份集

    时间节点恢复 = 全备份集+增量备份集+binlog日志。

 

六:审计操作

 

    通过SQL的日常操作,符合白名单策略的用户,有对数据库的查询权限。

6.2 general_log 日志审计操作

    这里以实际实例展示,MySQL数据库必须开启binlog 日志,同时推荐使用

row 行模式开启。此模拟环境MySQL 版本为5.7.18,与马耳他环境一致。

   

   如果考虑性能问题,general_log 一般推荐开启,因其记录详细的日志,消耗

系统5-10% 的性能。可以使用binlog 查询(binlog 记录信息粒度相对general

因此,这里审计slave2节点开启general 日志。

  MYSQL > set global general_log=on;

  MYSQL > flush privileges;

  MYSQL > show variables like ‘general%’;

  示例展示:  

  --开启general log

 

 --新建数据量audit ,并创建用户为audit 的用户 

     ---audit 通过异地登陆

 

--创建测试表 audit_test,并插入4条数据:

 

--- 通过general log 审计

 

 

 通过日志,可以很清楚的看见,异地登陆信息,操作信息。

6.3  历史操作查询及安全

      1) 操作系统(linux环境),修改shadow,passwd,gshadow文件不可改变位  

    Chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow

  2) MySQL数据库必须非root权限操作(这里系统也使用mysql).

  3) 修改当前用户rm 命令防止误删除操作。

    这里推荐使用safe-rm 开源原件,替换系统原rm 命令,

wget -c https://launchpadlibrarian.net/188958703/safe-rm-0.12.tar.gz

    tar –xvf  safe-rm-0.12.tar.gz  -C /usr/local/

     cd safe-rm/

     cp  safe-rm  /usr/local/bin/rm  -f

     chown root:root /usr/local/bin/rm

     vi /etc/profile

--- add

          PATH=/usr/local/bin:/bin:/usr/bin:$PATH

source /etc/profile

 

设置保护名单

vim /etc/safe-rm.conf

--- add

/

/home/mysql

/xxxxx/my.cnf

/usr/local/mysql

/etc

     /etc/safe-rm.conf

     示例展示:

备注: 良好的操作工作习惯,非常重要,不过于依赖工具。

 

  系统级别信息记录

通过在/etc/profile 新增一下代码,可有效记录登陆系统的操作记录,同时把此文件及历史记录信息加入safe-rm 保护名单中。

    --- add /etc/profile

### add ###

#PS1="`whoami`@`hostname`:"'[$PWD]'

PS1="[\u@\h \W]"#

history

USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`

if [ "$USER_IP" = "" ]

then

USER_IP=`hostname`

fi

if [ ! -d /tmp/history ]

then

mkdir /tmp/history

chmod 777 /tmp/history

fi

if [ ! -d /tmp/history/${LOGNAME} ]

then

mkdir /tmp/history/${LOGNAME}

chmod 300 /tmp/history/${LOGNAME}

fi

export HISTSIZE=4096

DT=`date +"%Y%m%d_%H%M%S"`

export HISTFILE="/tmp/history/${LOGNAME}/${USER_IP} history.$DT"

chmod 600 /tmp/history/${LOGNAME}/*history* 2>/dev/null

  

    source /etc/profile

示例展示:

 

七: 总结

    因MySQL特有的逻辑设计,除DB层面审计外,还对系统层面做了粗粒度

的策略管理,这样能更好的规避误操作。

        通过对slave2审计节点的部署及策略配置,除基于MySQL数据库generallog日志审计粒度外,关于操作系统的用户登陆,用户操作,文件修改,历史查询等方面也做了策略配置。