スキップしてコンテンツを表示

AWS WAF ルールの CloudWatch メトリクスとログを Count モードで分析する方法を教えてください。

所要時間4分
0

AWS WAF のウェブアクセス制御リスト (ウェブ ACL) のルールの一部は Count アクションを使用しています。これらのルールのために Amazon CloudWatch メトリクスとログを分析したいと考えています。

簡単な説明

最終的なアクション設定で AWS WAF ルールを実装する前に、Count ルールアクションを使用してテストしてください。AWS WAF は、Count に設定されたルールに対してリクエストを評価します。その後、AWS WAF は一致した結果をメトリクス、リクエストサンプル、ログに報告します。

Count は、誤検知を生成するルールのトラブルシューティングにも使用できます。ルールまたはルールグループがブロックすることを想定していないトラフィックをブロックした場合に、誤検知は発生します。詳細については、『AWS マネージドルールによる誤検知を検出する方法を教えてください。』を参照してください。

解決策

Count ルールアクションについて CloudWatch がメトリクスとログをどのように形式化するかを理解するには、次のシナリオ例を参照してください。

Count に設定されたカスタムルールのログを分析する

次の例で、ウェブ ACL には Count に設定された単一のカスタムルールがあります。 Geo-Count です。Geo-Count は、リクエストが米国からのものである場合にカウントします。ウェブ ACL のデフォルトアクションは Allow です。

Geo-Count ルールの例:

{
  "Name": "Geo-Count",
  "Priority": 0,
  "Statement": {
    "GeoMatchStatement": {
      "CountryCodes": [
        "US"
      ]
    }
  },
  "Action": {
    "Count": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "Geo-Count"
  }
}

クライアント IP アドレスが米国以外にある場合、ウェブ ACL はデフォルトアクションを使用してリクエストを許可します。

クライアント IP アドレスが米国にある場合、次のアクションが実行されます。

  • AWS WAF はリクエストをカウントする。
  • Geo-Count の CloudWatch メトリクスに、CountedRequests メトリクスのデータポイントが表示される。
    **注: ** CloudWatch は値がゼロ以外の場合にのみ、CountedRequests メトリクスを報告します。CloudWatch コンソールでデータを表示するには、[Graphed metrics] (グラフ化したメトリクス) に移動し、統計データを [Sum] (合計) に更新してください。
  • AWS WAF はウェブ ACL のデフォルトアクションを使用してリクエストを許可する。
  • CloudWatch は、このウェブ ACL のデータポイントを AllowedRequests メトリクスに記録する。

詳細については、『AWS WAF メトリクスとディメンション』を参照してください。

Count に設定されたカスタムルールは、ログで非終了状態になります。リクエストが Count に設定されたカスタムルールに一致する場合、AWS WAF は次の詳細を記録します。

  • nonTerminatingMatchingRules は、リクエストに一致する非終了ルールをリストする。
  • ruleId は、リクエストに一致し、かつ非終了状態のルールをリストする。
  • action フィールドは常に COUNT である。
  • ruleMatchDetails フィールドには、リクエストに一致するルールに関する詳細情報が含まれている。AWS WAF は、SQL インジェクション (SQLi) およびクロスサイトスクリプティング (XSS) の一致ルールステートメントの場合にのみこのフィールドに入力する。

Geo-Count 一致に対する nonTerminatingMatchingRules 例の詳細:

"nonTerminatingMatchingRules": [{
  "ruleId": "Geo-Count",
  "action": "COUNT",
  "ruleMatchDetails": [

  ]
}]

すべてのログフィールドの詳細については、『保護パック (ウェブ ACL) トラフィックのログフィールド』を参照してください。

Count に設定された AWS マネージドルールのルールグループ内の個々のルールのログを分析する

ルールグループ内のルールのアクションをオーバーライドするには、ルールグループ内の 1 つ以上のルールを Count に設定します。オーバーライドによりアクションが変更され、AWS WAF は一致したリクエストのみをカウントします。オーバーライドには、ルールグループ内で Count 以外に設定したルールアクションは含まれません。

ウェブリクエストがルールに一致する場合、AWS WAF はまず一致した結果を Count として処理します。その後、AWS WAF はルールグループ内の後続のルールを評価します。

