AWS WAF 中计数规则操作的指标和日志是如何格式化的?

上次更新时间:2022 年 7 月 27 日

我已设置 AWS WAF,并且 Web ACL 中的部分规则正在执行 Count(计数)操作。如何分析计数规则操作中规则的 Amazon CloudWatch 指标和日志?

简短描述

您可以使用计数规则操作来测试规则,然后通过其常规操作设置来执行规则。AWS WAF 根据计数规则操作中的规则评估请求,并报告其在指标、请求示例和日志中找到的匹配项。

您还可以使用计数规则操作对生成误报的规则进行问题排查。当规则或规则组阻止您不希望其阻止的流量时,会出现误报。如果您确定了阻止要允许通过的请求的规则,则可以更新该规则的操作以进行计数。从而将该规则排除在对请求执行操作之外。有关检测和减少误报的更多信息,请参阅如何检测 AWS 托管规则导致的误报并将其添加到安全列表中?

解决方法

要了解如何为计数规则操作格式化指标和日志,请考虑以下三种场景:

  1. 将自定义规则的规则操作设置为计数模式。
  2. 将单个规则的规则操作设置为 AWS 托管规则规则组内的计数模式。
  3. 覆盖整个规则组的操作以计数。

将自定义规则的规则操作设置为计数模式

示例

您的 Web ACL(Test1-ACL)具有包含计数规则操作的单个自定义规则(Geo-Count)。如果请求来自美国,则 Geo-Count 规则会计算请求。如果客户端 IP 属于其他国家/地区,则会匹配包含 Allow(允许)操作的 Web ACL 默认操作。

以下是此规则的 JSON 表示:

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

如果请求来自位于美国的客户端 IP,会出现以下情况:

  • 将该请求计入在内。
  • 自定义规则 Geo-Count 的 CloudWatch 指标在 CountedRequests 指标中显示一个数据点。
    注意:CloudWatch 仅在存在非零值时报告 CountedRequests 指标。要查看数据,请在 CloudWatch 控制台的 Graphed metrics(已绘制指标)选项卡上将统计数据切换为 Sum(总计)。
  • 由于 Geo-Count 是包含 Count(计数)操作的自定义规则,AWS WAF 会对请求进行计数。
  • 然后,AWS WAF 根据 Web ACL 默认操作评估请求。由于 Web ACL 默认操作设置为 Allow(允许),因此允许该请求。
  • Web ACL 的 AllowedRequests 指标中会显示该操作的数据点。

有关 AWS WAF 命名空间下包含的指标和维度的更多信息,请参阅 AWS WAF 指标和维度

将自定义规则的操作更新为 Count(计数)时,从日志记录的角度来看,该规则视为非终止规则。因此,如果请求与计数模式下的自定义规则匹配,则会记录以下字段:

  • nonTerminatingMatchingRules:与请求匹配的非终止规则列表。
  • ruleId:与请求匹配且为未终止规则的 ID。
  • action:始终为 COUNT(计数)。
  • ruleMatchDetails:与请求匹配的规则的详细信息。此字段仅针对与规则语句匹配的 SQL 注入(SQLi)和跨站脚本攻击(XSS)进行填充。

如果 Geo-Count 规则与请求匹配,则日志会显示 nonTerminatingMatchingRules 详细信息,如以下示例所示:

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

  ]
}]

有关所有可能的日志字段的更多信息,请参阅日志字段

要开启 Web ACL 的日志记录,请参阅管理 Web ACL 的日志记录

将单个规则的规则操作设置为 AWS 托管规则规则组内的计数模式

您可以覆盖规则组内的规则操作,将其设置为对部分或全部规则计数。对于在规则组内配置为非计数的规则操作,覆盖会更改操作,以便仅计算匹配的请求。

如果 Web 请求与规则匹配,则 AWS WAF 会将匹配作为计数处理,然后继续评估规则组内的后续规则。

有关如何将规则操作设置为计入规则组的详细信息,请参阅设置规则操作以计入规则组

示例

您的 Web ACL(Test2-ACL)包含 AWS 托管规则规则组(AWSManagedRulesKnownBadInputsRuleSet)。此 Web ACL 中并无其他规则,并且 Web ACL 默认操作配置为 Allow(允许)操作。

