sudo的指令参数过滤功能用于防止攻击者绕过权限限制、执行未授权命令或提权,而非防止敏感信息泄露;其核心是配合白名单、参数校验、环境变量清理及日志脱敏等机制实现安全控制。

sudo 的指令参数过滤功能不是用来“防止敏感信息泄露”的,而是用来**防止攻击者通过构造恶意参数绕过权限限制、执行未授权命令或提权**。它本身不加密、不隐藏参数,更不会自动过滤密码、密钥等敏感内容——那些仍会明文出现在日志或进程列表中。真正能缓解敏感参数泄露的,是配合参数过滤使用的**日志脱敏策略、环境变量清理和命令白名单机制**。
用显式白名单替代通配符,从源头杜绝参数注入
通配符(*、?、[])在 sudoers 中允许任意参数,极易被用于拼接危险操作:
-
错误写法:
alice ALL=(root) /usr/bin/systemctl start *→ 可执行systemctl start nginx; rm -rf / -
正确做法:只列出明确可信的服务名
Cmnd_Alias SAFE_SERVICES = /usr/bin/systemctl start nginx, /usr/bin/systemctl start sshd, /usr/bin/systemctl start docker
启用参数校验语法(sudo 1.8.21+),精确控制允许模式
新版 sudo 支持带引号的字符串匹配与否定规则,可拦截含敏感操作的参数组合:
- 允许重启 nginx,但禁止带
--force或分号:bob ALL=(root) /usr/bin/systemctl restart "nginx" !"/usr/bin/systemctl restart *--force*" !"/usr/bin/systemctl restart *;*" - 注意:需用双引号包裹字面值,
!否定项必须单独成条,且顺序影响生效逻辑
禁用危险环境变量与解释器调用,阻断参数逃逸路径
即使参数本身看似安全,攻击者也可能借环境变量或子 shell 绕过限制:
- 在 sudoers 中添加:
Defaults env_delete+="SHELL PATH LD_PRELOAD",清除常见攻击向量 - 显式禁止高危解释器路径:
Defaults!/usr/bin/python* noexec,并确保/usr/bin/env、/bin/sh -c等不在授权列表中 - 对日志类命令(如
cat),改用less或zcat,并禁用LESSOPEN等可执行钩子:Defaults env_delete+="LESSOPEN"
配合日志与审计机制,让参数行为可观测、可追溯
再严格的参数过滤也需日志支撑。没有记录,就等于没发生:
- 启用详细日志:
Defaults logfile="/var/log/sudo.log",并设为仅追加:sudo chattr +a /var/log/sudo.log - 对高危命令(如
mount、chroot)启用输出记录:Defaults log_output,日志存入/var/log/sudo-io/ - 定期用
sudo -l -U username验证实际权限,确认无意外暴露的通配路径或宽松参数规则










