【Xserver VPS】KUSANAGI × WordPressのセキュリティ設定 (1)

WordPress x Xserver VPS x KUSANAGI Xserver VPS

KUSANAGI × WordPressでプラグインをインストールしようとした際にエラーがでました。具体的には、WP phpMyAdminプラグインをインストールした際に、Your WP-CONTENT/PLUGINS/WP-PHPMYADMIN-EXTENSION directory is not writable. というエラー表示が出ました。これをきっかけにWordPressのファイルのパーミッションについて色々と調べてみましたが、Web上の情報には「本当にこんな設定して良いのか??」というものも多く、試行錯誤した結果を以下にまとめます。

WordPressのファイルパーミッションについて

そもそもエラーの原因は?

そもそもなぜ上記のようなエラーが出るのか。いろいろ調べた結論としては、

  • WordPressはサーバ上ではWebサーバが実行するため、httpd:wwwが実行している。
  • 一方、KUSANAGIではセキュリティ上の理由から、WordPress関連ファイルの所有権はkusanagi:kusanagiとなっている。
  • そのため、プラグインがファイル書き込みをしようとした際に、上記が発生することがある。
  • 例えば、あるディレクトリのパーミッションが775であった場合に、プラグインがそのディレクトリに書き込もうとすると、httpd:wwwには書き込み権限が無いため、エラーとなる。

エラーが表示される理由としてはシンプルですね。

Webで色々と情報を調べてみると、、、

同じような症状に突き当たっている人も多いと見えて、検索すると色々な解決法が出てきます。例えば、

  1. パーミッションを777に変更しましょう。
    ・・・。そりゃあ、問題は解決するでしょうよ。誰でも書き込みどころか何でもできるようになるんですから。でも、それってセキュリティ的にまずくないですか?プラグインのエラーどころか、もっと重大な事態を引き起こすことになる気がするのでボツです。
  2. wp-contentディレクトリ以下の所有権をすべてhttpd:wwwにしましょう。
    なるほど、たしかにそうすればパーミッション755とかであればhttpd:wwwが書き込みできるようになりそうですね。でも、KUSANAGIを作っている人たちもバカではない、というかむしろ、私なんかよりよっぽど賢くてよくわかっている人なわけですよね。その人達がWordPressファイルの所有権をkusanagi:kusanagiにしているということはキチンとした意味があるのだと思うのですよ。私なんかでさえ、「この設定したら、今度はKUSANAGIがこのディレクトリいじれなくなって、何か問題起きそうじゃないか?」と思うわけですよ。というわけでボツです。

と、色々と不安になるような解決策がいっぱいWebには溢れているのです。あくまで直感的にですが「こりゃ、信じて設定したらマズイな」と思ったわけです。となると、何か信じて良さそうな情報が無いかと調べてみました。

KUSANAGI公式サイトに従った設定

ドキュメント - 超高速CMS実行環境 KUSANAGI
KUSANAGIに関するドキュメントです。 過去の ... Read more

見つけました。KUSANAGI公式の推奨設定。これについても、Webでは「公式設定だとセキュリティがガチガチで使いづらい」「とりあえずパーミッション777にすれば問題解決」といった記述も散見されます。

ですが、使いやすさとセキュリティはトレードオフなんだから、キチンとセキュリティ対策すれば使いにくい部分があるのは当たり前。KUSANAGIはWordPress高速化がウリであって、WordPressの事をよーーく分かっている人たちが推奨している設定なのだから、まずはこれに従って「ガチガチ」の設定を行い、その上で色々と考えた上で必要最低限の変更を行っていくことを基本方針としました。

要は「何の設定変更しているのか分かってないものは変えない」ということですね。

以下、基本的には推奨設定に従って設定を進めた経緯を記載します。

wp-config.phpの安全性を高める

wp-config.phpはデータベースの接続情報だけでなく、認証用ユニークキーなど重要なセキュリティ情報も含んでいます。
そのためwp-config.phpファイルのセキュリティを向上させることは重要です。

推奨するセキュリティ設定|KUSANAGI

なるほど。確かにwp-config.phpを見るとユーザ名、DB名、認証関連情報、更にはパスワードまで記載されています。これがDocumentRoot にあるという事は、Web経由で見られてしまうリスクが高まるということ。なので、推奨設定に従ってこれをひとつ上のディレクトリに移動させます。

# cd /home/kusanagi/プロファイル名/DocumentRoot
# mv wp-config.php ../

ここで、サイトが見れるかブラウザで試してみると、問題なく見れています。「wp-config.phpの位置を変えたのに、何も設定変えずに動いているのはなんでだろ?」とも思いましたが、調べてみると、WordPressはwp-config.phpが見つからないと、その親ディレクトリを探しに行く仕様になっている模様。納得。

続いて、wp-config.phpの所有権をkusanagiに変更し、パーミッションも440に変更します。

# cd ..
# chown kusanagi:www wp-config.php
# chmod 440 wp-config.php

