910B裸金属服务器普通用户密码修改失败问题排查与解决记录

一、问题现象

  • 在 Ubuntu 22.04(鲲鹏 910B 裸金属服务器)上,以 root 身份执行:
echo 'devops:Nz6jZbSCnH7!' | sudo chpasswd

  返回错误:

chpasswd: (user devops) pam_chauthtok() failed, error:
Authentication token manipulation error
chpasswd: (line 1, user devops) password not changed
  • 使用 passwd devops 同样失败,且出现交互提示:
Current Kerberos password:

二、环境信息

  • 操作系统:Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-91-generic aarch64)

  • 用户:devops(UID=1003,本地用户,已加入 wheel 组)

  • 目标密码:Nz6jZbSCnH7!

三、排查过程

1. 确认用户状态与基本文件权限

id devops                     # uid=1003(devops) gid=1005(devops)
ls -la /etc/shadow*           # 权限正常(-rw-r----- 1 root shadow)
passwd devops                 # 出现 Kerberos 提示,后报错

 

2. 检查 /etc/shadow 与文件属性

grep ^devops: /etc/shadow     # 显示正常哈希,无锁定前缀(! 或 *)
lsattr /etc/shadow            # 仅 e 属性,无不可变锁

 

3. 搜索 PAM 中 Kerberos 模块引用

grep -Rn "pam_krb5.so" /etc/pam.d/

发现以下文件包含未注释的 Kerberos 模块:

  • common-account

  • common-password

  • common-auth

  • common-session

  • common-session-noninteractive

4. 逐步注释 Kerberos 相关行

sed -i 's/^\(.*pam_krb5.so.*\)/# \1/' /etc/pam.d/common-account
sed -i 's/^\(.*pam_krb5.so.*\)/# \1/' /etc/pam.d/common-password
sed -i 's/^\(.*pam_krb5.so.*\)/# \1/' /etc/pam.d/common-auth
sed -i 's/^\(.*pam_krb5.so.*\)/# \1/' /etc/pam.d/common-session
sed -i 's/^\(.*pam_krb5.so.*\)/# \1/' /etc/pam.d/common-session-noninteractive

但问题依旧存在,且/var/log/auth.log中没有相关日志。

5. 开启debug检查日志,定位具体错误

修改 /etc/pam.d/common-password 文件开启debug日志

# vim /etc/pam.d/common-password

# 在这一行末尾加上 debug
password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt debug

保存退出,继续执行 passwd devops ,查看日志

root@ainode-003:/etc/pam.d# journalctl -xe | grep -i passwd
Aug 31 08:58:41 ainode-003 sudo[3447957]:     root : TTY=pts/0 ; PWD=/root ; USER=root ; COMMAND=/usr/sbin/chpasswd
Aug 31 09:34:07 ainode-003 passwd[3548718]: pam_unix(passwd:chauthtok): username [devops] obtained
Aug 31 09:34:07 ainode-003 passwd[3548718]: pam_unix(passwd:chauthtok): username [devops] obtained
Aug 31 09:34:07 ainode-003 passwd[3548718]: pam_unix(passwd:chauthtok): password - new password not obtained

 提示密码没有获取到

表明 pam_unix.so 在 chauthtok 阶段未能获取到新密码,原因是其依赖的 auth 模块(原本是 Kerberos)没有提供密码令牌。

6. 检查 common-password 中 pam_unix.so 配置

当前配置为:

text
password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt
  • use_authtok:强制使用前一个模块(如 Kerberos)设置的密码令牌,不提供则失败。

  • try_first_pass:尝试使用之前模块的密码,若没有则回退到交互输入,但与 use_authtok 结合时,若无令牌则直接失败。

因为 Kerberos 已被注释,auth 栈未提供令牌,导致 pam_unix 无法获得新密码,从而报错。

四、最终解决方案

修改 /etc/pam.d/common-password

将 pam_unix.so 行中的 use_authtok 和 try_first_pass 选项移除,让 pam_unix 直接通过交互方式读取新密码。

修改后为:

password [success=1 default=ignore] pam_unix.so obscure yescrypt

(保留 obscure 和 yescrypt 以保持密码复杂度和加密方式)

验证

passwd devops

系统直接提示输入新密码,两次输入后成功修改,无任何错误。

posted @ 2026-08-31 10:36  高佳丰  阅读(29)  评论(0)    收藏  举报