mysql权限治理核心是“先收权、再分权、后验证”:一、锁定高危账号与越权行为;二、按角色划分最小权限集;三、清理冗余权限与废弃账号;四、建立权限变更与审计机制。

Mysql 权限 混乱时,核心思路是“先收权、再分权、后验证”——不是直接修补,而是重建清晰的权限层级结构。
一、快速锁定高危账号和越权行为
权限混乱往往源于历史遗留账号或临时授权未回收。先查出哪些账号有超出业务需要的权限:
- 运行 select user, host, authentication_string FROM mysql.user; 查看所有账号及密码状态(注意:MySQL 8.0+ 用
authentication_string,5.7 及以前用password) - 执行 SELECT * FROM mysql.user WHERE Super_priv=’Y’ OR Grant_priv=’Y’ OR Create_user_priv=’Y’; 找出拥有超级权限或授予权限能力的账号
- 用 SHOW GRANTS for ‘username’@’host’; 逐个检查关键账号的实际权限,重点关注是否授予了
ALL PRIVILEGES ON *.*或对敏感库(如mysql、information_schema)的写权限
二、按角色重新划分最小权限集
不再按人授权,而是按职责建角色(MySQL 8.0+ 支持原生 ROLE;5.7 可模拟):
- 应用只读账号:仅允许
SELECT,范围限定在业务库的指定表(如GRANT SELECT ON app_db.orders TO 'app_ro'@'%';) - 应用读写账号:允许
SELECT, INSERT, UPDATE, delete,但禁止DROP、ALTER、CREATE,且不跨库 - 运维管理账号:独立于应用账号,仅限内网 IP,拥有必要库的
PROCESS、REPLICATION CLIENT等监控类权限,不开放FILE或SHUTDOWN - 开发测试账号:限制在专用测试库,可
CREATE/ALTER/DROP,但禁止访问生产库,且定期自动过期
三、清理冗余权限与废弃账号
权限不是越多越安全,而是越精准越可控:
- 用 REVOKE ALL PRIVILEGES ON *.* FROM ‘old_user’@’%’; 先清空旧账号所有权限,再按需重授
- 删除长期未登录账号:SELECT user, host, last_login FROM mysql.user WHERE last_login(需开启
log_queries_not_using_indexes或审计日志辅助判断) - 禁用空密码、弱密码账号:ALTER USER ‘user’@’host’ IDENTIFIED WITH mysql_native_password BY ‘StrongPass123!’;
- 撤销全局权限中不必要的项,例如把
GRANT SELECT, INSERT ON *.*改为GRANT SELECT, INSERT ON app_db.*
四、建立权限变更与审计机制
防止再次混乱,必须固化流程:
- 所有权限变更走工单系统,执行前需二次确认,并记录操作人、时间、原因
- 开启 MySQL 审计日志(企业版)或使用
general_log+ 日志分析脚本(开源版),重点捕获GRANT、REVOKE、DROP USER操作 - 每月自动扫描:比对当前权限与基线配置(如用 SQL 脚本导出权限快照并 git 版本管理),发现偏差即告警
- 应用连接 字符串 中禁止硬 编码 root 或高权限账号,统一通过 中间件 或密钥管理服务(如 Vault)动态获取凭据
权限治理不是一次性任务,而是一套可持续运行的闭环。从收敛入口、明确边界,到自动监控,每一步都在降低人为失误带来的风险。