Team有一个需求,因为登录数据库的人过多,要把相应人员执行了何种SQL语句监控起来。

经过研究,发现可用的方法主要有三种:

1)用Macfee的审计插件mysql-audit-plugin;

2)用MariaDB的审计插件server_audit;

3)用MySQL自带的日志记录功能。

1.Macfee的审计插件mysql-audit-plugin的特点:

1)第三方开源插件,源代码在github上,路径为https://github.com/mcafee/mysql-audit

2)比较好的支持Linux,Windows没有现成的库。

2.MariaDB的审计插件server_audit的特点:

1)Windows 和 Linux均支持,均是利用MariaDB的server_audit库;

2)MariaDB是和MySQL同源的开源软件,MySQL被Oracle收购以后独立运营;

3)不同的MySQL需要寻找不同的server_audit库。

3.MySQL自带的日志记录功能的特点:

1)MySQL自身功能;

2)日志文件和数据表操作同时进行,可以方便查询。

4.Macfee的审计插件mysql-audit-plugin的安装与使用:

1)下载MySQL对应插件,如audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip等版本;

2)解压该插件:unzip audit-plugin-mysql-5.7-1.1.4-725-linux-x86_64.zip

3)把动态库复制到MySQL的对应插件目录,如cp libaudit_plugin.so /usr/local/mysql/lib/plugin/;

4)修改该库的所有权和读写权限:

chown -R mysql.mysql libaudit_plugin.so chmod -R 755 libaudit_plugin.so

5)在配置文件中进行配置修改:

(1)在MySQL的配置文件my.cn的[mysqld]中加入 set global audit_json_file=1;

(2)用offest-extract.sh解决偏移量问题。

offest-extract.sh 下载路径:https://raw.github.com/mcafee/mysql-audit/master/offset-extract/offset-extract.sh
对该shell文件进行读写权限修改:chmod +x ./offset-extract.sh
sh offset-extract.sh /usr/local/bin/mysqld
获得偏移量,如:{"5.7.19","b4633eb887552a3bbb5db3a1eea76e48", 7800, 7848, 3624, 4776, 456, 360, 0, 32, 64, 160, 536, 7964, 4352, 3648, 3656, 3660, 6048, 2072, 8, 7032, 7072, 7056},
把对应偏移量写进配置文件my.cn里面,方法为:
audit_offsets=7800, 7848, 3624, 4776, 456, 360, 0, 32, 64, 160, 536, 7964, 4352, 3648, 3656, 3660, 6048, 2072, 8, 7032, 7072, 7056

6)登录mysql,执行SQL语句INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so'; 

如果显示成功即表示该插件安装成功。

7)重启后,可发现有一个日志审计文件mysql-audit.json,里面有JSON形式的日志文件,会记录用户名、密码和操作。

5.MariaDB的审计插件server_audit安装方法

1)下载mariadb并把server_audit.so放进MySQL的插件库目录,即类似 /usr/local/mysql/lib/plugin/的MySQL插件库目录;

2)注意不同的MySQL对应不同的MariaDB,可能库需要匹配;

3)在MYSQL的配置文件(Windows为my.ini,Linux为my.cn)里添加如下语句

server_audit_logging=ON
server_audit_events='query_dml,query_ddl'
server_audit_file_path =/data/mysql/auditlog/
server_audit_file_rotate_size=200000000
server_audit_file_rotations=200
server_audit_incl_users='root'

4)登录mysql执行如下语句:INSTALL PLUGIN server_audit SONAME 'server_audit.so';

5)重启后,发现server_audit_file_path下面有文件server_audit.log,文件会记载SQL操作和操作者。

6.MySQL自带的日志记录功能

1)在配置文件my.cn或my.ini里填写如下配置

general_log=1 #为1表示开启通用日志查询,值为0表示关闭通用日志查询

general_log_file=/var/log/mysql/general_sql.log #建议路径

log_output=FILE,TABLE#设置通用日志的输出格式为文件和表 (保证操作输出到文件和表,且文件切割不影响表)

2)重启后,可以查看对应的数据表

select * from mysql.general_log;

如argument为BLOB形式,可以运行如下语句:

select event_time, user_host, thread_id, server_id, command_type, convert(argument using utf8) from mysql.general_log;

3) 在日志下有general_log_file对应的输出为日志文件, mysql.general_log对应的表为表操作记录;

4)日志文件被清除,不会影响 mysql.general_log的操作记录, mysql.general_log的表操作记录清除也不会影响日志文件;

5) mysql.general_log不可被drop和delete,但可以被truncate,因此要禁止部分用户的truncate权限。