记录 Web ACL 流量信息 - Amazon WAF、Amazon Firewall Manager 和 Amazon Shield Advanced
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

记录 Web ACL 流量信息

您可以启用日志记录以获取有关 Web ACL 所分析的流量的详细信息。日志中包含的信息包括Amazon WAF收到了来自Amazon资源、有关请求的详细信息以及每个请求所匹配的规则的操作。

在 Web ACL 的日志记录配置中,您可以自定义Amazon WAF发送到日志,如下所示:

  • 日志筛选— 您可以添加过滤以指定哪些 Web 请求保留在日志中以及哪些 Web 请求被删除。您可以筛选规则操作和在请求评估期间应用的 Web 请求标签。有关规则操作设置的信息,请参阅Amazon WAF 规则操作. 有关标签的信息,请参阅Amazon WAFWeb 请求上的标签.

  • 字段密文— 您可以从日志记录中编辑某些字段。编辑的字段将显示为XXX在日志中。例如,如果您编写URI字段中,URI字段将为XXX. 有关日志字段的列表,请参阅日志字段.

您可以将日志从 Web ACL 发送到具有已配置存储目标的 Amazon Kinesis Data Firehose。启用日志记录后,Amazon WAF通过 Kinesis Data Firehose 的 HTTPS 终端结点将日志传输到您的存储目标。

有关如何创建 Amazon Kinesis Data Firehose 以及查看存储的日志的信息,请参阅什么是 Amazon Kinesis Data Firehose? 要了解 Kinesis Data Firehose 配置所需的权限,请参阅使用 Amazon Kinesis Data Firehose 控制访问.

您必须拥有以下权限才能成功启用日志记录:

  • iam:CreateServiceLinkedRole

  • firehose:ListDeliveryStreams

  • wafv2:PutLoggingConfiguration

有关服务相关角色以及 iam:CreateServiceLinkedRole 权限的更多信息,请参阅将服务相关角色用于 Amazon WAF

管理 Web ACL 的日志记录

您可以随时启用和禁用 Web ACL 的日志记录。

为 Web ACL 启用日志记录

  1. 使用以前缀 aws-waf-logs- 开头的名称创建 Amazon Kinesis Data Firehose。例如:aws-waf-logs-us-east-2-analytics。使用 PUT 源,在您执行操作的区域中创建 Data Firehose。如果您为 Amazon CloudFront 捕获日志,请在美国东部(弗吉尼亚北部)创建防火管。有关更多信息,请参阅 。创建 Amazon Kinesis Data Firehose 传输流.

    重要

    请勿选择 Kinesis stream 作为源。

    OneAmazon WAF日志等同于一个 Kinesis Data Firehose 记录。如果您通常每秒接收 10000 个请求并启用了完整日志记录,您的 Kinesis Data Firehose ach 中应具有每秒 10000 个记录的设置。如果您没有正确配置 Kinesis Data Firehose,请Amazon WAF将无法记录所有日志。有关更多信息,请参阅 Amazon Kinesis Data Firehose 配额

  2. 登录到Amazon Web Services Management Console并打开Amazon WAF控制台位于https://console.aws.amazon.com/wafv2/.

  3. 在导航窗格中,选择 Web ACL

  4. 选择您要启用日志记录的 Web ACL。

  5. Logging (日志记录) 选项卡上,选择 Enable logging (启用日志记录)

  6. 选择您在第一步中创建的 Kinesis Data Firehose。您必须选择以开头的消防管aws-waf-logs-.

  7. (可选)如果您不希望在日志中包含特定字段及其值,请编辑这些字段。选择要编辑的字段,然后选择 Add (添加)。根据需要重复操作来编辑其他字段。编辑后的字段在日志中显示为 XXX。例如,如果您编写URI字段中,URI字段将为XXX.

  8. (可选)如果您不希望将所有请求发送到日志,请添加筛选条件和行为。在筛选日志,对于要应用的每个筛选器,请选择添加筛选器,然后选择筛选条件并指定是要保留还是删除符合条件的请求。完成添加过滤器后,如果需要,请修改默认日志记录行为.

  9. 选择启用日志记录

    注意

    成功启用日志记录后,Amazon WAF 将使用所需权限创建服务相关角色,以将日志写入到 Amazon Kinesis Data Firehose 中。有关更多信息,请参阅将服务相关角色用于 Amazon WAF

禁用 Web ACL 的日志记录

  1. 在导航窗格中,选择 Web ACL

  2. 选择您要禁用日志记录的 Web ACL。

  3. Logging (日志记录) 选项卡上,选择 Disable logging (禁用日志记录)

  4. 在对话框中,选择 Disable logging (禁用日志记录)

日志字段

以下列表介绍了可能的日志字段。

操作

