Вопрос или проблема
Я читал документацию по php-fpm документация и узнал, что могу назначить каждому сокету своего пользователя, группу и режим, но как я могу сказать apache (имеется в виду per vhost), чтобы использовать x пользователя и y группу для подключения к сокетам?
Что я хочу достичь, так это предотвратить чтение файлами пула друг друга, в случае взлома только файлы для этого домена будут слиты, и ничего больше. Я знаю, как я могу сделать это для пулов fpm, используя настройки user
и group
, а затем предоставив структуре файлов их соответствующие разрешения. Но как насчёт того, чтобы тот же http пользователь мог получить доступ ко всем сокетам fpm? Нужно ли мне об этом беспокоиться или нет?
pool1.conf (php-fpm)
[pool1]
user = domain1
group = domain1
listen = /run/php-fpm/www.domain1.sock
listen.owner = http
listen.group = http
listen.mode = 0660
domain1.conf (виртуальный хост apache)
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.domain1.com
DocumentRoot "/srv/http/domain1.com/www"
<Directory "/srv/http/domain1.com/www">
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
<Files "index.php">
SetHandler "proxy:unix:/run/php-fpm/www.domain1.sock|fcgi://localhost/"
</Files>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteRule . index.php [L]
</IfModule>
</Directory>
SSLEngine On
SSLCertificateFile "/etc/letsencrypt/live/domain1.com/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/domain1.com/privkey.pem"
Protocols h2 h2c
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
ErrorLog "/srv/protected/sites/domain1.com/logs/www-error_log"
CustomLog "/srv/protected/sites/domain1.com/logs/www-access_log" common
</VirtualHost>
Я также пытаюсь разобраться, почему значение по умолчанию для listen.mode
равно 0660
? Почему группе http нужны права на чтение и запись?
Я не эксперт, но вот как я понимаю, как это работает. Каждый процесс работает как системный (служебный) пользователь. Apache – это процесс и работает как его пользователь (http
в вашем примере). Я думаю, что для достижения того, что вы хотите, вам нужно будет запустить отдельный процесс apache с его собственным пользователем.
Однако для этого вам также нужно будет поместить каждого пользователя/сайт на свой порт, а затем иметь обратный прокси на той же машине, который слушает на портах 80/443 и соответственно обращается к соответствующим сайтам.
На самом деле это не плохая настройка, так как она также дает вам возможность добавить mod_security на сервере прокси и покрыть все сайты сразу.
Таким образом, кратко говоря, PHP-FPM не является решением, которое вы ищете (если я правильно понял ваш вопрос). Директива listen.user
должна быть такой же, как и пользователь, от имени которого работает apache.
возможно, apache2-mpm-itk мог бы сработать
https://cloudkul.com/blog/apache-virtual-hosting-with-different-users/
Ответ или решение
Для того чтобы настроить виртуальные хосты Apache, использующие различные сокеты PHP-FPM с разными пользователями и группами, необходимо учитывать несколько аспектов конфигурации.
1. Изучение PHP-FPM и Apache
Ваша цель — обеспечить изоляцию для каждого сайта, чтобы в случае нарушения безопасности информация не утекала с одного сайта на другой. Вы правильно понимаете, что PHP-FPM позволяет задавать user
, group
и listen.mode
для каждого пула, но важно учитывать, что Apache, как правило, работает под одним системным пользователем, например, www-data
или http
.
2. Конфигурация PHP-FPM
Предположим, что у вас уже есть настроенный пул в конфигурации pool1.conf
:
[pool1]
user = domain1
group = domain1
listen = /run/php-fpm/www.domain1.sock
listen.owner = http
listen.group = http
listen.mode = 0660
В этой конфигурации listen.owner
и listen.group
определяют, какие пользователи и группы могут взаимодействовать с сокетом. Указание http
здесь приводит к тому, что только пользователь http
может обращаться к этому сокету.
3. Настройка виртуального хоста Apache
Ваша конфигурация виртуального хоста для Apache выглядит следующим образом:
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.domain1.com
DocumentRoot "/srv/http/domain1.com/www"
<Directory "/srv/http/domain1.com/www">
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
<Files "index.php">
SetHandler "proxy:unix:/run/php-fpm/www.domain1.sock|fcgi://localhost/"
</Files>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteRule . index.php [L]
</IfModule>
</Directory>
SSLEngine On
SSLCertificateFile "/etc/letsencrypt/live/domain1.com/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/domain1.com/privkey.pem"
Protocols h2 h2c
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
ErrorLog "/srv/protected/sites/domain1.com/logs/www-error_log"
CustomLog "/srv/protected/sites/domain1.com/logs/www-access_log" common
</VirtualHost>
4. Проблема доступа к сокетам PHP-FPM
Если Apache работает от имени общего пользователя, например http
, то он сможет получить доступ ко всем сокетам PHP-FPM. Это создаёт риск утечки информации между сайтами. Чтобы избежать этого, вы можете использовать модуль mpm-itk
.
5. Использование mpm-itk
Модуль mpm-itk
позволяет вам запускать разные виртуальные хосты под различными пользователями. Это обеспечивает необходимую изоляцию на уровне пользователя. Для установки mpm-itk
вы можете воспользоваться следующими командами:
sudo apt-get install libapache2-mpm-itk
После установки вам нужно будет изменить вашу конфигурацию виртуального хоста:
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.domain1.com
AssignUserId domain1 domain1
DocumentRoot "/srv/http/domain1.com/www"
...
</VirtualHost>
6. Объяснение listen.mode
в PHP-FPM
Почему по умолчанию listen.mode
равен 0660
? Это сделано для того, чтобы пользователь Apache (например, http
) мог корректно взаимодействовать с сокетом. Важно, чтобыи пользователь находился в группе, указанной в listen.group
. Если ваш сервер Apache работает от имени пользователя, который не является членом группы, у него не будет доступа к сокету.
Вывод
Ваша конфигурация требует специальной настройки Apache для работы с разными пользователями и группами на уровне виртуальных хостов. Использование mpm-itk
является наиболее подходящим решением для достижения изоляции. Это обеспечит безопасность, защитив данные ваших веб-сайтов от потенциальных утечек.