記錄 Web ACL 流量資訊 - AWS WAF、AWS Firewall Manager 與 AWS Shield Advanced

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

記錄 Web ACL 流量資訊

您可以啟用日誌記錄取得您 Web ACL 分析流量的詳細資訊。記錄檔中包含的資訊包括AWS WAF收到您的請求AWS資源、請求的詳細資訊,以及適用於符合每個請求規則的動作。

在 Web ACL 的記錄設定中,您可以自訂AWS WAF會傳送至記錄檔,如下所示:

  • 記錄檔篩選— 您可以新增篩選以指定要保留在記錄檔中以及捨棄哪些 Web 要求。您可以篩選規則動作和要求評估期間套用的 Web 要求標籤。如需規則動作設定的詳細資訊,請參閱AWS WAF 規則動作。如需標籤的相關資訊,請參閱AWS WAF網頁請求上的標籤

  • 欄位密封— 您可以將日誌記錄中的某些欄位標記為密文。已編輯的欄位會顯示為XXX在記錄檔中。例如,如果您將URI欄位URI欄位將會是XXX。如需日誌欄位的清單,請參閱日誌欄位

您可以將日誌從 Web ACL 傳送到具有已設定儲存目的地的 Amazon Kinesis Data Firehose。啟用記錄之後,AWS WAF會透過 Kinesis Data Firehose 的 HTTPS 端點傳送日誌至您的儲存目的地。

如需如何建立 Amazon Kinesis 資料流管和檢閱存放日誌的詳細資訊,請參閱什麼是 Amazon Kinesis Data Firehose? 若要了解您的 Kinesis Data Firehose 組態所需的權限,請參閱使用 Amazon Kinesis Data Firehose 控制存取

您必須擁有以下權限,才能順利啟用記錄:

  • iam:CreateServiceLinkedRole

  • firehose:ListDeliveryStreams

  • wafv2:PutLoggingConfiguration

如需服務連結角色和 iam:CreateServiceLinkedRole 許可的詳細資訊,請參閱使用 AWS WAF 的服務連結角色

管理 Web ACL 記錄

您可以隨時啟用和停用 Web ACL 的記錄日誌功能。

啟用 Web ACL 記錄

  1. 使用名稱開頭字首 aws-waf-logs- 建立 Amazon Kinesis Data Firehose。例如,aws-waf-logs-us-east-2-analytics。使用 PUT 來源以及您正在操作的區域建立資料 firehose。如果您為 Amazon CloudFront 擷取日誌,請在美國東部 (維吉尼亞北部) 建立 Firehose。如需詳細資訊,請參閱「」建立 Amazon Kinesis Data Firehose 交付串流。

    重要

    請勿選擇 Kinesis stream 做為您的來源。

    OneAWS WAF日誌等同於一個 Kinesis Data Firehose 記錄。如果您每秒通常接收到 10,000 個請求,且您啟用完整的日誌,則您在 Kinesis Data Firehose 中每秒應該會有 10,000 個記錄設定。如果您未正確設定 Kinesis Data Firehose,請AWS WAF將不會記錄所有日誌。如需詳細資訊,請參閱 Amazon Kinesis Data Firehose 配額

  2. 登入。AWS Management Console,開啟AWS WAF主控台位於https://console.aws.amazon.com/wafv2/

  3. 在導覽窗格中,選擇 Web ACL

  4. 選擇您想啟用記錄的 Web ACL。

  5. 記錄標籤中,選擇啟用記錄

  6. 選擇您在第一步驟建立的 Kinesis Data Firehose。您必須選擇開頭為的消防軟管aws-waf-logs-

  7. (選用) 如果您不想要特定欄位及其值包含在日誌中,請編寫這些欄位。選擇要編寫的欄位,然後選擇新增。重複其他需要編寫的欄位。在日誌中編寫的欄位顯示為 XXX。例如,如果您將URI欄位URI欄位將會是XXX

  8. (選用) 如果您不想要將所有請求傳送至日誌,請新增您的篩選準則和行為。在下方過濾記錄,針對您想要套用的每個篩選器,選擇新增篩選,然後選擇您的篩選條件,並指定是否要保留或刪除符合條件的請求。當您完成新增篩選器時,如果需要,請修改預設記錄行為

  9. 選擇 Enable Logging (啟用記錄日誌)

    注意

    當您成功啟用記錄,AWS WAF 會使用具有必要許可的服務連結角色將日誌寫入到 Amazon Kinesis Data Firehose。如需更多詳細資訊,請參閱 使用 AWS WAF 的服務連結角色

