必须用白名单方式禁止sudo命令带通配符参数,因sudoers只匹配完整命令字符串;应使用绝对路径+固定参数,通过Cmnd_Alias显式列出所有合法组合,并添加拒绝规则拦截高危模式,最后审计验证。

不能让命令带危险通配符参数,关键不是“过滤掉”它们,而是从授权源头就禁止这类用法——sudoers 本身不支持参数级过滤,只认完整命令字符串。所以必须用白名单方式,把带通配符的调用直接排除在外。
绝对路径 + 固定参数是唯一安全写法
sudoers 不解析命令参数,它只比对整条命令是否完全匹配规则。例如:
- ✅ 安全:允许 /usr/bin/systemctl restart nginx —— 路径和参数都固定
- ❌ 危险:禁止 /usr/bin/systemctl restart * —— 星号会匹配任意服务名,等于开放全部重启权限
- ❌ 危险:禁止 /usr/bin/tail -f /var/log/*.log —— * 在末尾虽常见,但若日志目录可被用户创建或写入,可能被用于读取敏感文件
用 Cmnd_Alias 显式列出所有合法组合
避免在规则里出现任何通配符,把每种需要的参数组合都单独写死:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 在 /etc/sudoers.d/webops 中定义:
- Cmnd_Alias NGINX_CTRL = /usr/bin/systemctl start nginx, /usr/bin/systemctl stop nginx, /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
- 再绑定用户:%webops ALL=(root) NOPASSWD: NGINX_CTRL
- 这样用户执行 sudo systemctl restart redis 会直接拒绝,连尝试机会都没有
主动屏蔽已知高危模式
即使没显式授权,也要防止用户绕过。可在 sudoers 中插入拒绝规则(注意顺序,放在通用规则之前):
- alice ALL=(ALL) !/usr/bin/systemctl * reboot, !/usr/bin/systemctl * shutdown, !/usr/bin/systemctl * halt
- bob ALL=(ALL) !/bin/bash, !/usr/bin/python3 -c *, !/usr/bin/perl -e *
- 这些 ! 行会阻止匹配到的命令,且优先于后续的允许规则
配合审计与测试验证效果
配置完别跳过验证:
- 用目标用户执行 sudo -l,确认只列出你预期的那几条命令
- 手动试一条带星号的命令,比如 sudo systemctl restart *,应返回 “command not allowed”
- 检查 /var/log/secure 或 /var/log/auth.log,确认拒绝行为被记录
- 启用 log_subcmds(在 Defaults 行加 Defaults log_subcmds),确保子命令参数也被记入日志

