WordPressの管理画面に対してアクセス制限を行う

nginxのアクセス許可IPアドレスの設定

引き続き推奨設定に従って、vi /etc/nginx/conf.d/プロファイル名_http.confを実行しようとしました。しかし、vi /etc/nginあたりまで入力してタブを押しても補完されないので「ん?」となりました。で、以下を実行してみました。

# cd /etc
# ls -al | grep nginx
#

何も出てきません。すなわち、/etcにはnginxディレクトリが無いということ。なので、まずはnginx設定ファイルがどこにいるのか捜索です。

# find / -name "nginx"

すると、いくつか出てきますが、それっぽいのは/etc/opt/kusanagi/nginx。なのでそこに移動してlsしてみます。

# cd /etc/opt/kusanagi/nginx
# ls

いました、conf.d。なので、早速そこに入って設定ファイルの編集を見つけます。

#  cd conf.d
# ls

推奨設定では、【プロファイル名_http.conf】と【プロファイル名_ssl.conf】を編集してAllow 0.0.0.0/0をアクセスを許可したいIPアドレスに変更するように、とありますが、そのようなファイルはありません。

それらしいファイルとしては、【プロファイル名.conf】と【プロファイル名.wp.inc】が見つかりました。なので、まずは【プロファイル名.conf】を開いて、Allow 0.0.0.0/0のような記述が無いかと探してきます。

# vi プロファイル名.conf
server {
    listen 80;
    listen [::]:80;
    :
    :
}

server {
    listen 443 ssl httpd2;
    listen [::]:443 ssl httpd2;
    :
    :
}

すると、上記のように設定ファイルの中が二段構成になっているのが分かります。ポート番号から察するに、前段が推奨設定で言うところの【プロファイル名_http.conf】、後段が【プロファイル名_ssl.conf】に該当する様子。推奨設定では2つのファイルだったものが1つにまとまっているようです。

バージョンが変わってディレクトリや設定ファイルの構成は変わったものの、推奨設定のページは以前のままのようですね。でも、何をすべきかは指し示してくれていますので、自分なりに翻訳して設定を進めます。

で、上記の【プロファイル名.conf】の中でAllow 0.0.0.0/0らしきものを探そうとしますが、見つかりまえん。一方で、前段のhttp、後段のhttpsの設定それぞれに以下の一文を見つけることができます。

include conf.d/プロファイル名.wp.inc

なので、双方共通の設定としてこの【プロファイル名.wp.inc】に記載され、それがincludeされているのではないかと当たりをつけて、ファイルを開いてみます。

# vi プロファイル名.wp.inc
 1 # WordPress template
  :
  :
21 location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|images/)).)*$ {
22     satisfy any;
23     allow 0.0.0.0/0;
24     allow 127.0.0.1;

ありました!23行目にallow 0.0.0.0/0の記載が。

23行目を自分の環境に合わせて編集しておきます。

 1 # WordPress template
  :
  :
21 location ~* /wp-login\.php|/wp-admin/((?!(admin-ajax\.php|images/)).)*$ {
22     satisfy any;
23     allow 自宅等のアクセス元のIPアドレス
24     allow 127.0.0.1;

で、設定を反映させるために以下を実行。

# kusanagi nginx
# systemctl restart nginx

【Xserver VPS】phpMyAdminの導入でも行ったようにスマホから確認してみます。WiFiをオフにしてキャリアのネットワークからアクセスすると無事に403 Forbiddenになりました。

WordPress Login - 403 Forbidden

.htpasswdファイルの作成、ユーザ名及びパスワードの設定

ベーシック認証の設定をします。KUSANAGI環境ではApache / nginxのいずれを利用している場合も.htpasswdファイルは共通のパスを参照しています。ちょっとこのあたりの推奨設定の記載はnginx / Apacheのものが入り混じっていますが、丁寧に読んでいけば分かります。

共通のパスを参照していることは、以下のファイルを見てみると分かります。

  • 【Apache】/home/kusanagi/プロファイル名/DocumentRood/.htaccess
  • 【nginx】/etc/opt/kusanagi/nginx/conf.d/プロファイル名.wp.inc

それぞれ/home/kusanagi/.htpasswdを参照しています。

以下のコマンドを実行して.htpasswdファイルを作成します。

# htpasswd -c /home/kusanagi/.htpasswd ユーザ名
New password: 
Re-type new password: 

ユーザ名はサーバ環境のユーザ名でなく、任意のもので大丈夫です。パスワードも設定しておきます。

ここで、再びスマホからキャリアのネットワークからアクセスすると、先程は403 Forbiddenでしたが、今回は以下のようにベーシック認証が求められます。

WordPress Login - Basic Auth required

先程.htpasswdファイルを作成する時に設定したユーザ名とパスワードを入力すると、管理画面ログイン画面が表示されます。

続きは次回です。

コメント

タイトルとURLをコピーしました