Linux可通过PAM的pam_pwquality.so模块配合remember=N参数强制限制密码复用,需配置/etc/pam.d/common-password或system-auth,并确保/etc/security/opasswd可写且使用SHA-512加密。

Linux 系统可以通过 PAM(Pluggable Authentication Modules)模块强制限制用户不能重复使用最近用过的密码,核心是配置 pam_pwquality.so(新版系统)或 pam_pwcheck.so(旧版),并配合 remember 参数实现历史密码记录与校验。
启用密码历史记录功能
编辑 PAM 密码策略配置文件:
- 主流发行版(RHEL/CentOS 7+/Ubuntu 18.04+)修改:
/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS/Fedora) - 在对应文件中找到以
password requisite pam_pwquality.so开头的行(若不存在则添加),追加remember=N参数,例如:password requisite pam_pwquality.so retry=3 remember=5 -
remember=5表示系统将保存最近 5 次旧密码哈希,用户改密时不得与其中任一重复
确保密码哈希被实际存储
仅配置 remember 不够,还需保证旧密码哈希能写入用户数据库:
- 确认
/etc/security/opasswd文件存在且可写(由 root 所有,权限建议600)
若不存在,PAM 会自动创建;若被删除或权限错误,历史记录将失效 - 检查该文件是否被 SELinux 或其他安全策略阻止写入(RHEL/CentOS 上可临时用
ausearch -m avc -ts recent | grep opasswd查错) - 普通用户无需手动操作此文件,PAM 会在密码修改时自动更新
验证设置是否生效
完成配置后需实测验证:
- 切换到测试用户,执行
passwd修改密码 3 次(每次设不同密码) - 再尝试将密码改回第一次设定的值,应提示类似:
ERROR: The password has been used before. Please choose a different one. - 查看历史记录是否写入:
sudo cat /etc/security/opasswd | grep ^username(每行末尾数字代表记录序号)
补充注意事项
以下细节影响功能稳定性:
-
必须搭配密码加密方式使用:SHA-512(
ENCRYPT_METHOD SHA512)推荐,MD5 不支持 salt 变化,易绕过历史校验 -
不适用于 SSH 密钥登录场景:该机制只作用于
passwd命令或图形界面改密,对 key 登录无约束 -
root 用户默认不受限:如需限制 root,需在 PAM 配置中显式添加
enforce_for_root(部分版本支持)或单独为 root 设置策略 -
密码策略需与 shadow 工具协同:确保
/etc/login.defs中PASS_MIN_DAYS和PASS_MAX_DAYS合理,避免因强制改密间隔冲突导致误判

















