リダイレクトを使用してWordPressのログイン画面などのセキュリティを向上させる

WordPressを使い始めてもうすぐで一年になります。今まで、セキュリティということに関してはほとんどノータッチで使用を続けてきました。

最近、WordPressを色々と勉強している中でセキュリティに関して怖い記事をいくつか読み、対策した方法をメモ。

方法はシンプル、WordPressのログイン画面やコアファイルにアクセスがあった時は「IPアドレスで判定をして、自分以外のアクセスは301リダイレクトでアドレス http://0.0.0.0 へ飛ばしてしまう」です。

対策したファイル

対策したファイルは以下の5つです。

  • wp-login.php(ログイン画面)
  • wp-adminフォルダ(WordPressのコアフォルダ)
  • wp-config.php(データベース情報が書かれた重要ファイル)
  • xmlrpc.php(外部エディタなどからアクセスする時に利用するファイル)
  • wp-includesフォルダ(コレも重要なコアフォルダ)

1:WordPressのログイン画面を表示する時に「wp-admin」・「wp-admin/」・「login」と打っても、以下のような導線で最終的に「wp-login.php」にアクセスをしています。

  • 「wp-admin」→「wp-admin/」→「wp-login.php」
  • 「login」→「wp-login.php」

ピンポイントで「wp-login.php」の名前を指定して飛ばしてしまってもいいのですが、不正なアクセスを「wp-login.php」まで導くのも嫌なので、今回は大雑把に導線の途中でも飛ばしてしまう方法にしました。

2.wp-adminフォルダは、WordPressの本体そのものなのでココも自分以外はアクセス不可に。

3.wp-config.phpは、データベースの重要な情報が書かれている大切なファイルなので、自分以外はアクセス不可に。

4.xmlrpc.phpは、外部エディタなどで使用する機能ですが、危険なようなので自分以外はアクセス不可に。(外部エディタなどを使用しない場合は、自分もアクセスできないようにしてしまってもいいかもしれません)

リダイレクトできる条件

この方法、以下のような条件が必要です。

  • リダイレクトに「.htaccessに条件を記載をして、mod_rewriteという機能」を使用します。なので、「サーバーで.htaccess・mod_rewrite機能が利用できる」必要があります。
  • 自分のIPアドレスがある程度固定でないと運用が厳しいです。インターネットに接続するたびにIPアドレスが変わる環境だと、自分もWordPressにアクセスできなくなります。

方法

「wp-login.php」「wp-adminフォルダ」などが置かれているディレクレクトにある、「.htaccess」に下記の記載をします。

まずは分かりやすく、一つずつ記載。次に、短く書く方法を記載します。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXXX.XXXX.XXXX.XXXX
RewriteRule ^xmlrpc.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXXX.XXXX.XXXX.XXXX
RewriteRule ^wp-login.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXXX.XXXX.XXXX.XXXX
RewriteRule ^login.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXXX.XXXX.XXXX.XXXX
RewriteRule ^wp-admin.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXXX.XXXX.XXXX.XXXX
RewriteRule ^wp-config.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXXX.XXXX.XXXX.XXXX
RewriteRule ^wp-includes.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

「XXX.XXX.XXX.XXX」は、自分のIPアドレスに置き換えてください。

検索すると色々な確認サイトがあるのでお好みで。

簡単にですが説明

<IfModule mod_rewrite.c>:書き換えをするためのモジュール利用を定義します。

RewriteEngine On:書き換えするぞー!と、モジュールONを宣言します。

RewriteBase /:「.htaccessファイル」の置かれているディレクトリを起点にして下に続くルールを適用。「/wordpress/.htaccess」なら「/wordpress/」を起点にする。

RewriteCond %{REMOTE_ADDR} :「RewriteCond」で書き換えの条件を定義、「{REMOTE_ADDR}」でIPアドレスが条件の内容としています。「!=」の「!」は否定なので、このIPアドレスの時は書き換えを行わないとしています。「!」を消せば、指定したIPアドレスの時だけ書き換えが行われます。

RewriteRule:書き換えをする内容を記載。今回は、該当するファイル名の時に「アドレスを http://0.0.0.0 へ書き換え、301リダイレクト」としています。

正規表現の説明

アクセスしてくるコンピュターから送られてくる、アクセス先の情報の中から「wp-admin」や「wp-config.php」という名前を捉えるのに、正規表現というルールで記載をします。

「^wp-login.*$」を例に、正規表現を簡単に説明します。

^:文字の始まり
.*:どの文字でもいいので、0回以上の文字の繰り返し
$:文字の終わり

「^wp-login.*$」が表す内容は、起点となる「/」より続く文字が「wp-login」で始まる文字だった時。続く条件の「http://0.0.0.0へ301リダイレクトする」という意味になります。

