必须同时配置PAM的pam_wheel.so、锁定root密码、并使用su -测试,三者缺一不可:编辑/etc/pam.d/su启用use_uid参数,将用户加入wheel组后重新登录,再执行sudo passwd -l root,最后用su -验证。

只让 wheel 组成员能 su - 切到 root,不是加个组就完事——必须配 pam_wheel.so、锁死 root 密码、且区分 su 和 su - 的行为差异,三者缺一不可。
确认并启用 /etc/pam.d/su 中的 pam_wheel.so
系统不会自动启用 wheel 白名单,得手动打开开关:
- 编辑
/etc/pam.d/su,找到或添加这行(放在pam_rootok.so之后、pam_unix.so之前更稳妥):auth required pam_wheel.so use_uid -
use_uid是关键:它用调用者的真实 UID 判断是否属wheel,防止通过 setuid 程序绕过 - 别用
trust参数——它会让wheel成员免密,违背最小权限原则,生产环境禁用 - Ubuntu/Debian 默认不带
wheel组,需先sudo groupadd wheel;RHEL/CentOS 通常已存在
把用户加入 wheel 组并验证生效
加组只是第一步,权限不会热加载:
- 执行
sudo usermod -aG wheel username(-aG确保不覆盖原有组) - 立即验证:
id -nG username应输出含wheel;若无,说明未生效 - 必须重新登录或启动新 shell(如
exec bash),否则groups仍看不到wheel - 注意:
usermod -g wheel(小写 g)是设主组,会清空其他组,错误;必须用-G(大写)追加
必须锁定 root 密码,否则 pam_wheel 形同虚设
pam_wheel 只控制“谁可以尝试”,不阻止暴力试错——只要 root 密码有效,本地终端仍可能被爆破:
- 执行
sudo passwd -l root,它会在/etc/shadow中root行第二字段加!前缀 - 验证:
sudo grep '^root:' /etc/shadow输出应类似root:!$6$... - 此时非
wheel用户执行su -直接报Authentication failure;wheel成员仍可输自己密码继续(因为pam_wheel放行后,后续认证走的是他们自己的密码) - 该操作不影响
sudo,也不影响 SSH 密钥登录
务必用 su - 测试,su username 不触发 wheel 检查
这是最常踩的坑:很多人用 su root 测试成功,误以为配置生效,其实它根本没走 pam_wheel 校验:
-
su(不带-)默认不模拟完整登录,多数发行版下pam_wheel不介入 -
su -或su -l才强制加载目标用户环境,并触发pam_wheel的auth阶段 - 测试时一律用
su -,且观察日志:sudo tail -f /var/log/auth.log或journalctl -u systemd-logind -f,能看到pam_wheel的 accept/reject 记录 - 若需统一限制所有
su形式,可在/etc/pam.d/su顶部加两行:auth [success=ignore default=bad] pam_wheel.so use_uid+auth required pam_wheel.so use_uid,但实际中不推荐过度复杂化
真正起作用的是 PAM 规则 + 组权限 + root 账户状态三者的组合;漏掉任意一环,比如只加组不锁 root 密码,或只改 su 不测 su -,都会让限制失效。安全配置没有“差不多”,只有“全对”或“全错”。


















