清除密码历史记录,解决pam安全策略密码无法复用问题

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 历史(不影响其他用户)

核心优势

  1. 不关闭 PAM 策略(合规、不破坏基线)
  2. 不清空所有用户密码历史(只动 root)
  3. 无需重启、无需变更 authselect 配置
  4. 审计风险最低

步骤 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 遇到异常,再新开一个会话重试即可。

此时:

· 系统无历史密码校验

· 可以成功设置你需要的旧密码

· 复杂度校验依然保留(安全策略不失效)

相关推荐
海宇服务1 小时前
零信任架构实战:基于海宇风控经营异常预警构建自动化央企物资采购供应商资信排查网关
运维·人工智能·架构·自动化
开开心心就好1 小时前
发票信息录入太麻烦?离线工具一键转表格
运维·服务器·前端·pdf·ocr·maven·intellij-idea
吴声子夜歌2 小时前
Docker入门与实战——热门镜像介绍
运维·docker·容器
方便面不加香菜2 小时前
容器虚拟化基础--CGroups资源控制
运维·docker·容器
山东孙燕姿2 小时前
维修工单的转派与协同:两个人一起上
大数据·运维·服务器·网络·人工智能
AI你一生一世2 小时前
Cloud in a Bottle:把自托管从“运维苦役”变成“可交付的私有云”
运维·部署·状态管理·容器编排·私有云·备份恢复·自托管
Madison-No73 小时前
Jenkins持续集成
运维·ci/cd·jenkins
Initialize293084 小时前
Docker 容器网络不通?五步排查法
运维