操作。终止规则的可能值为:ALLOWBLOCK.COUNT是非终止规则操作。

args

查询字符串。

clientIp

发送请求的客户端的 IP。

country

请求的源国家/地区。如果Amazon WAF无法确定原产国,则会将此字段设置为-.

excludedRules

规则组中您排除的规则的列表。这些规则的操作设置为 COUNT。

exclusionType

一种类型,指示排除的规则具有操作 COUNT。

RuleId

规则组中排除的规则的 ID。

formatVersion

日志的格式版本。

headers

标头的列表。

httpMethod

请求中的 HTTP 方法。

httpRequest

关于请求的元数据。

httpSourceId

源 ID。此字段显示关联资源的 ID。

httpSourceName

请求的源。可能的值:CF了解 Amazon CloudFront,APIGW针对 Amazon API Gateway,ALB用于应用程序负载均衡器,和APPSYNC对于 来说为Amazon AppSync.

httpVersion

HTTP 版本。

labels

Web 请求上的标签。用于评估请求的规则应用了这些标签。

limitKey

指示 IP 地址源Amazon WAF应使用基于速率的规则汇总速率限制的请求。可能的值有IP,用于 Web 请求源,FORWARDED_IP,用于在请求的标头中转发的 IP。

极限值

基于速率的规则用于聚合速率限制请求的 IP 地址。如果请求包含无效的 IP 地址,则limitvalueINVALID.

maxRateAllowed

在五分钟内允许的最大请求数,具有与 limitKey 所指定的字段相同的值。如果请求数超过了 maxRateAllowed 并且还满足规则中指定的其他谓词,则 Amazon WAF 将触发为此规则指定的操作。

nonTerminatingMatchingRules

规则组中与请求匹配的非终止规则的列表。这些规则将始终为 COUNT 规则(匹配的非终止规则)。

操作

它将始终为 COUNT(匹配的非终止规则)。

RuleId

规则组中与请求匹配并且为非终止规则的 ID。即 COUNT 规则。

规则匹配详细信息

有关匹配请求的规则的详细信息。此字段仅适用于 SQL 注入和跨站点脚本 (XSS) 匹配规则语句。

rateBasedRuleId

作用于请求的基于速率的规则的 ID。如果这已终止请求,则 rateBasedRuleId 的 ID 与 terminatingRuleId 的 ID 相同。

rateBasedRuleList

对请求执行操作的基于速率的规则列表。

申请审理员

为自定义请求处理插入的标头列表。

requestId

请求的 ID,由底层主机服务生成。对于 Application Load Balancer,这是跟踪 ID。对于其他所有人,这是请求 ID。

响应代码

随自定义响应一起发送的响应代码。

ruleGroupId

规则组的 ID。如果规则阻止了请求,则 ruleGroupID 的 ID 与 terminatingRuleId 的 ID 相同。

ruleGroupList

对此请求进行操作的规则组的列表。

terminatingRule

规则组中终止了请求的规则。如果这是非空值,它还会包含RuleId操作.

terminatingRuleId

终止请求的规则的 ID。如果没有任何情况会终止请求,则值为 Default_Action

terminatingRuleMatchDetails

有关与请求匹配的终止规则的详细信息。终止规则具有针对 Web 请求结束检查过程的操作。终止规则的可能操作是:ALLOWBLOCK. 这仅适用于 SQL 注入和跨站点脚本 (XSS) 匹配规则语句。与所有用于检查多个事物的规则语句一样,Amazon WAF 对第一个匹配应用操作并停止检查 Web 请求。除了日志中报告的威胁之外,具有终止操作的 Web 请求还可能包含其他威胁。

terminatingRuleType

终止请求的规则的类型。可能的值:基于 RATE_BASED、REGULAR、GROUP 和管理规则组。

timestamp

时间戳,以毫秒为单位。

uri

请求的 URI。上述代码示例演示在编辑了此字段时应具有的值。

webaclId

Web ACL 的 GUID。

日志示例

例 在 SQLi 检测(终止)时触发的规则的日志输出

