mysql需主动启用validate_password插件并确认状态为active,配置medium策略及长度、大小写、数字、特殊字符要求,新密码才校验;旧弱密码须人工用alter user重置。

MySQL 本身不拒绝弱口令,除非你主动启用 validate_password 插件并配置策略——这是防止暴力破解最基础、也最容易被跳过的一步。
确认 validate_password 插件是否已加载
很多环境看似启用了插件,实则只是配置了参数但没真正加载。直接查变量会误判:
-
SHOW VARIABLES LIKE 'validate_password%';返回结果 ≠ 插件已生效;它只说明参数存在,不说明插件在运行 - 必须执行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,状态必须是ACTIVE - 如果返回空或
DISABLED,说明插件未加载:需在my.cnf的[mysqld]段添加plugin_load_add = validate_password.so,然后重启mysqld
设置密码强度参数要避开默认陷阱
MySQL 默认的 validate_password.policy = LOW 几乎等于没设——它只要求 8 位长度,且不校验大小写、数字或特殊字符。暴力工具扫这种密码几秒就破。
- 推荐配置(写入
my.cnf):validate_password.policy = MEDIUMvalidate_password.length = 12validate_password.mixed_case_count = 1validate_password.number_count = 1validate_password.special_char_count = 1 - 注意:
SET GLOBAL方式临时修改参数,对已存在的弱密码账户无效;只有新设或重置密码时才触发校验 - 已有账户必须用
ALTER USER 'xxx'@'%' IDENTIFIED BY 'NewP@ssw0rd!2024';才会走插件校验流程
插件不自动清理历史弱密码,必须人工干预
启用插件后,root、admin 等老账户仍可能挂着 123456 或 password 这类口令,插件不会主动锁、也不会告警。
- 先查风险账户:
SELECT user, host, plugin, authentication_string FROM mysql.user WHERE LENGTH(authentication_string) (粗筛明文或极短哈希) - 重点盯
mysql_native_password认证的用户——这类账户密码更容易被离线爆破,优先重置 - 禁用匿名账户:
DROP USER IF EXISTS ''@'localhost'; DROP USER IF EXISTS ''@'%'; FLUSH PRIVILEGES;
别依赖插件“一劳永逸”,它只管设密码那一刻
validate_password 是个守门员,不是监控摄像头。它不记录谁输错几次、不封 IP、不审计登录来源。一个被允许的强密码账户,如果被泄露或复用到其他系统,照样成为突破口。
真正防住暴力破解,得靠组合动作:插件控密码强度 + FAILED_LOGIN_ATTEMPTS 锁账户 + 防火墙/IP 白名单缩暴露面 + fail2ban 监控错误日志封源 IP。其中最容易被忽略的是——改完配置后没重启服务,或者忘了对存量账户执行 ALTER USER 触发校验。











