如何在计数模式下分析 AWS WAF 规则的 CloudWatch 指标和日志?
我的 AWS WAF Web 访问控制列表 (Web ACL) 中的一些规则使用计数操作。我想根据这些规则分析我的 Amazon CloudWatch 指标和日志。
简述
在使用最终操作设置实施 AWS WAF 规则之前,使用计数规则操作对其进行测试。AWS WAF 会根据为 Count(计数)设置的规则对请求进行评估。然后,AWS WAF 会在指标、请求样本和日志中报告匹配情况。
您还可以使用 Count(计数)对生成误报的规则进行故障排除。当规则或规则组阻止了预期不会阻止的流量时,就会出现误报。有关详细信息,请参阅如何检测由 AWS 托管规则引起的误报?
解决方法
要了解 CloudWatch 如何格式化 Count(计数)规则操作的指标和日志,请参阅以下示例情境:
分析设置为 Count(计数)的自定义规则的日志
在以下示例中,Web ACL 将以下单个自定义规则设置为 Count: Geo-Count。Geo-Count 会对来自美国的请求进行计数。Web ACL 的默认操作为 Allow(允许)。
Geo-Count 规则示例:
{ "Name": "Geo-Count", "Priority": 0, "Statement": { "GeoMatchStatement": { "CountryCodes": [ "US" ] } }, "Action": { "Count": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "Geo-Count" } }
如果客户端 IP 地址位于美国境外,则 Web ACL 将使用其默认操作并允许该请求。
如果客户端 IP 地址位于美国,则会发生以下操作:
- AWS WAF 对请求进行计数。
- CloudWatch 的 Geo-Count 指标在 CountedRequests 指标中显示一个数据点。
注意: 只有当值不为零时,CloudWatch 才会报告 CountedRequests 指标。要在 CloudWatch 控制台中查看数据,请转到 Graphed metrics(绘成图表的指标),然后将统计数据更新为 Sum(总和)。 - AWS WAF 使用 Web ACL 默认操作并允许该请求。
- CloudWatch 在此 Web 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": [ ] }]
有关所有日志字段的详细信息,请参阅保护包 (Web ACL) 流量的日志字段。
分析设置为 Count(计数)的 AWS 托管规则组中各个规则的日志
要覆盖规则组的规则操作,请将该规则组中的一条或多条规则设置为 Count(计数)。覆盖会更改操作,因此 AWS WAF 仅会对匹配的请求进行计数。覆盖不包括规则组中未设置为 Count(计数)的规则操作。
如果 Web 请求与规则匹配,AWS WAF 会首先对匹配项进行一次 Count(计数)处理。然后,AWS WAF 会评估规则组中的后续规则。
在以下示例中,Web ACL 使用 AWSManagedRulesKnownBadInputsRuleSet。Web 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 漏洞的请求进行计数。如果请求与规则组中的任何其他规则都不匹配,则 Web ACL 默认操作会允许该请求。
如果您将规则组内规则的规则操作设置为 Count(计数),则这些规则将作为排除规则记录在规则组中。您将收到每条排除规则的 Count(计数)指标。
如果请求与 Log4JRCE 规则相匹配,则会发生以下操作:
- AWS WAF 对请求进行计数。
- Log4JRCE 规则的 CloudWatch 指标在 CountedRequests 指标中显示一个数据点。
如果 AWSManagedRulesKnownBadInputsRuleSet 中没有其他规则与该请求相匹配,则会发生以下操作:
- Web ACL 默认操作会允许该请求。
- CloudWatch 在 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" } ] } ]
如果规则组内的单个规则更新为 Count(计数),则会发生以下操作:
- 与此规则匹配的请求的日志在 nonTerminatingMatchingRules 字段下不会包含该规则的 Count(计数)操作。
- AWS WAF 日志会在 excludedRules 字段下显示此规则。
在整个规则组的操作为 Count(计数)时分析日志
如果您将某个规则组的操作覆盖为 Count(计数),则会将整个规则组设置为 Count(计数)。
在以下示例中,Web ACL 使用 AWSManagedRulesKnownBadInputsRuleSet。Web ACL 不包含其他规则。Web ACL 的默认操作为 Allow(允许)。AWSManagedRulesKnownBadInputsRuleSet 中的所有规则都使用默认操作且未设置为 Count(计数)。您已启用 Override rule group action to Count(将规则组操作覆盖为 Count(计数))。
覆盖为 Count(计数)的 AWSManagedRulesKnownBadInputsRuleSet 规则示例:
{ "Name": "AWS-AWSManagedRulesKnownBadInputsRuleSet", "Priority": 0, "Statement": { "ManagedRuleGroupStatement": { "VendorName": "AWS", "Name": "AWSManagedRulesKnownBadInputsRuleSet" } }, "OverrideAction": { "Count": {} }, "VisibilityConfig": { "SampledRequestsEnabled": true, "CloudWatchMetricsEnabled": true, "MetricName": "AWS-AWSManagedRulesKnownBadInputsRuleSet" } }
如果请求与 AWSManagedRulesKnownBadInputsRuleSet 规则组中的规则相匹配,则会发生以下操作:
- CloudWatch 会在 CountedRequests 指标中显示规则组名称的数据点。
- 在 Count(计数)覆盖发生后,AWS WAF 将处理 Web ACL 中的其余规则。CloudWatch 会将请求与 Web ACL 的默认操作进行匹配,并在 Web ACL 的 AllowedRequests 指标中显示一个数据点。
- 在 AWS WAF 日志中,匹配的请求在 nonTerminatingMatchingRules 字段中包含一个 Count(计数)操作。
- ruleGroupList 显示了在终止操作被覆盖之前规则组内部原先会阻止请求的规则。
如果请求中的组件(例如 URI 或查询字符串)存在 Log4j 漏洞,则会发生以下操作:
- Log4JRCE 规则会阻止该请求。
- 由于 Block(阻止)是终止操作,AWS WAF 会停止评估规则组并将终止操作结果返回到 Web ACL。
- Override rule group action to Count(将规则组操作覆盖为 Count(计数))生效。AWS WAF 会将规则组的终止操作覆盖为 Count(计数)。
- AWS WAF 会处理 Web 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(计数)模式下部署规则后,使用 Amazon CloudWatch Logs Insights 查询您的 AWS WAF 日志并识别潜在的误报,然后再切换到 Block(阻止)。
注意: 要使用这些查询,您必须先启用 Web 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(阻止)之前,请调整规则条件。
相关信息
How AWS WAF handles rule and rule group actions in a web ACL(AWS WAF 如何处理 Web ACL 中的规则和规则组操作)
CloudWatch Logs Insights query language (Logs Insights QL)(CloudWatch Logs Insights 查询语言 (Logs Insights QL))
This article was reviewed and updated on 2026-03-04.
This article was reviewed and updated on 2026-03-26.
