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