Nginx+php-fpm下でパーミッションがめちゃくちゃになってた話
やれやれ大変な目にあったぜ…
サーバーを管理していたりWordPressを導入したりするとファイルやディレクトリのパーミッション設定はセキュリティ上避けては通れない道ですが、WordPressのパーミッション設定で特に有名というか必要不可欠の設定が「wp-config.phpを外部からアクセス出来ないようにする」という設定です。
自分はこれを660にしていたんですが、ちょーっと確認してみるとアクセスできてしまったんですね。表示される内容は空白ですし、ダウンローダーにぶっ込んでも空ファイルが生成されるだけではあったのですが、これはどうにもセキュリティ上よろしくないってので、何がどうなってんのか調べてみることにしました。
所有者は誰でグループは誰でその他は一体誰なんだ
とりあえずテスト用に生贄のindex.htmlを作成。パーミッションを400にしてみるものの見れる。どういうこっちゃ
コマンド叩いて確認してみます。
cd [ルートディレクトリ] li -l
所有者がNginxになっとるなこれ…
外部からのアクセスに応じてファイルを見に行ったりするのは、WebサーバープログラムであるNginxなので、こいつが所有者である場合全てのアクセスが可能になってしまいます。これはあかん。
chmod -R [ユーザー名]:[ユーザー名] [ルートディレクトリ]
さてこれでいいかな…
パーミッションを660とかにしてみます。
よしよしよし。
しかし困ったことが。これではせっかく書き込みできていたはずのディレクトリなんかにphpでうごいてるWordPressもアクセスできなくなっちゃう。つまりプラグインの導入や編集やテーマ周りの編集機能がオジャンになってしまうと。
どーうしたもんか、というところで「Nginxとphpを実行してるphp-fpmの実行ユーザーは別々にできる」という話を聞いてちょっとやってみることに。
php-fpmの実行ユーザーをNginxから変える
とりあえずuseraddで適当なユーザーを作成します。
useradd -s /sbin/nologin test
最初にphp-fpm.confを編集して、新しく作る設定ファイルを読み込んでくれるようにします。
vi /etc/php-fpm.conf
デフォルトではコメントアウトされているincludeの設置部分を修正します。
include=etc/php-fpm.d/*.conf
そして、存在しない場合は新しいディレクトリと先程作ったユーザー用の設定ファイルを作成します。
mkdir /etc/php-fpm.d vi /etc/php-fpm.d/test.conf
[test] listen = /var/run/php-fpm/php-fpm-test.sock user = test group = test #502 Bad Gatewayエラーが出る場合はここを追加 listen.owner = test listen.group = test #ここまで pm = dynamic pm.max_children = 15 pm.start_servers = 5 pm.min_spare_servers = 2 pm.max_spare_servers = 5
設定内容は環境によって様々なので、合わせて変更して下さい。
そしてphp-fpmを再起動。
systemctl restart php-fpm
仕上げにこのままではNginxがphp-fpmのソケットにアクセスできないのでNginxの設定を編集します。
vi /etc/nginx/conf.d/default.conf
upstream部分とfastcgi_pass部分を修正。
upstream php-handler { #server 127.0.0.1:9000; server unix:/var/run/php-fpm/php-fpm-test.sock; }
location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm-test.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
そしてNginxを再起動して完了です。
systemctl restart nginx
この状態でphpinfo()を実行すると、正常に実行ユーザーが変更できていればEnvironmentの項目でUSER部分がtestと表示されます。やったね!
ただしこれでも少し注意が必要で、他のファイルはいいのですがphpファイルのパーミッションを660とかにしてもphpを実行するのはアクセス者ではなく新しく作ったtestユーザーなので実行されちゃいます。ダウンロードできるかは試してないのでなんとも言えませんが、そういったファイルにアクセス出来ないようにするにはおとなしくNginxのconfファイルにlocation = /hoge.php {deny all;}とでも書いておきましょう…
最近のコメント