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
系统直接提示输入新密码,两次输入后成功修改,无任何错误。

浙公网安备 33010602011771号