防止用户反复使用旧密码需三要素齐备:正确加载PAM历史模块(如pam_pwhistory.so remember=5)、创建并授权/etc/security/opasswd文件(root:root,600权限)、确保配置位于password类型行且路径匹配发行版(Ubuntu用common-password,RHEL用system-auth),缺一不可。

要防止用户反复使用旧密码,关键不是单纯改个参数,而是让系统真正记住并比对历史密码。核心在于三件事:PAM模块正确加载、历史存储文件就位、策略生效路径匹配。
确认并配置PAM历史记录模块
不同发行版主配置文件不同,不能一概而论:
- Ubuntu/Debian 系统:编辑 /etc/pam.d/common-password
- RHEL/CentOS 7+、Fedora:编辑 /etc/pam.d/system-auth
- 新版本(如 RHEL 8+/Ubuntu 22.04+)推荐用 pam_pwhistory.so,替代老旧的 pam_unix.so remember=N
在对应文件中添加或修改这一行(确保是 password 类型,不是 auth 或 account):
password requisite pam_pwhistory.so remember=5 use_authtok enforce_for_root
其中 remember=5 表示保存最近 5 次密码哈希;enforce_for_root 可选,如需限制 root 用户;use_authtok 防止流程中重复触发其他密码模块。
创建并授权历史密码存储文件
系统不会自动创建该文件,缺了它,remember 参数完全失效:
- 运行命令创建空文件:sudo touch /etc/security/opasswd
- 设置属主和权限:sudo chown root:root /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd
- 检查 SELinux 是否拦截(RHEL/CentOS):sudo ausearch -m avc -ts recent | grep opasswd,如有拒绝记录需调整策略
这个文件由 PAM 在用户执行 passwd 时自动写入,不可手动编辑,也不建议清空——清空等于重置历史记录。
验证策略是否真实生效
别只看配置有没有保存,要实测流程:
- 切换到测试用户,连续执行三次 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),这是完全错误的调用阶段
- 只改了 system-auth,但 Ubuntu 的 passwd 命令实际走的是 common-password 链
- 没装 libpwquality 或 pam-pwquality 包(某些最小化安装环境需手动补全)
- 密码加密方式不支持 salt 变化,例如仍用 MD5;推荐在 /etc/login.defs 中设 ENCRYPT_METHOD SHA512
不复杂但容易忽略

















