如何在MySQL中为第三方审计系统配置只读的系统视图权限?

只因performance_schema是伪库,权限必须显式授予具体表(如events_statements_summary_by_digest),不可用ON performance_schema.批量授权,且默认不包含在GRANT SELECT ON .*范围内。

如何在mysql中为第三方审计系统配置只读的系统视图权限?

为什么只给 SELECT 还连不上 performance_schema

第三方审计工具(如 Prometheus + mysqld_exporter、Percona Monitoring、自研采集脚本)常需读 performance_schemainformation_schema,但这些库不归入普通数据库权限体系。即使你执行了 GRANT SELECT ON *.*,MySQL 仍默认拒绝访问 performance_schema —— 它是“伪库”,权限必须显式授予每张表,且不能用 ON performance_schema.* 批量授权。

GRANT SELECT 到具体表,不是库

审计系统真正依赖的是少数几张高价值统计表,而非整个 schema。盲目授 performance_schema.* 会暴露线程堆栈、SQL 文本、锁等待链等敏感信息,且 MySQL 8.0+ 会直接报错拒绝该语法。

  • GRANT SELECT ON performance_schema.events_statements_summary_by_digest TO 'auditor'@'%';(必授,SQL 执行频次与指纹)
  • GRANT SELECT ON performance_schema.events_waits_summary_global_by_event_name TO 'auditor'@'%';(必授,全局等待事件聚合)
  • GRANT SELECT ON information_schema.TABLES TO 'auditor'@'%';(可选,仅当工具需自动发现表)
  • GRANT SELECT ON information_schema.STATISTICS TO 'auditor'@'%';(可选,查索引分布)

不要授 performance_schema.threadsprocesslist——它们含当前 SQL 文本,属高危泄露点。

认证插件和 host 匹配是隐形断连点

即使权限全给了,pymysqlmysqlclient 或某些旧版 exporter 仍可能报 Access denied for user。这不是权限问题,而是认证层不兼容:

  • MySQL 8.0+ 默认用 caching_sha2_password,而多数审计 agent 仍依赖 mysql_native_password
  • 创建账号时必须显式指定:CREATE USER 'auditor'@'10.20.30.%' IDENTIFIED WITH mysql_native_password BY 'xxx';
  • 确认审计服务器真实出口 IP 匹配 host 模式;若走 Kubernetes Service 或云 LB,需查 SELECT SUBSTRING_INDEX(USER(), '@', -1); 确认实际连接来源

视图封装不可用于 performance_schema

有人想用视图把 events_statements_summary_by_digest 字段裁剪后再授予权限,这条路走不通:MySQL 不允许在 performance_schema 上创建视图(报错 ERROR 1356 (HY000)),也不支持对其设 SQL SECURITY DEFINER。所有授权必须落在原始表上,且不能绕过字段级控制——这意味着你得信任审计工具不会滥用字段,或在应用层做结果过滤。

文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xinjizixun/125584.html

上一篇 2026-07-12 09:52
下一篇 2026-07-12 09:52

相关推荐