sudo参数过滤本质是执行前的白名单模式匹配,非实时扫描;需用显式路径、固定参数、否定规则及noexec等组合防护,禁用通配符与危险环境变量。

sudo 的“参数过滤”不是实时扫描命令里的密码或敏感字符串,而是通过配置规则,在执行前就决定“这条带参数的命令能不能跑”。它不解析内容,只做模式匹配和白名单放行。真正起作用的是显式路径、固定参数、否定规则和运行时防护的组合。
用白名单代替通配符
通配符(*、?)是最大风险源,会让用户拼接任意操作:
- ❌ 错误:alice ALL=(root) /usr/bin/systemctl start *
- ✅ 正确:用 Cmnd_Alias 明确列出每一条允许的完整命令:
Cmnd_Alias SAFE_CTRL = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload sshd, /usr/bin/systemctl status docker
再授权:alice ALL=(root) SAFE_CTRL
固定路径+固定文件名防绕过
路径遍历和符号链接可能绕过表面限制:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- /bin/cat /var/log/*.log 看似安全,但用户可创建 /var/log/../../etc/shadow.log 来读取敏感文件
- 改用绝对路径且不含通配:/bin/cat /var/log/syslog /var/log/auth.log
- 对配置类操作,禁用直接编辑:
❌ 不要写 /usr/bin/vi /etc/ssh/sshd_config
✅ 改用专用脚本(如 /opt/bin/update-ssh-port.sh),并确保脚本属 root、权限 600
启用参数校验语法(sudo ≥1.8.21)
新版 sudo 支持引号包裹与否定规则,实现更细粒度控制:
- 只允许重启 nginx,且禁止 --force 和分号注入:
bob ALL=(root) /usr/bin/systemctl restart "nginx" !"/usr/bin/systemctl restart *--force*" !"/usr/bin/systemctl restart *;*" - 注意:双引号必须包裹字面值;! 开头的否定规则需单独成行;顺序影响匹配优先级
切断逃逸链:noexec + 环境清理
即使命令被允许,也要防止其加载恶意库或启动子 shell:
- 对高危命令启用 noexec:alice ALL=(root) NOEXEC: /usr/bin/mysql, /usr/bin/systemctl
- 清除危险环境变量:Defaults env_delete += "PATH SHELL LD_PRELOAD LD_LIBRARY_PATH SSH_CONNECTION"
- 禁用解释器调用:Defaults!/usr/bin/python* noexec, Defaults!/bin/sh noexec
- 强制干净 PATH:Defaults secure_path="/usr/local/bin:/usr/bin:/bin"
不复杂但容易忽略

















