「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
ウェブ ACL トラフィック情報のログ記録
ログ記録を有効にして、ウェブ ACL で分析されるトラフィックに関する詳細情報を取得できます。ログの情報には、AWS WAF リソースから AWS がリクエストを受信した時間、そのリクエストの詳細と各リクエストが一致したルールのアクションが含まれます。
設定済みのストレージ送信先を使用して、ウェブ ACL から Amazon Kinesis Data Firehose にログを送信します。ログ記録を有効にすると、AWS WAF は Kinesis Data Firehose の HTTPS エンドポイントを介してストレージ先にログを送信します。
Data Firehose を作成し、保存されたログを確認する方法については、「Amazon Kinesis とは」を参照してください。Amazon Kinesis Data FirehoseData Firehose の設定に必要なアクセス許可を理解するには、「KinesisAmazon Kinesis Data Firehose によるアクセスの制御」を参照してください。
ログ記録を正常に有効化するには、以下のアクセス許可がある必要があります。
-
iam:CreateServiceLinkedRole
-
firehose:ListDeliveryStreams
-
wafv2:PutLoggingConfiguration
サービスにリンクされたロールおよび iam:CreateServiceLinkedRole
アクセス許可の詳細については、「AWS WAF のサービスにリンクされたロールの使用」を参照してください。
ウェブ ACL のログ記録の管理
ウェブ ACL のログ記録はいつでも有効または無効にできます。
ウェブ ACL でログ記録を有効にするには
-
Amazon Kinesis Data Firehose を
aws-waf-logs-
で始まるプレフィックスを使用して作成します。 たとえば、aws-waf-logs-us-east-2-analytics
と指定します。 ソースを使用して、動作しているリージョンでデータ firehose を作成します。PUT
Amazon CloudFront でログをキャプチャしている場合には、米国東部(バージニア北部) で firehose を作成します。詳細については、「Amazon Kinesis Data Firehose 配信ストリームの作成」を参照してください。重要 ソースとして
Kinesis stream
を選択しないでください。1 つの AWS WAF ログは 1 つの Kinesis Data Firehose レコードに相当します。通常の場合に 1 秒あたり 10,000 リクエストを受信し、完全ログを有効にすると、Kinesis Data Firehose では 1 秒あたり 10,000 レコードに設定されます。Kinesis Data Firehose を正しく設定しないと、AWS WAF はすべてのログを記録しません。詳細については、「Amazon Kinesis Data Firehose のクォータ」を参照してください。
-
AWS マネジメントコンソールにサインインし、AWS WAF コンソール(https://console.aws.amazon.com/wafv2/
)を開きます。 -
ナビゲーションペインで、[Web ACLs] を選択します。
-
ログ記録を有効にするウェブ ACL を選択します。
-
[ログ記録] タブで [ログの有効化] を選択します。
-
最初のステップで作成した Kinesis Data Firehose を選択します。で始まる firehose を選択する必要があります。
aws-waf-logs-
-
(オプション) 特定のフィールドとその値がログに含まれることを希望しない場合には、このフィールドを編集します。編集するフィールドを選び、[追加] を選択します。必要に応じて手順を繰り返し、追加のフィールドを編集します。編集されたフィールドは、ログに
XXX
と表示されます。たとえば、[URI] フィールドを編集した場合、ログの [URI] フィールドはXXX
になります。 -
[ログの有効化] を選択します。
注記 ログを正常に有効化すると、AWS WAF は、必要なアクセス許可を使用してサービスにリンクされたロールを作成し、Amazon Kinesis Data Firehose にログを書き込みます。詳細については、「AWS WAF のサービスにリンクされたロールの使用」を参照してください。
ウェブ ACL でログ記録を無効にするには
-
ナビゲーションペインで、[Web ACLs] を選択します。
-
ログ記録を無効にするウェブ ACL を選択します。
-
[ログ記録] タブで [ログの無効化] を選択します。
-
確認ダイアログボックスで、[ログの無効化] を選択します。
ログのフィールド
次のリストでは、使用可能なログフィールドについて説明します。
- timestamp
-
タイムスタンプ (ミリ秒単位)。
- formatVersion
-
ログの形式バージョン。
- webaclId
-
ウェブ ACL の GUID。
- terminatingRuleId
-
リクエストを終了したルールの ID。リクエストを終了したものがない場合、この値は
Default_Action
となります。 - terminatingRuleType
-
リクエストを終了したルールのタイプ。使用できる値: RATE_BASED、REGULAR、GROUP、および MANAGED_RULE_GROUP。
- action
-
アクション。ルールを終了するには、以下の値を指定できます。ALLOW および BLOCK。COUNT は、ルール終了の有効な値ではありません。
- terminatingRuleMatchDetails
-
リクエストに一致した終了ルールに関する詳細情報。終了ルールには、ウェブリクエストに対する検査プロセスを終了するアクションがあります。終了ルールに対して実行できるアクションは、ALLOW および BLOCK です。これは、SQL インジェクションおよびクロスサイトスクリプティング (XSS) 一致ルールステートメントに対してのみ設定されます。複数の対象を検査するすべてのルールステートメントと同様、AWS WAF は最初の一致にアクションを適用し、ウェブリクエストの検査を停止します。終了アクションを伴うウェブリクエストには、ログで報告された脅威に加えて、他の脅威が含まれている可能性があります。
- httpSourceName
-
リクエストの送信元。使用できる値: の場合は
CF
、Amazon CloudFront の場合はAPIGW
、Amazon API Gateway の場合はALB
、Application Load Balancer の場合はAPPSYNC
。AWS AppSync - httpSourceId
-
ソース ID。このフィールドには、関連付けられているリソースの ID が表示されます。
- ruleGroupList
-
このリクエストで動作したルールグループのリスト。前述のコード例では、1 つのみです。
- ruleGroupId
-
ルールグループの ID ルールがリクエストをブロックした場合、
ruleGroupID
の ID は、terminatingRuleId
の ID と同じです。 - terminatingRule
-
リクエストを終了したルールグループ内のルール。これが null 以外の値の場合、[ruleid] および [action (アクション)] も含まれます。この場合、アクションは常に BLOCK です。
- nonTerminatingMatchingRules
-
リクエストに一致するルールグループ内の終了しないルールのリスト。これは常に COUNT ルール (一致する終了しないルール) です。
- action (nonTerminatingMatchingRules group)
-
これは常に COUNT (一致する終了しないルール) です。
- ruleId (nonTerminatingMatchingRules グループ)
-
リクエストに一致して、終了しなかったルールグループ内のルールの ID。これが COUNT ルールです。
- ruleMatchDetails (nonTerminatingMatchingRules グループ)
-
リクエストに一致したルールに関する詳細情報。このフィールドは、SQL インジェクションおよびクロスサイトスクリプティング (XSS) 一致ルールステートメントに対してのみ設定されます。
- excludedRules
-
除外されているルールグループ内のルールのリスト。これらのルールのアクションは COUNT に設定されます。
- exclusionType (excludedRules グループ)
-
除外されたルールにアクション COUNT があることを示すタイプ。
- ruleId (excludedRules グループ)
-
除外されたルールグループ内のルールの ID。
- rateBasedRuleList
-
このリクエストで動作したレートベースのルールのリスト。
- rateBasedRuleId
-
このリクエストで動作したレートベースのルールの ID。このリクエストが終了した場合、
rateBasedRuleId
の ID は、terminatingRuleId
の ID と同じです。 - limitKey
-
このフィールドは、リクエストが単一ソースから送信された可能性が高いためにレートモニタリングの対象となるかを AWS WAF が判断するために使用されます。使用できる値: IP。
- maxRateAllowed
-
5 分間に許可される
limitKey
で指定されたフィールドに同じ値を持つ、リクエストの最大数。リクエストの数がmaxRateAllowed
を超え、このルールで指定されるほかの述語が一致した場合、AWS WAF はこのルールで指定されるアクションをトリガーします。 - httpRequest
-
リクエストに関するメタデータです。
- clientIp
-
リクエストを送信するクライアントの IP アドレス。
- country
-
リクエストの送信国。が送信元の国を特定できない場合は、このフィールドを AWS WAF に設定します。
-
- ヘッダー
-
ヘッダーの一覧。
- uri
-
リクエストの URI。上記のコードの例では、このフィールドが編集された場合の値を示しています。
- args
-
クエリ文字列。
- httpVersion
-
HTTP のバージョン。
- httpMethod
-
リクエストの HTTP メソッド。
- requestId
-
基盤となるホストサービスによって生成されるリクエストの ID。Application Load Balancer の場合、これはトレース ID です。その他のすべてでは、これはリクエスト ID です。
- limitKey
-
レートベースのルールによってレート制限のリクエストを集計するために AWS WAF が使用する IP アドレスのソースを示します。有効な値は、ウェブリクエストのオリジンの場合は
IP
、リクエストのヘッダーで転送される IP の場合はFORWARDED_IP
です。 - limitValue
-
レートベースのルールで使用する IP アドレス。レート制限のリクエストを集計します。リクエストに無効な IP アドレスが含まれている場合、
limitvalue
はINVALID
です。
ログの例
例 の検出 (終了) 時にトリガーされたルールのログ出力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" } }
例 検出時にトリガーされたルールのログ出力 (非終了)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" } }
例 ルールグループ内でトリガーされた複数のルールの ログ出力 (RuleA-XSS は終了し、Rule-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" } }