「XXXX/wp-login/」でも、「XXXX/wp-loginXX/XXX/XXX」でも、「XXXX/wp-login」でも、「http://0.0.0.0」へ飛びます。

「XXX/XXXwp-login/」や、「XXX/XXXwp-loginXXX」は飛ばないです。

少し乱暴で強引な書き方にしました。

他のファイルも同じです。wp-adminも、文字がwp-adminで始まる時は、ファイルでもディレクトリでも、とにかく飛びます。

短く記載したバージョン

上記で書いた「.htaccess」に記載する内容を短く書くと、

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXX.XXX.XXX.XXX
RewriteRule ^xmlrpc.*$|^wp-login.*$|^login.*$|^wp-admin.*$|^wp-config.*$|^wp-includes.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

になります。横に長くなりますが、RewriteRuleは1行で記載をします。改行を入れてはダメです。

RewriteRuleにある「|」が「or、又は」という意味になります。なので、「どのファイル名の時でも」という意味になります。

.htaccessの記載する位置

WordPressを利用している場合、すでに「.htaccess」があると思います。

「#BEGIN WorPress 〜 #END WordPress」という内容が書かれていると思うので、位置は上でも下でもお好みで。

上に書くと、「wp-login」と打つと「http//0.0.0.0」へ飛びます。下に書くと「404ページ」へ移動します。この違いは、「.htaccess」が上から順番に処理をしていくためです。

ん、上に記載ですねかね・・・。私は上に記載をしています。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !=XXX.XXX.XXX.XXX
RewriteRule ^xmlrpc.*$|^wp-login.*$|^login.*$|^wp-admin.*$|^wp-config.*$|^wp-includes.*$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

このようになります。

wp-loginだけ、wp-configだけ、などの時は

最初に記載した一つずつバージョンで、必要なモノを「.htaccess」に「コピ−&ペースト」。「IPアドレスをご自分のに書き換え」てください。

動かないプラグインやエラーが出るときは

自分のIPアドレス以外の外部からのアクセスは全て遮断してしまいます。私の環境では起きていないですが、プラグインや使用しているテーマ、サーバーによってはエラーが出る可能性があります。

その時は、RewriteRuleで該当のファイル名を消す、RewriteCondでアクセスできるように許可を与える、などが考えられます。

補足

2つの補足事項です。

ホスト名などでアクセスできるようにする

セキュリティ的な疑問は残りますが、検索していただければ環境に合わせて柔軟に対応できます。IPアドレでなく、プロバイダの「ホスト名」や、使用するブラウザの「ユーザーエージェント」にする時は、

  • ホスト名:RewriteCond %REMOTE_HOST !=XXX.XXX.XXX.ne.jp など
  • ユーザーエジェント:RewriteCond %HTTP_USER_AGENT !=XXXXXXXXXXXX など

少し面倒ですが、WordPressにログインする時だけ「ブラウザのユーザエージェントを自分のオリジナルに切り換え」という方法も考えられます。ホスト名、ユーザーエージェントも、「確認君」などで確認できます。

他にも、「RewriteCond 一覧」や「RewriteCond 変数」などで検索をすれば、だいたい環境にあった内容が見つかると思います。

ファイル名の正規表現

ファイルやフォルダをピンポイントで指定する時の正規表現は、

・ wp-login.php:^wp-login\.php$
・ wp-adminフォルダ:^wp-admin/$ や ^wp-admin/(.*)$
・ xmlrpc.php:^xmlrpc\.php$
・ wp-config.php:^wp-config\.php$
・ wp-includesフォルダ:^wp-includes/$ や ^wp-includes/(.*)$

拡張子の「.(ドット)」などを、

「\(バックスラッシュ)」

でエスケープ処理して記載をします。環境によっては「¥(円マーク)」で表示されるかもしれません。

キーボードでバックスラッシュが打てない時は、頻繁に使用するモノでもないと思うのでコピー&ペーストで・・・。

MACなら、メニュー右上の日本語入力などの環境設定で「バックスラッシュと円マークの入力」の切り替えできます。

IPアドレスが変わって、ログインできないとき

自分のIPアドレスが変わるとログインできなくなります。そんなときは、FTPなどで「.htaccess」に記載をしたIPアドレスを書き換えればアクセスできます。

まとめ

<Files "wp-login.php">
order deny,allow
deny from all
allow from 固定IPアドレスを入力
</Files>

のようなアクセス制限が広く一般的なようですが、301で飛ばしてしまうのとどちらがいいのか、メリット・デメリットはわかりません。

重要:リダイレクト先は必ず「http://0.0.0.0」に。くれぐれも。