背景

在使用 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

通过这些排查和修复步骤,问题终于得以解决。如果你遇到类似问题,按照这个流程逐步排查,也许能帮助你解决问题。