告诉 apache 虚拟主机使用不同的用户/组连接到 php-fpm 套接字

告诉 apache 虚拟主机使用不同的用户/组连接到 php-fpm 套接字

我一直在阅读 php-fpm文档并且发现我可以为每个套接字赋予自己的用户、组和模式,但是我如何告诉 apache(我的意思是每个 vhost)使用 x 用户和 y 组来连接到套接字?

我想要实现的是防止池读取彼此的文件,如果发生违规,则只有该域的文件会被泄露,而不会泄露其他文件。我知道如何使用usergroup设置为 fpm 池执行此操作,然后为文件结构赋予适当的权限。但是如果同一个 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.mode0660?为什么 http 组需要读写权限?

答案1

我不是专家,但我理解它的工作原理如下。每个进程都以系统(服务)用户的身份运行。Apache 是一个进程,并以它的用户身份运行(http在您的示例中)。我认为,为了实现您想要的效果,您需要生成一个具有自己用户的单独 apache 进程。

但是,要做到这一点,您还需要将每个用户/站点放在自己的端口上,然后在同一台机器上设置一个反向代理,监听端口 80/443 并相应地访问相应的站点。

这实际上不是一个糟糕的设置,因为它还使您有机会在代理服务器上添加 mod_security 并一次覆盖所有站点。

因此,简而言之,PHP-FPM 不是您要寻找的解决方案(如果我正确理解了您的问题)。该listen.user指令必须与运行 apache 的用户相同。

答案2

相关内容