如果我想设置一个功能(capabilities(7)
),例如CAP_NET_BIND_SERVICE
,在可执行文件上,该文件是一个脚本,我是否必须设置功能(setcap(8)
)在启动该脚本的解释器上,或者在脚本文件本身上设置它是否足够?
注意:这个问题特别涉及 Scientific Linux 6.1,但我认为它可以得到一般性的回答。
答案1
在脚本上设置功能将不会生效。这与不处理setuid
脚本的情况类似。与后一种情况类似,它是如何处理 shebang 的实现execve
及其背后的安全推理(详细信息请参见:允许在 shell 脚本上设置 setuid)。
我认为你有这些选择
设置解释器本身的功能(实际上是它的副本)
- 这里有一个问题,任何能够执行它的人都将使用这些提升的功能运行(能够执行一些任意脚本或以交互方式启动它)
编写一个包装器可执行文件,该可执行文件将具有硬编码逻辑来执行脚本,并在此可执行文件上设置所需的功能
- 确保没有人能够修改或删除/替换脚本
- 仍然这样做
chroot
可能会滥用这样的包装器
在这两种情况下,您都必须execve
通过设置inheritable
标志来确保功能集能够生存。您还可以通常使用pam_cap
分布式libcap
,仅通过配置为选定的用户实际激活所需的功能。
一般来说,您希望确保没有人能够通过改变环境来修改您的解释器的行为,例如。PYTHON_PATH
或类似的东西。
答案2
现在,到 2022 年,如果您的系统使用 systemd,您还可以创建一个 systemd 单元配置并从那里运行脚本,同时还列出了CapabilityBoundingSet=
指令所需的功能。