必须先安装validate_password组件,否则所有策略参数无效;mysql 8.0+需用install component 'file://component_validate_password'安装,并在my.cnf中配置validate_password=force_plus_permanent。

必须先安装 validate_password 组件,否则所有策略参数都是无效的——改了 validate_password.length 或 validate_password.policy 也拦不住 '123456' 这类密码。
确认并安装 validate_password 组件(MySQL 8.0+)
MySQL 8.0 把密码校验做成服务器组件,不是插件,INSTALL PLUGIN 命令已废弃,硬用会报 ERROR 3510 (HY000) 或 ERROR 1126 (HY000)。
- 先查是否已加载:
SELECT * FROM mysql.component WHERE component_id LIKE 'validate_password%'; - 没结果就执行:
INSTALL COMPONENT 'file://component_validate_password';(路径必须带file://前缀) - 若提示
Component not found,说明当前二进制包不带该组件,需换官方 RPM/DEB 包或升级 MySQL - 安装后立即生效,但重启会丢失——必须在
/etc/my.cnf的[mysqld]段追加:validate_password=FORCE_PLUS_PERMANENT
设 STRONG 策略并显式配置关键参数
policy = MEDIUM 不够:它默认不启用字典检查、不强制 check_user_name,等保三级测评时会被认定为“未启用高级校验能力”。STRONG 才是硬性前提。
- 在线设置(立即生效):
SET GLOBAL validate_password.policy = 'STRONG'; - 必须逐项显式赋值,不能依赖默认值:
SET GLOBAL validate_password.length = 12;、SET GLOBAL validate_password.mixed_case_count = 2;、SET GLOBAL validate_password.number_count = 2;、SET GLOBAL validate_password.special_char_count = 1; -
mixed_case_count = 2表示大小写字母总数 ≥ 2(如Ab1!满足),不是“必须含大写且含小写”;真要分拆校验,得靠应用层 - 开启用户名检查:
SET GLOBAL validate_password.check_user_name = ON;(防止user123这类弱密码) - 若配了
validate_password.dictionary_file却路径无效或为空字符串,STRONG会自动退化为MEDIUM,策略失效
避免 ALTER USER 报 ERROR 1820 和业务中断
策略启用后,所有用户首次登录或执行任何语句前,都会被强制要求重置密码——这不是异常,是策略生效的明确信号。
- 已有用户会触发:
ERROR 1820 (HY000): You must reset your password using ALTER USER - 必须用
ALTER USER 'user'@'host' IDENTIFIED BY 'NewPass@123';重置,SET PASSWORD或直接改mysql.user表会被拦截 - 批量处理前,先查弱口令账户:
SELECT user, host FROM mysql.user WHERE LENGTH(authentication_string) (<code>authentication_string长度过短往往对应弱密) - 别忘了配密码过期:
default_password_lifetime = 90要写进my.cnf,再对每个用户执行ALTER USER 'u'@'h' PASSWORD EXPIRE INTERVAL 90 DAY;,否则测评时“部分账号永不过期”直接扣分
最常被忽略的是持久化——只执行 SET GLOBAL 看似成功,但重启后全归零;更隐蔽的是 validate_password.dictionary_file 路径权限不对或文件不存在,会让 STRONG 策略静默降级,实测时才发现弱密码仍能通过。











