Hushfort

WordPress でログイン試行回数を制限するにはどうすればいいですか?

執筆:Eureka Studio · 更新日

要点

WordPress は、誰でも何度でもパスワードを試せる状態になっています。ログイン試行回数を制限するには、一定時間内の失敗回数を IP ごとに数え、上限に達した IP をしばらくロックアウトするプラグインを使います。たとえば「5 分間に 8 回失敗したら 15 分待機」といった設定です。2FA やアプリケーションパスワードの失敗も回数に含まれること、そして自分の IP を許可リストに入れておくことを確認してください。

手順

  1. 1手順 1

    無制限に推測できる状態を確認する

    制限がないと、WordPress は間違ったパスワードに何度でも同じエラーを返します。しかもデフォルトのメッセージは、そのユーザー名が存在することまで教えてしまいます。

    WordPress のログインフォームに間違ったパスワードを 2 回入力した画面。そのたびに WordPress は demo-admin のパスワードが正しくないと表示し、次の試行を通してしまう
  2. 2手順 2

    ログイン制限をオンにしてルールを決める

    WordPress で「Hushfort → 上限と制限」を開き、「ログイン制限を有効化」をオンにします。デフォルトは「5 分間に 8 回失敗で 15 分間のロックアウト」で、24 時間以内に 4 回ロックアウトされると 1,440 分のロックアウトになります。「変更を保存」を押します。

    Hushfort の「上限と制限」タブ。ログイン制限がオンで、許容する失敗回数 8、計測期間 5 分、ロックアウト時間 15 分が表示されている
  3. 3手順 3

    自分の IP を許可リストに入れ、IP の取得元を確認する

    下にある「IP の取得元」を設定します。Cloudflare の背後にあるサイトも含め、ほとんどのサイトには「自動 (検証済みのプロキシヘッダーのみ)」が適しています。続いて、オフィスや自宅の IP を「許可 IP」に追加すれば、自分がロックアウトされることはなくなります。最後に保存します。

    IP の取得元が「自動 (検証済みのプロキシヘッダーのみ)」に設定され、「許可 IP」に 203.0.113.10 が追加されている
  4. 4手順 4

    IP がロックアウトされたらメールで受け取る

    「通知メール」をオンにし、通知先のアドレスをカンマ区切りで 1 つ以上入力します。このスイッチには、サイトで SMTP が正しく動作している必要があります。SMTP がない場合、Hushfort はこのオプションをオフのままにして理由を表示します。

    「通知メール」がオンになり、通知先アドレスが 2 つ入力されて保存されたところ
  5. 5手順 5

    制限が働いていることを確認する

    許容回数を超えて失敗した IP は、次の試行を許されずにロックアウトされます。「履歴」には有効なブロックがすべて表示され、試されたユーザー名、試行回数、ブロックの終了時刻と「ブロック解除」ボタンが並びます。

    Hushfort の「履歴」画面。3 つの IP アドレスの有効なブロックが、試されたユーザー名、各 8 回の試行、残り 15 分とともに表示され、その下に失敗した試行の全履歴がある

なぜ重要なのか

総当たり攻撃(ブルートフォース攻撃)は、根気だけの攻撃です。パスワードを試し、外れたら次を試す。WordPress はそれを気にしません。同じアドレスから 1,000 回間違ったパスワードが送られてきても、1 回目と同じように丁寧に応答します。弱いパスワードや使い回しのパスワードのアカウントがあれば、破られるのは時間の問題です。

ログイン制限は、この計算を変えます。1 つの IP が数回試すごとに 15 分待たなければならないなら、そこそこ強いパスワードを推測するのに、数時間ではなく数年かかります。ボットのためにログインページを何度も生成する負荷からサーバーを守ることにもなります。

これだけでは防げないこと。 何千もの IP アドレスを持つ攻撃者は、それぞれから数回ずつ推測を送れます。だからこそ、ログイン制限は二要素認証と組み合わせると最も効果を発揮します。二要素認証があれば、パスワードを当てられてもコードなしでは役に立ちません。

よくある間違い

  • ログインフォームだけを数える。 パスワードは xmlrpc.php、REST API のアプリケーションパスワード、二要素認証のコード入力画面からも試せます。これらが制限の回数に含まれなければ、攻撃者はそちらを使うだけです。XML-RPC 経由のログインも塞ぎましょう。詳しくは XML-RPC を安全に無効化する方法をご覧ください。
  • プロキシの背後で間違った IP を読む。 サイトが Cloudflare の背後にあり、プラグインがプロキシのアドレスを読んでいると、1 つのボットのせいで訪問者全員がロックアウトされかねません。逆に X-Forwarded-For ヘッダーを無条件に信頼すると、ボットはリクエストのたびに新しい IP をでっち上げ、まったく数えられません。安全なルールは、リクエストが本当にプロキシから来ている場合に限ってプロキシヘッダーを信頼することです。
  • ロックアウトが長すぎる。 3 回の打ち間違いで 24 時間のロックアウトでは、自社のスタッフを罰することになります。最初のロックアウトは短くし、繰り返されたときに長くしましょう。
  • 許可リストがない。 自分の固定 IP を追加しておけば、パスワードを忘れても締め出されることはありません。

