防止sudo提权的关键是严格控制可执行命令、阻断shell逃逸与编辑器提权路径,并最小化权限范围;需精简sudoers配置、禁用交互式shell、启用NOEXEC/log_input输出、使用sudoedit、限制find/awk等危险命令参数,结合noexec插件、systemd安全选项及auditd监控。

防止通过 sudo 提权的关键,不是禁用 sudo 本身,而是严格控制哪些命令能被提权执行、阻断常见逃逸路径(如 shell 转义、编辑器内执行命令),并最小化用户权限范围。
精简 sudoers 配置:只允许可信命令
默认的 %sudo ALL=(ALL:ALL) ALL 是最大风险来源。应显式列出允许的命令,禁用通配符和 shell 元字符:
- 用
NOPASSWD仅限无交互、无子shell 的命令,例如:alice ALL=(root) NOPASSWD: /bin/systemctl restart nginx, /usr/bin/journalctl -u nginx - 禁止使用
sudo sh、sudo bash、sudo python3 -c "import os; os.system('/bin/sh')"等方式启动 shell;在 sudoers 中添加Defaults !shell_noop并配合! /bin/sh, ! /bin/bash, ! /usr/bin/python*显式拒绝 - 启用
Defaults log_input, log_output记录所有命令输入输出,便于审计异常行为
封堵编辑器提权路径(vim/less/nano)
很多编辑器(如 vim)支持 :!sh 或 :set shell=/bin/sh | :shell 直接获得 root shell。限制方法如下:
- 对需要
sudo编辑的配置文件,改用sudoedit(即sudo -e):它会复制文件到临时目录,以普通用户身份打开编辑器,保存后才以 root 权限覆盖原文件——此时编辑器运行在非特权上下文中,无法提权 - 在 sudoers 中为编辑器设置
NOEXEC标志:alice ALL=(root) NOEXEC: /usr/bin/vim /etc/nginx/nginx.conf
这会阻止 vim 内部执行外部命令(但需确保系统 vim 编译时启用了+job和+terminal以外的禁用项) - 替换高危编辑器:生产环境避免授予
sudo vim或sudo nano;改用更安全的sudoedit或自定义 wrapper 脚本校验目标路径白名单
禁用交互式 shell 启动与命令注入
即使限制了编辑器,攻击者仍可能通过 sudo find /tmp -exec sh \;、sudo awk 'BEGIN {system("/bin/sh")}' 等方式绕过。应对策略包括:
- 在 sudoers 中全局禁用危险命令:
Defaults env_delete += "PATH" # 清除 PATH 防止调用非常规二进制Defaults !env_reset, !requiretty(谨慎启用,仅当明确需要) - 用
sudo -l定期检查用户实际可用命令,发现未授权的find、awk、perl、gdb等应立即移除 - 对必须使用的命令加参数白名单,例如:
bob ALL=(root) /usr/bin/find /var/log -name "*.log" -mtime +7 -delete
禁止带-exec、-ok等可执行选项的用法
补充加固措施:权限隔离与监控
单靠 sudo 配置不够,需结合系统级防护:
- 启用
sudo的noexec插件(Linux PAM 模块),拦截动态链接库加载和 execve 调用,大幅增加逃逸难度 - 将敏感服务(如数据库、Web 服务)运行在专用系统用户下,避免 root 直接管理;用 systemd 的
RestrictSUIDSGID=、NoNewPrivileges=等指令限制进程提权能力 - 部署 auditd 或 eBPF 工具(如 tracee)监控
execve调用,对非白名单路径的 root 权限 shell 启动实时告警

















