
2026/03/09 6:56
検知は保護ではない:WAF の検知モードが行うことと、できないこと --- **備考** - 「Detection Is Not Protection」は「検知は保護ではない」と直訳し、意味を明確にしました。 - 「What WAF Detection Mode Does (and Doesn’t)」は「WAF の検知モードが行うことと、できないこと」に訳し、専門性と読みやすさを両立しています。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Azure Web Application Firewall(WAF)はデフォルトでDetectionモードで作成され、マッチしたルールは「Block」としてログに記録されますが、バックエンドにはまだ到達します。パイプラインチェック(ボディ解析失敗やサイズ制限違反)のみが真にブロックされ、OWASP Top 10 の保護を実現するにはPreventionモードが必要です。Prevention では異常スコア ≥ 5 を持つリクエストがアプリケーションへ到達する前にブロックされます。
Microsoft は Detection モードで数週間の調整期間を推奨しますが、Prevention への切替えを強制するタイマーやアラートは提供していないため、多くのチームが Detection を離れません。これにより誤った安全感が生まれます:ログでは「Block」操作が記録され、
action_s == "Block" のみでフィルタリングした SIEM クエリが実際の脅威を過大評価し、コンプライアンスツールはモードを検証せずに「WAF 有効」と報告するため、PCI DSS チェックは満たされるものの保護は提供されません。
Azure は Application Gateway と Front Door で Prevention を強制するポリシー定義を提供していますが、採用例はほとんどありません。単純な Resource Graph クエリ(
mode != "Prevention")を実行すると、サブスクリプション全体の Detection モードに残っているすべての WAF ポリシーを棚卸しでき、内部サービスが脆弱であるギャップを明らかにします。本文
WAFが有効になっているのに、ダッシュボードは緑色で、アプリケーションへのすべての攻撃がそのままバックエンドへ届く――なぜですか?
Azure 環境のどこかに、デフォルト設定として Detection(検知)モード にある WAF ポリシーが存在している可能性があります。
誰かが明示的にその呼び出しを行ったわけでもなく、受動的観測を必要とするアクティブなインシデントもないのに、単に「デフォルト」だからです。チューニングには時間が掛かり、会話を閉じるような強制は一切ありません。
実際にリクエストに起こること
Detection モードで動作する WAF エンジンは以下の処理を行います:
- すべてのリクエストを完全管理ルールセットと照合し、異常スコア(デフォルトでは OWASP 異常スコアリング)を算出します。
- Prevention(防止)モード – スコアが5以上になるとブロックし、WAF は 403 を返して接続を閉じます。リクエストはバックエンドに届きません。
- Detection モード – 同じスコアでログを書き込み、マッチしたルールを記録しますが、その後リクエストは変更せずにアプリケーションへ転送されます。攻撃者は通過します。
検知モードでも、ボディ解析失敗やサイズ制限などの必須ルールでブロックされるケースはありますが、これは「配管行動」であり OWASP Top 10 の脅威をカバーするセキュリティ制御ではありません。
罠を設定しているデフォルト
Azure の新規 WAF ポリシーはすべて Detection モードで初期化されます。Microsoft は「検知から始め、実際のトラフィックを観測し、誤検出を除外してから防止へ移行する」ことを推奨しています。
しかし:
- WAF が検知モードに留まった時点でトリガーされるタイマーやアラート、Azure Policy のゲートは存在しません。
- チューニングループには正式な終了基準がなく、実際には終わりません。
このパターンは繰り返されます:検知モードでデプロイ → アラートをレビュー → 除外設定 → アラート量減少 → 次の優先事項へ。
ループは閉じられず、検知モードは「意図しない」結果として永続化します。
検知モードは攻撃が成功しているかどうかを示すシグナルを持たず、検知モードと防止モードの WAF は「ブロックされたトラフィックからユーザーへの影響ゼロ」という同一指標で見たときに区別できません。
静寂は何も証明しないのです。
チームは WAF アラートを無視するようになり、二次的な問題が生じます。すべてがログに残るもののブロックされず、アラートには運用上の意味がなくなるため、数か月後に防止モードへ切り替える際に「誤検出で実際にユーザー影響を与えているケース」を扱うチャンネルが機能しない状態になってしまいます。
誤解させるログ
Detection モードで WAF ルールにマッチしたリクエストのログは次のようになります:
action_s : Block policyMode_s : Detection ruleName_s : DefaultRuleSet-1.0-SQLI-942430
合理的なエンジニアは「Block」と読み、リクエストがブロックされたと結論付けます。しかし実際には action_s = "Block" は「防止モードであればこうなる」という仮想結果 を示すだけです。リクエストはバックエンドに到達しています。
Microsoft の公式ドキュメントでもこのログ構成をサンプルとして示しつつ、誤読を防ぐ十分な強調が欠けています。
結果:
AzureDiagnostics | where Category == "FrontdoorWebApplicationFirewallLog" | where action_s == "Block"
というクエリは、実際には「アプリケーションへ到達したリクエスト」を返します。構文自体は正しいが解釈を誤っています。
修正方法
AzureDiagnostics | where Category == "FrontdoorWebApplicationFirewallLog" | project TimeGenerated, RuleID = ruleName_s, Action = action_s, Mode = policyMode_s, ClientIP = clientIp_s, URI = requestUri_s | where Action == "Block" and Mode == "Prevention"
必ず
policyMode_s をプロジェクトし、明示的にフィルタリングしてください。防止モードでの Block は何かが停止されたことを意味し、検知モードでの Block は「観測して通過した」だけです。ダッシュボードやアラートルールで同一イベントとしてカウントすべきではありません。
SIEM 連携規則、Sentinel 分析、セキュリティダッシュボードが
policyMode_s をフィルタリングせずに構築されている場合、「ブロックされた攻撃」数は実際にはブロックされなかったケースを含む可能性があります。
なぜ誰も気づかないのか
- セキュリティ姿勢ツール は「WAF が有効」かどうか(リソースにポリシーが紐付いているか)だけを報告します。モード、診断設定の有無(検知モードでは完全に可視化されません)、実際にトラフィック経路上で動作しているかは言及しません。
- ほとんどのコンプライアンスレビューは存在確認に留まり、
を尋ねることはありません。policyMode_s - PCI DSS 要件 6.4 はインターネット向けアプリケーションに対する WAF 保護を求めますが、評価では「WAF があるか?」のみをチェックし、ブロックしているかどうかは別問題で、通常尋ねられません。
- Azure には「Application Gateway」「Front Door」に対し指定モードを要求する 2 つの組み込みポリシー定義があります。これらはほとんど環境で未使用です。
解決策
- ログ設定に依存しないインベントリ を作成します:
Resources | where type == "microsoft.network/frontdoorwebapplicationfirewallpolicies" or type == "microsoft.network/applicationgatewaywebapplicationfirewallpolicies" | project name, resourceGroup, subscriptionId, mode = properties.policySettings.mode | where mode != "Prevention"
これで「防止モードにない」WAF ポリシーを正確に把握できます。
-
スコープが分かったら:
- チューニング期限 を設定(例:代表的トラフィックを持つ安定アプリなら 2〜4 週間)。
- その期間中は毎日ログをレビュー。
- 除外ルールはコード化(Bicep/Terraform)し、管理ルールセットバージョンアップ時にも継続できるようにします。
- 防止モードへ切り替える際には正当なリクエストがブロックされることを想定し、実行手順書(何がブロックされたかを照会し、対象除外を作成するプロセスと承認者)を用意します。
-
その後 Azure Policy の組み込みポリシー を有効化。新規デプロイ時に防止モードでない場合は拒否させます。
コンプライアンスダッシュボードへ統合し、「WAF: 有効」=「実際に保護が機能している」を意味するようにします。
名称の問題
Detection(検知) は「何かを捕捉した」という印象を与えます。
実際には「検出されたものはただ記録されるだけ」で、攻撃が通過したままです。
もしこのモードを **Logging(ログ)」と呼べば、エンジニアは本来の一時的診断状態として扱いやすくなります。「検知」という語が「脅威が識別され対処されている」という誤解を招き、保護があると思い込ませる原因となっています。
最後に
プロダクション環境で WAF が Detection モード のまま 1 か月以上経過している場合、アプリケーションは実質的に保護されていません。
攻撃の詳細ログは残りますが、何も遮断しない状態です。これを今日修正する価値があります。
現在 WAF ポリシーのモードはどう設定されていますか?
確認には約 30 秒で完了します。答えに驚くこともあるでしょう。