MySQL审计插件使用和对比

MySQL审计插件使用和对比

   数据库审计是数据库安全中很重要的一个环节,说到审计,有些上市公司内部还会根据塞班斯法案,进行404审计等等。

  而最基本的审计还是需要的,有些同学可能感觉审计会有些鸡肋,其实非也,开审计的功能势必会影响性能,如果不开又会有遗漏,这种防患于未然,把问题都扼杀在摇篮之中,通过这种规范和制度来做最后一道防线。

   MySQL中也需要审计,不说大的方向,就说和我们工作更贴近的,比如某一个业务在某个时间点出现了异常,因为异常操作(比如DDL)导致系统出现了严重的问题,这个时候如果要查看这个问题的具体情况,谁登陆了系统,什么时候登陆的,做了什么操作等等。通过审计的方式就很奏效。所以尽管说社区版是没有审计插件的,但是我们还是需要考虑审计,只是实现方式不同而已。

   说到数据库审计的方案,MySQL社区版是没有审计插件的,而在商业版中有,是需要单独收取licence费用的,对于公司的很多业务而言,还是会一些考虑,所以我们更倾向于看看还有哪些方案可以实现。

   大体来说除了商业版的审计插件外,还有三类审计插件可以考虑:

Percona自带的审计插件audit log,

MariaDB的审计插件server audit,

Mcafee的审计插件,已经在github上开源。

因为我们规划软件版本的时候是选择Percona分支,并且Percona自带了审计插件,所以我们就毫不犹豫的先选定了这个审计插件。但是实际的测试来看,和我们的预期还是有一定的差距。

MariaDB的方案有很多朋友推荐我试试,在Percona测试之后,看了下MariaDB的方案,测试效果非常不错,有个顾虑就是MySQL 5.7是否会和这个插件有兼容性和冲突,官方给出了说明,使用小版本5和大版本10的插件都可以,如此一来,有了功能,有了用户基础,所以就更倾向于这个方案。

还有McAfee的审计插件,McAfee是全球最大的专业安全公司,它的审计插件我看了下使用情况,在MySQL 5.5,5.6中使用相对比较多,我们规划的版本是MySQL 5.7,所以权衡下来不是太倾向这个插件。

我的测试就基于Percona和MariaDB的审计插件

Percona的审计插件安装可以使用如下的命令:

install plugin audit_log soname 'audit_log.so';

查看审计插件的情况可以直接通过关键字audit来看。

show global variables like 'audit%'; 

需要设置的参数为:

其中参数audit_log_policy是关键,参数选项有ALL(记录所有),LOGIN(记录登录登出信息),QUERY(只记录查询事件),NONE(不记录任何事件)

如果选择类型为ALL,运行命令show processlist,审计日志的内容大体如下:

{"audit_record":{"name":"Query","record":"20_2017-10-20T07:40:38","timestamp":"2017-10-20T07:42:13 UTC","command_class":"show_processlist","connection_id":"2","status":0,"sqltext":"show processlist","user":"root[root] @ localhost []","host":"localhost","os_user":"","ip":"","db":""}}

记录的信息还是很全的,哪怕你敲错了命令,也会在审计日志中记录下来。

我使用sysbench压测,开了600线程,压测5分钟。

   sysbench /home/xxx/sysbench-master/src/lua/oltp_read_write.lua --mysql-user=root --mysql-port=24402 --mysql-socket=/data/mysql_24402/tmp/mysql.sock --mysql-host=localhost --mysql-db=test --tables=10 --table-size=10000000 --threads=600  --report-interval=5  --max-time=300 run

 我又对比测试了MariaDB的方案。把so文件直接拷贝到Percona的plugin目录下即可。

安装插件。

INSTALL PLUGIN server_audit SONAME 'server_audit.so';

这个参数很有特点server_audit_events可以指定很细粒度的审计,比如DDL(create,alter这种语句),DCL(grant语句),DML等都可以指定范围。

登录到MySQL的审计日志如下:

20171020 17:22:00,tk-dba-mysql10-202,root,localhost,5,0,CONNECT,,,0

创建一个表test,SQL为:create table test_audit(id int primary key);

20171020 17:22:40,tk-dba-mysql0-202,root,localhost,5,18,QUERY,test,'create table test_audit(id int primary key)',0

   同样的压测,大概有600M的日志,相比少了很多。

   如果从性能的角度来说,MariaDB的插件对于性能的损耗最低。还是推荐使用。