mysql社区版无原生审计日志,AUDIT_LOG插件仅限企业版;合规检查需结合PERforMANCE_SCHEMA、外部代理及手动SQL扫描元数据表,而非依赖SHOW GRANTS或mysql.user单表。

MySQL 本身不内置审计日志功能,AUDIT_LOG 插件仅在 MySQL Enterprise Edition 中提供,社区版默认不可用;合规性检查需依赖外部工具或手动 SQL 扫描,不能靠 SHOW GRANTS 或 mysql.user 表直接满足等保、GDPR 等要求。
MySQL 社区版没有原生审计日志,别指望 audit_log.so
社区版启动时加载 audit_log.so 会报错:Plugin 'audit_log' is not loaded。该插件仅随商业版分发,且需单独购买许可。替代方案只有:
- 启用通用查询日志(
general_log=ON),但会严重拖慢性能,且记录所有语句(含敏感数据),不符合最小日志原则 - 使用 mariadb 的
server_audit插件(开源、兼容 MySQL 协议),需替换数据库或额外部署代理层 - 通过 MySQL router 或 proxySQL 拦截流量并记录,但无法捕获本地 socket 连接或 root@localhost 的操作
用 SQL 手动做合规性检查,重点查这三类权限滥用
等保 2.0 要求“权限最小化”“分离管理员与业务账号”,但 select * FROM mysql.user 只显示全局权限,容易漏掉库/表级细粒度授权。必须联合多张元数据表扫描:
SELECT u.User, u.Host, u.authentication_string IS NOT NULL AS has_password, u.super_priv = 'Y' AS has_super, COUNT(DISTINCT t.Table_name) AS tables_with_insert_priv FROM mysql.user u LEFT JOIN mysql.tables_priv t ON u.User = t.User AND u.Host = t.Host AND t.Table_priv LIKE '%Insert%' WHERE u.Account_locked = 'N' GROUP BY u.User, u.Host HAVING has_super OR tables_with_insert_priv > 10;
常见误判点:
-
GRANT OPTION权限比SUPER更危险——它允许用户把权限转授他人,但不会出现在mysql.user的字段里,得查mysql.db和mysql.tables_priv -
'%'主机匹配允许任意 IP 连接,但若账号绑定了require X509,实际风险较低;只看Host列不结合ssl_type会误报 - 系统账号如
mysql.session或mysql.infoschema是内部使用,不应被人工干预,但SHOW GRANTS FOR 'mysql.session'@'localhost'会返回语法错误——这类账号不能直接GRANT或REVOKE
用 PERFORMANCE_SCHEMA 捕获运行时权限行为(5.7+)
虽然不能替代审计日志,但 performance_schema.events_statements_history_long 可回溯最近 10000 条执行语句,配合 accounts 表能定位越权操作:
SELECT a.USER, a.HOST, es.SQL_TEXT, es.TIMER_START FROM performance_schema.accounts a JOIN performance_schema.events_statements_history_long es ON a.USER = es.USER AND a.HOST = es.HOST WHERE es.SQL_TEXT LIKE '%DROP TABLE%' OR es.SQL_TEXT LIKE '%GRANT%' ORDER BY es.TIMER_START DESC LIMIT 20;
注意限制:
- 该表默认关闭,需设
performance_schema=ON且events_statements_history_long.size > 0 - 只记录成功执行的语句,失败的权限拒绝(如
Error 1142 (42000): INSERT command denied)不会入库 - 历史记录滚动覆盖,无法长期归档,需搭配定时导出脚本
真正的合规落地,不是堆砌 GRANT 语句,而是建立账号生命周期流程:创建时走审批工单、定期自动扫描 mysql.role_edges 树状关系、删除离职人员前先冻结再验证无活跃连接。审计日志只是证据链一环,缺失它时,performance_schema + 外部代理日志 + 定期 SQL 巡检是唯一可行组合。