WordPressのログイン・管理画面にBasic認証をかけるプラグイン「WP Admin Basic Auth」を作りました

2013年4月ごろから、複数の WordPress サイトの管理画面に不正にログインしようとする bot が増えているという話を聞いて、少し気になったので WordPress サイトの管理画面やログインページにBasic認証をかけるプラグイン「WP Admin Basic Auth」を作りました。

Basic認証ダイアログ

なぜ作ったのか

2013年4月ごろから、WordPress サイトのログイン・管理画面への大規模な不正ログイン攻撃が増加しましています。

参考: WordPress の“admin”アカウントを狙った大規模な不正ログイン攻撃、パスワードへの警戒を – インターネットコム

よくある攻撃内容としては、ユーザー名「admin」、パスワード「admin」「123456」といったもののようです。

参考: おい、そこのWordPress管理者、大丈夫か?不正ログインがないか確認を

基本的な対策としては、

  • パスワードを複雑で長いものにする
  • 「admin」というユーザー名を使わない
  • ブログのドメイン名と同じユーザー名(例: stocker)を使わない
  • WordPress は最新のものを使用する

ですが、いくら最新の WordPress を使用し、長いパスワードを設定したとしても、攻撃されているのを放置するのは気持ちが悪いものです。
(理論的には、ユーザー名とパスワードの組み合わせをずっと試し続けていれば、いつかはログインされてしまうはずですし)

そこで、最初は Simple Login Lockdown というプラグインを使って、複数回ログインに失敗するとしばらくの間誰もログインできないようにしました。

…結果、不正ログイン攻撃があるたびに自分もログインできなくなってしまいました orz

そこで、WordPress のログイン画面や管理画面にアクセスしようとした時にBasic認証をかけたいと思ったのですが、そのようなプラグインが見当たらなかったため制作しました。

使い方

下記ページから「WP Admin Basic Auth」プラグインをダウンロードし、解凍します。
解凍されると出てくる「wp-admin-basic-auth」フォルダーを、WordPress の「wp-content」以下の「plugins」フォルダー内に入れます。

もしくは、WordPressの管理画面から「プラグイン>新規追加」をクリックし、「WP Admin Basic Auth」で検索し、インストールします。

あとは、管理画面の「プラグイン」から「WP Admin Basic Auth」プラグインを有効化するだけです。
(設定画面などはありません)

一度管理画面からログアウトした後、管理画面にログインしようとすると、この記事の上のほうにあるキャプチャー画像のようにBasic認証を求められますので、普段 WordPress にログインするときに使用しているユーザー名とパスワードを入力 してBasic認証し、その後 WordPress にログインします。

ソースコード

コメント部分を除いたソースコードはこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function admin_basic_auth(){
	// キャッシュを出力しない
	nocache_headers();
	// 既にログインしている場合はreturn
	if ( is_user_logged_in() ) {
		return;
	}
 
	// WordPress のユーザー認証で BASIC 認証ユーザー/パスワードをチェック
	$user = isset($_SERVER["PHP_AUTH_USER"]) ? $_SERVER["PHP_AUTH_USER"] : '';
	$pwd  = isset($_SERVER["PHP_AUTH_PW"])   ? $_SERVER["PHP_AUTH_PW"]   : '';
	if ( ! is_wp_error(wp_authenticate($user, $pwd)) ) {
		return;
	}
 
	// HTTPヘッダーで、BASIC認証を要求
	header('WWW-Authenticate: Basic realm="Please Enter Your Password"');
	header('HTTP/1.0 401 Unauthorized');
	// 認証がキャンセルされたら「Authorization Required」と表示して終了
	die('Authorization Required');
}
 
// WordPress管理画面へのログインページでHTMLが出力され始める前に admin_basic_auth() 関数を実行
add_action('login_init', 'admin_basic_auth');

見ての通り、WordPress のユーザー名とパスワードを使用して認証しています。
セキュリティ的には、WordPress ユーザーのログイン名/パスワードとは別物にしたほうがより強固ですが、今のところBasic認証を突破しようとする bot は居ないと思われますのでこのようにしています。
(もし、Basic認証を突破しようとする bot が現れた場合は、管理画面からBasic認証のユーザー名とパスワードを変更できるようアップデートする予定です)

謝辞

このプラグインを制作するにあたり、 @wokamoto さんのプラグイン WP Basic Auth の最初の頃のバージョンのソースコードを参考にさせて頂きました。
「WP Basic Auth」プラグインは、WordPress の「管理画面以外」にBasic認証をかけるプラグインです。

ちなみに、wokamotoさんは Crazy Bone(狂骨) という WordPress のログイン・不正ログイン試行の履歴を記録するプラグインも公開していらっしゃいます。
このブログも、Crazy Bone プラグインで不正ログインしようとしたユーザー(あるいは bot)のIPアドレスや時間を記録しています。

また、WordPressの教科書 の著者の1人であり、WordPressカスタマイズ講座 を一緒に開講している、FUNTERACTIVE の井村圭介さんにもアドバイスを頂きました。
ありがとうございます。

※ちなみに、このプラグインは前回の WordPressカスタマイズ講座 の参加者の方に配布したものとほぼ同じものです。

注意点

このプラグインは、WordPress サイトの管理画面への不正ログイン攻撃をある程度回避することができるものですが、絶対にログインされないことを保証するものではありません。
WordPress を不正ログイン攻撃から守るのは、以下の対策が基本です。パスワードが単純で短いものであれば、このプラグインもあまり意味がありません。

  • パスワードを複雑で長いものにする
  • 「admin」というユーザー名を使わない
  • ブログのドメイン名と同じユーザー名(例: stocker)を使わない
  • WordPress は最新のものを使用する

このプラグインを使用したことによる、いかなる損害も保証できませんのでご注意ください。

万が一、このプラグインのせいでログインできなくなった場合は(パスワードを忘れたなど)、「WordPressインストールフォルダー/wp-content/plugins/」内の「wp-admin-basic-auth」フォルダー名を変更するなどしてこのプラグインを強制停止してください。

If you like this article click the Facebook “Like” button to share it with your friends!