sudo权限配置应禁用命令通配符,改用显式白名单、绝对路径、参数校验语法及noexec等机制,并强化日志审计,防止提权与逃逸。

在sudo权限配置中,直接使用命令通配符(如*、?、[])允许用户执行带任意参数的命令,极易引发提权风险。关键原则是:**宁可显式列出安全参数,也不依赖通配符做“模糊放行”**。
避免在Cmnd_Alias中用*匹配整个参数串
错误示例:alice ALL=(root) /usr/bin/systemctl start *
这允许执行systemctl start nginx; rm -rf /——分号后命令仍以root运行。
正确做法是只允许可信服务名,用明确白名单替代通配:
- 用
Cmnd_Alias SAFE_SERVICES = /usr/bin/systemctl start nginx, /usr/bin/systemctl start sshd, /usr/bin/systemctl start docker - 或借助sudo内置的
!requiretty和env_check机制限制环境变量注入
慎用?和[]通配符,警惕路径遍历与参数逃逸
像/bin/cat /var/log/*.log看似安全,但若用户能创建/var/log/../../etc/shadow.log,就可能绕过路径限制。
加固建议:
- 改用绝对路径+固定文件名,例如
/bin/cat /var/log/syslog /var/log/auth.log - 启用
sudoers中的noexec标志(需系统支持),阻止在sudo环境下执行子shell或动态链接器劫持 - 对日志类命令,优先使用
less或zcat等不可写工具,并配合setenv禁用LESSOPEN等危险环境变量
用sudoers的“参数校验语法”实现细粒度控制
较新版本sudo(1.8.21+)支持sudoers中使用\转义和""包裹参数,配合!否定逻辑,可精确描述允许模式。
例如限制仅能重启特定服务且禁止--force、--no-block等危险选项:
bob ALL=(root) /usr/bin/systemctl restart "nginx" !"/usr/bin/systemctl restart *--force*" !"/usr/bin/systemctl restart *;*"- 配合
Defaults env_delete+="SHELL PATH"清除潜在攻击向量
始终启用日志与事后审计能力
再严格的参数限制也需可观测性支撑:
- 在
/etc/sudoers中设置Defaults logfile="/var/log/sudo.log"并确保日志不可篡改(如用chattr +a) - 用
sudo -l -U username定期验证实际生效权限,注意通配符是否被意外扩展 - 对高危命令(如
mount、chroot、pkexec调用),坚持“最小参数+显式路径+无shell元字符”三原则










