共计 2228 个字符,预计需要花费 6 分钟才能阅读完成。
问题现象
在 CentOS 7/ 8 系统中,当我们尝试使用 passwd 命令修改用户密码时,有时会遇到如下错误提示:

passwd: Authentication token manipulation error
passwd: password unchanged
这个错误通常发生在密码修改的最后一步,系统无法将新密码写入到相关认证文件中。遇到这种情况,很多新手管理员会感到困惑,不知道从何下手排查问题。
原理分析
Linux PAM 工作机制
Linux 系统使用 PAM(Pluggable Authentication Modules,可插拔认证模块)来处理认证相关任务。当执行 passwd 命令时,系统会调用 PAM 模块来完成密码修改流程。PAM 的配置文件位于 /etc/pam.d/ 目录下,其中 passwd 文件定义了密码修改的具体流程。
/etc/shadow 文件的重要性
用户密码的哈希值存储在 /etc/shadow 文件中,这是一个高度敏感的系统文件。我们可以使用以下命令查看其权限:
ls -l /etc/shadow
正常情况下应该看到如下输出:
-r--------. 1 root root 1234 Jan 1 10:00 /etc/shadow
这表示该文件仅对 root 用户可读,其他用户没有任何权限。如果这个文件的权限不正确,就可能导致密码修改失败。
常见错误原因
- 文件权限问题 :
/etc/shadow或相关目录权限设置不当 - SELinux 限制:安全策略阻止了密码修改操作
- 磁盘空间不足:系统无法写入密码信息
- 文件系统只读 :
/etc目录被挂载为只读 - PAM 配置错误 :
/etc/pam.d/passwd文件被误修改
解决方案
方法 1:修复文件权限
首先检查并修复 /etc/shadow 文件的权限:
# 确保文件所有者为 root 且权限为 400
sudo chmod 400 /etc/shadow
sudo chown root:root /etc/shadow
# 同时检查 /etc/shadow- 备份文件和 /etc 目录权限
sudo chmod 600 /etc/shadow-
sudo chmod 755 /etc
风险提示:此操作需要 root 权限,错误的权限设置可能导致系统安全问题。
方法 2:检查并修复 PAM 配置
比较正常的 /etc/pam.d/passwd 文件内容:
# 正常配置示例
cat /etc/pam.d/passwd
# 输出应包含类似内容
#%PAM-1.0
auth include system-auth
account include system-auth
password substack system-auth
如果发现配置被修改,可以从备份恢复或手动修复:
# 从备份恢复
sudo cp /etc/pam.d/passwd- /etc/pam.d/passwd
# 或者手动编辑
sudo vi /etc/pam.d/passwd
方法 3:使用 chage 命令
如果 PAM 验证问题暂时无法解决,可以使用 chage 命令直接修改密码过期信息,间接实现密码修改:
# 设置密码过期,强制用户下次登录修改密码
sudo chage -d 0 username
避坑指南
安全操作 /etc/shadow
- 永远不要直接编辑
/etc/shadow文件 - 修改前先备份:
sudo cp /etc/shadow /etc/shadow.bak - 使用
vipw或vigr等专用工具编辑密码文件
配置 sudo 规则
为避免频繁切换到 root,可以配置 sudo 规则:
# 允许 wheel 组成员执行密码修改
%wheel ALL=(ALL) /usr/bin/passwd, !/usr/bin/passwd root
使用 auditd 监控
配置 auditd 监控对关键文件的访问:
# 监控 /etc/shadow 访问
sudo auditctl -w /etc/shadow -p wa -k shadow_access
进阶建议
pwconv/pwunconv 命令
pwconv:将密码从/etc/passwd转移到/etc/shadowpwunconv:反向操作(不建议使用)
PAM 密码复杂度策略
编辑 /etc/pam.d/system-auth 文件,添加:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
故障排查流程图
graph TD
A[遇到 token manipulation error] --> B[检查 /etc/shadow 权限]
B -->| 权限正常 | C[检查磁盘空间]
B -->| 权限异常 | D[修复权限]
C -->| 空间足够 | E[检查 PAM 配置]
C -->| 空间不足 | F[清理磁盘]
E -->| 配置正常 | G[检查 SELinux]
E -->| 配置异常 | H[修复 PAM 配置]
G -->|SELinux 阻止 | I[临时禁用或调整策略]
G -->|SELinux 正常 | J[使用 chage 命令]
延伸思考题
- 为什么 Linux 系统要将密码存储在
/etc/shadow而不是/etc/passwd中? - 如何在密码修改失败时获取更详细的错误信息?
- 企业环境中如何批量检测和修复多台服务器的密码修改问题?
通过本文的讲解,相信大家对 CentOS 系统中密码修改报错有了更深入的理解。遇到问题时,按照本文提供的排查思路和方法,大多数情况下都能快速解决问题。Linux 系统的安全性很大程度上依赖于这些认证机制的正确配置,因此理解其工作原理对系统管理员来说至关重要。
