Linux 上脚本的功能

Linux 上脚本的功能

如果我想设置一个功能(capabilities(7)),例如CAP_NET_BIND_SERVICE,在可执行文件上,该文件是一个脚本,我是否必须设置功能(setcap(8))在启动该脚本的解释器上,或者在脚本文件本身上设置它是否足够?

注意:这个问题特别涉及 Scientific Linux 6.1,但我认为它可以得到一般性的回答。

答案1

在脚本上设置功能将不会生效。这与不处理setuid脚本的情况类似。与后一种情况类似,它是如何处理 shebang 的实现execve及其背后的安全推理(详细信息请参见:允许在 shell 脚本上设置 setuid)。

我认为你有这些选择

  1. 设置解释器本身的功能(实际上是它的副本)

    • 这里有一个问题,任何能够执行它的人都将使用这些提升的功能运行(能够执行一些任意脚本或以交互方式启动它)
  2. 编写一个包装器可执行文件,该可执行文件将具有硬编码逻辑来执行脚本,并在此可执行文件上设置所需的功能

    • 确保没有人能够修改或删除/替换脚本
    • 仍然这样做chroot可能会滥用这样的包装器

在这两种情况下,您都必须execve通过设置inheritable标志来确保功能集能够生存。您还可以通常使用pam_cap分布式libcap,仅通过配置为选定的用户实际激活所需的功能。

一般来说,您希望确保没有人能够通过改变环境来修改您的解释器的行为,例如。PYTHON_PATH或类似的东西。

答案2

现在,到 2022 年,如果您的系统使用 systemd,您还可以创建一个 systemd 单元配置并从那里运行脚本,同时还列出了CapabilityBoundingSet=指令所需的功能。

相关内容