安全的sudo命令参数限制需采用显式白名单、绝对路径、语法校验和运行时防护四层组合,禁用通配符,固定路径与文件名,启用noexec、env_delete等加固措施,并配套日志审计与权限验证。

直接在 sudoers 里用 * 或 ? 放行命令参数,看似省事,实则埋下提权隐患。真正安全的参数限制,靠的是显式白名单、绝对路径、语法校验和运行时防护四层组合。
只允许可信服务名,不用通配符匹配整个参数串
错误写法:alice ALL=(root) /usr/bin/systemctl start *
这会让 systemctl start nginx; rm -rf / 这类拼接命令以 root 权限执行分号后的部分。
正确做法是列出每个允许的服务:
- 用
Cmnd_Alias定义白名单:Cmnd_Alias SAFE_START = /usr/bin/systemctl start nginx, /usr/bin/systemctl start sshd, /usr/bin/systemctl start docker - 再授权:
alice ALL=(root) SAFE_START
固定路径+固定文件名,防路径遍历绕过
像 /bin/cat /var/log/*.log 看似只读日志,但若用户能创建 /var/log/../../etc/shadow.log,就能越权读取敏感文件。
加固方式:
- 禁用通配,改用明确路径:
/bin/cat /var/log/syslog /var/log/auth.log - 对日志类命令,优先用不可写工具:
/usr/bin/less /var/log/syslog,并配合Defaults env_delete+="LESSOPEN"清除危险环境变量 - 启用
noexec标志(需系统支持):alice ALL=(root) NOEXEC: /usr/bin/systemctl,阻止子 shell 启动
用 sudoers 参数校验语法做细粒度控制
较新版本 sudo(1.8.21+)支持带引号和否定逻辑的参数匹配,可精准拦截危险选项。
例如只允许重启 nginx,且禁止 --force 和命令拼接:
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 /var/log/sudo.log防篡改 - 定期检查实际生效权限:
sudo -l -U username,确认通配符未被意外扩展或覆盖 - 对高危命令(如
mount、chroot、pkexec),坚持三原则:
最小参数 + 显式路径 + 不含 shell 元字符(;、&、|、$()等)











