WordPress WAF・ファイアウォール
完全設定ガイド
WAF(Webアプリケーションファイアウォール)はSQLインジェクション・XSS・DDoS攻撃などをサーバーに届く前にブロックする最も効果的な防御層です。このページではCloudflare(無料プラン含む)・Wordfence WAF・レンタルサーバー標準WAFの設定手順と使い分けを徹底解説します。
📋 目次
🛡️ 1. WAFとは何か:仕組みと必要性
WAF(Web Application Firewall)はWebサーバーへのHTTPリクエストをリアルタイムに解析し、悪意のあるリクエストをブロックするセキュリティシステムです。通常のファイアウォールがネットワーク層(IPアドレス・ポート)で判断するのに対し、WAFはHTTPの内容そのもの(パラメータ・ヘッダー・Cookie等)を解析します。
WAFがブロックできる攻撃の種類
| 攻撃の種類 | 手法 | WAFの検知方法 |
|---|---|---|
| SQLインジェクション | URLやフォームにSQL命令を埋め込んでDBを操作 | リクエスト内のSQL構文パターンを検知 |
| XSS(クロスサイトスクリプティング) | 悪意のあるJavaScriptを被害者のブラウザで実行 | スクリプトタグや危険なJSパターンを検知 |
| ローカルファイルインクルージョン | サーバーの内部ファイルを読み取る | パストラバーサル(../)パターンを検知 |
| ブルートフォース攻撃 | ログインページへの大量試行 | 同一IPからの短時間の大量リクエストを検知 |
| DDoS攻撃 | 大量のリクエストでサーバーをダウンさせる | 異常なリクエスト数・パターンを検知しレート制限 |
| 悪意のあるボット | コンテンツ盗用・脆弱性スキャン | ボットのユーザーエージェントや行動パターンを検知 |
WAFは万能ではありません。ゼロデイ攻撃(未知の脆弱性)・暗号化されたマルウェア・正規ユーザーに偽装した攻撃(低速ブルートフォース)の検知は苦手です。WAFは多層防御の一つとして位置づけ、ログインセキュリティ・ログ監視と組み合わせることが重要です。
📊 2. WAFの種類と比較
| WAFの種類 | 代表的サービス | 費用 | 設置場所 | 向いているサイト |
|---|---|---|---|---|
| クラウド型WAF | Cloudflare・Sucuri | 無料〜月数千円 | サーバーの手前(CDNエッジ) | ほぼ全サイトにおすすめ |
| プラグイン型WAF | Wordfence・iThemes | 無料〜月1,000円程度 | WordPressアプリケーション層 | 小〜中規模サイト |
| サーバー内蔵WAF | 各レンタルサーバー標準 | 多くは無料(サーバー料金込み) | サーバーOS・Webサーバー層 | 手軽に始めたい初心者 |
| .htaccessルール | 手動設定 | 無料 | Apacheの設定層 | 技術者・細かい制御が必要な場合 |
☁️ 3. Cloudflare WAFの設定手順
Cloudflare概要 無料〜有料
世界最大規模のCDN・セキュリティネットワークを持つCloudflareは、ドメインのDNSをCloudflare経由にすることで全トラフィックを保護します。無料プランでも基本的なDDoS保護・ボット管理・SSLが利用できます。
Cloudflare無料プランの設定手順
Cloudflareアカウント作成・サイト追加
cloudflare.comでアカウントを作成し、「サイトを追加」→ドメインを入力→無料プランを選択します。Cloudflareが現在のDNSレコードを自動スキャンして取り込みます。
ネームサーバーをCloudflareに変更
ドメインレジストラ(お名前.com・Xserverドメイン等)の管理画面で、ネームサーバーをCloudflareが指定する2つのネームサーバーに変更します。反映には最大48時間かかります。
SSL/TLS設定を「Full (strict)」に変更
Cloudflare管理画面 →「SSL/TLS」→「概要」→「Full (strict)」に設定。サーバー側でSSLが有効になっている場合はこれが最も安全です。
セキュリティレベルを設定
「セキュリティ」→「設定」→セキュリティレベルを「中」以上に設定。「ボットとの戦い」を「オン」にすると既知の悪意あるボットを自動ブロックします。
WordPress専用の設定:wp-admin保護
「セキュリティ」→「WAF」→「カスタムルール」(無料プランは5ルールまで)→ wp-adminへのアクセスを自分のIPアドレスのみ許可するルールを作成します(Proプラン以上推奨)。
Cloudflareで設定すべき重要ルール
| ルール名 | 条件 | アクション | 必要プラン |
|---|---|---|---|
| wp-admin IP制限 | URIパスが /wp-admin/ AND IPが自分以外 | チャレンジ or ブロック | 無料 |
| xmlrpc.phpブロック | URIパスが /xmlrpc.php | ブロック | 無料 |
| wp-login.php保護 | URIパスが /wp-login.php AND リクエスト数超過 | レート制限 | 無料(レート制限は有料) |
| 悪意あるボットブロック | 既知のスキャナーUAを含む | ブロック | 無料 |
| OWASP Top 10対応 | マネージドルールセット | 自動ブロック | Proプラン以上 |
🔌 4. Wordfence WAFの設定手順
Wordfence WAF概要 無料〜有料
WordPressプラグインとして動作するWAFです。WordPress自体が処理する前にリクエストをインターセプトするため(Extended Protection有効時)、高い保護効果があります。無料版でも十分に機能します。
Wordfenceをインストール・有効化
プラグイン → 新規追加 → 「Wordfence Security」を検索してインストール・有効化します。メールアドレスを登録するとアラートが届きます。
「最適化されたWAF」に変更する
Wordfence管理画面 →「ファイアウォール」→ WAFステータスの「最適化する」をクリック。指示に従って自動的に.htaccessを変更し、PHP実行前にWordfenceが起動するように設定します。
ブルートフォース保護を設定
「ファイアウォール」→「ブルートフォース保護」→ ログイン失敗の最大試行回数(推奨:5回)と失敗後のロックアウト時間(推奨:30分)を設定します。
リアルタイムIPブロックリストを有効化
「ファイアウォール」→「リアルタイムIPブロックリスト」を有効化(Premiumのみ)。無料版では「サイトを保護している国のIPをブロック」で代替します。Wordfence無料版は30日遅延のシグネチャを使用。
無料版は最新の脅威シグネチャが30日遅れで適用されます。つまり、新しいWordPressプラグインの脆弱性が発見されてから30日間は、無料版では保護されない可能性があります。リアルタイム保護が必要な重要サイトはPremium(年約119ドル)への移行を検討してください。Cloudflareのマネージドルールと組み合わせることで、コスト削減しながら保護を高めることも可能です。
🖥️ 5. レンタルサーバーのWAFを活用する
主要なレンタルサーバーはほとんどがWAFを無料提供しています。有効化するだけで基本的な保護が得られます。
| サーバー | WAF名称 | 設定場所 | デフォルト状態 |
|---|---|---|---|
| エックスサーバー | Xserver WAF(SiteGuard) | サーバーパネル → WAF設定 | 無効(手動有効化が必要) |
| ConoHa WING | WAF(ModSecurity) | WING管理画面 → セキュリティ | 有効 |
| さくらインターネット | さくらのWAF | コントロールパネル → セキュリティ | 無効(オプション申し込み) |
| ミックスホスト | ModSecurity | cPanel → ModSecurity | 有効 |
📄 6. .htaccessで実装する簡易WAF
.htaccessに特定のルールを追加することで、軽量なWAFとして機能させることができます。Apache使用サーバーで有効です。
基本的なセキュリティルール
# ========================================
# WordPress .htaccess セキュリティ設定
# ========================================
# 悪意のあるクエリ文字列をブロック
RewriteEngine On
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ - [F,L]
# ディレクトリリスティングの無効化
Options -Indexes
# 特定の悪意あるボットをブロック
SetEnvIfNoCase User-Agent "^libwww-perl*" block_bot
SetEnvIfNoCase User-Agent "^Python-urllib" block_bot
SetEnvIfNoCase User-Agent "nikto" block_bot
SetEnvIfNoCase User-Agent "sqlmap" block_bot
SetEnvIfNoCase User-Agent "WPScan" block_bot
Deny from env=block_bot
# WordPressのコアファイルへの直接アクセスを防止
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
⚙️ 7. 誤検知(False Positive)の調整方法
WAFが正当なリクエストをブロックする「誤検知」への対処方法を解説します。
誤検知が起きやすいシチュエーション
- WordPressの記事エディタで特殊文字(
<や>)を含む文章を保存しようとしたとき - お問い合わせフォームにプログラムコードやURLを入力したとき
- WooCommerceの決済処理でStripeやPayPalのWebhookがブロックされるとき
- 特定の国からのアクセスをブロックしている場合の海外出張時
Cloudflareでの誤検知対応
ブロックされたリクエストを確認
Cloudflare管理画面 →「セキュリティ」→「セキュリティイベント」でブロックされたリクエストの詳細(IP・ルールID・リクエスト内容)を確認します。
特定のIPやパスをホワイトリストに追加
「セキュリティ」→「WAF」→「カスタムルール」で、特定のIPアドレスや正規のUser-Agentに対して「バイパス」アクションを設定します。
💥 8. DDoS攻撃への対策
DDoS(分散サービス拒否)攻撃はWordPressサイトでも発生します。特に規模が大きくなってきたサイトや、競合との関係で意図的に攻撃されるケースも増えています。
| 対策 | 方法 | 費用 | 効果 |
|---|---|---|---|
| Cloudflare有効化 | DNS変更のみ | 無料 | ★★★★☆ 基本的なDDoSは無料版でも十分防げる |
| レート制限 | Cloudflare Pro / .htaccessのLimitIPConn | 無料〜有料 | ★★★☆☆ 同一IPからの集中攻撃に有効 |
| キャッシュプラグイン | WP Rocket・W3 Total Cache | 無料〜有料 | ★★★☆☆ サーバー負荷を分散 |
| CDN活用 | CloudflareのCDN機能 | 無料 | ★★★★☆ 静的ファイルの負荷を分散 |
| マネージドWAF | Sucuri・Cloudflare Business | 月数千〜数万円 | ★★★★★ 大規模攻撃にも対応 |