次の例では、ウェブ ACL は AWSManagedRulesKnownBadInputsRuleSet を使用しています。ウェブ ACL には他のルールはなく、デフォルトアクションは Allow です。

AWSManagedRulesKnownBadInputsRuleSet ルールの例:

{
  "Name": "AWS-AWSManagedRulesKnownBadInputsRuleSet",
  "Priority": 0,
  "Statement": {
    "ManagedRuleGroupStatement": {
      "VendorName": "AWS",
      "Name": "AWSManagedRulesKnownBadInputsRuleSet",
      "ExcludedRules": [
        {
          "Name": "Log4JRCE"
        }
      ]
    }
  },
  "OverrideAction": {
    "None": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "AWS-AWSManagedRulesKnownBadInputsRuleSet"
  }
}

Log4JRCE ルールを Count に設定すると、AWS WAF は Log4j の脆弱性を含むリクエストをカウントします。リクエストがルールグループ内の他のルールに一致しない場合、ウェブ ACL のデフォルトアクションがリクエストを許可します。

ルールグループ内のルールのアクションを Count に設定すると、それらはルールグループ内の除外ルールとしてログに記録されます。除外された各ルールの Count メトリクスを受け取ります。

リクエストが Log4JRCE ルールに一致する場合、次のアクションが実行されます。

  • AWS WAF はリクエストをカウントする。
  • Log4JRCE ルールの CloudWatch メトリクスに、CountedRequests メトリクスのデータポイントが表示される。

AWSManagedRulesKnownBadInputsRuleSet 内の他のルールがリクエストに一致しない場合、次のアクションが実行されます。

  • ウェブ ACL のデフォルトアクションはリクエストを許可する。
  • CloudWatch は、ウェブ ACL の AllowedRequests メトリクスにデータポイントを記録する。

除外されたルールの場合、AWS WAF ログに次の詳細が記録されます。

  • excludedRules フィールドは、ルールグループ内で除外したルールをリストする。これらのルールのアクションは Count に設定される。
  • exclusionType は、除外されたルールのアクションが Count であることを示す。
  • ruleId は、除外されたルールの ID をリストする。

Log4JRCE ルールに一致するリクエストに対する excludedRules の詳細例:

"ruleGroupList": [
  {
    "ruleGroupId": "AWS#AWSManagedRulesKnownBadInputsRuleSet",
    "terminatingRule": null,
    "nonTerminatingMatchingRules": [

    ],
    "excludedRules": [
      {
        "exclusionType": "EXCLUDED_AS_COUNT",
        "ruleId": "Log4JRCE"
      }
    ]
  }
]

ルールグループ内の個別のルールが Count に更新された場合、次のアクションが実行されます。

  • このルールに一致するリクエストのログには、nonTerminatingMatchingRules フィールド内のルールの Count アクションは含まれない。
  • AWS WAF ログは、このルールを excludedRules フィールド内に表示する。

ルールグループ全体のアクションが Count である場合のログ分析

ルールグループのアクションを Count にオーバーライドすると、ルールグループ全体が Count に設定されます。

次の例では、ウェブ ACL は AWSManagedRulesKnownBadInputsRuleSet を使用しています。ウェブ ACL には他のルールは含まれていません。ウェブ ACL のデフォルトアクションは Allow です。AWSManagedRulesKnownBadInputsRuleSet 内のすべてのルールはデフォルトアクションを使用し、Count には設定されていません。[Override rule group action to Count] (ルールグループアクションを Count にオーバーライドする) を有効にしました。

AWSManagedRulesKnownBadInputsRuleSet ルールで Count をオーバーライドした例:

{
  "Name": "AWS-AWSManagedRulesKnownBadInputsRuleSet",
  "Priority": 0,
  "Statement": {
    "ManagedRuleGroupStatement": {
      "VendorName": "AWS",
      "Name": "AWSManagedRulesKnownBadInputsRuleSet"
    }
  },
  "OverrideAction": {
    "Count": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "AWS-AWSManagedRulesKnownBadInputsRuleSet"
  }
}

