【问题标题】:SELinux contexts for rails appsRails 应用程序的 SELinux 上下文
【发布时间】:2017-05-24 18:03:00
【问题描述】:

我正在设置一个 Centos 7 服务器作为 Rails 应用程序的网络服务器(使用 capistrano 部署),在阅读了相当多的 SELinux 之后,我想我明白需要做什么,但我不知道正是完成它的最佳方法。 问题如下:

我所有的网络应用程序都在同一个目录下,我已经使用以下命令(递归地)设置了上下文 httpd_sys_content_t

semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"

这向我保证,Apache 可以读取所有文件,这是我在 SELinux 方面的第一步。

问题 #1: 在这一步之后,我得到一个权限错误,因为 apache 无法执行 /shared/bundle/ 中的 .so 脚本 em> 目录(其中包含此应用程序的 gem。 为了解决这个问题,我递归地将 shared/bundle 目录的上下文设置为 httpd_sys_script_exec_t。这是错的吗?有没有更好的方法来处理这个问题?

问题 #2: 我还没有达到这一步,但如果不设置 public/uploads 的上下文,我可能无法将文件上传到 Web 应用程序 dir 到 httpd_sys_content_rw_t,这是有道理的。

我最大的问题是: 每次部署新网站时是否需要设置这些上下文,以确保其上传目录具有 httpd_sys_content_rw_t 上下文,并且其捆绑目录具有 httpd_sys_script_exec_t 上下文?必须有一种方法可以永久设置它,而且可能比我上面描述的更优雅,但我不想在不完全了解后果的情况下过多地混淆这些上下文。

有人能告诉我这种情况下最好的设置是什么吗?我是否遗漏了一些可以让这个设置变得更容易的东西?

【问题讨论】:

    标签: ruby-on-rails centos centos7 selinux rhel7


    【解决方案1】:

    一切都取决于您使用的应用服务器以及它在哪个域中运行。看起来您的应用服务器在 httpd_t SELinux 域下运行,该域可能是 mod_passenger。然后您需要根据 httpd_t 域的要求更改文件上下文。非常好的资源是:

    https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/SELinux_Users_and_Administrators_Guide/chap-Managing_Confined_Services-The_Apache_HTTP_Server.html http://www.unix.com/man-page/centos/8/httpd_selinux/

    您的工作进展顺利,但在某些时候您需要开始编写自己的政策。当您的应用程序需要执行不允许 httpd_t 的操作时,这将成为问题 - 例如连接到远程 HTTP(S) 服务或打开 /var/www 之外的文件。在这种情况下,正确的方法是为您的应用编写自己的 SELinux 策略。

    我去过那里几次,我为开源应用程序 Foreman 维护 SELinux 策略,默认情况下与Passenger 一起部署。在乘客世界中,事情有点复杂,因为不可能进行干净的初始转换,所以你最终得到了乘客 t 域(理想情况下它应该是 my_awesome_app_t)。无论如何,这是最重要的文件:

    https://github.com/theforeman/foreman-selinux/blob/develop/foreman.te

    编写 SELinux 策略是一个痛苦的过程,但它可以大大提高应用的安全性。它还可以帮助您强化代码库。在我的演讲中了解更多信息:

    https://www.youtube.com/watch?v=zQcYXJkwTns

    祝你好运!

    【讨论】:

    • 非常感谢您的洞察伙伴,我会查看您链接的信息,以找出将其应用于我的场景的最佳方法。
    • 由于我这边的时间限制,我想我必须采用更快的方法。您是否认为编写一组适用于我所有 Rails 应用程序并允许它们现在正确执行的规则对我来说太糟糕了?类似于:semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/(.*)?/public/uploads(/.*)?"这将在我在该服务器上的每个站点上的所有上传目录上设置 RW 上下文?然后我会为脚本目录做同样的事情。你怎么看?
    • 这不是最安全的方法,您实际上是允许对所有应用程序进行读写访问,这正是 SELinux 试图阻止的。如果您需要快速的方法,您可以简单地将您的域置于允许模式,同时将系统的其余部分保持在受限状态(处于强制模式)。那将是 semanage 许可的 domain_t。
    • 使用我之前介绍的命令,我只允许 RW 访问所有站点的所有上传目录,而不是站点本身。这就是我最终采用的方法,我使用 2 个 semanage 命令设置了所有网站所需的所有权限,而不会影响安全性(只有上传目录有 RW,只有脚本目录有脚本执行权限)。虽然这可能不是完美的方法,但在安全方面似乎还不错。
    • 哦,是的,我错过了上传子目录,这样做是安全的。
    猜你喜欢
    • 2015-01-24
    • 2016-05-14
    • 2019-11-25
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 2012-02-24
    • 2016-04-30
    相关资源
    最近更新 更多