RHEL8 精准清除 root 密码历史记录,解决 "Password has been already used" 无法复用旧密码问题
一、问题场景
RHEL8 默认启用 pam_pwhistory 密码历史策略,很多生产加固配置中还会加入 enforce_for_root 参数,代表 root 用户也禁止复用历史密码。
症状很直接:
· 即使是 root,也无法使用曾经用过的旧密码
· passwd 报错 Password has been already used
· 想恢复成机房统一标准口令时被历史策略拦截
二、原理说明
RHEL8 的密码历史记录不存放在 shadow,也不存放在系统日志,唯一存储文件是:
/etc/security/opasswd
文件作用:
· 记录所有用户历史密码哈希
· remember=N 策略依赖此文件判断是否重复
· 普通修改 PAM 配置不清理此文件依然报错
文件格式大致为:
用户名:哈希1,哈希2,哈希3
每个用户一行,冒号后是该用户历史密码哈希的逗号分隔列表。
三、生产最优方案:只清理 root 历史(不影响其他用户)
核心优势
- 不关闭 PAM 策略(合规、不破坏基线)
- 不清空所有用户密码历史(只动 root)
- 无需重启、无需变更 authselect 配置
- 审计风险最低
步骤 1:备份原文件(生产必做)
bash
cp -a /etc/security/opasswd /etc/security/opasswd.bak.$(date +%F)
步骤 2:查看当前密码历史记录
bash
cat /etc/security/opasswd
你会看到类似:
root:$6$xxxx$yyyy,...
user1:$6$aaaa$bbbb,...
步骤 3:仅删除 root 那一行
使用 sed 精准删除,避免手工编辑误伤其他用户:
bash
sed -i '/^root:/d' /etc/security/opasswd
验证删除结果:
bash
grep -c '^root:' /etc/security/opasswd # 应返回 0
wc -l /etc/security/opasswd # 确认文件未被清空
只删除 root 开头那一行,保留其他所有业务用户历史密码记录。
步骤 4:直接修改为旧密码
bash
passwd root
文件修改立即生效,不需要重启,也不需要特意新开 SSH 会话。如果当前会话执行 passwd 遇到异常,再新开一个会话重试即可。
此时:
· 系统无历史密码校验
· 可以成功设置你需要的旧密码
· 复杂度校验依然保留(安全策略不失效)