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

1次阅读

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

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

MySQL 本身不内置审计日志功能,AUDIT_LOG 插件仅在 MySQL Enterprise Edition 中提供,社区版默认不可用;合规性检查需依赖外部工具或手动 SQL 扫描,不能靠 SHOW GRANTSmysql.user 表直接满足等保、GDPR 等要求。

MySQL 社区版没有原生审计日志,别指望 audit_log.so

社区版启动时加载 audit_log.so 会报错:Plugin 'audit_log' is not loaded。该插件仅随商业版分发,且需单独购买许可。替代方案只有:

  • 启用通用查询日志(general_log=ON),但会严重拖慢性能,且记录所有语句(含敏感数据),不符合最小日志原则
  • 使用 mariadbserver_audit 插件(开源、兼容 MySQL 协议),需替换数据库或额外部署代理层
  • 通过 MySQL routerproxySQL 拦截流量并记录,但无法捕获本地 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.dbmysql.tables_priv
  • '%' 主机匹配允许任意 IP 连接,但若账号绑定了 require X509,实际风险较低;只看 Host 列不结合 ssl_type 会误报
  • 系统账号如 mysql.sessionmysql.infoschema 是内部使用,不应被人工干预,但 SHOW GRANTS FOR 'mysql.session'@'localhost' 会返回语法错误——这类账号不能直接 GRANTREVOKE

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=ONevents_statements_history_long.size > 0
  • 只记录成功执行的语句,失败的权限拒绝(如 Error 1142 (42000): INSERT command denied)不会入库
  • 历史记录滚动覆盖,无法长期归档,需搭配定时导出脚本

真正的合规落地,不是GRANT 语句,而是建立账号生命周期流程:创建时走审批工单、定期自动扫描 mysql.role_edges 树状关系、删除离职人员前先冻结再验证无活跃连接。审计日志只是证据链一环,缺失它时,performance_schema + 外部代理日志 + 定期 SQL 巡检是唯一可行组合。

text=ZqhQzanResources