リクエストが AWSManagedRulesKnownBadInputsRuleSet ルールグループ内のルールに一致する場合、次のアクションが実行されます。

  • CloudWatch は、ルールグループ名の CountedRequests メトリクスにデータポイントを表示する。
  • AWS WAF は、Count オーバーライドが適用された後、ウェブ ACL 内の残りのルールを処理する。CloudWatch は、ウェブ ACL のデフォルトアクションに対してリクエストを照合し、ウェブ ACL の AllowedRequests メトリクスにデータポイントを表示する。
  • AWS WAF ログでは、一致したリクエストに nonTerminatingMatchingRules フィールド内の Count アクションが含まれている。
  • ruleGroupList には、終了アクションがオーバーライドされる前に、元々リクエストをブロックしたルールグループ内のルールが表示される。

URI やクエリ文字列などのリクエスト内のコンポーネントに Log4j の脆弱性が存在する場合、次のアクションが実行されます。

  • Log4JRCE ルールはリクエストをブロックする。
  • Block は終了アクションなので、AWS WAF はルールグループの評価を停止し、終了アクションの結果をウェブ ACL に返す。
  • [Override rule group action to Count] (ルールグループアクションを Count にオーバーライドする) が有効になる。AWS WAF はルールグループの終了アクションを Count にオーバーライドする。
  • AWS WAF はウェブ ACL の残りのルールを処理する。
  • ログ内の ruleGroupList および nonTerminatingMatchingRules の詳細は、次の形式で表示される。
"ruleGroupList": [{
  "ruleGroupId": "AWS#AWSManagedRulesKnownBadInputsRuleSet",
  "terminatingRule": {
    "ruleId": "Log4JRCE",
    "action": "BLOCK",
    "ruleMatchDetails": null
  },
  "nonTerminatingMatchingRules": [

  ],
  "excludedRules": null
}],
"rateBasedRuleList": [

],
"nonTerminatingMatchingRules": [{
  "ruleId": "AWS-AWSManagedRulesKnownBadInputsRuleSet",
  "action": "COUNT",
  "ruleMatchDetails": [

  ]
}]

CloudWatch Logs Insights をクエリして Count ルールとの一致を分析する

Count モードでルールをデプロイした後、Block に切り替える前に Amazon CloudWatch Logs Insights を使用して AWS WAF ログをクエリし、潜在的な誤検知を特定してください。

**注: ** これらのクエリを使用するには、まずウェブ ACL のログ記録を有効にし、CloudWatch ロググループにログを送信する必要があります。

nonTerminatingMatchingRules 内の特定のルールをトリガーしたリクエストを検索するには、次のクエリを実行してください。

fields @timestamp
| filter @message like /"ruleId":"YOUR-RULE-SET-NAME","action":"COUNT"/
| sort @timestamp desc
| display @timestamp, terminatingRuleId, httpRequest.clientIp, httpRequest.country, @message
| limit 100

**注: ** YOUR-RULE-SET-NAME をご利用のルールセット名に置き換えてください。

nonTerminatingMatchingRules をトリガーしたすべてのリクエストを検索するには、次のクエリを実行します。

fields @timestamp, @message
| parse @message ',"nonTerminatingMatchingRules":[{"ruleId":"*","action":"*"' as rule, action
| filter action = "COUNT"
| display @timestamp, rule, action
| sort @timestamp desc

複数の非終了ルールをラベルと共にトリガーしたすべてのリクエストを検索するには、次のクエリを実行してください。

fields @timestamp
| filter @message like '"labels":['
| parse @message '"labels":[*]' as Labels
| parse @message '"nonTerminatingMatchingRules":[*]' as nonTermRules
| filter nonTermRules like /COUNT/
| display @timestamp, nonTermRules, Labels
| sort @timestamp desc
| limit 100

クエリ結果を確認して、Count ルールに一致するリクエストのパターンを特定します。一致したリクエストが正当なトラフィックを表している場合、ルールは誤検知を生成します。アクションを Block に切り替える前に、ルールの条件を調整してください。

関連情報

がルールとルールグループのアクション AWS WAF を処理する方法

CloudWatch Logs Insights クエリ言語 (Logs Insights QL)

CloudWatch の AWS WAF ログを分析する方法を教えてください。

AWS公式更新しました 5ヶ月前
2コメント

This article was reviewed and updated on 2026-03-04.

エキスパート

応答済み 1ヶ月前

This article was reviewed and updated on 2026-03-26.

エキスパート

応答済み 19日前