mysql 5.7 社区版需依赖mcafee audit插件实现审计,必须匹配小版本、显式启用audit_json_file、正确配置日志路径权限及selinux策略,并注意全局变量仅对新连接生效。

MySQL 5.7 社区版不带原生审计功能,必须靠第三方插件实现数据库级操作记录——McAfee libaudit_plugin.so 是目前最稳定、适配最广的选择,但装错版本或漏设关键变量会导致日志完全不生成。
确认 MySQL 5.7 具体小版本并下载匹配的 McAfee 插件
MySQL 5.7.x 对插件二进制兼容性极敏感,5.7.34 之后部分系统调用变更,旧版插件会加载失败或静默丢日志。
- 先查准确版本:
SELECT VERSION();,例如返回5.7.41,就必须用标有mysql57的 release(如 GitHub 上v1.1.12的audit-plugin-mysql-5.7-1.1.12-999-linux-x86_64.zip) - 别从已归档的 Bintray 下载——链接失效且包未更新;改用 GitHub Releases,认准 tag 名含
mysql57 - 解压后只取
lib/libaudit_plugin.so,不要用utils/offset-extract.sh——5.7.30+ 多数场景已无需手动提偏移量,强行运行反而可能写错配置
安装插件后必须显式启用 audit_json_file,否则日志为空
INSTALL PLUGIN AUDIT SONAME 'libaudit_plugin.so' 成功只是第一步。插件默认处于“加载但关闭”状态,SHOW PLUGINS 显示 ACTIVE ≠ 日志在写。
- 关键开关是:
SET GLOBAL audit_json_file = ON;(注意不是audit_json_log_file,后者是只读路径变量) - 如果只想记高危操作,可加过滤:
SET GLOBAL audit_record_cmds = 'insert,delete,update,drop,create,alter,grant'; - 强制记录登录行为(防绕过):
SET GLOBAL audit_force_record_logins = ON; - 这些变量必须在 MySQL 运行时执行,写进
my.cnf不生效(McAfee 插件不支持配置文件初始化该类开关)
日志路径权限和 SELinux 是“有插件无日志”的头号原因
错误日志里看不到明显报错,audit_json_log_file 指向的路径却始终没文件——八成是权限或安全模块拦截。
-
audit_json_log_file默认值是mysql-audit.json,相对路径会落在 datadir 下;建议显式设为绝对路径,如:SET GLOBAL audit_json_log_file = '/var/log/mysql/audit.json'; - 确保该路径父目录(如
/var/log/mysql)属主为mysql用户,且有写权限:chown mysql:mysql /var/log/mysql && chmod 755 /var/log/mysql - CentOS/RHEL 启用 SELinux 时,需放行 mysqld 写日志:
sudo semanage fcontext -a -t mysqld_log_t "/var/log/mysql(/.*)?" && sudo restorecon -Rv /var/log/mysql - 若用 systemd 管理 MySQL,还需检查
ProtectSystem=full是否阻止了日志写入——临时注释该行再试
McAfee 插件在 5.7 上最易被忽略的是变量作用域:所有 audit_* 全局变量都只对新连接生效,已存在的连接不会自动继承;如果测试时复用旧客户端连接,会误判为“配置无效”。











