定期审查MySQL权限需制度化自动化,覆盖全局、数据库、表/列级权限及账户状态,用SQL快速生成清单,通过脚本+定时任务固化审计,审查后须清理失效账户、收紧越权配置、记录变更依据。

定期审查 MySQL 权限不是一次性的操作,而是需要制度化、自动化的维护流程。核心在于“查得全、看得清、改得准、留得下”——即全面发现权限配置、清晰识别风险项、精准调整冗余或越权设置,并保留可追溯的审计记录。
明确审查范围和关键风险点
权限审查不能只看 mysql.user 表,要覆盖多层级权限结构:
-
全局权限:重点关注
SUPER、GRANT OPTION、FILE、SHUTDOWN等高危权限,这些可能被用于提权或数据导出 -
数据库级权限:检查
mysql.db中对敏感库(如information_schema、sys、业务核心库)的非必要授权 -
表/列级权限:确认
mysql.tables_priv和mysql.columns_priv是否存在过度细化但实际已废弃的授权 -
账户状态:同步检查
Account_locked、password_expired、max_connections等安全属性是否合规
用标准 SQL 快速生成审查清单
每次人工登录后,可直接运行以下组合查询,5 秒内输出关键信息:
- 所有活跃用户及其高危权限:
SELECT User, Host, Account_locked, password_expired, Super_priv, Grant_priv, File_priv FROM mysql.user WHERE account_locked = 'N'; - 每个用户的完整权限语句(便于比对):
SELECT CONCAT('SHOW GRANTS FOR ''', User, '''@''', Host, ''';') AS cmd FROM mysql.user WHERE User != '' ORDER BY User;
将结果复制执行,或用脚本批量收集 - 无主数据库权限(曾授权但用户已删):
SELECT DISTINCT User, Host FROM mysql.db WHERE User NOT IN (SELECT User FROM mysql.user);
自动化脚本 + 定时任务闭环执行
把审查动作固化为可重复、可归档的运维动作:
- 编写 shell 脚本(如
audit_mysql_privs.sh),连接数据库并导出四类权限表快照 +SHOW GRANTS结果到带日期的文件夹中 - 加入基础校验逻辑:例如自动标出
Super_priv = 'Y'且Host = '%'的账户,提示“需人工复核” - 用
crontab设置每周日凌晨 2 点执行:0 2 * * 0 /opt/dba/audit_mysql_privs.sh >> /var/log/mysql/audit.log 2>&1 - 建议保留最近 12 周的审计日志,方便做权限变更趋势分析
审查后必须做的三件事
发现不合规项只是开始,闭环处理才真正提升安全性:
-
清理失效账户:对 90 天未登录、测试期已过的账户,执行
DROP USER 'xxx'@'host'; -
收紧越权配置:将
GRANT ALL ON *.*改为按需授予,例如仅SELECT, INSERT ON finance.invoice - 记录变更依据:每次调整权限,都在内部运维系统中登记操作人、时间、原因(如“配合 XX 系统上线新增读写权限”),不可仅靠口头确认










