WordPressのセキュリティを考える(超簡易版)
WordPressを何も考えずにインストールすると、
/index.phpとか /wp-config.phpとか /wp-admin/WPのプログラム本体 /wp-content/plugins/インストールしたプラグイン /wp-content/themes/インストールしたテーマ /wp-content/uploads/アップロードした画像たち /wp-includes/WPのプログラム本体
などというディレクトリー構造になる。このうち、/wp-config.php、/wp-login/php、/wp-admin/*.php、/wp-includes/*.phpは一般人からはWebアクセスされる事は無いのに表に出てきているので不正アクセスの脅威に常にさらされることになる。特に/wp-login.php。(購読者というログイン者が居る)会員制サイトの場合は使えないが、個人用ブログを垂れ流したり、会社Webサイトを作ったりな時には/wp-login.phpなんて外からは触れない方が理想だ。
これに対して、Apacheでできる2つの簡単な対策を考えてみた。
1..htaccessが全面的に使える場合
単純に/.htaccessでwp-*.phpをアクセス制限する。BASIC認証でもいいし特定のIPからのみ許可でもいい。
同様に/wp-admin/.htaccessと/wp-includes/.htaccessでこのディレクトリー以下の全てのアクセスを制御できる。
.htaccessではDirectoryディレクティブとLocationディレクティブが使えないため、子供のディレクトリーに置く.htacessのFilesディレクティブで制御する。
<Files "*.php"> Order deny,allow Deny from All Allow from xxx.yyy.zzz.www </Files>
などとした.htaccessを/wp-admin/や/wp-includes/に置くと、ディレクトリー全体をアクセス制限できるようになる。
2./etc/httpd/conf/httpd.confがいじれてかつ名前ベースのバーチャルホストが使える場合
www.example.comという名前とwpadmin.example.comという名前をこのサーバーに付け、www.example.comのホストではindex.phpと/wp-content/だけを置いてwp-blog-header.phpへのincludeを適切に設定する。admin.example.comのホストではそれ以外のWPの全コンテンツを置いてこちらで記事の投稿を行う。/wp-admin/はそのものはwww.example.comに無いのでアクセスされる事もない。なんならadmin.example.comはDNSじゃなくて管理したい端末でのみhostsに設定するとなおセキュアであろう。
残念ながらこちらの方法はwp-adminやwp-includeの中にある画像やcssを普通に使う標準テーマでは使えない。自作テーマでこれらの中身を使わない場合にのみ適用可能だ。
WordPressは何かしようとすると途端に動きが怪しくなる事が未だにあるため、Apacheの制御でなんとかセキュアにできないかと考えた結果こうなった。