通过Cmnd_Alias定义安全命令白名单并配合!否定语法,可精准拦截高权限用户间接提权路径;需用绝对路径、置于secure_path内,否定规则须与白名单同授权行,避免单独写入或混入别名,并优先放置严格规则文件以确保生效。

用 Cmnd_Alias 配合 ! 否定语法,可以精准拦截高权限用户通过间接命令提权的路径,而不是粗暴禁用整个用户或组。
定义安全命令白名单
先明确哪些命令是允许执行的,其余一律禁止。比如运维只需查日志、重启服务、查看进程:
- 在
/etc/sudoers.d/10-safe-cmds中定义别名:Cmnd_Alias SAFE = /usr/bin/journalctl, /usr/bin/systemctl restart *, /bin/ps - 注意:通配符
*仅限于参数位置(如restart nginx),不能用于路径前段(如/usr/bin/*是危险且通常被拒绝的) - 所有命令必须写绝对路径,且确保在
secure_path范围内,否则即使配置正确也会失败
用叹号显式排除危险跳转入口
仅靠白名单还不够——某些看似无害的命令能启动交互式 shell 或加载任意代码,成为逃逸通道:
- 明确禁止:
!/bin/sh, !/bin/bash, !/usr/bin/python3 -c *, !/usr/bin/perl -e *, !/usr/bin/less, !/usr/bin/vi, !/usr/bin/nano - 特别注意
less和vi:它们在运行时按v或!可直接调用 shell,属于经典逃逸点 - 否定规则必须和白名单出现在同一行授权中,例如:
alice ALL=(root) NOPASSWD: SAFE, !/bin/bash, !/usr/bin/python3 -c *
防止别名被绕过的关键细节
别名本身不带逻辑判断,错误写法会让否定失效:
- 不能把否定单独写成一行,如:
alice ALL=(root) !/bin/bash—— 这条不会生效,因为没绑定到具体授权上下文 - 避免在别名里混用肯定与否定,
Cmnd_Alias DANGEROUS = !/bin/sh是非法语法,!只能在命令列表中使用 - 若用户同时匹配多条规则,以最先命中的为准;把带否定的严格规则放在
/etc/sudoers.d/的靠前文件中(如05-restrict.conf),防止被后面宽松规则覆盖
验证是否真正封死跳转路径
配置不是写完就结束,必须实测关键逃逸场景:
- 切换到目标用户,运行
sudo -l,确认输出中不出现/bin/bash等被禁命令,且否定项清晰列出 - 手动尝试:
sudo /usr/bin/python3 -c "import os; os.system('/bin/bash')"应直接报错“not allowed” - 检查日志:
sudo grep 'python3.*-c' /var/log/sudo.log,确认有拒绝记录而非静默失败 - 对
less /var/log/syslog按!后输入sh,应被中断并退出,而非获得 shell 提示符

















