【问题标题】:How do I disable SELinux for a subprocess launched from Apache?如何为从 Apache 启动的子进程禁用 SELinux?
【发布时间】:2010-11-14 20:15:38
【问题描述】:

My Apache module 启动一个辅助子进程,它执行例如但不限于以下操作:

  • 它设置了一个套接字,以便它可以与 Apache 通信。
  • 在 Apache 退出时删除的临时位置读取和写入文件。这些文件用于例如用于存储通过网络接收的大量数据,以防这些数据无法轻松放入 RAM。
  • 它生成用户指定的可执行文件。类似于 CGI。这些衍生进程中的每一个都以自己的专用用户身份运行。

帮助程序子进程以 root 身份启动,以便它可以管理文件所有权和权限,并可以作为特定用户生成更多进程。

我的模块的一些用户在安装了 SELinux 的系统上运行,例如基于 RedHat 的发行版。 SELinux 通常会干扰我的模块。到目前为止,我一直在告诉人们在系统范围内禁用 SELinux,因为我不知道如何为我的软件编写适当的策略。文档非常分散、复杂,通常只针对系统管理员,而不是软件开发人员。

作为朝着正确方向迈出的一步,我想实现对 SELinux 的最小支持。我正在寻找一种方法来启动我的辅助子进程而没有任何 SELinux 限制,而无需禁用 SELinux 系统范围。有没有办法做到这一点,如果有,怎么做?

【问题讨论】:

    标签: linux security selinux


    【解决方案1】:

    嗯...您可以编写一个将您的域转换为unconfined_t 的规则,但是您会惹恼不少系统管理员。最好为自己编写一个继承自 httpd_t 的新域,并添加适当的访问上下文。

    【讨论】:

    • 我知道,但现在我已经告诉人们完全禁用 SELinux,他们仍然愿意使用我的软件。我不能一开始就追求完美,我想要一个不需要太长时间来学习和实施的中间解决方案。
    • 加载该规则是如何工作的?我是否应该编写一个策略文件,fork() 一个进程,然后调用一些 SELinux API 来加载所述策略文件,然后 exec() 我的帮助程序?
    • 很少有 SELinux 真正在编程;主要是政策。您的策略文件包含新域、可执行文件的新文件上下文、从httpd_t 到新域的转换规则,以及它必须运行但还没有的任何可执行文件的文件上下文。您加载已编译的 SELinux 模块,根据需要重新标记可执行文件,然后它就全部运行了。
    • 那么 exec() 会查看可执行文件的 SELinux 上下文并自动将该 SELinux 上下文分配给执行的进程并加载正确的策略文件?
    • 只有一个系统策略,因此一旦管理员通过semanage 加载了模块,就无需加载其他任何内容。 SELinux 将使用当前域和可执行文件的上下文作为策略中的查找,以便找到它应该将新进程转换到的域。因此,如果在httpd_t 中运行的httpd 运行具有myapp_bin_t 上下文的可执行文件,并且策略指定将这些可执行文件转换为myapp_t,则新进程将在myapp_t 域中运行。
    猜你喜欢
    • 2012-10-12
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多