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 に短時間で多数のリクエストが来たら、一定時間ブロックする設定です。

  1. Cloudflare ダッシュボードで対象のドメインを開きます。
  2. 「Security」→「Security rules」を開きます(従来の画面では「Security」→「WAF」の「Rate limiting rules」タブ)。
  3. 「Create rule」→「Rate limiting rules」を選びます。
  4. 「Rule name」に、wp-login rate limit のように分かる名前を付けます。
  5. 「When incoming requests match」で、「Field」を「URI Path」、「Operator」を「equals」、「Value」を /wp-login.php にします。
  6. 「With the same characteristics」は「IP」のままにします(無料・Pro プランは IP のみ)。
  7. 「When rate exceeds」で回数と期間を指定します。無料プランなら期間は10秒で、回数は 5 などにします。
  8. 「Then take action」の「Choose action」で「Block」を選び、「Duration」(ブロックを続ける時間)を指定します。
  9. 「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 がブラウザを確認し、必要な場合だけ操作を求める仕組みです。人はログイン画面に進めますが、スクリプトによる自動送信の多くはここで止まります。

  1. 「Security」→「Security rules」を開き、「Create rule」→「Custom rules」を選びます。
  2. 「Rule name」を付けます(例: wp-login challenge)。
  3. 「Edit expression」を開き、次の式を入力します。203.0.113.10 と 198.51.100.0/24 は例なので、管理者の IP アドレスに置き換えます(複数はスペースで区切ります)。
  4. 「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 を渡します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