Apache + php-fpm:プールごと、ユーザープロジェクトごとに適切な権限がありますか?

Apache + php-fpm:プールごと、ユーザープロジェクトごとに適切な権限がありますか?

さまざまなユーザー(プロジェクトごとに1人のユーザー)でApache仮想ホストとPHP-FPMプールを設定する正しい方法は何ですか?

  • 各ユーザー/プロジェクトはファイルアクセスの点で互いに独立しています。
  • 一般的なApache / projectsを使用してwww-dataプールされたプロジェクトにアクセスできませんか?

私は仮想ホストでApacheを使用して設定し、各仮想ホストを独自のプールに設定しようとしphp-fpmています。

  • Apache 仮想ホストsite1.conf:
<VirtualHost *:443>
        DocumentRoot /var/www/site1/public

        <Directory /var/www/site1/public>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>

    <FilesMatch \.php$>
        # 2.4.10+ can proxy to unix socket
        SetHandler "proxy:unix:/run/php/php-fpm.site1.sock|fcgi://localhost/"
    </FilesMatch>

</VirtualHost>

  • PHPプールsite1
[site1]
user = site1
group = site1
listen.owner = site1
listen.group = www-data
listen.mode = 0660

  • ディレクトリは次から始まります/var/www/site1
drwxr-xr-x 15 site1 site1 4,0K ago 31 11:48 .
drwxr-xr-x 15 site1 site1 4,0K ago 31 11:48 public

  • そしてユーザー:
id site1
uid=1007(site1) gid=1007(site1) grupos=1007(site1),33(www-data)

virtualhostの他の設定ファイルと同じで、site2適切な場合は変更します。


これでこの設定が機能し、すべてのファイルが提供されますが、意図した目的と比較してオープンすぎます。

まず、パブリック領域のファイルとディレクトリは次のものをsite1使用する必要があります。世界中で読むことができるライセンス(例rwxr--r-- site1 site1 file:)。 site1でのみファイルを読み取ることができるように設定すると、どこでもHTTP 403エラーが発生しますEACCESS。私はApacheがある時点でこれらのファイルにアクセスする必要があることを理解していますが、FPMプールの全体的な目的はそのアクセスを処理することだと思います。

これはまた、プロジェクトユーザーが十分に設定しない限り、作成した新しいumaskファイルに十分な権限がない可能性があり、Webサーバー(またはFPM?)がアクセスできるようにするには、まず誰でも読みやすいように手動で設定する必要があることを意味します。

私の考えに潜在的な解決策は、Apacheを実行しているユーザーをwww-data(etc ...)のメンバーにすることです。ただし、これにより、Apacheで実行されている他のプロジェクトに、Laravel設定、バックエンドコネクタなどのフロントエンド以外の要素を含むプロジェクトファイルへのフルアクセス権が付与されます。など。理論的にはこれはうまくいきません。site1site2

2番目のオプションは、Apacheユーザーが具体的に読み取れるようにACL()の読み取りディレクティブを使用するか、または各プロジェクトのディレクトリを設定することですpublic。しかし、最初にApacheへのフルパスアクセスを許可しないと、これがどのように機能するのかわかりません。読み取り Linux ディレクトリパスは次の条件でのみ読み取ることができるので、プロジェクトは実行可能ですか?www-data setgidẁww-datasetfaclみんなその親パスはです。うまくいきますが、その設定が何であるかは完全にわかりません。

私が見ることができる唯一の別のオプションは、別の仮想ホストが自分のユーザーによって実行されるようにApache自体を設定することです。ただし、そのような設定に関する文書は見つかりません。私が見つけた最も近いのはapache2-mpm-itkこの機能を宣伝することですが、実際にApacheがサービスを提供できるようにするために使用可能な設定を見つけられませんでした。スタートこのモジュールが有効になっている場合。実際、Debian 9システムのitkのデフォルト設定では起動時にセグフォルトが発生します。

正しい設定を達成するために私が見逃しているものは何ですか?私はそれを受け入れる持つ可能です。少なくとも普通のWebホストなら誰でもそうすると思います。

ベストアンサー1

最近、パフォーマンス上の理由からApacheグローバル読み取りのみを許可する同様の設定を設定しました。 mpm_event_moduleを使用します。

ApacheとPHP-FPMは2つの独立したプロセスであることを考慮する必要があります。どちらも独立した設定と環境を持ち、PHP-FPMはApacheの権限を管理するため、互いに影響を与えません。

フォームを使用して既存の方法でファイルをアップロードする場合、Apache には静的ファイルに対する読み取りまたは書き込み権限が必要です。 PHPコードでファイルをアップロードすると、PHP-FPMが起動します。 PHP-FPMはPHPコードのみを処理します。

listen.owner = site1
listen.group = www-data
listen.mode = 0660

Apacheプロセスの場合、.phpファイルをPHP-FPM unixソケットに渡す(書き込む)ことができます。

user = site1
group = site1

プールはPHPコードを実行する実際のユーザー/グループです。ユーザーsite1 必然ではないwww-data攻撃はsite1グループ権限を持つ別の仮想ホストディレクトリに書き込むことができるからですwww-data

問題の解決策はapache-mpm-itkです。

Apacheがグローバルに読み取ることを許可すると、すべてのマルチプロセスモジュール(MPM)を使用できます。 apache-mpm-itk はスレッド MPM と互換性がありません。唯一のオプションはmpm_prefork_moduleです。名前にもかかわらず、apache-mpm-itkは技術的にMPMではありません。これは改善されたプリフォークです。

PHP-FPMの各プールにopen_basedirディレクティブを設定することを忘れないでください。

2020年にはDebian 10(buster)をお勧めします。

おすすめ記事