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
user
とgroup
は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.php
をwebapp/
下に以下の内容で作成します。(確認後削除します)
<?php
phpinfo();
info.php
にアクセスしてEnvironment
のUser
がwebapp_php
になっていたら成功です。File not found.
と表示された場合はそのファイルにwebapp_phpがアクセスできるか、パーミッションを確認してみてください。
最後に
これによりwebapp/
以下のPHP実行環境は隔離され、その外のファイルにはアクセスできない環境を作ることができました。
また、PHPのスクリプト自体の編集権限をwebapp_php
ユーザーに与えないことでセキュリティがより堅牢になるはずです。