MySQL 8.0需显式安装validate_password组件并配置STRONG策略参数(如length=12、mixed_case_count=2等)才能满足等保三级密码复杂度要求,仅设length=8且policy=MEDIUM不生效;配置须写入my.cnf持久化,并实测拦截效果,同时预留免校验管理账号防业务中断。

MySQL 8.0 默认不启用密码强度校验,必须显式安装 validate_password 组件并完整配置 STRONG 策略参数,否则任何弱密码(如 '123456')都能通过,直接不满足等保三级对“密码复杂度”的强制要求。
确认并安装 validate_password 组件
MySQL 8.0 将密码验证功能实现为服务器组件(component),不是插件(plugin)。INSTALL PLUGIN 在 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 包
设置符合等保三级的 STRONG 策略参数
等保三级只要求“8位+数字/大小写字母/特殊字符”,但仅设 validate_password.length = 8 不够——policy = MEDIUM 下部分参数可能沿用旧值或被忽略校验;STRONG 才能确保所有规则生效,且必须逐项显式配置:
SET GLOBAL validate_password.policy = 'STRONG';-
SET GLOBAL validate_password.length = 12;(高于等保最低 8 位,防业务脚本硬编码 8 位失败) -
SET GLOBAL validate_password.mixed_case_count = 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,字典检查失效。
持久化配置并验证真实拦截效果
只执行 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
验证是否真起作用,不能只看变量值,必须实测:
-
CREATE USER 'test'@'localhost' IDENTIFIED BY 'Abc123!';→ 应成功 -
CREATE USER 'test2'@'localhost' IDENTIFIED BY 'password123';→ 必须报ERROR 1819 (HY000) - 执行
SHOW VARIABLES LIKE 'validate_password%';,确认所有目标变量值与预期一致
避开业务连接中断这个致命坑
策略一旦生效,所有 CREATE USER、ALTER USER ... IDENTIFIED BY 操作都会被校验。如果业务脚本里硬编码了 8 位密码或含用户名的密码,建用户或改密会批量失败。
最易被忽略的是:策略变更后,DBA 或运维人员自己执行 ALTER USER 时也可能触发拦截,而此时若无备用高权限账号或应急通道,会导致紧急维护受阻。务必提前在测试环境跑通全部建库建用户脚本,并预留一个未受策略限制的管理账号(如用 caching_sha2_password + SSL 连接的专用账号)作为兜底。


















