应使用 sudoedit 替代 sudo vi,因其以普通用户身份编辑临时文件,保存后由 sudo 以 root 覆盖原文件,全程无 root shell;需在 /etc/sudoers 中授权 sudoedit、禁用 vi/vim 等高危命令,并启用 noexec、日志审计等加固措施。

防止研发人员通过 sudo vi 等命令利用编辑器内置 shell 功能(如 :!sh、:set shell=/bin/sh)逃逸提权,核心不是禁止 vi,而是切断 root 权限下编辑器执行任意命令的能力。关键在于让编辑行为始终运行在非特权上下文中,同时阻断所有已知逃逸路径。
用 sudoedit 替代 sudo vi
sudo vi /etc/hosts 是高危操作:vi 以 root 身份运行,:! 可直接 spawn root shell,绕过 sudo 命令白名单。sudoedit /etc/hosts 安全得多:它由 sudo 复制文件到临时目录(权限 0600),再以普通用户身份调用 $EDITOR 编辑,保存后 sudo 才以 root 覆盖原文件——全程无 root shell、无交互式命令执行能力。
- ✅ 在
/etc/sudoers中统一授权sudoedit,禁用sudo vi:devteam ALL=(root) NOPASSWD: sudoedit /etc/nginx/*.conf, sudoedit /etc/systemd/system/*.service
- ✅ 强制指定安全编辑器(避免用户设
EDITOR=vim后启用危险插件):devteam ALL=(root) EDITOR=/usr/bin/nano sudoedit /etc/hosts
- ✅ 检查当前可用权限:
sudo -l -U devuser,确认输出中不含vi、vim、nano --help等可滥用命令。
对编辑器本身做运行时限制
即使用了 sudoedit,若用户编辑器配置不当(如 vim 中 set shell=/bin/bash),仍可能带来风险。需从系统层面加固:
-
在
/etc/sudoers中为编辑器启用NOEXEC(需 vim 编译支持):devteam ALL=(root) NOEXEC: /usr/bin/vim.basic /etc/nginx/*.conf
这会禁用
:!、:shell等子进程调用功能(但不阻止:w !sudo tee %类间接逃逸,故仍推荐优先用sudoedit)。 -
生产环境禁用完整版 vim,改用精简版:
# Debian/Ubuntu apt-get install vim-tiny && update-alternatives --config editor
vim.tiny默认不编译+job、+terminal特性,天然无法执行外部命令。
封堵其他编辑器类逃逸入口
less、nano、man、git 等工具同样支持 shell 调用:
-
less中按!sh、man中按!bash、git中git help !sh都可能触发提权。
解决方案是全局禁用交互式 shell 启动:Defaults requiretty Defaults env_delete += "SHELL PATH LD_PRELOAD" Defaults !env_reset
并显式拒绝高危命令:
Cmnd_Alias EDITOR_ESCAPES = \ /bin/sh, /bin/bash, /usr/bin/python3 -c *, \ /usr/bin/less *, /usr/bin/man *, /usr/bin/git help * %devteam ALL=(ALL) !EDITOR_ESCAPES
日志与审计必须跟上
没有记录的防护等于没防护:
-
启用输入输出日志:
Defaults log_input, log_output Defaults iolog_dir=/var/log/sudo-io
所有
sudoedit的文件读写、命令执行都会被录制,便于回溯是否有人尝试:r !id或:w !curl ...。 -
每周运行一次检查:
sudo -l -U devuser | grep -E "(vi|vim|less|nano|git)"
发现未授权的编辑器路径立即清理。
不复杂但容易忽略。