{ "timestamp": 1576280412771, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-southeast-2:EXAMPLE12345:regional/webacl/STMTest/1EXAMPLE-2ARN-3ARN-4ARN-123456EXAMPLE", "terminatingRuleId": "STMTest_SQLi_XSS", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [ { "conditionType": "SQL_INJECTION", "location": "HEADER", "matchedData": [ "10", "AND", "1" ] } ], "httpSourceName": "-", "httpSourceId": "-", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "httpRequest": { "clientIp": "1.1.1.1", "country": "AU", "headers": [ { "name": "Host", "value": "localhost:1989" }, { "name": "User-Agent", "value": "curl/7.61.1" }, { "name": "Accept", "value": "*/*" }, { "name": "x-stm-test", "value": "10 AND 1=1" } ], "uri": "/foo", "args": "", "httpVersion": "HTTP/1.1", "httpMethod": "GET", "requestId": "rid" }, "labels": [ { "name": "value" } ] }

例 在 SQLi 检测时触发的规则的日志输出(非终止)

{ "timestamp":1592357192516 ,"formatVersion":1 ,"webaclId":"arn:aws:wafv2:us-east-1:123456789012:global/webacl/hello-world/5933d6d9-9dde-js82-v8aw-9ck28nv9" ,"terminatingRuleId":"Default_Action" ,"terminatingRuleType":"REGULAR" ,"action":"ALLOW" ,"terminatingRuleMatchDetails":[] ,"httpSourceName":"-" ,"httpSourceId":"-" ,"ruleGroupList":[] ,"rateBasedRuleList":[] ,"nonTerminatingMatchingRules": [{ "ruleId":"TestRule" ,"action":"COUNT" ,"ruleMatchDetails": [{ "conditionType":"SQL_INJECTION" ,"location":"HEADER" ,"matchedData":[ "10" ,"and" ,"1"] }] }] ,"httpRequest":{ "clientIp":"3.3.3.3" ,"country":"US" ,"headers":[ {"name":"Host","value":"localhost:1989"} ,{"name":"User-Agent","value":"curl/7.61.1"} ,{"name":"Accept","value":"*/*"} ,{"name":"foo","value":"10 AND 1=1"} ] ,"uri":"/foo","args":"" ,"httpVersion":"HTTP/1.1" ,"httpMethod":"GET" ,"requestId":"rid" }, "labels": [ { "name": "value" } ] }

例 在规则组内触发的多个规则的日志输出(RuLEA-XSS 正在终止,规则 B 不终止)

{ "timestamp":1592361810888, "formatVersion":1, "webaclId":"arn:aws:wafv2:us-east-1:123456789012:global/webacl/hello-world/5933d6d9-9dde-js82-v8aw-9ck28nv9" ,"terminatingRuleId":"RG-Reference" ,"terminatingRuleType":"GROUP" ,"action":"BLOCK", "terminatingRuleMatchDetails": [{ "conditionType":"XSS" ,"location":"HEADER" ,"matchedData":["<","frameset"] }] ,"httpSourceName":"-" ,"httpSourceId":"-" ,"ruleGroupList": [{ "ruleGroupId":"arn:aws:wafv2:us-east-1:123456789012:global/rulegroup/hello-world/c05lb698-1f11-4m41-aef4-99a506d53f4b" ,"terminatingRule":{ "ruleId":"RuleA-XSS" ,"action":"BLOCK" ,"ruleMatchDetails":null } ,"nonTerminatingMatchingRules": [{ "ruleId":"RuleB-SQLi" ,"action":"COUNT" ,"ruleMatchDetails": [{ "conditionType":"SQL_INJECTION" ,"location":"HEADER" ,"matchedData":[ "10" ,"and" ,"1"] }] }] ,"excludedRules":null }] ,"rateBasedRuleList":[] ,"nonTerminatingMatchingRules":[] ,"httpRequest":{ "clientIp":"3.3.3.3" ,"country":"US" ,"headers": [ {"name":"Host","value":"localhost:1989"} ,{"name":"User-Agent","value":"curl/7.61.1"} ,{"name":"Accept","value":"*/*"} ,{"name":"xssfoo","value":"<frameset onload=alert(1)>"} ,{"name":"bar","value":"10 AND 1=1"} ] ,"uri":"/foo" ,"args":"" ,"httpVersion":"HTTP/1.1" ,"httpMethod":"GET" ,"requestId":"rid" }, "labels": [ { "name": "value" } ] }

例 为检查具有内容类型 JSON 的请求正文而触发的规则的日志输出

Amazon WAF目前将 JSON 身体检查的位置报告为UNKNOWN.

{ "timestamp": 1576280412771, "formatVersion": 1, "webaclId": "arn:aws:wafv2:ap-southeast-2:12345:regional/webacl/test/111", "terminatingRuleId": "STMTest_SQLi_XSS", "terminatingRuleType": "REGULAR", "action": "BLOCK", "terminatingRuleMatchDetails": [ { "conditionType": "SQL_INJECTION", "location": "UNKNOWN", "matchedData": [ "10", "AND", "1" ] } ], "httpSourceName": "ALB", "httpSourceId": "alb", "ruleGroupList": [], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "requestHeadersInserted":null, "responseCodeSent":null, "httpRequest": { "clientIp": "1.1.1.1", "country": "AU", "headers": [], "uri": "", "args": "", "httpVersion": "HTTP/1.1", "httpMethod": "POST", "requestId": "null" }, "labels": [ { "name": "value" } ] }