2026年5月20日

2026年5月20日

WordPressのCloudflare詳細設定方法(WAF・Page Rules・Workers)

はじめに

CloudflareはCDNにとどまらず、WAF・Rate Limiting・Workers(エッジ関数)など高度な機能を備えています。WordPressに最適化した設定を施すことで、セキュリティ強化とパフォーマンス改善を同時に実現できます。

症状・原因

  • スパムボットのアクセスが多くサーバー負荷が高い
  • wp-login.phpへのブルートフォース攻撃を受けている
  • XMLRPCへの大量アクセスが来ている
  • 特定のページだけキャッシュの動作を変えたい

解決手順

ステップ1:WAFカスタムルールでWordPressを保護する

Cloudflareダッシュボード → セキュリティ → WAF → カスタムルール

ルール1: wp-login.php へのブルートフォース防御
  条件: URI パス contains /wp-login.php
        AND 国 not in [JP]  (日本からのみ許可する場合)
  アクション: マネージドチャレンジ

ルール2: XML-RPCへのアクセスをブロック
  条件: URI パス equals /xmlrpc.php
  アクション: ブロック

ルール3: バッドボットをブロック
  条件: (cf.client.bot) is false
        AND (http.user_agent contains "python-requests"
             OR http.user_agent contains "curl/")
        AND URI パス starts with /wp-
  アクション: ブロック

ステップ2:Rate Limitingでログイン試行を制限する

Cloudflareダッシュボード → セキュリティ → WAF → Rate Limiting ルール

ルール: ログインページのRate Limiting
  条件: URI パス equals /wp-login.php
        AND リクエストメソッド equals POST
  レート: 10リクエスト / 1分
  アクション: ブロック(10分間)

ステップ3:Page Rules(Transform Rules)を設定する

Cloudflareダッシュボード → ルール → Page Rules(旧仕様)
または → ルール → Transform Rules(新仕様)

WordPressで便利なPage Rulesの例:

1. 管理画面のキャッシュ完全無効化
   URL: example.com/wp-admin/*
   設定: キャッシュレベル = バイパス

2. 静的ファイルの長期キャッシュ
   URL: example.com/wp-content/uploads/*
   設定: エッジキャッシュTTL = 1ヶ月
         ブラウザキャッシュTTL = 1週間

3. WP-Cronをセキュアに
   URL: example.com/wp-cron.php*
   設定: セキュリティレベル = 高い
         アクセス: Cloudflare Workers のみ許可

ステップ4:Cloudflare Workers でWordPressを最適化する

// Cloudflare Workers: wp-login.php へのアクセスに国制限
// Workers & Pages → 新しいWorker で作成

addEventListener('fetch', event => {
    event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
    const url = new URL(request.url);

    // wp-login.php のアクセス制限
    if (url.pathname === '/wp-login.php') {
        const country = request.cf.country;
        const allowedCountries = ['JP', 'US']; // 許可する国

        if (!allowedCountries.includes(country)) {
            return new Response('Access denied', {
                status: 403,
                headers: { 'Content-Type': 'text/plain' },
            });
        }
    }

    // 通常のリクエストはオリジンにそのまま転送
    return fetch(request);
}
// Cloudflare Workers: HTMLレスポンスにセキュリティヘッダーを追加
async function addSecurityHeaders(response) {
    const newHeaders = new Headers(response.headers);

    newHeaders.set('X-Frame-Options', 'SAMEORIGIN');
    newHeaders.set('X-Content-Type-Options', 'nosniff');
    newHeaders.set('Referrer-Policy', 'strict-origin-when-cross-origin');
    newHeaders.set(
        'Content-Security-Policy',
        "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"
    );

    return new Response(response.body, {
        status: response.status,
        headers: newHeaders,
    });
}

ステップ5:Cloudflare Analytics でトラフィックを分析する

ダッシュボード → 分析 → トラフィック

確認すべき指標:
- キャッシュヒット率: 60%以上が目標
- 脅威: ブロックされた悪意あるリクエスト数
- 帯域幅の節約: CDNで配信されたデータ量
- リクエスト数: 総リクエスト vs キャッシュヒット
// functions.php: Cloudflare のキャッシュヒット状況をデバッグ
function mytheme_show_cf_cache_status(): void {
    if (!WP_DEBUG || !current_user_can('manage_options')) {
        return;
    }

    // Cloudflareが付与するキャッシュステータスヘッダー
    // CF-Cache-Status: HIT / MISS / EXPIRED / BYPASS / REVALIDATED
    $status = $_SERVER['HTTP_CF_CACHE_STATUS'] ?? 'N/A';
    echo "<!-- CF-Cache-Status: {$status} -->\n";
}
add_action('wp_footer', 'mytheme_show_cf_cache_status');

注意事項

  • Page RulesはFreeプランでは3つまでしか作成できません。優先度が高いルールから設定してください
  • Cloudflare WorkersはFreeプランで1日100,000リクエストまで無料です。高トラフィックサイトでは有料プランを検討してください
  • WAFのマネージドルールセット(Cloudflare Managed Rules)はProプラン以上で利用できます

まとめ

WAFカスタムルールで /wp-login.php/xmlrpc.php へのアクセスを制限し、Rate Limitingでブルートフォース攻撃を防ぎます。Page RulesでWordPress管理画面のキャッシュをバイパスし、静的ファイルを長期キャッシュします。Cloudflare WorkersでエッジでのIP制限やセキュリティヘッダーの付与が可能です。

お気軽にご相談ください

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