如何定期审查权限_mysql权限维护流程

8次阅读

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

如何定期审查权限_mysql 权限维护流程

定期审查 MySQL 权限不是一次性的操作,而是需要制度化、自动化的维护流程。核心在于“查得全、看得清、改得准、留得下”——即全面发现权限配置、清晰识别风险项、精准调整冗余或越权设置,并保留可追溯的审计记录。

明确审查范围和关键风险点

权限审查不能只看 mysql.user 表,要覆盖多层级权限结构:

  • 全局权限 :重点关注 SUPERGRANT OPTIONFILESHUTDOWN 等高危权限,这些可能被用于提权或数据导出
  • 数据库级权限 :检查 mysql.db 中对敏感库(如 information_schemasys、业务核心库)的非必要授权
  • 表 / 列级权限 :确认 mysql.tables_privmysql.columns_priv 是否存在过度细化但实际已废弃的授权
  • 账户状态 :同步检查 Account_lockedpassword_expiredmax_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 系统上线新增读写权限”),不可仅靠口头确认
text=ZqhQzanResources