MySQL密码过期策略必须显式设为非零值(如90),因默认default_password_lifetime=0等同永不过期,不满足等保三级要求;需全局设置并为所有现有用户单独执行ALTER USER指定过期时间,同时配合validate_password强度策略共同生效。

MySQL密码过期策略必须显式启用并设为非零值,否则 default_password_lifetime=0(默认)等同于“永不过期”,直接不满足等保三级要求。
确认并修改全局密码过期天数
等保三级明确要求密码定期更换,常见为90天或365天。MySQL 5.7.4+ 通过 default_password_lifetime 控制默认策略:
-
SHOW VARIABLES LIKE 'default_password_lifetime';—— 查看当前值;若返回0,说明未启用过期机制 -
SET GLOBAL default_password_lifetime = 90;—— 立即生效(无需重启),但仅对新创建用户或未显式设置过期的用户生效 - 如需持久化,必须在
/etc/my.cnf的[mysqld]段落中添加:default_password_lifetime = 90,然后重启 MySQL - 注意:
NULL表示使用全局设置,0是硬性禁用,二者语义不同,不能混用
为已有用户单独设置过期时间
全局设置只影响后续新建用户,已存在的账号(尤其是 root、业务账号)必须逐个修正,否则测评时会因“部分账号未过期”被扣分:
-
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;—— 强制该用户90天后过期 -
ALTER USER 'admin'@'localhost' PASSWORD EXPIRE NEVER;—— 谨慎使用,仅限极少数运维账号,且需有强审计支撑 - 检查所有用户当前状态:
SELECT user, host, password_last_changed, password_lifetime FROM mysql.user;,重点关注password_lifetime列是否为90或具体数值,而非NULL或0 - 特别注意:MySQL 8.0 中
password_expired字段为Y时,用户首次登录会触发ERROR 1820 (HY000),必须用ALTER USER ... IDENTIFIED BY重置,这点常被漏测
避免与密码强度策略冲突
过期策略和密码复杂度策略(validate_password)是两套独立机制,但实际生效时会叠加作用。常见踩坑点:
- 先启用了
validate_password插件,再设default_password_lifetime,没问题;但反过来——如果只设了过期却没开密码强度校验,用户可能设出弱密码再等它过期,等于白设 -
validate_password.policy设为'STRONG'后,validate_password.length默认是12,但等保只要求8位;若你设了12,而业务方脚本里硬编码了8位密码,会导致批量建用户失败 - 密码历史限制(
password_history=5)在 MySQL 8.0.29+ 才原生支持,低版本只能靠人工巡检或外部工具补位,别误以为开了validate_password就自动带历史检查 - 修改密码时若触发过期+强度双重校验,错误信息可能只报
ERROR 1819(密码不符合策略),掩盖了真正卡点,建议用SELECT VALIDATE_PASSWORD_STRENGTH('xxx');单独验证密码强度
真正难的不是设一个 90,而是确保所有账号(包括监控账号、备份账号、中间件连接账号)都落在策略覆盖范围内,且每次密码变更都经过校验链路。漏掉一个 user@10.10.%.%,等保现场测评就可能卡在“身份鉴别”这一项。


















