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制限やセキュリティヘッダーの付与が可能です。