mysql默认不校验密码强度,必须手动安装validate_password插件并正确配置策略、字典文件及参数,否则安全设置无效;已存在弱密码账户需人工重置,且插件仅对新建或修改密码生效。

MySQL 默认不校验密码强度,123456、password 这类弱口令能直接通过,必须手动启用 validate_password 插件并配置策略,否则所有“安全设置”都是形同虚设。
如何确认并安装 validate_password 插件
很多人的第一步就卡在插件没装上——尤其是 Docker 镜像、精简版 MySQL 或某些云数据库,默认根本不带 validate_password.so 文件。
- 先查是否已加载:
SELECT * FROM information_schema.plugins WHERE plugin_name = 'validate_password';,返回空行说明未安装 - MySQL 5.7 执行:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - MySQL 8.0.13+ 推荐用组件方式:
INSTALL COMPONENT 'file://component_validate_password'; - 若报错
Plugin 'validate_password' is not loaded或找不到 so 文件,得先装系统包(如 Ubuntu 的mysql-common,CentOS 的mysql-community-server),再重试 - 装完立刻验证:
SHOW VARIABLES LIKE 'validate_password%';应该返回一堆参数,而不是空结果
为什么设了 MEDIUM 策略却仍允许弱密码?
validate_password_policy 设成 MEDIUM 只是起点,它默认要求:长度 ≥ 8、含 1 位数字、1 位大写、1 位小写、1 个特殊字符。但这些“默认值”可能被其他变量覆盖,或根本没生效。
- 检查当前实际值:
SHOW VARIABLES LIKE 'validate_password%';,重点关注validate_password_length、validate_password_number_count等是否为预期值 - 运行时设置用:
SET GLOBAL validate_password_length = 12;、SET GLOBAL validate_password_policy = MEDIUM; - 但 MySQL 重启后会丢失——必须把对应参数写进
my.cnf的[mysqld]段:validate_password.length = 12、validate_password.policy = MEDIUM - 注意变量名差异:MySQL 5.7 用
validate_password_length,8.0+ 有些版本用validate_password.length(带点号),写错就静默失败
dictionary_file 为什么总不生效?
想禁用 company123、admin2024 这类带业务关键词的密码?validate_password.dictionary_file 是唯一办法,但它对路径、格式、加载时机极其敏感。
- 文件路径必须是 MySQL 进程可读的**绝对路径**,比如
/etc/mysql/weak-words.txt,不能是~/dict.txt或相对路径 - 文件内容每行一个单词,**不能有空格、注释、空行**,末尾必须有换行符(否则最后一行被忽略)
- 必须在插件已加载的前提下设置:
SET GLOBAL validate_password.dictionary_file = '/etc/mysql/weak-words.txt'; - 但仅设路径不会自动重载字典——得额外执行:
SET GLOBAL validate_password.check_user_name = ON;(触发重新读取,部分版本需配合重启) - 更稳妥的做法:在
my.cnf中静态配置validate_password.dictionary_file = /etc/mysql/weak-words.txt,然后重启 mysqld
已有用户密码不会被自动拦截
插件只在校验「新建用户」或「ALTER USER ... IDENTIFIED BY」时起作用。已存在的弱密码账户(比如 root、admin)完全不受影响,必须人工干预。
- 查高危账户:
SELECT user, host FROM mysql.user WHERE authentication_string LIKE '%*6BB4837EB74329105EE454935CEA2F37C92D7E5C%';(匹配已知弱哈希前缀,或用password_last_changed IS NULL辅助判断) - 强制重置:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass#2026'; - 特别注意远程账户:
'admin'@'%'这类账户一旦密码弱,就是直接入口,优先处理 - 别忘了清理匿名用户:
DROP USER ''@'localhost';,它常被忽略,但能绕过密码校验
真正容易被跳过的不是“怎么设”,而是“谁的密码还没改”和“字典文件权限对不对”。插件装了、参数写了、策略设了,但 root 密码还是 123456,或者 /etc/mysql/weak-words.txt 属主是 root 而 mysqld 运行用户是 mysql——这些细节一漏,整个策略就塌一半。











