要让所有用户定期修改登录密码,需分两层落实:新用户通过编辑/etc/login.defs设置pass_max_days 90、pass_min_days 7、pass_warn_age 14自动生效;已有用户必须用chage -m 90 -m 7 -w 14逐个配置,否则无效。

要让所有用户定期修改登录密码,关键不是“一键开启”,而是分两层落实:新用户自动继承策略,已有用户逐个补设生效。只改全局配置文件,老用户完全不受影响。
让新用户默认遵守90天换密规则
编辑 /etc/login.defs,确保这三行存在且数值合理:
- PASS_MAX_DAYS 90:密码最长可用90天
- PASS_MIN_DAYS 7:两次修改至少间隔7天(防绕过)
- PASS_WARN_AGE 14:到期前14天开始登录时提示
保存后,此后用 useradd 创建的普通用户会自动按此执行。注意:该文件对已存在的用户无效。
批量为现有用户启用策略
已有用户不会读取 /etc/login.defs,必须用 chage 显式设置。推荐脚本方式处理 UID ≥ 1000 的普通账户:
- 先列出所有普通用户:
getent passwd | awk -F: '$3 >= 1000 {print $1}' - 再逐个设置:
chage -M 90 -m 7 -W 14 username - 如需首次登录强制改密(例如刚重置完密码),额外加:
chage -d 0 username
执行后,用户下次通过密码方式登录(如 SSH 密码登录、图形界面输密),若密码超期,系统会直接拦截并要求修改,无法跳过。
验证是否真正生效
别只看配置文件,必须查具体用户的 shadow 状态:
- 查单个用户:
chage -l username,确认 “Password expires” 是90天后,“Minimum number of days between password change” 是7 - 批量检查是否被设为强制改密:
sudo awk -F: '$5 == "0" {print $1}' /etc/shadow,输出用户名即表示已标记“立即过期”
注意:SSH 密钥登录、su 切换、cron 任务等不走密码认证流程的场景,不会触发强制改密提示。
配套增强安全性(建议同步配置)
仅设有效期不够,还需防止弱密码和重复使用旧密码:
- 在
/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS)中启用强度校验:password requisite pam_pwquality.so minlen=10 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 difok=3 - 启用历史记录限制(避免循环用旧密码):
password [default=ok] pam_pwhistory.so use_authtok remember=5 enforce_for_root
改完记得测试:用目标用户账号密码登录,观察是否提示、能否成功改密、新密码是否符合复杂度要求。