停用 Web ACL 記錄

  1. 在導覽窗格中,選擇 Web ACL

  2. 選擇您想停用記錄的 Web ACL。

  3. 記錄標籤中,選擇停用記錄

  4. 在對話方塊中,選擇停用記錄

日誌欄位

下列清單說明可能的日誌欄位。

動作

動作。終止規則可能的值:ALLOWBLOCKCOUNT是非終止規則動作。

args

查詢字串。

clientIp

傳送請求的用戶端 IP 地址。

country

請求來源的國家/地區。如果AWS WAF無法確定來源國,則會將此欄位設定為-

excludedRules

規則群組中已排除的規則清單。這些規則的動作設定為 COUNT。

exclusionType

此類型表示已排除的規則均具備動作 COUNT。

RuleId

在規則群組中被排除的規則 ID。

formatVersion

日誌的格式版本。

標頭

標題清單。

httpMethod

請求的 HTTP 方法。

httpRequest

請求的中繼資料。

httpSourceId

來源 ID。此欄位顯示與資源關聯的 ID。

httpSourceName

請求的來源。可能的值如下:CFAmazon CloudFront,APIGWAmazon API Gateway,ALB針對 Application Load Balancer,以及APPSYNCforAWS AppSync。

httpVersion

HTTP 版本。

labels

Web 請求上的標籤。這些標籤是由用來評估請求的規則套用。

limitKey

指出 IP 位址來源AWS WAF應該使用以速率為基礎的規則彙總速率限制的請求。可能的值為IP,用於 Web 請求來源,以及FORWARDED_IP,用於在請求中標頭中轉發的 IP。

限制值

以費率為基礎的規則用來彙總速率限制要求的 IP 位址。如果要求包含無效的 IP 位址,limitvalueINVALID

maxRateAllowed

五分鐘內允許的請求數量上限,此值與 limitKey 指定之欄位中的值相同。若請求數超過 maxRateAllowed,而且也滿足規則中指定的其他述詞,AWS WAF 會觸發針對此規則指定的動作。

nonTerminatingMatchingRules

規則群組中符合請求的非終止規則清單。這些一律是 COUNT 規則 (符合的非終止規則)。

動作

這一律是 COUNT (符合的非終止規則)。

RuleId

在規則群組符合請求的規則 ID 為非終止的。也就是 COUNT (計數) 規則。

規則比對詳細資料

符合請求之規則的詳細資訊。此欄位只會為 SQL 插入和跨網站指令碼 (XSS) 符合規則陳述式填入。

rateBasedRuleId

處理請求的速率規則 ID。若此項目已終止請求,則 rateBasedRuleId 的 ID 將與 terminatingRuleId 的 ID 相同。

rateBasedRuleList

處理請求的以速率為基礎的規則名單。

請求是否正確

插入用於自訂要求處理的標頭清單。

requestId

請求的 ID,由基礎主機服務產生。對於 Application Load Balancer,這是追蹤識別碼。對於所有其他人來說,這是請求 ID。

回應代碼

隨自訂回應傳送的回應碼。

ruleGroupId

規則群組的 ID。若規則封鎖請求,則 ruleGroupID 的 ID 將與 terminatingRuleId 的 ID 相同。

ruleGroupList

處理此請求的規則群組名單。

terminatingRule

在規則群組中終止請求的規則。如果此為非 null 值,則它還包含RuleIdaction

terminatingRuleId

終止請求的規則 ID。如果無法終止請求,則值為 Default_Action

terminatingRuleMatchDetails

符合請求之終止規則的詳細資訊。終止規則對 Web 請求具有結束檢查程序的動作。終止規則可能的動作是ALLOWBLOCK。這只會為 SQL Injection 和跨網站指令碼 (XSS) 符合規則陳述式填入。與所有檢查多個項目的規則陳述式一樣,AWS WAF 會在第一個符合項目上套用動作,並停止檢查 Web 請求。具有終止動作的 Web 請求除了包含記錄中報告的威脅之外,還可能包含其他威脅。

terminatingRuleType

終止請求的規則類型。可能的值如下:RATE_BASED、REGULAR、GROUP 和 MANAGED_RULE_RULAR。

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 檢查要求主體時觸發的規則記錄輸出

AWS 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" } ] }