SELinux 限制 Apache/PHP 访问

SELinux 限制 Apache/PHP 访问

我安装了一个最小的 CentOS 系统,其中包含 Apache、PHP 和 SELinux 的默认配置:

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
  • 列表/var/tmp
  • 显示内核版本,
  • 与外部主机建立连接

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

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

我使用 CentOS 7,selinux-policy 版本是 3.13.1-23.el7_1.7。(我也在 Fedora 上尝试了同样的操作,得到了相同的结果)

答案1

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

只要您实际安装更新、使用 Ksplice 等,内核版本实际上也不是什么问题。

至于建立出站网络连接,您可以限制这一点,因为有些网站不需要建立这样的连接。但有时它们需要,例如大多数网站都需要连接到数据库。您可以使用 SELinux 布尔值来管理这一点,例如:

# 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允许所有出站网络连接至任何地方;其他设置则更加严格,只允许连接到每个特定服务。


还要记住,如果您使用 nginx 和 php-fpm,那么在 CentOS 6.6 和 7 之前,php 不会受到 SELinux 的限制。

答案2

您需要在 php 中阻止系统命令吗?检查 php 指令

disable_functions =

这?

答案3

从我的角度来看,/etc/passwd需要让系统的每个用户都能读取。

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

在 apache virtualhost 中,你可以对和"php_admin_value open_basedir /var/www/example.com"执行相同的操作upload_tmp_dirsession.save_path

相关内容