利用MariaDB Auditing Plugin实现社区版MySQL的审计功能

关于MySQL的审计功能,有三个主流的选项:

1、MySQL Enterprise Audit Plugin:仅供MySQL 企业版使用的插件,收费

2、Percona Audit Log Plugin:仅供Percona Server使用的插件,免费

3、MariaDB Audit Plugin:支持MariaDB、MySQL、Percona Server,建议使用1.2以上版本


下面以MariaDB Audit Plugin为例,实现官方社区版MySQL的审计功能

首先需要下载MariaDB的完整安装包,单独的plugin官网已不再提供

将 mariadb-10.2.8-linux-glibc_214-x86_64/lib/plugin/server_audit.so 复制到MySQL的plugin目录下,并修改权限,与其他plugin权限一致

# chown root:mysql server_audit.so 
# chmod 755 server_audit.so


在登录MySQL安装插件前,先确认系统glibc版本是否匹配编译server_audit.so的glibc版本

[root@237_21 plugin]# strings /lib64/libc.so.6 |grep GLIBC_
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
而MariaDB多使用2.14版glibc进行编译,以下简单记录下glibc的升级过程
# wget -c http://ftp.gnu.org/gnu/libc/glibc-2.14.tar.gz
# tar zxvf glibc-2.14.tar.gz
# cd glibc-2.14
# mkdir build
# cd build
# ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
# make && make install
# LD_PRELOAD=/lib/libc-2.12.so yum -y install glibc-devel
# strings libc.so | grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_PRIVATE


安装插件
mysql> install plugin server_audit soname 'server_audit.so';
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like '%server_audit%';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| server_audit_events           |                       |
| server_audit_excl_users       |                       |
| server_audit_file_path        | server_audit.log      |
| server_audit_file_rotate_now  | OFF                   |
| server_audit_file_rotate_size | 1000000               |
| server_audit_file_rotations   | 9                     |
| server_audit_incl_users       |                       |
| server_audit_loc_info         |                       |
| server_audit_logging          | OFF                   |
| server_audit_mode             | 1                     |
| server_audit_output_type      | file                  |
| server_audit_query_log_limit  | 1024                  |
| server_audit_syslog_facility  | LOG_USER              |
| server_audit_syslog_ident     | mysql-server_auditing |
| server_audit_syslog_info      |                       |
| server_audit_syslog_priority  | LOG_INFO              |
+-------------------------------+-----------------------+
16 rows in set (0.01 sec)

编辑my.cnf,添加审计规则,关键参数如下:

server_audit_logging:审计功能的开关

server_audit_file_path:审计日志路径,默认存于数据目录下

server_audit_events:指定记录到日志的event类型,Type如下:

CONNECT、QUERY、TABLE、(1.2版本起新增QUERY_DDL,QUERY_DML,1.3版本起新增QUERY_DCL)

server_audit_incl_users:该列表中用户的行为将记录日志,但Type:CONNECT的event仍然会记录不受该参数影响。优先级较server_audit_excl_users高(同一个用户在incl和excl中都存在,以incl为准)

server_audit_excl_users:该列表中用户的行为将不记录日志,但Type:CONNECT的event仍然会记录不受该参数影响

以下为日志轮转(循环复用)设置,需设置server_audit_output_type:FILE-mode

server_audit_file_routations:轮转日志总数,当设为0表示审计日志不轮转。默认值为9

server_audit_file_rotate_size:限制单个轮转审计日志大小,超出该限值后自动轮转

server_audit_file_rotate_now:强制轮转一次

注:server_audit_output_type:SYSLOG-mode相关参数使用较少,不作介绍,参数信息可见文末参考文档


对上述参数简单测试一下:user1、user2、user3(不存在的用户)分别登录数据库,执行QUERY(show databases;),退出数据库

1、my.cnf配置:用户user1的行为记录审计日志,用户user2的行为不记录审计日志:

plugin_dir=/usr/local/mysql3306/lib/plugin
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so;server_audit=server_audit.so"
########audit plugin########
server_audit_logging = 1
server_audit_events = 'CONNECT,QUERY,TABLE'
server_audit_incl_users = 'user1'
server_audit_excl_users = 'user2'

使用user1、user2分别进行登录操作,查看server_audit.log输出情况:

