背景
在使用 Debian 12 (bookworm) 系统时,我遇到了一个奇怪的问题:尝试通过 passwd
命令修改 root 用户的密码时,系统返回错误信息:
passwd: Permission denied
passwd: password unchanged
随着问题的深入排查,我发现问题的根本原因与 PAM 配置文件的损坏有关。以下是详细的排查和解决过程。
问题分析与解决过程
1. 切换到 root 用户并执行 passwd
命令时遇到错误
我切换到 root 用户并尝试修改 root 密码:
su
然而,执行该命令时,系统返回了以下错误:
su: Permission denied
这让我意识到,系统可能存在某些权限或配置问题,导致无法切换到 root 用户。于是,我尝试使用 sudo
来进行操作:
sudo -u deloz
但 sudo
命令也给出了以下错误提示:
usage: sudo -h | -K | -k | -V
usage: sudo -v [-ABkNnS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-ABkNnS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command [arg ...]]
这表明 sudo
命令并未按预期工作,似乎系统配置有误。
2. 尝试直接以 root 用户执行 passwd
命令
接着,我使用 sudo -i
切换到 root 用户,并尝试修改密码:
sudo -i
passwd
然而,执行 passwd
命令时,系统返回了如下错误信息:
passwd: Permission denied
passwd: password unchanged
此时,我开始怀疑问题可能与文件权限或者 PAM 配置文件有关。
3. 排查 /etc/shadow
文件的权限
我检查了 /etc/shadow
文件的内容,确保 root 用户的密码没有异常。通过以下命令查看文件内容:
sudo grep root /etc/shadow
输出如下:
root:$y$j9T$TnjnE3m76jvAkPmwZbGzm0$CvX83f1PFJq1Cu6v7epTgco/2x1/jeDneeiA0eR1nZ2:19975:0:99999:7:::
从文件内容来看,root 用户的密码条目没有异常。
4. 检查 AppArmor 配置
为了排查是否是 AppArmor 安全模块导致的问题,我运行了以下命令,查看系统的 AppArmor 状态:
sudo aa-status
输出表明 AppArmor 正常加载,并且没有启用任何限制措施来阻止 passwd
命令的执行:
apparmor module is loaded.
26 profiles are loaded.
24 profiles are in enforce mode.
...
5. 检查 PAM 配置文件
接下来,我检查了与 passwd
命令相关的 PAM 配置文件,首先查看了 /etc/pam.d/passwd
文件内容:
cat /etc/pam.d/passwd
文件内容如下:
@include common-password
然后,我查看了 common-password
配置文件:
cat /etc/pam.d/common-password
这时,我发现文件内容出现了乱码,看起来配置文件已经损坏:
���kT)��D
���3�i��D=�P��?Qxߓȃ����>S��%� Y6�
...
6. 修复 PAM 配置文件
由于 common-password
文件损坏,我决定手动恢复该文件的默认配置。我首先备份了损坏的文件:
sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.bak
然后,使用标准的 PAM 配置文件内容替换了它:
sudo tee /etc/pam.d/common-password <<EOF
#
# /etc/pam.d/common-password - password-related modules common to all services
#
password [success=1 default=ignore] pam_unix.so obscure yescrypt
password requisite pam_deny.so
password required pam_permit.so
password optional pam_gnome_keyring.so
EOF
7. 测试密码修改功能
配置文件修复后,我再次尝试执行 passwd
命令:
sudo passwd
这次,系统成功提示我输入并确认新密码:
New password:
Retype new password:
passwd: password updated successfully
通过这些排查和修复步骤,问题终于得以解决。如果你遇到类似问题,按照这个流程逐步排查,也许能帮助你解决问题。