前言
今天日志审计时发现我们的日志记录不合规,于是上午搜了一下关于MySQL启用审计插件的配置,
对于MySQL Percona MariaDB三家都有自己的审计插件,但是呢,MySQL的审计插件是只有企业版才有的,同时也有很多第三方的的MySQL的审计插件,Percona和MariaDB都是GPL的审计插件,此处以 MariaDB Audit Plugin 为例
安装
下载 MariaDB
wget https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-10.4.12/bintar-linux-x86_64/mariadb-10.4.12-linux-x86_64.tar.gz --no-check-certificate
解压文件后找到server_audit.so
插件,将该插件拷贝出来备用(拷贝到mysql的plugin目录中)
安装配置
install plugin server_audit SONAME "server_audit.so";
SET global server_audit_events='QUERY_DDL,QUERY_DML_NO_SELECT,QUERY_DCL';
SET global server_audit_file_path='/web/soft/mysql-5.6.44/logs/audit.log';
SET global server_audit_file_rotate_size=1073741824;
SET global server_audit_file_rotations=100;
SET GLOBAL server_audit_logging=ON;
通过 show variables like '%audit%';
可查看当前参数
mysql> show variables like '%audit%';
+-------------------------------+---------------------------------------+
| Variable_name | Value |
+-------------------------------+---------------------------------------+
| server_audit_events | QUERY_DDL,QUERY_DML_NO_SELECT |
| server_audit_excl_users | |
| server_audit_file_path | /web/soft/mysql-5.6.44/logs/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 | ON |
| 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 |
+-------------------------------+---------------------------------------+
变量解释
server_audit_events :指定记录事件的类型,用逗号分隔多个值(connect,query,table),如果开启了查询缓存(query cache),查询直接从缓存返回数据,将不会有table的记录;
server_audit_output_type : file (输出日志和syslog分离,则需要设置为file。也可以设置为syslog,表示输出日志到syslog中);
server_audit_file_path : server_audit.log(server_audit.log的默认路径在mysql的数据目录),可以设置成其他路径;
server_audit_file_rotate_size : 1073741824(设置server_audit.log大小达到限制后进行轮替);
server_audit_file_rotations : 100 (日志文件数量限制为9个);
server_audit_incl_users : 需要进行行为审计的用户;
server_audit_excl_users : 不需要进行行为审计的用户(connect不受该设置影响);
server_audit_file_rotate_now : 设置该值为on表示强制进行日志轮替;
server_audit_syslog_ident : mysql-server_auditing(设置ident,作为syslog记录的一部分);
server_audit_syslog_info : 指定字符串加入到syslog的输出中;
添加MySQL配置
修改/etc/mysql/my.cnf文件,在文件末尾添加如下内容,防止重启失效
[mysqld]
log_output=FILE
server_audit=FORCE_PLUS_PERMANENT
server_audit_file_path=/web/soft/mysql-5.6.44/logs/audit.log
server_audit_events = 'QUERY_DDL,QUERY_DML_NO_SELECT,QUERY_DCL'
server_audit_logging=ON
server_audit_file_rotate_size=1G
server_audit_file_rotations=100
server_audit_syslog_priority=LOG_INFO
重新启动MySQL
service mysql restart
测试
然后操作mysql 即可在/web/soft/mysql-5.7.29/logs/audit.log
中看到日志信息
20200601 17:32:11,Wechat-MySQL-Master,amtdb,10.255.50.106,4,3,QUERY,wechat,'drop table wct_group_r_user_bak',1051
20200601 17:32:21,Wechat-MySQL-Master,amtdb,10.255.50.106,4,23,QUERY,wechat,'drop table wct_group_r_user_bak',1051
20200601 17:32:34,Wechat-MySQL-Master,amtdb,10.255.50.106,4,31,QUERY,wechat,'drop table cms_live_channel_bak',0
20200601 17:32:44,Wechat-MySQL-Master,amtdb,10.255.50.106,4,35,QUERY,wechat,'drop table cms_live_look_back_bak',0
20200601 17:33:34,Wechat-MySQL-Master,amtdb,10.255.50.106,4,65,QUERY,wechat,'truncate table cms_content',0
注意
开启插件会对数据库性能有影响,具体影响数值未测试,在使用插件时需权衡
附录
所有操作类型
类型名称 | |
---|---|
CONNECT | 连接,断开连接和失败的连接-包括错误代码 |
QUERY | 执行的查询及其结果为纯文本格式,包括由于语法或权限错误而导致的查询失败 |
TABLE | 受查询执行影响的表 |
QUERY_DDL | 同QUERY ,但仅过滤DDL类型的查询(CREATE ,ALTER ,DROP ,RENAME 和TRUNCATE 语句-除了CREATE/DROP [PROCEDURE / FUNCTION / USER] 和RENAME USER (他们不是DDL) |
QUERY_DML | 同QUERY ,但仅过滤DML类型的查询(DO ,CALL ,LOAD DATA/XML ,DELETE ,INSERT ,SELECT ,UPDATE ,HANDLER 和REPLACE 语句) |
QUERY_DML_NO_SELECT | 与相同QUERY_DML ,但不记录SELECT查询。(因为版本1.4.4)( , ,DO ,CALL ,,LOAD DATA/XML , 和语句)DELETE``INSERT``UPDATE``HANDLER``REPLACE |
QUERY_DCL | 同QUERY ,但仅过滤DCL型查询(CREATE USER ,DROP USER ,RENAME USER ,GRANT ,REVOKE 和SET PASSWORD 语句) |