普通用户执行passwd修改他人密码报“Authentication token manipulation error”,根本原因是passwd默认仅允许修改自身密码,通过校验UID是否匹配实现;二级管理员需通过sudoers精确授权指定passwd命令路径及参数才能安全操作。
为什么 passwd 直接报 “Authentication token manipulation error”
普通用户执行 passwd 修改他人密码时,即使输入了正确当前密码,也会遇到这个错误。根本原因不是权限不够,而是 passwd 默认只允许修改自己的密码——它会校验调用者 uid 是否等于目标用户 uid。二级管理员没有绕过该检查的默认能力。
- 该限制由 PAM 模块
pam_unix.so的use_authtok或try_first_pass行为控制,不是 Linux 内核级限制 - 直接
sudo passwd username之所以能成功,是因为sudo提升的是整个命令的执行权限,passwd在 root 下跳过了 UID 校验逻辑 - 但这样不等于“授权”,只是临时提权;真要让二级管理员长期、安全地操作,必须配置细粒度的 sudo 权限
如何用 sudoers 精确授权修改指定账号密码
不能给二级管理员无限制的 sudo su - 或全命令 ALL 权限,否则等同于交出 root。正确做法是限定其只能运行特定参数组合的 passwd 命令。
- 编辑
/etc/sudoers必须用sudo visudo,避免语法错误锁死系统 - 添加类似这一行:
%secadmin ALL=(root) /usr/bin/passwd [a-zA-Z0-9_-]+—— 注意这里用正则匹配用户名(部分系统支持,但更稳妥的是列出白名单) - 生产环境推荐显式白名单:
%secadmin ALL=(root) /usr/bin/passwd user1, /usr/bin/passwd user2, /usr/bin/passwd user3 - 务必禁用交互式 shell:不要加
NOPASSWD: ALL,而应保留密码提示(除非策略明确允许),且避免写成NOPASSWD: /usr/bin/passwd这种无参数限制的形式
passwd 命令在 sudo 下的参数陷阱
看似简单的一条命令,参数顺序和存在与否会决定是否被 sudoers 规则匹配。规则不匹配,就会 fallback 到拒绝。
-
sudo passwd user1匹配/usr/bin/passwd user1;但sudo passwd -u user1(解锁账户)就不匹配,除非你在 sudoers 里显式加上-u参数 - 某些发行版(如 RHEL/CentOS)的
passwd路径是/usr/bin/passwd,Debian/Ubuntu 也是,但自定义系统可能不同,用which passwd确认 - 不要依赖
passwd --stdin(常见于脚本批量改密):该选项在多数发行版默认禁用,且需额外开启 PAM 支持,sudoers 中也必须单独放行 - 如果二级管理员需要重置密码并强制首次登录修改,得额外授权
chage:/usr/bin/chage -d 0 username
二级管理员执行时仍被拒绝?检查这三处
配置完 sudoers 后仍失败,大概率不是语法错,而是权限链中某个环节没对上。
- 确认用户确实属于
secadmin组:groups $USER,组名大小写、空格、拼写必须完全一致 - 检查
passwd是否被 alias 或 wrapper 覆盖:type passwd,输出应为passwd is /usr/bin/passwd,而非alias或function - PAM 日志往往比 sudo 日志更准:查
/var/log/secure或/var/log/auth.log,搜索passwd和对应用户名,看是 sudo 拒绝还是 PAM 拒绝(后者说明规则匹配了但 PAM 层拦住了)
真正麻烦的从来不是加一行 sudoers,而是让那个「指定用户只能改那几个账号密码」的边界,在命令行参数、PAM 配置、路径一致性之间严丝合缝。漏掉任意一环,都会变成“看起来配好了,但就是不行”。

