20170915 10:00:53,237_21,user1,127.0.0.1,4,0,CONNECT,,,0
20170915 10:00:53,237_21,user1,127.0.0.1,4,74,QUERY,,'select @@version_comment limit 1',0
20170915 10:01:03,237_21,user1,127.0.0.1,4,75,QUERY,,'show databases',0
20170915 10:01:21,237_21,user1,127.0.0.1,4,0,DISCONNECT,,,0
20170915 10:01:26,237_21,user2,127.0.0.1,5,0,CONNECT,,,0
20170915 10:01:26,237_21,user2,127.0.0.1,5,77,QUERY,,'select @@version_comment limit 1',0
20170915 10:01:31,237_21,user2,127.0.0.1,5,78,QUERY,,'show databases',0
20170915 10:01:33,237_21,user2,127.0.0.1,5,0,DISCONNECT,,,0
20170915 10:01:42,237_21,user3,127.0.0.1,6,0,FAILED_CONNECT,,,1045
20170915 10:01:42,237_21,user3,127.0.0.1,6,0,DISCONNECT,,,0 

user1、user2除了CONNECT信息之外,还记录QUERY信息,excl_参数设置无效。


2、my.cnf配置:用户user2的行为设置为不记录审计日志,server_audit_incl_users不作设置:

server_audit_logging = 1
server_audit_events = 'CONNECT,QUERY,TABLE'
#server_audit_incl_users = 'user1'
server_audit_excl_users = 'user2'

使用user1、user2分别进行登录操作,查看server_audit.log输出情况:

20170915 10:47:59,237_21,user1,127.0.0.1,1,0,CONNECT,,,0
20170915 10:47:59,237_21,user1,127.0.0.1,1,1,QUERY,,'select @@version_comment limit 1',0
20170915 10:48:14,237_21,user1,127.0.0.1,1,2,QUERY,,'show databases',0
20170915 10:48:16,237_21,user1,127.0.0.1,1,0,DISCONNECT,,,0
20170915 10:48:34,237_21,user2,127.0.0.1,2,0,CONNECT,,,0
20170915 10:48:40,237_21,user2,127.0.0.1,2,0,DISCONNECT,,,0
20170915 10:48:46,237_21,user3,127.0.0.1,3,0,FAILED_CONNECT,,,1045
20170915 10:48:46,237_21,user3,127.0.0.1,3,0,DISCONNECT,,,0
user1记录CONNECT、QUERY信息,user2仅记录CONNECT,user3登录失败的信息也被记录


3、user1记录审计日志,excl_参数不作设置

server_audit_logging = 1
server_audit_events = 'CONNECT,QUERY,TABLE'
server_audit_incl_users = 'user1'
#server_audit_excl_users = 'user2'
使用user1、user2分别进行登录操作,查看server_audit.log输出情况:

20170915 10:54:24,237_21,user1,127.0.0.1,1,0,CONNECT,,,0
20170915 10:54:24,237_21,user1,127.0.0.1,1,1,QUERY,,'select @@version_comment limit 1',0
20170915 10:54:29,237_21,user1,127.0.0.1,1,2,QUERY,,'show databases',0
20170915 10:54:31,237_21,user1,127.0.0.1,1,0,DISCONNECT,,,0
20170915 10:54:36,237_21,user2,127.0.0.1,2,0,CONNECT,,,0
20170915 10:54:44,237_21,user2,127.0.0.1,2,0,DISCONNECT,,,0
20170915 10:54:47,237_21,user3,127.0.0.1,3,0,FAILED_CONNECT,,,1045
20170915 10:54:47,237_21,user3,127.0.0.1,3,0,DISCONNECT,,,0

user1记录CONNECT、QUERY信息,user2仅记录CONNECT,user3登录失败的信息也被记录


过滤参数效果总结如下:
1、若同时设置server_audit_incl_users和server_audit_excl_users,所有用户的审计都会被记录
2、若仅设置:server_audit_excl_users时,excl_users将仅记录CONNECT日志,其余用户记录server_audit_events规定的日志类型
3、若仅设置:server_audit_incl_users时,incl_users将记录server_audit_events规定的日志类型,其余用户仅记录CONNECT日志
4、不存在的用户登录数据库时也会记录CONNECT日志


参考文档:

1、MySQL Auditing with MariaDB Auditing Plugin

https://www.percona.com/blog/2016/02/15/mysql-mariadb-with-mariadb-auditing-plugin/

2、MariaDB Audit Plugin - Log Settings

https://mariadb.com/kb/en/library/mariadb-audit-plugin-log-settings/

3、MariaDB Audit Plugin - System Variables

https://mariadb.com/kb/en/library/mariadb-audit-plugin-system-variables/




猜你喜欢

转载自blog.csdn.net/leonpenn/article/details/77980503