Я установил минимальную систему 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 и получил те же результаты)
Каждый должен уметь читать /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 я использую "php_admin_value open_basedir /var/www/example.com"
ты можешь сделать то же самое для upload_tmp_dir
и session.save_path
Вам нужна команда системы блокировки в php? Проверить директиву php
disable_functions =
Это?