mysql 8.0+必须用install component安装validate_password组件并设policy='strong',配dictionary_file路径,所有参数需在my.cnf中按指定格式配置并重启生效,否则等保三级不通过。

MySQL 默认不校验密码强度,validate_password 插件/组件必须显式启用、参数必须逐项配置、且必须写入 my.cnf 才算合规——只执行 SET GLOBAL 或只改配置文件但没重启,等保三级测评会直接不通过。
确认 validate_password 是否已加载成功
插件没加载,后面所有参数设置都无效,且无明确报错提示。别猜版本,直接查状态:
- 执行
SELECT * FROM information_schema.plugins WHERE plugin_name = 'validate_password';—— 若返回空或PLUGIN_STATUS为DISABLED,说明未启用(MySQL 5.7 / 8.0.16 及以前) - 执行
SELECT * FROM mysql.component WHERE component_urn = 'file://component_validate_password';—— 若无结果,说明组件未安装(MySQL 8.0.17+ 推荐方式) -
SHOW VARIABLES LIKE 'validate_password%';返回空或只有默认值(如length=8但其他全为 0),基本可判定未加载
MySQL 8.0+ 必须用 INSTALL COMPONENT 安装
8.0.16 起 INSTALL PLUGIN validate_password SONAME 'validate_password.so' 已废弃,强行执行报错 ERROR 3510 (HY000);新版二进制包可能根本不带 .so 文件,ERROR 1126 就是它。
- 先查是否已存在:
SELECT * FROM mysql.component WHERE component_id LIKE 'validate_password%'; - 无结果则执行:
INSTALL COMPONENT 'file://component_validate_password';(注意前缀file://不可省) - 若提示
Component not found,说明当前 MySQL 包不含该组件,需升级或重装官方 RPM/DEB 包 - 安装后立即验证:
SHOW VARIABLES LIKE 'validate_password%';应返回完整参数列表,而非空或报错
STRONG 策略必须显式设参数,且 dictionary_file 不能为空
MEDIUM 不满足等保三级:它不激活 validate_password.check_user_name,也不做字典比对。STRONG 才是硬性要求,但若 validate_password.dictionary_file 为空或路径无效,STRONG 会静默退化为 MEDIUM。
- 策略等级必须用字符串:
SET GLOBAL validate_password.policy = 'STRONG';(单引号不能少) - 关键参数必须逐项显式设置(缺一不可):
validate_password.length = 12、validate_password.mixed_case_count = 2(注意是大小写字母“各至少 2 个”,不是总共 2 个)、validate_password.number_count = 2、validate_password.special_char_count = 1、validate_password.check_user_name = ON -
validate_password.dictionary_file必须指向一个真实可读的文本文件(每行一个弱词),否则 STRONG 失效;线上常设为空字符串,等于白配
配置必须写入 my.cnf 才算持久化生效
SET GLOBAL 只在当前进程有效,MySQL 重启后全部丢失。等保测评时会检查配置文件,临时设置不被认可。
- 在
my.cnf的[mysqld]段下添加(注意格式:无下划线、首字母小写):[mysqld] 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 validate_password_dictionary_file = /etc/mysql/weak_passwords.txt
- 参数名在 SQL 中是
validate_password.mixed_case_count,但在配置文件里必须写成validate_password_mixed_case_count,写错就完全不生效 - 修改配置文件后必须重启
mysqld,否则新参数不会加载
最容易被忽略的是:策略只对 CREATE USER 和 ALTER USER ... IDENTIFIED BY 生效,不校验初始 mysqld --initialize 生成的 root 密码;另外 validate_password.dictionary_file 路径若不可读,STRONG 会无声退化,连日志都不报——建议部署后立刻用 CREATE USER 'test'@'%' IDENTIFIED BY 'admin123'; 测试是否真拦截。