プラグインを使わない方法

WordPress には、ログインに失敗するたびに実行される wp_login_failed というフックがあります。トランジェントで失敗回数を数え、回数が多すぎるときにログインを拒否できます。必須プラグイン(wp-content/mu-plugins/login-limit.php)として置く最小限の例です:

<?php
add_action( 'wp_login_failed', function () {
    $key = 'll_' . md5( $_SERVER['REMOTE_ADDR'] );
    $n   = (int) get_transient( $key );
    set_transient( $key, $n + 1, 15 * MINUTE_IN_SECONDS );
} );

add_filter( 'authenticate', function ( $user ) {
    $key = 'll_' . md5( $_SERVER['REMOTE_ADDR'] );
    if ( (int) get_transient( $key ) >= 8 ) {
        return new WP_Error( 'too_many', 'Too many failed attempts. Try again later.' );
    }
    return $user;
}, 30 );

これでも動きますが、足りない部分は正直に認めておきましょう。読むのは REMOTE_ADDR だけなので、プロキシの背後ではプロキシを数えてしまいます。XML-RPC の multicall による推測を個別の試行として数えません。許可リスト、通知メール、ログもありません。どれも、書いて保守しなければならないコードが増えることを意味します。

アクセスログを監視する fail2ban のような、サーバーレベルのツールを提供しているホスティング会社もあります。ホスティング会社が運用してくれるなら強力ですが、共用サーバーでは通常自分で設定できません。

うまくいかないときは

  • 自分がロックアウトされた。 ロックアウトが終わるのを待つか、モバイルデータ通信など別のネットワークから試すか、ほかの管理者にあなたの IP を許可リストに追加してもらってください。
  • 全員が一斉にロックアウトされる。 サイトがプロキシの背後にあり、プラグインがプロキシの IP を読んでいる可能性が高いです。「IP の取得元」の設定を変更してください。
  • ロックアウトがまったく起きない。 IP の取得元が、ボットが偽装できるヘッダーを信頼していないか確認してください。試行のたびに異なる「IP」が表示されているなら、それが原因です。

サイトに戻るためのあらゆる方法は、ログイン URL を変更したら wp-admin が 404 にをご覧ください。

Hushfort なら

ログイン制限は、無料の WordPress セキュリティプラグイン Hushfort Security に追加する有料アドオン Hushfort Pro の機能です。

Hushfort のログイン制限レイヤーは、あなたが決めた計測期間内の失敗したログインを IP ごと(または IP とユーザー名の組み合わせごと)に数え、あなたが決めた時間だけその IP をロックアウトします。24 時間以内にロックアウトが繰り返されると、さらに長い長期ロックアウトを適用できます。

  • 二要素認証コードの失敗やアプリケーションパスワードによるログインの失敗も数えるため、推測のための裏口がありません。
  • プロキシヘッダーは、リクエストが本当に Cloudflare またはプライベートネットワークから来ている場合にだけ信頼します。
  • 通知メールは、登録したすべてのアドレスに届きます。
  • 失敗した試行とブロックした試行はすべて、絞り込み可能な「履歴」に表示されます。
  • 許可リストはほかのすべての Hushfort レイヤーと共有されるため、自分を追加するのは 1 回で済みます。

Hushfort を無効化すると、既存のロックアウトはすべて解除されます。

よくある質問

ログイン試行は何回まで許可すればいいですか?

数回打ち間違える人には十分で、推測が無意味になる程度に少ない回数です。数分間に 5〜10 回の失敗で 15 分のロックアウト、というのが無理のない落としどころです。

WordPress は標準でログイン試行回数を制限していますか?

いいえ。WordPress 本体は、失敗したログインを無制限に受け付けます。サーバー側で制限をかけているホスティング会社もあるので確認する価値はありますが、それに頼ることはできません。

ログイン制限で自分のサイトから締め出されることはありますか?

打ち間違いを続ければあり得ます。自分の IP を許可リストに追加するか、ロックアウトが終わるのを待ってください。ほかの管理者があなたの IP を許可リストに追加することもできます。

ログイン試行回数の制限だけで総当たり攻撃は防げますか?

推測のペースを大幅に落とせますが、多数の IP アドレスを持つ攻撃者は試行を分散できます。二要素認証、強力なパスワード、XML-RPC 経由のログインの遮断と組み合わせてください。

Cloudflare の背後だと、なぜ関係のない人がロックアウトされるのですか?

プロキシの背後では、すべての訪問者がプロキシの IP から来ているように見えることがあります。IP の取得元を設定し、リクエストが本当にそのプロキシから来ている場合に限って、実際の IP を示すヘッダーを信頼するようにしてください。

不具合の報告・機能のリクエスト

メッセージは Hushfort の開発チームに直接届きます。

内容の種類

返信にのみ使用します。

これらの情報は返信のためだけに使用します。 プライバシー