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 =
Это?