NGINX и PHP FPM - общие проблемы с настройкой и производительностью при использовании open_basedir

Я хочу настроить сервер NGINX, на котором можно размещать несколько веб-сайтов, которые отделены друг от друга, поэтому vhosta не может получить доступ к файлам из vhostb,

Я установил свежий сервер Debian 7.5 и установил NGINX и PHP FPM из пакетов Debian по умолчанию.

Тогда я добавлю 2 новых пользователей vhosta а также vhostb и добавил пользователя веб-сервера NGINX www-data группе каждого пользователя.

Затем я создал следующую структуру каталогов.

   var/
    |---www/
    |---vhosta
         |---httpdocs (permissions 750 - owner: vhosta - group: vhosta)
    |---vhostb
         |---httpdocs (permissions 750 - owner: vhostb - group: vhostb)

Я настроил отдельный пул PHP FPM для каждого виртуального хоста, чтобы отделить процессы PHP для каждого виртуального хоста. Конфигурация выглядит следующим образом (просто показывает для vhosta)

[vhosta]
listen = /var/run/php5-fpm-vhosta.sock
user = vhosta
group = vhosta
listen.owner = vhosta
listen.group = vhosta

Насколько мне известно, эта конфигурация должна отделяться vhosta от доступа к файлам в vhostb's каталог httpdocs, так как vhosta не имеет прав доступа к папке httpdocs из vhosta, Я проверил это, пытаясь создать простой скрипт PHP в vhosta, который пытается получить доступ к файлам в vhostb's Каталог httpdocs.

Все идет нормально. Я установил приложение PHP (CMS) в vhosta и сделал некоторое тестирование производительности с ApacheBench.

Как правило, все работает более плавно и быстро, чем с Apache2, и я получу следующий результат.

Requests per second:    31.62 [#/sec] (mean)
Time per request:       316.209 [ms] (mean)
Time per request:       31.621 [ms] (mean, across all concurrent requests)
Transfer rate:          430.58 [Kbytes/sec] received

Хорошо, 31.62 запросов в секунду - это нормально для меня на данный момент.

Последнее, что я хочу доступ ограничить оба vhosta а также vhostb к подмножеству каталогов, поэтому они не имеют доступа к другим читаемым в мире системным файлам. Я делаю это с помощью директивы PHP open_basedir.

Я добавил следующее для каждого пула PHP FPM виртуальных хостов (просто показывает vhosta)

php_admin_value[open_basedir] = /var/www/vhosta/httpdocs/:/tmp/

При этом vhosts не должен иметь доступа, например, к /etc/passwd. Я создал простой PHP-скрипт, который проверяет, что vhosts не может получить доступ к файлам снаружи из настроенных каталогов.

Наконец, я повторил тест производительности и в итоге получил следующий результат.

Requests per second:    11.82 [#/sec] (mean)
Time per request:       8460.087 [ms] (mean)
Time per request:       84.601 [ms] (mean, across all concurrent requests)
Transfer rate:          161.18 [Kbytes/sec] received

Похоже, что добавление директивы open_basedir в пул PHP FPM приводит к значительному снижению производительности. Время доступа и количество запросов в секунду теперь довольно схожи по сравнению с настройкой, использующей Apache2 с mod_php.

Мои вопросы следующие:

  1. Может ли созданная мной установка считаться "безопасной", чтобы отдельные vhosts не могли получить доступ друг к другу? Если нет, то что лучше делать, и чего мне не хватает?

  2. Почему производительность сильно падает, когда я использую open_basedir? Или это сохранить, чтобы не использовать open_basedir, так как такие файлы, как / etc / passwd, в любом случае, доступны для чтения всему миру?

1 ответ

Решение

Если вы действительно хотите, чтобы они не имели доступа к чему-либо реальному в системе, настройте chroot для php-fpm, создав таким образом "фальшивый" /etc/passwd и так далее. Или, что еще проще, используйте докер!

1) Я не уверен, как вы настроили статические файлы для загрузки с этих vhosts, потому что они не должны загружаться в этом случае, возможно, только если вы передадите все в php-fpm, который открывает вас для другого вида атакует и снижает производительность. Обычно вы устанавливаете такие разрешения (учитывая, что nginx - это пользователь, запускающий процесс nginx):

  • / var / vhosta: владелец vhosta.nginx; Пермь 750
  • / var / vhostb: владелец vhostb.nginx; Пермь 750

2) Я не уверен на 100%, однако, если у вас сложное приложение, которое загружает огромное количество файлов, а ваш ввод / вывод не обеспечивает хорошую производительность, то это может иметь смысл. Ограничения open_basedir выполняют такие вещи, как проверка, не являются ли файлы символической ссылкой или внутри символической ссылки, и т. д., делая много запросов ввода-вывода, что повышает IOPS вашего диска. Еще одна причина использовать докер или хотя бы chroot.

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