rails 个应用的 SELinux 上下文

SELinux contexts for rails apps

我正在设置一个 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 无法执行 .so 脚本在 /shared/bundle/ 目录(其中包含此应用程序的精华。 为了解决这个问题,我递归地将shared/bundle目录的上下文设置为httpd_sys_script_exec_t。这是错误的吗?有没有更好的方法来处理这个问题?

问题 #2: 我还没有完成这一步,但如果不设置 public/uploads 目录到 httpd_sys_content_rw_t,这是有道理的。

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

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

一切都取决于您使用的应用服务器以及它在哪个域中运行 运行。看起来您的应用服务器 运行ning 在 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 一起部署。在乘客世界中,事情有点复杂,因为不可能进行干净的初始转换,因此您最终得到 passenger_t 域(理想情况下应该是 my_awesome_app_t)。无论如何,这是最重要的文件:

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

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

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

祝你好运!