安全にPHPの使えるWebスペースを構築する

PHPとApacheの組み合わせは、両方のパッケージをインストールするだけですぐ使える手軽さが非常に魅力ですが、同時にセキュリティ上の問題も少なくありません。

特にDebianでデフォルトとなっているPHP-FPMモードでは、PHPの実行プロセスがApacheと同じであり、複数ユーザーが一つのWebサーバーを使う際に、他者のファイルにもアクセスできてしまうという問題があります。

このような問題を解決するために、PHPにはプール(実行環境)を分ける機能があります。プールを分けることで、ディレクトリごとに別のユーザーでPHPを実行させることができ、所有権の無いファイルにはアクセスさせないようにできます。

今回はFrederik Himpeさんのページを参考にしました。

設定方法

PHP側

/etc/php/[PHPのバージョン]/fpm/pool.d/以下がプールの設定ファイルを置く場所です。このディレクトリに、webapp.confと言う名前で以下の内容のファイルを作成します。

[webapp]
user = webapp_php
group = webapp_php
listen = /run/php/php[PHPのバージョン]-webapp-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 12
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 5000
rlimit_core = unlimited
php_admin_value[open_basedir] = /home/webapp/public_html:/tmp
php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

usergroupはPHPを実行させたいユーザーとグループで、後で新しく作成します。
php_admin_value[open_basedir]はこのプールのルートとなるディレクトリで、ここで指定したものより上位のディレクトリにはアクセスできないようになります。

設定できる他の項目については公式Wikiを見てください。

ユーザー・グループ作成

# adduser --system --disabled-login --shell /bin/false --no-create-home --home /home/webapp webapp_php
# groupadd webapp_php

セキュリティのためログインさせないようにPHPを実行させるユーザーを作ります。

Apache側

/etc/apache2/apache2.confもしくはサイト毎の設定ファイルの中に以下を記述します。

<Directory "/var/www/html/webapp">
 <FilesMatch "\.php$">
  SetHandler "proxy:unix:/run/php/php[PHPのバージョン]-webapp-fpm.sock|fcgi://localhost-webapp"
 </FilesMatch>
</Directory>

また、ソフトリンク機能を使い/home/webapp/public_html以下をWebサーバー上のwebapp/に公開します。

# ln -s /home/webapp/public_html /var/www/html/webapp

サーバーに変更を適用

ApacheとPHP-FPMを再起動し変更を適用します。

# systemctl restart apache2
# systemctl restart php[PHPのバージョン]-fpm

info.phpwebapp/下に以下の内容で作成します。(確認後削除します)

<?php
phpinfo();

info.phpにアクセスしてEnvironmentUserwebapp_phpになっていたら成功です。File not found.と表示された場合はそのファイルにwebapp_phpがアクセスできるか、パーミッションを確認してみてください。

最後に

これによりwebapp/以下のPHP実行環境は隔離され、その外のファイルにはアクセスできない環境を作ることができました。
また、PHPのスクリプト自体の編集権限をwebapp_phpユーザーに与えないことでセキュリティがより堅牢になるはずです。

コメントを残す