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,
  • показать версию ядра,
  • установить соединение с внешними хостами

Однако я получаю оповещения AVC при попытке прочитать атрибуты /etc/shadow или когда я пытаюсь получить доступ к домашнему каталогу.

Прежде всего, это нормально? И как я могу настроить SELinux, чтобы ограничить больше действий PHP?

Я использую CentOS 7, и моя версия selinux-policy - 3.13.1-23.el7_1.7. (Я тоже пробовал то же самое с Fedora и получаю те же результаты)

3 ответа

Каждый должен уметь читать /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, этот php не ограничивается SELinux до CentOS 6.6 и 7.

С моей точки зрения /etc/passwd должны быть доступны для чтения всем пользователям системы.

Ваш php-скрипт запускается с пользователем apache, поэтому он может читать /etc/passwd

В apache virtualhost я использую "php_admin_value open_basedir /var/www/example.com" Вы можете сделать то же самое для upload_tmp_dir а также session.save_path

Вам нужна блокировка системной команды в php? Проверьте директиву php

disable_functions =

Это?

Другие вопросы по тегам