最有效通用做法是启用wheel组并配置pam策略:创建wheel组(如不存在)、将授权用户加入该组、在/etc/pam.d/su中添加auth required pam_wheel.so use_uid,并锁定root密码以彻底阻断su路径。

要防止普通用户随意用 su 切换到 root,最有效、最通用的做法是启用 wheel 组并配合 PAM 策略——不是删命令、改权限或靠密码强度,而是从认证源头控制谁有资格尝试。
确认并创建wheel组
多数 RHEL/CentOS/Fedora 系统已预置 wheel 组;Ubuntu/Debian 默认不用它,需手动建立:
- 检查是否存在:
getent group wheel,无输出则运行sudo groupadd wheel - 把授权用户加入该组:
sudo usermod -aG wheel username - 新组权限需重新登录 shell 才生效,可用
groups命令验证是否含wheel
配置PAM强制wheel校验
编辑 /etc/pam.d/su,在 auth 段顶部附近添加(或取消注释)这一行:
-
auth required pam_wheel.so use_uid:表示只有 wheel 组成员才能执行su(包括su -) - 若只想允许 su 到 root(不许 su 到其他普通用户),改用:
auth required pam_wheel.so group=wheel - 顺序很重要:这行应放在
pam_rootok.so之后、pam_unix.so之前,否则可能被绕过
加固root账户防止绕过
即使加了 wheel 限制,只要 root 密码还有效,物理终端或 console 下仍可能被暴力尝试。建议同步锁定:
- 执行
sudo passwd -l root,它会在/etc/shadow中 root 行密码字段前加! - 验证:
sudo grep '^root:' /etc/shadow输出第二字段应以!开头 - 此时
su -对所有用户均返回Authentication failure,彻底阻断密码路径
搭配sudo替代并审计操作
限制 su 不等于放弃提权能力,而是转向更可控、可记录的方式:
- 用
sudo visudo编辑 sudoers,取消注释:%wheel ALL=(ALL) ALL - 用户改用
sudo command,每次调用自动记入/var/log/secure或journalctl -t sudo - 如需更细粒度控制,可限定命令路径,例如:
%wheel ALL=(root) /usr/bin/systemctl restart nginx











