必须将 auth required pam_wheel.so use_uid 置于 /etc/pam.d/su 的 auth 段最顶部,配合 /etc/login.defs 中 SU_WHEEL_ONLY yes 及真实存在的 wheel 组,三者缺一不可。

怎么在 /etc/pam.d/su 里启用 pam_wheel.so 且不被绕过
必须把 auth required pam_wheel.so use_uid 这行加在 /etc/pam.d/su 的 最顶部 auth 段开头,否则可能被后续的 pam_rootok.so 或其他 sufficient 规则提前放行。很多用户改完没效果,就是这行写在了 auth [success=ignore default=bad] pam_wheel.so ... 后面,或者误塞进了 account 段。
常见错误配置:
- 写成
auth [success=ok default=bad] pam_wheel.so use_uid—— 这种写法逻辑反了,default=bad会让非 wheel 用户直接失败,但success=ok又不保证后续流程继续,实际行为不稳定 - 漏掉
use_uid参数 —— 不加这个,模块会按初始 UID(euid)判断组成员,普通用户 su 时 euid 是自己的,但实际执行时已切换权限,容易误判 - 只注释掉
# auth sufficient pam_wheel.so trust use_uid而没启用required行 —— “取消注释”不等于“启用”,得确认是auth required开头,不是sufficient或requisite
为什么改完后 su - 提示 Permission denied 而不是 Authentication failure
这是限制生效的明确信号:Permission denied 表示 PAM 已拦截请求,根本没走到密码验证环节;而 Authentication failure 才是密码错或 root 密码被锁导致的。说明你配置对了,但当前用户不在 wheel 组。
验证步骤:
- 用
id -nG看当前用户所属组,确认含wheel - 检查
/etc/group是否真有wheel:x:10:这行(有些精简系统默认不建该组) - 刚执行
usermod -aG wheel username后,必须新开 shell 或重新登录才生效,SSH 会话里newgrp wheel无效 - 查日志:
grep "pam_wheel" /var/log/secure,能看到类似su: pam_wheel(su:auth): user 'alice' not in group 'wheel'
su 和 su - 对 pam_wheel 的触发差异必须统一处理
pam_wheel.so 默认只对 su -(即登录式 shell)强制校验;su(不带 -)可能跳过检查,尤其在某些发行版(如旧版 Debian)中。这意味着仅靠一行 auth required pam_wheel.so use_uid 无法完全封死提权路径。
稳妥做法是加两行:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
auth [success=ignore default=bad] pam_wheel.so use_uid auth required pam_wheel.so use_uid
第一行先做快速判断:非 wheel 用户直接标记为 bad;第二行再走标准 required 流程。这样无论用户输 su 还是 su -,只要目标是 root,都会被拦住。注意:这两行必须都在 auth 段,且位于 pam_rootok.so 之前。
/etc/login.defs 中 SU_WHEEL_ONLY yes 是必要兜底项
某些发行版(RHEL/CentOS 系列)会优先读取 /etc/login.defs 中的 SU_WHEEL_ONLY 标志,即使 PAM 配置正确,若这里没设,su 仍可能 fallback 到宽松模式。
正确写法只有这一种:
echo "SU_WHEEL_ONLY yes" >> /etc/login.defs
不能带等号、空格、引号,也不能写成 SU_WHEEL_ONLY = yes。该设置只影响 su 命令,不影响 sudo 或 su -c。改完无需重启任何服务,立即生效。
真正容易被忽略的是:use_uid 参数和 SU_WHEEL_ONLY 必须同时存在,缺一不可;而 wheel 组本身必须真实存在且用户已加入——这三个点任一出错,限制就形同虚设。

















