核心是路径锁定、参数收束、环境净化三步闭环:只允许可信命令的绝对路径与固定参数,剔除bash/sh/vim/python等高危命令,启用env_reset与secure_path,并通过sudo -l和实测验证。

要利用 sudo 的 NOPASSWD 限制高危命令执行,核心不是“放开再堵”,而是从配置源头就排除风险路径——只显式允许安全子集,其余全部默认拒绝。关键在路径锁定、参数收束、环境净化三步闭环。
只允许可信命令的绝对路径+固定参数
高危命令(如 find、vim、python)本身不危险,危险在于它们能加载任意文件或启动 shell。必须禁止自由参数,只放行明确用途的组合:
- ✅ 安全写法:
Cmnd_Alias SAFE_FIND = /usr/bin/find /var/www -type f -name "*.log" -mtime -7(限定目录、类型、名称、时间) - ❌ 危险写法:
/usr/bin/find /var/www -exec /bin/sh \;或/usr/bin/find / -name "flag"(未限定范围,可越界) - 用
which find和ls -l $(which find)确认真实路径,避免符号链接绕过
禁用所有可能触发 shell 的命令入口
以下命令即使加了 NOPASSWD,也应彻底从白名单中剔除,不给任何参数组合机会:
-
/bin/bash、/bin/sh、/bin/dash、/usr/bin/zsh -
/usr/bin/sudo(防止嵌套提权)、/usr/bin/su、/usr/bin/doas -
/usr/bin/vim、/usr/bin/nano、/usr/bin/less(可通过!或:shell启动子 shell) -
/usr/bin/python*、/usr/bin/perl、/usr/bin/ruby(可直接os.system("sh"))
强制环境重置与安全路径隔离
攻击者常通过污染 PATH、SHELL、PYTHONPATH 等变量绕过限制。需在 /etc/sudoers 顶部统一加固:
- 启用
Defaults env_reset清空用户环境 - 显式设置
Defaults secure_path="/usr/local/bin:/usr/bin:/bin",排除/home或/tmp等可写路径 - 如需保留语言变量,仅追加:
Defaults env_keep += "LANG LC_*"
验证是否真正生效
改完配置后,切勿跳过实测。以目标用户身份执行:
-
sudo -l:确认只列出你定义的那几条命令,无多余项 -
sudo /usr/bin/find /tmp -exec /bin/sh \;:应明确报错command not allowed -
sudo /bin/bash:应提示command not found或权限拒绝 - 检查
/var/log/auth.log,确认非法尝试有完整记录(含源 IP、时间、命令)










