WordPress でログイン試行回数を制限するにはどうすればいいですか?
執筆:Eureka Studio · 更新日
要点
WordPress は、誰でも何度でもパスワードを試せる状態になっています。ログイン試行回数を制限するには、一定時間内の失敗回数を IP ごとに数え、上限に達した IP をしばらくロックアウトするプラグインを使います。たとえば「5 分間に 8 回失敗したら 15 分待機」といった設定です。2FA やアプリケーションパスワードの失敗も回数に含まれること、そして自分の IP を許可リストに入れておくことを確認してください。
手順
1手順 1
無制限に推測できる状態を確認する
制限がないと、WordPress は間違ったパスワードに何度でも同じエラーを返します。しかもデフォルトのメッセージは、そのユーザー名が存在することまで教えてしまいます。

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

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

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

5手順 5
制限が働いていることを確認する
許容回数を超えて失敗した IP は、次の試行を許されずにロックアウトされます。「履歴」には有効なブロックがすべて表示され、試されたユーザー名、試行回数、ブロックの終了時刻と「ブロック解除」ボタンが並びます。
なぜ重要なのか
総当たり攻撃(ブルートフォース攻撃)は、根気だけの攻撃です。パスワードを試し、外れたら次を試す。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 を無効化すると、既存のロックアウトはすべて解除されます。
よくある質問
ログイン試行は何回まで許可すればいいですか?
WordPress は標準でログイン試行回数を制限していますか?
ログイン制限で自分のサイトから締め出されることはありますか?
ログイン試行回数の制限だけで総当たり攻撃は防げますか?
Cloudflare の背後だと、なぜ関係のない人がロックアウトされるのですか?
関連するハウツー
WordPress に二段階認証(2FA)を設定するには?
WordPress に二段階認証(2FA)を設定する方法。認証アプリでの登録、リカバリーコードの保存、スマートフォン紛失時の対処法を解説します。
手順を読むxmlrpc.php とは何ですか? WordPress で無効化するには?
xmlrpc.php とは何か、WordPress で安全に無効化する方法を解説。ログインを隠しても残る入口を閉じ、ピンバックを残す方法も紹介します。
手順を読むWordPress のログイン URL を変更するには?
WordPress のログイン URL を変更して wp-admin を隠す 5 つの手順。ログアウト前のテストと、URL を忘れたときの戻り方も解説します。
手順を読む