AWSManagedRulesKnownBadInputsRuleSet 规则组内的 Log4JRCE 规则更新为 Count(计数)操作。现在,如果客户端请求中的某个组件(例如 URI、查询字符串等)存在 Log4j 漏洞,则该请求会被 Log4JRCE 规则计入在内。如果请求与规则组内的其他任何规则都不匹配,则 Web ACL 默认操作会允许该请求。

以下是此规则的 JSON 表示:

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

如果您将规则操作设置为计入规则组内的规则,则这些规则会视为规则组内的被排除规则。如果您启用了指标,则会收到每个被排除规则的 COUNT(计数)指标。

如果请求与 Log4JRCE 规则匹配,会出现以下情况:

  • 将该请求计入在内。
  • Log4JRCE 规则的 CloudWatch 指标在 CountedRequests 指标中显示一个数据点。

如果 AWSManagedRulesKnownBadInputsRuleSet 中没有其他规则与请求匹配,会出现以下情况:

  • Web ACL 默认操作允许该请求。
  • Web 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"
      }
    ]
  }
]

如果规则组内的单个规则更新为计数规则操作,会出现以下情况:

  • nonTerminatingMatchingRules 字段下,与此规则匹配的请求的日志不包含该规则的 Count(计数)操作。
  • AWS WAF 日志在 excludedRules 字段下显示此规则。

覆盖整个规则组的操作以计数

有关如何覆盖规则组的操作以计数的信息,请参阅覆盖生成的规则组操作以计数

有关如何覆盖规则组的操作以计数的信息,请参阅覆盖规则组的操作以计数

示例

您的 Web ACL(Test3-ACL)包含 AWS 托管规则规则组(AWSManagedRulesKnownBadInputsRuleSet)。此 Web ACL 中并无其他规则,并且 Web ACL 默认操作为 Allow(允许)。AWSManagedRulesKnownBadInputsRuleSet 规则组内的所有规则都使用规则中定义的默认操作。这意味着此规则组内的规则未设置为 Count(计数)。但是,Override rule group action to count(覆盖规则组操作以计数)选项已启用。

以下是此规则的 JSON 表示:

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

如果客户端请求中的某个组件(如 URI、查询字符串等)存在 Log4j 漏洞,会出现以下情况:

  • 该请求被 Log4JRCE 规则阻止。
  • 由于 Block(阻止)为终止操作,因此 AWS WAF 会停止评估规则组,并将终止操作结果返回到 Web ACL。
  • 此时,Override rule group action to count(覆盖规则组操作以计数)生效。规则组的终止操作被覆盖为计数。
  • 然后,AWS WAF 会继续处理 Web ACL 中的其余规则。

如果请求与 AWSManagedRulesKnownBadInputsRuleSet 规则组内的 Log4JRCE 规则(或任何其他规则)匹配,会出现以下情况:

  • CloudWatch 在 CountedRequests 指标中显示与规则组名称 AWSManagedRulesKnownBadInputsRuleSet 对应的数据点。
  • 进行覆盖后,AWS WAF 会继续处理 Web ACL 中的其余规则。因此,该请求最终与 Web ACL 默认操作相匹配。这会显示为 Web ACL 的 AllowedRequests 指标中的一个数据点。
  • 在 AWS WAF 日志中,匹配请求在 nonTerminatingMatchingRules 字段中包含计数操作。
  • 此外,ruleGroupList 会显示在终止操作被覆盖以计数之前,最初阻止请求的规则组内的规则。
  • 如果 Log4JRCE 规则与请求匹配,则日志将显示 ruleGroupListnonTerminatingMatchingRules 的详细信息,如以下示例所示:
"ruleGroupList": [{
  "ruleGroupId": "AWS#AWSManagedRulesKnownBadInputsRuleSet",
  "terminatingRule": {
      "ruleId": "Log4JRCE",
      "action": "BLOCK",
      "ruleMatchDetails": null
    },
  "nonTerminatingMatchingRules": [

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

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

  ]
}]

这篇文章对您有帮助吗?


您是否需要账单或技术支持?