共计 1913 个字符,预计需要花费 5 分钟才能阅读完成。
错误现象与触发场景
当在 CentOS7.6 系统中执行 passwd root 命令时,系统返回 authentication token manipulation error 错误提示,并伴随 password unchanged 的警告。该问题常出现在以下场景:

- 系统异常断电后文件系统进入只读状态
- 误操作导致
/etc/shadow文件权限异常 - SELinux 安全上下文被破坏
/分区磁盘空间耗尽(需检查df -h)
技术原理深度分析
1. 文件系统只读挂载
当系统检测到磁盘错误时,Linux 会自动将文件系统重新挂载为只读模式。此时任何写入操作(包括密码修改)都会失败,报错信息可能不会直接提示只读状态。可通过以下命令验证:
mount | grep "\/"
# 正常应显示 rw(读写),若显示 ro(只读)则需修复
2. /etc/shadow 文件权限
该文件必须满足特定权限才能被 passwd 程序修改:
- 权限位必须为 640(
-rw-r-----) - 属主必须为 root
- 属组通常为 shadow
检查命令:
ls -l /etc/shadow
# 错误示例:-rw-rw-r-- 1 root root
# 正确示例:-rw-r----- 1 root shadow
3. SELinux 安全上下文
SELinux 会限制 passwd 进程对 shadow 文件的访问。关键上下文包括:
shadow_t:/etc/shadow 应有的类型passwd_exec_t:/usr/bin/passwd 的执行类型
验证命令:
ls -Z /etc/shadow /usr/bin/passwd
# 正常输出应包含 shadow_t 和 passwd_exec_t
三种解决方案
方案一:单用户模式修复
- 重启系统,在 GRUB 菜单按 e 进入编辑模式
- 找到
linux16行,末尾添加rd.break并按下 Ctrl+X - 进入紧急 shell 后执行:
mount -o remount,rw /sysroot # 重新挂载为读写
chroot /sysroot # 切换根目录
passwd root # 修改密码
touch /.autorelabel # 触发 SELinux 重新标记
exit # 退出 chroot
reboot # 重启系统
方案二:LiveCD 救援模式
- 使用 CentOS 安装 ISO 启动,选择 ”Troubleshooting” > “Rescue a CentOS system”
- 按提示挂载原系统到 /mnt/sysimage
- 执行修复:
chroot /mnt/sysroot
restorecon -v /etc/shadow # 修复 SELinux 上下文
chmod 600 /etc/shadow # 修正权限
passwd root # 修改密码
exit
reboot
方案三:SELinux 策略调整
临时解决方案(重启失效):
setenforce 0 # 临时禁用 SELinux
passwd root # 修改密码
setenforce 1 # 重新启用
永久解决方案:
semanage fcontext -a -t shadow_t /etc/shadow # 修复上下文
restorecon -v /etc/shadow # 立即生效
避坑指南
- 不要直接修改 shadow 文件内容,应使用
vipw命令 - 避免在磁盘空间不足时操作(先执行
df -h) - 修改权限时不要使用 777 等危险权限
- 生产环境慎用
setenforce 0
生产环境最佳实践
- 定期检查关键文件权限:
#!/bin/bash
for file in /etc/passwd /etc/shadow /etc/sudoers; do
ls -l $file | grep -q "-rw-r--r--" && echo "[WARN] $file 权限异常"
done
- 建立权限变更审计日志:
# 在 /etc/bashrc 末尾添加
alias chmod='chmod -v | tee -a /var/log/permission_change.log'
alias chown='chown -v | tee -a /var/log/permission_change.log'
- 使用自动化工具监控 SELinux 状态:
# 每日检查 SELinux 拒绝记录
audit2why -a | mail -s "SELinux Denied Report" admin@example.com
总结思考
通过本次故障排查,我们可以深入理解 Linux 权限管理的多层防护机制:
- 传统 Unix 权限(rwx)
- 文件系统挂载属性(ro/rw)
- SELinux 强制访问控制
- 文件属性(chattr +i)
建议读者动手实践:
- 创建一个新用户并观察
/etc/passwd和/etc/shadow的变化 - 尝试在 SELinux enforcing 模式下重现并解决权限问题
- 使用
audit2allow工具生成自定义 SELinux 策略模块
记住:任何权限修改都应遵循最小权限原则,并在变更后立即验证效果。
正文完
