我安装了一个最小的 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_dir
session.save_path