validate_password插件未加载是密码策略失效主因;需用install plugin安装并配置plugin-load-add等参数至[mysqld]段,设force_plus_permanent确保永久生效。

validate_password插件没加载,所有配置都白搭
执行 SHOW VARIABLES LIKE 'validate_password%' 返回空结果,基本可以断定插件根本没加载——这是 90% 的失败起点。MySQL 5.7 默认不启用该插件,必须手动安装,且不能依赖“重启后自动加载”。
确认方式只有两个可靠操作:
- 查插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,结果必须有记录且PLUGIN_STATUS为ACTIVE - 查变量是否存在:
SHOW GLOBAL VARIABLES LIKE 'validate_password%';,应返回至少 7 条以上参数(如validate_password_length、validate_password_policy等)
安装命令(Linux):
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
⚠️ 常见错误:
- 在 Windows 上误用
.so(应为.dll)或路径写错,报错ERROR 1126 (HY000): Can't open shared library - 插件文件实际不在
@@plugin_dir目录下(可用SELECT @@plugin_dir;查看) - 配置文件里写了
disable-plugin-validate_password却没删,导致插件被显式禁用
SET GLOBAL 配置只临时生效,重启就丢
运行 SET GLOBAL validate_password_policy = MEDIUM; 这类命令,确实能让当前实例立刻校验密码强度,但 MySQL 一重启,所有值全退回默认(policy=1、length=8),等保检查时直接挂掉。
必须把参数写进配置文件并重启服务。编辑 /etc/my.cnf 或 /etc/mysql/my.cnf,在 [mysqld] 段下添加:
plugin-load-add = validate_password.so validate-password = FORCE_PLUS_PERMANENT validate_password_policy = 2 validate_password_length = 12 validate_password_mixed_case_count = 1 validate_password_number_count = 1 validate_password_special_char_count = 1
注意三点:
-
validate-password(带连字符)是配置项名,不是validate_password;写错就静默失效 -
FORCE_PLUS_PERMANENT是关键,确保插件无法被卸载、启动即加载 - 所有
validate_password_*参数必须放在[mysqld]下,放错段落(比如[client])完全不读取
改完必须执行 systemctl restart mysqld(CentOS/RHEL)或 service mysql restart(Ubuntu/Debian)。
ALTER USER 不报错?可能是策略参数没设全或权限不足
设置了 validate_password_policy = MEDIUM,但 ALTER USER 'u'@'%' IDENTIFIED BY 'abc123!'; 仍成功,问题通常出在以下几点:
-
validate_password_number_count、validate_password_mixed_case_count、validate_password_special_char_count任意一个为0,对应类型字符就变成可选——不是“必须含”,而是“可不含” - 当前连接用户缺少
SYSTEM_VARIABLES_ADMIN权限,导致策略变量读取失败,校验静默跳过 - 客户端用了旧协议(如 MySQL 5.6 客户端连 5.7 服务端),绕过了插件链
-
validate_password_length设得太小,低于硬性下限:它必须 ≥validate_password_number_count + validate_password_special_char_count + 2 * validate_password_mixed_case_count(例如后三者都是 1,则 length 至少为 4)
验证是否真生效,最直接的方法是测试创建弱密码:
CREATE USER 'test_weak'@'localhost' IDENTIFIED BY '123456';
若返回 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,说明策略已起作用。
STRONG 策略要字典文件,但多数生产环境不该开
设 validate_password_policy = STRONG(即值为 2)后,插件会尝试读取 validate_password_dictionary_file 指定的字典文件,逐行比对密码是否在其中。但这个功能在生产中极少真正启用,原因很实际:
- 字典文件路径必须绝对、可读,且 MySQL 进程有权限访问;否则策略退化为
MEDIUM,还不报错 - 每次校验都要读文件+字符串匹配,高并发建用户时可能成为瓶颈
- 字典维护成本高:你得自己准备、更新、分发、校验文件内容,等保检查又不强制要求此项
真正需要的是明确的最小长度(如 12)、大小写+数字+特殊字符各至少 1 个,这些 MEDIUM 级别已完全覆盖。STRONG 更像是合规材料里的“加分项”,不是安全刚需。
最后提醒一句:插件只在校验 CREATE USER 和 ALTER USER ... IDENTIFIED BY 时触发,不会重检已有账户,也不会拦截 SET PASSWORD 或客户端直连后的其他改密方式——它的边界非常清晰,别指望它包打天下。











