Nginx+PHP-FPMでUNIXドメインソケットを使っていてハマる

Nginx+PHP FPMのサイト環境でPHPの処理にUNIXドメインソケットを使っている場合、何気なくDebianでPHPをアップグレードすると、「502 Bad Gateway」となってハマる場合があるので注意を。

NginxでUNIXドメインソケット経由でPHP FPMを使っている場合、

fastcgi_pass unix:/var/run/php5-fpm.sock

のような設定を記述するが、/var/run/php5-fpm.sockのパーミッションはPHP FPMのデフォルト設定だとこれまで、

srw-rw-rw-  1 www-data    www-data       php5-fpm.sock

のようになっていた。ところが、セキュリティ上の問題で5.4.4-14+deb7u9からのデフォルトは、

srw-------  1 www-data    www-data       php5-fpm.sock

と変更されている。

Nginxの起動ユーザーをデフォルトの「nginx」から「www-data」に変更して運用している環境では問題ないが、「nginx」のままで運用していれば、php5-fpm.sockへのアクセスパーミッションがなくなることになり、502エラーとなるというお話。

対処方法は2つ

ということで、「502 Bad Gateway」となってしまったという場合には、実行ユーザーがnginxのままになっていると思われるので、/etc/nginx/nginx.confを、

user  nginx;
↓
user  www-data;

のように修正して、Nginxを再起動ればOKだ。ログファイルやキャッシュのディレクトリ・ファイルのパーミッションは別途確認しておいたほうがいいだろう。

もしくは、ローカルユーザーが安全と言い切れる環境なら、PHP FPMのパーミッションを以前ようにゆるく設定すれば良い。具体的には、/etc/php5/fpm/pool.d/www.confにおいて、

listen = /var/run/php5-fpm.sock
listen.mode = 0666

のような設定が必要になる。設定を変更したら、「/etc/init.d/php5-fpm restart」で再起動を行えば完了である。

注意はちゃんと書いてある

このあたりの情報はアップデートのメッセージに書いてある。斜め読みしていたのでアップデート前に気が付かなかったが、エラーログを見て「あぁ」という結末。

php5 (5.4.4-14+deb7u9) stable; urgency=medium

  * The default PHP FPM socket permission has been changed from 0666
    to 0660 to mitigate security vulnerability (CVE-2014-0185) in PHP
    FPM that allowed any local user to run a PHP code under the active
    user of FPM process via crafted FastCGI client.

    The default Debian setup now correctly sets the listen.owner and
    listen.group to www-data:www-data in default php-fpm.conf.  If you
    have more FPM instances or a webserver not running under www-data
    user you need to adjust the configuration of FPM pools in
    /etc/php5/fpm/pool.d/ so the accessing process has rights to
    access the socket.

メッセージはきちんと読まないといけないという教訓。