MySQL 8.0 必须显式安装 validate_password 组件、完整配置 STRONG 策略参数并写入 my.cnf 持久化,否则无法通过等保三级测评;组件需用 INSTALL COMPONENT 安装,策略参数须逐项显式设置且重启生效,缺一不可。

MySQL 8.0 默认不启用任何密码强度校验,仅靠 SET GLOBAL 修改几个变量无法通过等保三级测评——必须显式安装 validate_password 组件、完整配置 STRONG 策略参数,并写入 my.cnf 持久化,否则所有弱密码(如 '123456')仍能创建成功。
确认并安装 validate_password 组件(MySQL 8.0 必须用 COMPONENT)
MySQL 8.0 将密码校验实现为服务器组件(component),不是插件(plugin)。INSTALL PLUGIN validate_password SONAME 'validate_password.so' 在 8.0.16+ 已废弃,强行执行会报错 ERROR 3510 (HY000)。
- 先查是否已加载:
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 策略并逐项显式配置参数
MEDIUM 策略不满足等保三级要求:它只检查长度 + 各类字符至少 1 位,但等保明确要求“组合使用多种字符类型”,且 STRONG 才激活 validate_password.check_user_name 和字典比对能力。
-
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 会退化为 MEDIUM,字典检查失效
配置必须写入 my.cnf 才能持久化生效
SET GLOBAL 只在当前运行时有效,MySQL 重启后全部丢失。等保测评时会检查配置文件,临时设置不被认可。
- 在
/etc/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_policy),MySQL 8.0 要求全小写下划线形式 - 改完后重启 MySQL:
systemctl restart mysqld,再执行SHOW VARIABLES LIKE 'validate_password%';确认值已加载 - 务必预留一个免校验的管理账号(如用
ALTER USER ... PASSWORD EXPIRE NEVER+ 单独策略),防策略误配导致业务中断
实测拦截效果比参数设置更重要
参数设对了不代表策略真生效。等保测评会现场测试:ALTER USER 'test'@'%' IDENTIFIED BY '123456'; 必须报错 ERROR 1819 (HY000),否则直接一票否决。
- 测试前确保用户是新建或刚重置密码——已有账户不会 retroactively 校验
-
SET PASSWORD FOR 'u'@'%'在 MySQL 8.0 中仍触发校验,但部分客户端工具可能绕过,建议统一用ALTER USER - 如果测试通过但线上应用连接失败,大概率是应用密码未同步更新,或用了硬编码的 8 位密码
- STRONG 策略下,
'Abc123!'(仅 1 个大写、1 个小写)会失败,必须满足所有参数项,缺一不可
最容易被忽略的是:组件未真正加载、STRONG 策略参数未逐项显式设置、配置未写入 my.cnf,以及没有预留应急管理账号。这三项任一缺失,都会导致等保测评不通过或线上故障。


















