应修改 /etc/pam.d/common-password(debian/ubuntu)或 /etc/pam.d/system-auth(rhel/centos/fedora),在 password 堆栈中添加 password requisite pam_pwhistory.so remember=5 enforce_for_root use_authtok,并确保 /etc/security/opasswd 存在且权限为 600。

确认 PAM 配置文件路径,别改错地方
大多数现代 Linux 发行版中,passwd 命令实际走的是 /etc/pam.d/common-password(Debian/Ubuntu 系)或 /etc/pam.d/system-auth(RHEL/CentOS/Fedora 系),而不是 auth 行或 account 行。常见错误是把 remember=5 加到 auth [success=1 default=ignore] pam_unix.so 这类行里,完全无效。
先确认当前生效路径:
grep -r "password.*pam_.*so" /etc/pam.d/ | grep -E "(passwd|common-password)"
若输出含 common-password,优先改它;若为 RHEL 8+/CentOS Stream,也建议同步检查 password-auth 是否软链接到 system-auth,必要时两边都加。
添加 pam_pwhistory.so 并设 remember=5
推荐使用 pam_pwhistory.so(比老式 pam_unix.so remember=N 更健壮,支持 enforce_for_root,且 Ubuntu 22.04+、RHEL 8+ 默认预装)。在对应 PAM 文件的 password 堆栈中,插入一行(放在 pam_unix.so 或 pam_pwquality.so 之前):
password requisite pam_pwhistory.so remember=5 enforce_for_root use_authtok
说明:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
requisite:任一失败即终止密码修改流程 -
remember=5:记录并校验最近 5 次密码哈希 -
enforce_for_root:root 用户也受限制(否则默认不生效) -
use_authtok:避免重复提示输密码,配合前面的pam_pwquality.so使用
确保 /etc/security/opasswd 可写且存在
pam_pwhistory.so 不会自动创建该文件,也不会报错提示缺失——它会静默失效。必须手动初始化:
sudo touch /etc/security/opasswd && sudo chown root:root /etc/security/opasswd && sudo chmod 600 /etc/security/opasswd
还要注意:
- SELinux 或 AppArmor 可能阻止写入,RHEL/CentOS 上可用
ausearch -m avc -ts recent | grep opasswd查 AVC 拒绝日志 - 该文件是二进制格式,不可编辑明文,也不该用
cat查看内容 - 历史记录从用户**第一次成功执行带此 PAM 配置的
passwd开始累积**,此前的密码不会被导入
验证是否真生效,不是只看配置
改完不能只检查语法,必须实测:
- 切换测试用户,连续执行三次
passwd,每次设不同密码(如pass1→pass2→pass3) - 再执行一次
passwd,尝试设回pass1,应出现类似提示:ERROR: The password has been used before. Please choose a different one. - 若仍能成功,检查
/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS)是否有pam_pwhistory相关错误
记住:remember=5 的“5 次”是按该用户后续改密行为滚动记录的,不是从配置当天起算;且它只对密码内容做校验,不控制改密时机——要防秒改绕过,还得配 chage -m 1 username。










