mysql中用户权限的最小化原则与最佳实践

来源:这里教程网 时间:2026-02-28 20:49:56 作者:

只授予
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
不会自动级联;回收父角色权限后,子角色仍可能保留旧权限副本。

相关推荐