要防止用户重用最近5次旧密码,必须同时满足三要素:在正确发行版对应的pam密码配置文件(ubuntu用common-password、rhel用system-auth)中添加password requisite pam_pwhistory.so remember=5 use_authtok enforce_for_root;创建并授权/etc/security/opasswd(root:root,600);且验证时需实测改密流程,历史记录从首次启用该配置后开始累积。

要防止用户改密码时重用最近 5 次旧密码,关键不是只改一个参数,而是让系统真正“记住旧密码”并“在改密时比对”。这需要 PAM 模块、历史存储文件、配置路径三者全部到位,缺一不可。
确认并修改正确的 PAM 配置文件
不同发行版调用的 PAM 链不同,不能统一改 system-auth:
- Ubuntu/Debian 系统:编辑 /etc/pam.d/common-password,这是 passwd 命令实际走的路径
- RHEL/CentOS 7+:编辑 /etc/pam.d/system-auth(RHEL 8+ 推荐优先检查该文件)
- 务必找 password 类型 的行(不是 auth 或 account),添加或修改为:
说明:pam_pwhistory.so 是当前主流推荐模块(比老式 pam_unix.so remember=5 更稳定);remember=5 表示记录最近 5 次哈希;use_authtok 防止重复触发其他密码模块;enforce_for_root 可选,如需限制 root 用户。
创建并授权历史密码存储文件
系统不会自动创建这个文件,没有它,remember=5 完全静默失效:
- 执行命令创建空文件:sudo touch /etc/security/opasswd
- 设置属主和权限:sudo chown root:root /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd
- 该文件由 PAM 在用户成功执行 passwd 时自动写入,不可手动编辑,也不建议清空(清空等于重置历史)
- RHEL/CentOS 上若启用了 SELinux,需检查是否拦截:sudo ausearch -m avc -ts recent | grep opasswd,如有拒绝记录,需调整策略
验证策略是否真实生效
别只看配置是否保存,要走完整改密流程测试:
- 切换到普通测试用户,连续执行三次 passwd,每次设不同密码(如 pass1 → pass2 → pass3)
- 再尝试将密码改回 pass1,应提示类似:The password has been used before
- 查看记录是否写入:sudo cat /etc/security/opasswd | grep ^username(每行末尾数字为序号,从 1 开始递增)
- 注意:历史记录从该用户首次成功使用带 remember 的 PAM 配置改密起开始累积,之前改过的密码不会被自动导入
避开几个高频失效陷阱
很多配置“看着对,实则无效”,问题常出在:
- 把 remember=5 加在 auth 类行(如 auth [success=1 default=ignore] pam_unix.so),完全不生效——必须是 password 类型 行
- 只改了 system-auth,但 Ubuntu 的 passwd 实际走 common-password,等于锁了一半门
- 误以为 /etc/login.defs 中能配 remember 参数——它不支持密码历史功能,仅用于 PASS_MAX_DAYS 等时效策略
- 未确认加密方式:推荐在 /etc/login.defs 中设 ENCRYPT_METHOD SHA512,MD5 因 salt 机制缺陷,可能绕过历史校验











