最干净的做法是确认并删掉用户在/etc/sudoers或/etc/sudoers.d/下的所有授权行;若需保留部分权限则用!否定高危命令;还需配合/etc/cron.deny、passwd -l和nologin shell实现多重拦截。

直接移除用户在 /etc/sudoers 中的授权行
只要用户没出现在 /etc/sudoers 或 /etc/sudoers.d/ 下任何文件里,就默认无 sudo 权限。最干净的做法是确认并删掉其授权行。
用 visudo 打开主配置文件,或检查 /etc/sudoers.d/ 下所有文件:
sudo grep -r "username" /etc/sudoers /etc/sudoers.d/- 找到匹配行(如
username ALL=(ALL:ALL) ALL或属于某 User_Alias 的定义) - 整行删除或加
#注释 - 保存退出 ——
visudo会自动语法校验,避免锁死 sudo
用 ! 否定特定命令,保留其他权限
如果该用户还需执行部分命令(比如 systemctl restart nginx),但必须禁用 sudo su、sudo -i、sudo crontab 等高危操作,就得靠否定规则。
在 /etc/sudoers 中添加类似这样的行:
-
username ALL=(ALL:ALL) ALL, !/usr/bin/su, !/usr/bin/bash, !/usr/bin/sh, !/usr/bin/zsh(防 shell 切换) -
username ALL=(ALL:ALL) ALL, !/usr/bin/crontab(禁用定时任务) -
username ALL=(ALL:ALL) ALL, !/usr/bin/visudo, !/bin/mount, !/sbin/reboot(按需补充)
注意:! 后必须写绝对路径;通配符(如 !/usr/bin/*)极不安全,容易被绕过,严禁使用。
配合 /etc/cron.deny 和 passwd -l 做双重拦截
仅靠 sudo 限制不够——用户可能绕过 sudo,直接调用 crontab -e(如果权限允许),或用其他方式提权。必须补上系统级限制:
- 把用户名写入
/etc/cron.deny:echo "username" | sudo tee -a /etc/cron.deny - 锁定其密码防止本地登录后提权:
sudo passwd -l username - 设为不可登录 shell(可选):
sudo usermod -s /sbin/nologin username
这三步叠加后,即使用户拿到终端,也无法新建定时任务、无法 su 切换、无法交互式登录 root shell。
验证时别只测 sudo -l
sudo -l -U username 只显示 sudoers 允许什么,不反映 /etc/cron.deny 或 shell 锁定状态。真实验证要模拟用户行为:
-
sudo -u username bash -c 'sudo su -c id'(应报 permission denied) -
sudo -u username crontab -e(应提示 “you are not authorized to use cron”) -
sudo -u username bash -c 'sudo -i'(应拒绝,且passwd -S username应显示LK)
最容易被忽略的是:用户仍可能通过写入 /etc/sudoers.d/ 下新文件、或利用已有漏洞执行任意命令。真正禁用 sudo 不是“删一行”,而是“断路径 + 锁账户 + 审日志”。


















