我如何使用SELinux来限制PHP脚本?

我想在我的SL6.4(RHEL 6.4重build)Web服务器上划分不同的PHP应用程序,以便它们不能访问彼此的数据。 SELinux似乎可以做到这一点,但我不确定细节。 我的问题有两个部分:

  1. SElinux如何使用mod_phppipe理在Apache进程中运行的PHP脚本? 当运行PHP脚本时,进程是否以某种方式进入脚本上下文,还是只有当脚本通过CGI或FastCGI运行在进程外时才能工作? 如果它转换到一个脚本上下文来运行PHP脚本,是什么让PHP的错误触发转换回主要的httpd上下文? 如果我需要一个备用的PHP部署方法,这将是很好的知道。
  2. 我怎样才能分离脚本/应用程序,例如TinyTinyRSS不能访问OpenCloud拥有的东西? 看起来我应该可以通过closureshttpd_unified并提供单独的httpd_ttrss_*httpd_opencloud_*上下文来实现这一点,并行于httpd_user_foohttpd_sys_foo 。 考虑到我可以使用的应用程序的数量,我甚至可以使用没有新上下文的sys / user区分。 但是我还没有find关于什么closureshttpd_unified的含义的文档,或者如何设置不同的HTTP上下文。 特别是用PHP脚本通过mod_php运行。

我很好地创build了新的SELinux策略模块,但希望一些文档指向我需要做的新策略,以及如何使它与SELinux目标策略很好地集成。

如果试图用SELinux来完成这种分离是一个失败的原因,我需要在不同的上下文中分别启动不同的httpd,甚至可能是LXC容器,这也是一个有用的答案。

达到这种分离水平的最好方法是不使用types转换,而使用类别/ MCS转换。 这有点像libvirt KVM的svirt实现。

好的,你需要做的第一件事是下载一个名为mod_selinux的httpd模块。 它在Fedora软件仓库中已经有相当长的一段时间了,但是从来没有真正将它用于EL6系统。

无论如何,你可以从Fedora源码重build软件包。 我在一个Fedora机器上做了这个,但是你可以从镜像下载相同的包。 运行httpd-2.2我使用F16作为基础。

 yumdownloader --source mod_selinux --releaserver=16 ... mod_selinux-2.2.2454-3.fc15.src.rpm | 23 kB 00:00 

然后下载时,重build你的EL6盒子。

 rpmbuild --rebuild mod_selinux-2.2.2454-3.fc15.src.rpm ... Wrote: /home/build/rpmbuild/RPMS/x86_64/mod_selinux-2.2.2454-3.el6.x86_64.rpm 

最后安装模块。

 rpm -i /home/build/rpmbuild/RPMS/x86_64/mod_selinux-2.2.2454-3.el6.x86_64.rpm 

RPM为你需要的httpd安装一个模块,同时为httpd一个策略,这也是运行它的必要条件。

该模块的文件安装在/etc/httpd/conf.d/mod_selinux.conf

在这个过程中的第一个阶段是增加主要httpd进程运行的类别的数量,以便它可以产生跨越正确范围的子线程。 在文件中更改:

 selinuxServerDomain *:s0 

 selinuxServerDomain *:s0-s0:c0.c1023 

现在,你必须将每个虚拟主机分配给apache一个类别。 这是通过添加一个如下例所示的selinuxDomainVal

 <VirtualHost *:80> DocumentRoot /var/www/vhosts/host1 ServerName host1.virtual selinuxDomainVal *:s0:c0 </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/vhosts/host2 ServerName host2.virtual selinuxDomainVal *:s0:c1 </VirtualHost> 

接下来,在每个主机的文档根目录中,将它们的文档根目录重新标记为与httpdconfiguration中标记的类别相同的类别。

 chcon -R -l s0:c0 /var/www/vhosts/host1 chcon -R -l s0:c1 /var/www/vhosts/host2 

如果你想使标签得到尊重,如果你做一个系统relabel,你最好更新本地政策!

 semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c0 '/var/www/vhosts/host1(/.*)?' semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c1 '/var/www/vhosts/host2(/.*)?' 

这就是它! 现在不可能把你的文档留在别人身上去探索。