2026年6月22日
2026年6月22日
WordPressのログイン試行をCloudflareで制限する方法(レート制限ルールとカスタムルール)
WordPress のログインページ(/wp-login.php)には、パスワードを総当たりで試すアクセスが日常的に届きます。サイトを Cloudflare 経由で配信していれば、こうしたアクセスを WordPress に届く前に Cloudflare 側で止められます。この記事では、Cloudflare の レート制限ルール(Rate limiting rules) で同じ IP からの連続アクセスを止める方法と、カスタムルール(Custom rules) で管理者以外のアクセスにチャレンジやブロックをかける方法を、手順に沿って説明します。
画面の名称は2026年10月時点の Cloudflare ダッシュボード(英語表示)と公式ドキュメントに合わせています。ダッシュボードを日本語表示にしている場合は、対応する項目に読み替えてください。
前提:Cloudflare のプロキシを通っていること
Cloudflare のルールが効くのは、Cloudflare のプロキシを通ったアクセスだけです。
- ダッシュボードの DNS 設定で、サイトの A / AAAA / CNAME レコードのプロキシ状態が「Proxied」(オレンジの雲)になっていることを確認します。「DNS only」のレコードにはルールが適用されません。
- サーバーの IP アドレスを直接指定したアクセスは Cloudflare を通らないため、ルールでは止まりません。後半の「オリジンへの直接アクセスを防ぐ」も合わせて設定します。
Cloudflare の導入そのものは WordPressにCloudflareを設定する方法 を参照してください。
プランごとの違い
レート制限ルールとカスタムルールは無料プランでも使えますが、使える数や条件はプランで違います。2026年10月時点の公式ドキュメントの主な値は次のとおりです。
| 項目 | Free | Pro | Business |
|---|---|---|---|
| レート制限ルールの数 | 1 | 2 | 5 |
| レート制限の条件に使える項目 | パス、Verified Bot | ホスト、URI、パス、クエリなど | 左に加えてメソッド、送信元 IP、User Agent など |
| カウントの期間 | 10秒 | 最大1分 | 最大10分 |
| ブロックを続ける時間 | 10秒 | 最大1時間 | 最大1日 |
| カスタムルールの数 | 5 | 20 | 100 |
無料プランのレート制限は「10秒間に何回まで」という短い単位でしか数えられず、ブロックも10秒で解除されます。速い総当たりを鈍らせる効果はありますが、ゆっくり試す攻撃には効きません。無料プランでは、後で説明するカスタムルールと組み合わせるのが現実的です。
方法1:レート制限ルールで連続アクセスを止める
同じ IP アドレスから /wp-login.php に短時間で多数のリクエストが来たら、一定時間ブロックする設定です。
- Cloudflare ダッシュボードで対象のドメインを開きます。
- 「Security」→「Security rules」を開きます(従来の画面では「Security」→「WAF」の「Rate limiting rules」タブ)。
- 「Create rule」→「Rate limiting rules」を選びます。
- 「Rule name」に、
wp-login rate limitのように分かる名前を付けます。 - 「When incoming requests match」で、「Field」を「URI Path」、「Operator」を「equals」、「Value」を
/wp-login.phpにします。 - 「With the same characteristics」は「IP」のままにします(無料・Pro プランは IP のみ)。
- 「When rate exceeds」で回数と期間を指定します。無料プランなら期間は10秒で、回数は 5 などにします。
- 「Then take action」の「Choose action」で「Block」を選び、「Duration」(ブロックを続ける時間)を指定します。
- 「Deploy」で保存・反映します。
手順5の条件を式で表すと次のとおりです。条件の入力欄の下にある「Edit expression」を選ぶと、式を直接入力できます(「Use expression builder」で入力欄に戻ります)。
(http.request.uri.path eq "/wp-login.php")
回数の決め方の目安です。通常のログインでは、ログイン画面の表示(GET)と送信(POST)、ログイン後の転送などで、/wp-login.php に数回のリクエストが発生します。パスワードを数回打ち間違えても引っかからない程度の回数にし、反映後に自分でログインして問題がないかを確かめます。
Business 以上のプランでは条件にリクエストのメソッドを使えるので、次の式で POST だけを数える(ログイン画面の表示は数えない)設定にできます。
(http.request.uri.path eq "/wp-login.php" and http.request.method eq "POST")
方法2:カスタムルールで管理者以外にチャレンジをかける
管理者が決まった場所(固定 IP のオフィスなど)からしかログインしないなら、それ以外の IP からの /wp-login.php へのアクセスに Managed Challenge をかけるか、ブロックします。Managed Challenge は、Cloudflare がブラウザを確認し、必要な場合だけ操作を求める仕組みです。人はログイン画面に進めますが、スクリプトによる自動送信の多くはここで止まります。
- 「Security」→「Security rules」を開き、「Create rule」→「Custom rules」を選びます。
- 「Rule name」を付けます(例:
wp-login challenge)。 - 「Edit expression」を開き、次の式を入力します。
203.0.113.10と198.51.100.0/24は例なので、管理者の IP アドレスに置き換えます(複数はスペースで区切ります)。 - 「Choose action」で「Managed Challenge」を選び、「Deploy」で反映します。
(http.request.uri.path eq "/wp-login.php" and not ip.src in {203.0.113.10 198.51.100.0/24})
管理者の IP が固定でない場合は、and not ip.src in {…} の部分を外し、すべてのアクセスに Managed Challenge をかけても構いません。人の操作には大きな負担になりにくく、自動化された総当たりを減らせます。
公式ドキュメントは、いきなり Block にせず Managed Challenge で始め、Security → Analytics で引っかかったリクエストを確認してから Block に切り替える進め方を勧めています。管理者が締め出されないよう、同じ順番で進めるのが安全です。
/wp-admin/ 全体を同じ条件で止めるのは避けます。/wp-admin/admin-ajax.php はサイトの表側(フォームやプラグインの機能)からも呼ばれるため、止めると訪問者向けの機能が動かなくなることがあります。
xmlrpc.php も対策する
/xmlrpc.php は、外部アプリから WordPress を操作するための古い仕組みで、ここでもパスワードの総当たりが行われます。使っていなければ、カスタムルールでブロックします。
(http.request.uri.path eq "/xmlrpc.php")
ただし、Jetpack や WordPress の公式モバイルアプリなど、XML-RPC を使うサービスを利用している場合はブロックすると動かなくなります。使っているかどうか分からない場合は、まず Managed Challenge にして、Security → Analytics で正規の利用がないかを確認してから決めます。
オリジンへの直接アクセスを防ぐ
攻撃者がサーバーの IP アドレスを知っていると、Cloudflare を経由せずに直接 /wp-login.php を狙えます。サーバー側のファイアウォールで、80番・443番ポートへのアクセスを Cloudflare の IP アドレス範囲(公式サイトの https://www.cloudflare.com/ips/ で公開)からだけ許可すると、この抜け道を塞げます。範囲は変わることがあるので、定期的に見直します。
WordPress 側のプラグインと併用するときの注意
Cloudflare を経由すると、サーバーに届くアクセスの送信元 IP は Cloudflare のものになります。このままログイン試行回数を制限するプラグインを使うと、別々の訪問者が同じ IP に見えてしまい、正しい利用者までまとめてロックされることがあります。
本来の訪問者の IP は、Cloudflare が付ける CF-Connecting-IP ヘッダーに入っています。Apache の mod_remoteip や Nginx の ngx_http_realip_module で Cloudflare の IP 範囲を信頼する設定をするか、プラグイン側の「プロキシの背後にある」ことを指定する設定を使い、実際の訪問者の IP で数えるようにします。WordPress 側の制限方法は WordPressのログイン試行回数を制限する方法 を参照してください。
反映後の確認
- ログアウトした状態で、管理者の環境から実際にログインできるかを確かめます。
- 別の回線(スマートフォンのモバイル回線など)から
/wp-login.phpを開き、チャレンジやブロックが意図どおりに出るかを確かめます。 - 数日後に Security → Analytics を見て、ルールに一致したリクエストの件数と内容を確認し、回数やアクションを調整します。
まとめ
- Cloudflare のルールは、プロキシ(オレンジの雲)を通るアクセスにだけ効きます。
- レート制限ルールで
/wp-login.phpへの連続アクセスを IP ごとに止めます。無料プランは10秒単位なので効果は限定的です。 - カスタムルールで、管理者以外の IP からの
/wp-login.phpに Managed Challenge をかけ、様子を見てから Block に切り替えます。 - 使っていなければ
/xmlrpc.phpもブロックします。/wp-admin/全体は止めません。 - オリジンを Cloudflare の IP 範囲からだけ受け付けるようにし、WordPress 側のプラグインには実際の訪問者の IP を渡します。