应禁止用户通过 sudo su 或 sudo -i 切换 root,核心是限制 sudo 提权范围并关闭 root shell 授权路径:修改 /etc/sudoers 为显式白名单、禁用交互式 shell、启用 SU_WHEEL_ONLY 与 pam_wheel.so、撤销宽松配置、可选禁用 root 登录 shell。

直接禁止用户用 sudo su 或 sudo -i 切换到 root,关键不是封死 sudo 命令本身,而是控制它能执行什么——重点在于限制其提权范围,同时关闭对 root shell 的授权路径。
修改 /etc/sudoers 文件,禁用 root shell 启动
使用 visudo 安全编辑 sudo 配置,避免语法错误导致锁死权限:
- 删除或注释掉类似
%wheel ALL=(ALL:ALL) ALL或username ALL=(ALL) ALL这类无限制授权行 - 改为显式白名单,例如只允许重启服务:
username ALL=(ALL) /bin/systemctl restart nginx - 明确禁止启动交互式 shell:
Defaults !shell_noop(非必需),更有效的是在授权行中排除:username ALL=(ALL) ALL, !/bin/bash, !/bin/sh, !/bin/zsh, !/usr/bin/su, !/usr/bin/sudo -i, !/usr/bin/sudo -s
启用 SU_WHEEL_ONLY 并配合 pam_wheel.so
即使用户有 sudo 权限,也要阻断其间接调用 su 的能力:
- 编辑
/etc/pam.d/su,取消注释并确保存在:auth required pam_wheel.so use_uid - 编辑
/etc/login.defs,添加或确认:SU_WHEEL_ONLY yes - 这样即使用户能运行
sudo su,底层su也会因 PAM 检查失败而拒绝,返回su: Permission denied
撤销已有用户的 root shell 权限
检查并清理可能已存在的宽松配置:
- 运行
sudo -l -U username查看该用户实际被授予的命令列表 - 若发现
(ALL : ALL) NOPASSWD: ALL或含/bin/bash的条目,必须删除 - 避免使用
ALL通配符;优先用具体命令路径 + 参数约束(如/usr/sbin/useradd -m *) - 对运维人员,建议用
sudo -u someadmin command代替切换 root,实现职责分离
可选:禁用 root 的交互式登录 Shell
从源头削弱 root 账户的可用性:
- 运行
sudo usermod -s /usr/sbin/nologin root(或/bin/false) - 这不会影响
sudo执行命令,但会使sudo -i、sudo su -等尝试启动 root shell 失败 - 注意:某些系统服务依赖 root 的合法 shell,修改前建议测试关键任务是否受影响


















