SELinux限制Apache / PHP访问

我在默认configuration下安装了Apache,PHP和SELinux的最小CentOS系统:

SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 29 

如果我要更改Apache根目录,则必须重新标记此新目录,否则SELinux会阻止访问。 但是我发现,使用PHP脚本,可能比我想象的要多得多。 例如,我可以在没有任何警报的情况下执行以下操作:

  • /etc/passwd
  • list /var/tmp
  • 显示内核版本,
  • build立与外部主机的连接

但是,当我尝试读取/etc/shadow属性或尝试访问主目录时,我收到AVC警报。

首先,这是正常的吗? 如何调整SELinux来限制更多的PHP操作?

我使用CentOS 7,我的selinux-policy版本是3.13.1-23.el7_1.7。 (我也尝试与Fedora相同,并得到相同的结果)

你需要在PHP系统命令块? 检查php指令

 disable_functions = 

这个?

从我的angular度来看, /etc/passwd需要被系统的每个用户读取。

你的php脚本用apache用户运行,所以这个脚本可以读取/etc/passwd是正常的

在apache虚拟主机中,我使用"php_admin_value open_basedir /var/www/example.com"你可以对upload_tmp_dirsession.save_path做同样的事情

每个人都需要能够读取/etc/passwd并写入/var/tmp 。 所以这些都不是问题。

内核版本也不是真正的问题,只要你实际上安装更新,使用Ksplice等。

至于出站networking连接,你可以限制这个,因为一些网站不需要做这样的连接。 但有时他们会这样做,例如大多数网站将需要连接到数据库。 你可以用SELinux布尔值来pipe理这个,比如:

 # semanage boolean -l | grep httpd_can_network httpd_can_network_relay (off , off) Allow httpd to can network relay httpd_can_network_connect_db (off , off) Allow httpd to can network connect db httpd_can_network_connect (off , off) Allow httpd to can network connect httpd_can_network_memcache (off , off) Allow httpd to can network memcache httpd_can_network_connect_cobbler (off , off) Allow httpd to can network connect cobbler 

设置httpd_can_network_connect允许所有出站networking连接到任何地方; 其他则更具限制性,只允许连接到每个特定的服务。


另外请记住,如果你使用nginx和php-fpm,那么在CentOS 6.6和7之前,这个php不受SELinux的限制。