最稳妥方式是确保用户既不在sudo/wheel组中,也未被/etc/sudoers或/etc/sudoers.d/中任何规则显式授权,且无通配规则意外匹配;验证时sudo -v应提示“not in the sudoers file”。

直接禁止特定用户使用 sudo,最稳妥的方式不是删配置、改权限或锁账户,而是从 /etc/sudoers 的授权逻辑中“不给入口”——即不为其添加任何规则,同时确保其**不属于任何被显式授权的组**(如 sudo 或 wheel),并清除可能存在的隐式匹配。
确认用户未被任何 sudo 组包含
大多数发行版默认只允许特定组成员使用 sudo:
- Debian/Ubuntu 系统:检查是否在
sudo组中:groups username—— 若输出含sudo,则已具备基础 sudo 权限; - RHEL/CentOS/Fedora 系统:检查是否在
wheel组中:getent group wheel | grep username; - 若用户确实在上述任一组中,移出即可:
sudo gpasswd -d username sudo(Ubuntu)
或sudo gpasswd -d username wheel(RHEL系)。
检查 /etc/sudoers 及 /etc/sudoers.d/ 下是否有显式授权
即使不在系统组中,仍可能被单独授权。用以下命令查看该用户实际生效的规则:
sudo -l -U username
若返回类似 Matching Defaults entries... 后列出命令,则说明有明确配置。此时需定位来源:
- 主配置:
sudo visudo,搜索username或%groupname; - 子配置:
ls -l /etc/sudoers.d/,检查所有.conf文件(注意:含.或~的文件名会被忽略); - 删除或注释掉对应行,例如:
# username ALL=(ALL:ALL) ALL或# %devteam ALL=(ALL) /bin/ls。
防止被通配规则意外覆盖
sudoers 按顺序匹配,一旦命中即停止。常见陷阱是顶部存在宽泛规则,如:
%sudo ALL=(ALL:ALL) ALL
若用户属于 sudo 组,这条就会生效,后续更严格的限制(如 !rm)根本不会执行。因此:
- 确保用户**既不在授权组中,也没有个人条目**;
- 避免在 sudoers 中写
ALL类通配符授权给非必要用户; - 如需全局限制,可在文件开头加一条拒绝规则(需谨慎):
Defaults:username !authenticate(禁用密码验证,但不阻止命令执行)
更有效的是:username ALL=(ALL) NOPASSWD: /bin/true+!ALL,但实际中极少需要——只要没授权,就默认无权。
验证与兜底措施
完成清理后,切换到目标用户执行:
sudo -v
预期结果是提示:username is not in the sudoers file. This incident will be reported.
此时该用户运行任何 sudo 命令都会被拒绝,且操作会被记录在 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL系)中。
无需修改 shell、禁用密码或调整文件权限——这些属于过度干预,反而可能影响 cron、systemd 用户服务等正常行为。


















