要让linux用户密码按时过期并强制修改,需同步配置/etc/login.defs、chage命令和pam模块:前者设新用户默认策略,后者为现有用户设置及强制首次登录改密,pam则增强复杂度与历史密码限制。

要让 Linux 用户密码按时过期并强制修改,关键不是只改一个地方,而是把 /etc/login.defs、chage 命令 和 PAM 模块 三者配齐。缺一环,策略就可能不生效,尤其在已有用户或企业环境中。
一、新用户自动继承密码有效期
修改 /etc/login.defs 是设置全局默认策略的起点,它只影响用 useradd 新建的用户:
-
PASS_MAX_DAYS 90:密码最多使用 90 天,到期后必须更换 -
PASS_MIN_DAYS 7:两次修改至少间隔 7 天,防绕过 -
PASS_WARN_AGE 14:登录时提前 14 天开始提示“密码即将过期”
保存后,新建用户会自动获得这些值;但已有用户不受影响,需单独处理。
二、为现有用户批量设置过期规则
已有用户不会读取 /etc/login.defs,必须用 chage 显式写入 /etc/shadow:
- 设密码 90 天过期、最短 7 天才能再改、提前 14 天警告:
sudo chage -M 90 -m 7 -W 14 username - 检查是否生效:
sudo chage -l username,确认输出中 Password expires 和 Minimum number of days between password change 符合预期 - 批量操作示例(仅处理 UID ≥ 1000 的普通用户):
getent passwd | awk -F: '$3 >= 1000 {print $1}' | xargs -I{} sudo chage -M 90 -m 7 -W 14 {}
三、强制首次登录或重置后立即改密
这是账号初始化和安全审计的关键步骤,核心是让系统认为“密码已过期”:
- 执行:
sudo chage -d 0 username
它把 shadow 中“上次修改日期”设为 0(即 1970-01-01),用户下次用密码登录时就会被拦截,强制先改密 - 注意前提:用户必须有可用密码(
sudo passwd username设置过)、家目录权限正确(sudo chown -R username:username /home/username)、且登录方式为密码认证(SSH 需开启PasswordAuthentication yes) - 该操作对 SSH 密钥登录、
su切换、cron 等非交互式场景无效
四、增强策略:密码复杂度与历史记录
光设有效期不够,还需防止弱密码和重复使用旧密码:
- 启用
pam_pwquality.so(Debian/Ubuntu 编辑 /etc/pam.d/common-password,RHEL/CentOS 编辑 /etc/pam.d/system-auth):password requisite pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
要求:10 位以上、大小写字母/数字/特殊字符各至少 1 个、新旧密码至少 3 位不同 - 禁用重复使用最近 5 次密码:
password [success=1 default=ignore] pam_pwhistory.so use_authtok remember=5
改完 PAM 配置无需重启服务,下次用户改密码时即生效。











