Nginx+php-fpm下でパーミッションがめちゃくちゃになってた話

やれやれ大変な目にあったぜ…

サーバーを管理していたりWordPressを導入したりするとファイルやディレクトリのパーミッション設定はセキュリティ上避けては通れない道ですが、WordPressのパーミッション設定で特に有名というか必要不可欠の設定が「wp-config.phpを外部からアクセス出来ないようにする」という設定です。
自分はこれを660にしていたんですが、ちょーっと確認してみるとアクセスできてしまったんですね。表示される内容は空白ですし、ダウンローダーにぶっ込んでも空ファイルが生成されるだけではあったのですが、これはどうにもセキュリティ上よろしくないってので、何がどうなってんのか調べてみることにしました。

所有者は誰でグループは誰でその他は一体誰なんだ

とりあえずテスト用に生贄のindex.htmlを作成。パーミッションを400にしてみるものの見れる。どういうこっちゃ
コマンド叩いて確認してみます。

cd [ルートディレクトリ]
li -l

所有者がNginxになっとるなこれ…
外部からのアクセスに応じてファイルを見に行ったりするのは、WebサーバープログラムであるNginxなので、こいつが所有者である場合全てのアクセスが可能になってしまいます。これはあかん。

chmod -R [ユーザー名]:[ユーザー名] [ルートディレクトリ]

さてこれでいいかな…
パーミッションを660とかにしてみます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-10-20-40-13

よしよしよし。

しかし困ったことが。これではせっかく書き込みできていたはずのディレクトリなんかに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;}とでも書いておきましょう…

Share this:

rexent_gx

インターネットクソオタク

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください