Скажите виртуальным хостам Apache подключаться к сокетам php-fpm, используя разных пользователя/группу для каждого.

Вопрос или проблема

Я читал документацию по 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 является наиболее подходящим решением для достижения изоляции. Это обеспечит безопасность, защитив данные ваших веб-сайтов от потенциальных утечек.

Оцените материал
Добавить комментарий

Капча загружается...