密码策略组件是什么
validate_password 是 MySQL 8.0 的密码强度组件,在 CREATE USER、ALTER USER、SET PASSWORD 时校验新密码的长度、大小写、数字与符号组合,并可选做字典比对。它只管新密码的强度,不改变认证插件本身的加密方式;账号级另有过期、历史复用与失败锁定策略。
基本信息
| 适用 | MySQL 8.0 组件式;5.7 为同名插件 |
|---|---|
| 安装 | INSTALL COMPONENT 'file://component_validate_password'; |
| 强度档位 | LOW / MEDIUM / STRONG |
| 账号级策略 | PASSWORD EXPIRE / HISTORY / FAILED_LOGIN_ATTEMPTS |
策略项含义
| 参数 | 含义 | 建议取值 |
|---|---|---|
| validate_password.policy | 校验档位 | 内部账号 MEDIUM 起步,对外账号 STRONG |
| validate_password.length | 新密码最小长度 | 12 位以上,结合业务输入习惯 |
| mixed_case_count / number_count / special_char_count | 各类字符最少数量 | 各 1,避免只堆长度 |
| validate_password.dictionary_file | 字典文件路径,拒绝常见弱口令 | 有合规要求时配置 |
| PASSWORD EXPIRE INTERVAL n DAY | 账号密码有效期 | 90 天或按合规基线 |
| PASSWORD HISTORY n | 禁止复用最近 n 个密码 | 5 |
| FAILED_LOGIN_ATTEMPTS / PASSWORD_LOCK_TIME | 连续失败锁定(8.0.19+) | 5 次失败锁定 1 天 |
安装与全局配置
安装与全局配置
INSTALL COMPONENT 'file://component_validate_password'; # 8.0 组件式安装
SHOW VARIABLES LIKE 'validate_password%'; # 确认各参数当前值
SET GLOBAL validate_password.policy = STRONG; # 调整档位
SET GLOBAL validate_password.length = 12; # 最小长度
SET GLOBAL validate_password.mixed_case_count = 1; # 至少 1 个大小写字母
-- 持久化:validate_password.policy 等写进 my.cnf 的 [mysqld] 段账号级密码策略
账号级密码策略
ALTER USER 'app'@'%' PASSWORD EXPIRE INTERVAL 90 DAY; # 90 天过期
ALTER USER 'app'@'%' PASSWORD HISTORY 5; # 禁用最近 5 个旧密码
ALTER USER 'app'@'%' FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 1; # 连错 5 次锁 1 天
SELECT user, host, password_lifetime FROM mysql.user; # 核对生效结果典型使用场景
- 等保或内审要求统一口令复杂度,用组件做强制校验
- 新开对外账号时同步配置过期周期与历史密码限制
- 在线爆破压力大时给业务账号加失败锁定
- 排查「口令符合规范却改不了」,核对档位与字符类别下限
- 交接期轮换密码,用 PASSWORD EXPIRE 强制相关账号改密
把策略调成 STRONG 不会让已有弱密码自动失效,必须对老账号执行 PASSWORD EXPIRE 才能强制改密,否则合规检查仍然不通过。
失败锁定与连接池重试叠加可能把业务账号锁死:上线前先确认应用的失败重试次数小于账号锁定次数,避免一次网络抖动就锁号。
口令治理落地步骤
- 先装组件并确认 SHOW VARIABLES LIKE 'validate_password%' 有输出,参数才真正生效
- 把策略写进 my.cnf 而不是只 SET GLOBAL,否则重启或主从切换后回到默认档位
- 老账号批量执行 ALTER USER ... PASSWORD EXPIRE 强制改密,逐个通知到责任人
- 改密窗口与监控口径对齐:锁定事件要能在监控里看到,避免被当成登录异常噪声