创建用户必须明确指定 host 而非使用 '%',生产环境应限定为内网或 localhost;授予权限需遵循最小原则,仅赋予 SELECT/INSERT/UPDATE/DELETE 等必要权限;MySQL 8.0+ 应启用 validate_password 插件并设为 MEDIUM 或 STRONG 策略;须定期审计并清理残留账户。

创建用户时必须指定 host 而非用 % 通配
直接用 CREATE USER 'user'@'%' 是最常见也最危险的做法——它允许该用户从任意 IP 连接,哪怕你只打算在本地用。生产环境应明确限定来源,比如只允许内网访问:CREATE USER 'app_user'@'192.168.1.%',或仅本机:'app_user'@'localhost'。注意:localhost 和 127.0.0.1 在 MySQL 中行为不同(前者走 Unix socket,后者走 TCP),权限记录不互通,别混用。
授予权限时避免使用 GRANT ALL PRIVILEGES
GRANT ALL PRIVILEGES ON db.* TO 'user'@'host' 会赋予包括 DROP DATABASE、CREATE USER、SHUTDOWN 等高危权限,远超应用所需。应按最小权限原则显式授予:
-
SELECT, INSERT, UPDATE, DELETE—— 基础 DML 操作 -
EXECUTE—— 仅当需调用存储过程时添加 -
SHOW VIEW—— 仅当查询视图时需要 - 绝对不要给
FILE、PROCESS、SUPER权限,除非 DBA 明确介入运维场景
执行后务必运行 FLUSH PRIVILEGES(虽然多数情况下自动刷新,但显式调用更稳妥)。
密码策略与强密码强制生效
MySQL 8.0+ 默认启用 validate_password 插件,但需确认已加载并配置强度:
- 检查是否启用:
SHOW VARIABLES LIKE 'validate_password%'; - 设为 MEDIUM 或 STRONG:
SET GLOBAL validate_password.policy = MEDIUM; - 创建用户时密码必须满足长度、大小写、数字、特殊字符组合,否则
CREATE USER直接报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
老版本(5.7)需手动安装插件并配置参数,否则默认无强度校验。
定期审计权限变更与残留账户
权限不是一劳永逸的。容易被忽略的是:应用下线后账户未删、测试账号长期存在、临时授权未回收。建议定期执行:
- 查所有非内置用户:
SELECT User, Host FROM mysql.user WHERE User NOT IN ('mysql.infoschema', 'mysql.session', 'mysql.sys', 'root'); - 查某用户具体权限:
SHOW GRANTS FOR 'user'@'host'; - 删除无用账户:
DROP USER 'old_user'@'host';(注意:5.7+ 才支持DROP USER自动清理权限,旧版需先REVOKE再DELETE FROM mysql.user+FLUSH PRIVILEGES)
真正难的不是建用户,而是让权限始终收敛在业务边界内——每次加权限前,先问一句“这个操作真的不能用已有账户完成吗”。











