pam_unix模块的remember参数可防止用户重复使用近期密码,需在PAM配置中添加remember=N并确保opasswd文件权限正确,RHEL/CentOS需配合use_authtok才生效。

在 Linux 运维中,pam_unix 模块的 remember 参数可用于防止用户重复使用近期用过的密码,这是加强账户安全的重要手段。它通过将旧密码哈希(加盐后)保存在 /etc/security/opasswd 文件中实现,需配合 use_authtok 或正确配置密码修改流程才能生效。
确认 pam_unix 模块支持 remember 功能
不是所有系统默认启用该功能,需检查 pam_unix.so 是否编译了 remember 支持:
- 运行
grep -i remember /lib/security/pam_unix.so或strings /lib/security/pam_unix.so | grep remember,有输出即表示支持 - RHEL/CentOS 7+、Debian 10+、Ubuntu 18.04+ 默认支持;较老版本(如 CentOS 6)需确认是否为增强版
pam - 若不支持,需升级
pam包或改用pam_pwquality+retry/minlen等替代策略(但无法直接限制历史密码)
配置 /etc/pam.d/common-password(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/CentOS)
关键是在 password [default=ok] pam_unix.so 这一行添加 remember=N,N 表示保留最近 N 个旧密码(例如 remember=5 表示不能使用最近 5 次用过的密码):
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- Ubuntu/Debian:编辑
/etc/pam.d/common-password,找到类似行:
password [success=1 default=ignore] pam_unix.so obscure sha512 remember=5
确保remember=5出现在password类型、pam_unix.so的同一行,且不要与use_authtok冲突(后者会跳过密码检查) - RHEL/CentOS:编辑
/etc/pam.d/system-auth,在password sufficient pam_unix.so行末追加remember=5,例如:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
注意:如果已有use_authtok,说明该行仅用于密码修改(如passwd命令),此时remember才有效;若缺失use_authtok,可能被认证流程跳过
初始化和维护 /etc/security/opasswd
remember 生效的前提是系统能写入并读取历史密码文件:
- 首次启用后,用户第一次改密时自动创建
/etc/security/opasswd,格式为:username:count:hash1:hash2:... - 确保该文件权限为
600、属主为root:root,否则pam_unix拒绝写入 - 可手动检查内容:
sudo cat /etc/security/opasswd(仅 root 可读);若为空,说明尚未触发记录(需用户成功改密一次) - 若需清空某用户历史记录,可用
sudo sed -i '/^username:/d' /etc/security/opasswd(谨慎操作)
验证 remember 是否生效
最直接的方式是让测试用户连续改密并尝试复用:
- 用普通用户执行
passwd,输入新密码(记为 P1) - 再改一次,设为 P2;继续改到 P6(共改 6 次)
- 此时尝试将密码改回 P1,应提示错误(如
Authentication token manipulation error或具体提示“Password has been used before”) - 如未报错,检查:
– PAM 配置是否写在password段而非auth段
– 是否遗漏use_authtok(RHEL 系必须)或与其他模块冲突(如pam_pwquality提前返回)
– SELinux 是否阻止写入/etc/security/opasswd(ausearch -m avc -ts recent | grep opasswd)

















