mysql密码复杂度策略必须先加载validate_password组件或插件、再显式配置strong策略及length=12、mixed_case_count=2等参数、最后写入my.cnf并重启,缺一环弱密码仍可创建。

MySQL密码复杂度策略不是“设个参数就生效”,必须先加载validate_password插件或组件,再按规则配置参数,最后写入配置文件——缺任何一环,ALTER USER或CREATE USER仍能设出'123456'这种弱密码。
确认并加载 validate_password 插件或组件(版本决定用法)
MySQL 5.7 和 8.0+ 加载方式不同,混用会静默失败。别猜版本,直接查状态:
- 执行
SELECT * FROM information_schema.plugins WHERE plugin_name = 'validate_password';—— 有结果且PLUGIN_STATUS = 'ACTIVE',说明是 5.7 或兼容模式下的 8.0 插件已启用 - 执行
SELECT * FROM mysql.component WHERE component_urn = 'file://component_validate_password';—— 有结果说明 8.0.17+ 组件已安装(推荐方式) - 若两者都为空:5.7 执行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';;8.0.17+ 执行INSTALL COMPONENT 'file://component_validate_password';(路径必须带file://前缀) - 常见报错:
ERROR 3510 (HY000)表示你在 8.0.16+ 用了INSTALL PLUGIN;ERROR 1126 (HY000)表示validate_password.so文件不存在(新版 MySQL 已移除该文件)
设置 STRONG 策略参数(等保三级硬性要求)
MEDIUM 不满足等保三级——它不校验用户名是否出现在密码中,也不启用字典比对。STRONG 才激活 validate_password.check_user_name 和 validate_password.dictionary_file,但后者若配置无效,STRONG 会退化为 MEDIUM:
-
SET GLOBAL validate_password.policy = 'STRONG';(字符串值,必须加单引号) -
SET GLOBAL validate_password.length = 12;(等保最低 8 位,但设 12 可避免业务脚本因硬编码 8 位而批量失败) -
SET GLOBAL validate_password.mixed_case_count = 2;(注意:是大小写字母“各至少 2 个”,不是总共 2 个) SET GLOBAL validate_password.number_count = 2;SET GLOBAL validate_password.special_char_count = 1;-
SET GLOBAL validate_password.check_user_name = ON;(防止'admin123'这类密码) - 必须同步配置
validate_password.dictionary_file路径,否则 STRONG 失效;若留空或路径不可读,MySQL 不报错但降级为 MEDIUM
写入 my.cnf 才算真正生效(SET GLOBAL 只是临时)
SET GLOBAL 修改的变量在 MySQL 重启后全部丢失,等保测评只认配置文件。注意参数名格式差异:
- SQL 中用下划线:
validate_password.length - my.cnf 中必须去掉下划线、首字母小写:
validate_password_length = 12(写成validate_password.length = 12完全不生效) - 在
[mysqld]段添加:plugin-load-add = validate_password.so validate_password_policy = STRONG validate_password_length = 12 validate_password_mixed_case_count = 2 validate_password_number_count = 2 validate_password_special_char_count = 1 validate_password_check_user_name = ON
- 8.0.17+ 若用组件方式,
plugin-load-add行可省略,但必须确保INSTALL COMPONENT已成功执行,且配置项仍需写入 my.cnf - 改完必须重启
mysqld,否则配置不加载
验证策略是否真起作用(别被假象骗了)
很多人看到 SHOW VARIABLES LIKE 'validate_password%'; 返回一堆值,就以为搞定了。实际还要测行为:
- 执行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'weak123';—— 应报错ERROR 1819 (HY000),而不是静默成功 - 执行
CREATE USER 'test'@'%' IDENTIFIED BY '123456';—— 同样应失败 - 注意:策略只对
CREATE USER、ALTER USER、SET PASSWORD生效,不影响 mysqld 初始化时生成的 root 初始密码,也不重检已有用户密码 - 如果测试仍成功,优先检查:插件/组件是否真 ACTIVE;
validate_password.dictionary_file是否为空或路径错误;my.cnf 参数名是否写错(尤其下划线和大小写);是否忘了重启 mysqld
最易被忽略的是:STRONG 级别下 validate_password.dictionary_file 配置失效,会导致整个策略降级,而 MySQL 不提示、不报错、不记录日志——你看到的全是“配置成功”,但弱密码照常创建。











