ruby-on-rails - Rails 应用程序的 SELinux 上下文

标签 ruby-on-rails centos centos7 selinux rhel7

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

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

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

这向我保证,那里的所有文件都可以被 apache 读取,这是我关于 SELinux 的第一步。

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

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

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

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

最佳答案

一切都取决于您使用的应用服务器以及它在哪个域中运行。看起来您的应用服务器在 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

祝你好运!

关于ruby-on-rails - Rails 应用程序的 SELinux 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44165598/

相关文章:

安装了 repo 的 docker-ce 没有出现在 `yum list available` 中

ruby-on-rails - rails Assets 管道 "Cannot allocate memory - nodejs"

css - 用于打印背景颜色的 rails 5 bootstrap 4 样式表

apache - 如何配置 apache 以运行具有与文件不同的组 ID 的页面

linux - getopts命令没有输入时如何回显

php - CentOS Apache .htaccess : Options not allowed here (500 - Internal Server Error)

linux - GDB:lx-symbols 未定义命令

ruby-on-rails - 仅当资源具有特定属性时如何过滤搜索集合?

mysql - mysql中的比例WHERE语句应用于DATETIME字段

centos - 如何在不使用 Apache 和 PHP 的情况下在一台 VM 上安装 Nagios 以检查另一台 VM(客户端)的特定统计信息?