mysql最小权限原则要求精确授予select等必要权限,限制作用范围至库表列和主机,禁用匿名用户与root远程访问,定期审计回收冗余权限。

只授予 GRANT 所需的最小权限类型
MySQL 不支持“只读用户”这种笼统概念,必须精确到具体权限位。例如,仅允许查询某张表,就该用 SELECT 而非 SELECT, INSERT, UPDATE, DELETE;若只需查一个库,就别给 ALL PRIVILEGES ON *.*。
-
SELECT已足够时,不要顺手加上SHOW VIEW或LOCK TABLES - 应用连接账号通常不需要
CREATE USER、RELOAD、PROCESS等管理类权限 - 对日志表或审计表,有时只需
INSERT,连SELECT都应禁止(防敏感字段泄露)
限制 GRANT 的作用范围:库、表、列、主机
权限颗粒度越细,风险面越小。MySQL 支持在四个维度上收紧:database.table、database.table(column)、username@'host'。
- 避免用
'user'@'%',改用具体 IP 段或域名,如'app01'@'192.168.10.%' - 敏感系统表(如
mysql.user)绝不开放给业务账号,哪怕只读 - 列级权限虽少用,但在处理身份证号、手机号等字段时值得考虑:
GRANT SELECT (name, email) ON mydb.users TO 'report'@'localhost';
禁用匿名用户与默认 root 远程访问
安装后未清理的 ''@'localhost' 或 'root'@'%' 是高频入侵入口。这类账号往往无密码或空密码,且权限极大。
- 运行
SELECT User, Host FROM mysql.user;
检查是否存在空用户名或通配符主机 - 删除匿名用户:
DROP USER ''@'localhost';
- 重命名并限制 root:
RENAME USER 'root'@'%' TO 'root'@'127.0.0.1'; FLUSH PRIVILEGES;
- 生产环境应彻底禁用
skip-grant-tables,它会绕过所有权限检查
定期审计与权限回收
权限不会自动过期,但人会转岗、服务会下线、临时需求会变成永久配置。不清理的权限就是潜在后门。
- 每月执行一次权限比对:
SELECT User, Host, Select_priv, Insert_priv, Grant_priv FROM mysql.user WHERE account_locked = 'N';
- 对三个月未登录的账号,先
SET PASSWORD FOR 'olduser'@'%' = '';再评估是否删除 - 使用
SHOW GRANTS FOR 'user'@'host';查看实际生效权限,注意WITH GRANT OPTION可能导致权限扩散
最常被忽略的是权限继承关系:角色(MySQL 8.0+)可嵌套,但 REVOKE 不会自动级联;回收父角色权限后,子角色仍可能保留旧权限副本。










