mysql中权限管理中的审计日志与合规性检查

来源:这里教程网 时间:2026-02-28 20:47:10 作者:

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 巡检是唯一可行组合。

相关推荐