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

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

Basic認証ダイアログ

なぜ作ったのか

WordPress サイトのログイン・管理画面は常に大規模な不正ログイン攻撃にさらされています。
よくある攻撃内容としては、ユーザー名「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 にログインします。

Webコーディングスクール 体験レッスン受付中

ソースコード

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

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」フォルダー名を変更するなどしてこのプラグインを強制停止してください。

最近の記事

Web制作関連動画

メルマガ会員向けの「コーダーにも役立つ補完AI『Codeium』の使い方」の動画を期間限定で公開しています。
CodeiumはGitHub Copilotと似ていますが、CSSなども補完できて、今登録すれば無料で使えます。

メルマガでは、Web制作者のためのAI活用やWordPress関連の動画など、さまざまな特典があります。ご興味ある方は、ぜひメルマガにご登録ください。
Index