웹 ACL 트래픽 정보 로깅 - AWS WAF: AWS Firewall Manager 및 AWS Shield Advanced

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

웹 ACL 트래픽 정보 로깅

로깅을 활성화하여 웹 ACL에서 분석한 트래픽에 대한 자세한 정보를 기록할 수 있습니다. 로그에 포함된 정보에는 AWS WAF 님이 귀하의 요청을 AWS 리소스, 요청에 대한 자세한 정보 및 각 요청이 일치된 규칙에 대한 동작을 참조하십시오.

웹 ACL에서 로그로 로그를 보냅니다. Amazon Kinesis Data Firehose 구성된 스토리지 대상. 로깅을 활성화한 후 AWS WAF는 Kinesis Data Firehose의 HTTPS 엔드포인트를 통해 스토리지 대상에 로그를 전송합니다. Amazon Kinesis Data Firehose를 생성하고 저장된 로그를 검토하는 방법은 Amazon Kinesis Data Firehose란 무엇입니까?를 참조하십시오.

로깅을 활성화하려면 다음 권한이 있어야 합니다.

  • iam:CreateServiceLinkedRole

  • firehose:ListDeliveryStreams

  • wafv2:PutLoggingConfiguration

서비스 연결 역할 및 iam:CreateServiceLinkedRole 권한에 대한 자세한 내용은 AWS WAF에 서비스 연결 역할 사용 단원을 참조하십시오.

웹 ACL에 대한 로깅 관리

언제든지 웹 ACL에 대한 로깅을 활성화 및 비활성화할 수 있습니다.

웹 ACL에 대해 로깅을 활성화하려면

  1. 접두사로 시작하는 이름을 사용하여 Amazon Kinesis 데이터 Firehose 생성 aws-waf-logs-. 예를 들어, aws-waf-logs-us-east-2-analytics. 데이터를 사용하여 데이터 FireHose 생성 PUT 소스 및 운영 중인 지역. Amazon CloudFront에 대해 로그를 캡처하려면 미국 동부(버지니아 북부)에 Firehose를 생성합니다. 자세한 내용은 Amazon Kinesis Data Firehose 전송 스트림 생성을 참조하십시오.

    중요

    Kinesis stream을 소스로 선택하지 마십시오.

    한 개의 AWS WAF 로그는 한 개의 Kinesis Data Firehose 레코드에 해당합니다. 일반적으로 초당 10,000개의 요청을 받는데 전체 로그를 활성화한 경우, Kinesis Data Firehose에는 초당 10,000개의 레코드가 설정되어 있어야 합니다. Kinesis Data Firehose를 올바르게 구성하지 않으면 AWS WAF에서 로그를 기록하지 않습니다. 자세한 내용은 Amazon Kinesis Data Firehose 할당량을 참조하십시오.

  2. AWS Management Console에 로그인한 다음 https://console.aws.amazon.com/wafv2/에서 AWS WAF 콘솔을 엽니다.

  3. 탐색 창에서 Web ACLs(웹 ACL)를 선택합니다.

  4. 로깅을 활성화하려는 웹 ACL을 선택합니다.

  5. 로깅 탭에서 로깅 활성화를 선택합니다.

  6. 선택 Kinesis Data Firehose 첫 번째 단계에서 만든 것입니다. You must choose a firehose that begins with aws-waf-logs-.

  7. (선택 사항) 로그에 포함된 특정 필드와 그 값이 필요하지 않은 경우 해당 필드를 삭제합니다. 삭제할 필드를 선택한 후 추가를 선택합니다. 필요에 따라 이 작업을 반복하여 추가 필드를 삭제합니다. 삭제된 필드는 로그에서 XXX로 표시됩니다. 예를 들어, 우리 필드, 우리 로그의 필드는 XXX.

  8. 로깅 활성화를 선택합니다.

    참고

    로깅을 활성화한 경우 AWS WAF는 필요한 권한을 가진 서비스 연결 역할을 생성하여 Amazon Kinesis Data Firehose에 로그를 기록합니다. 자세한 정보는 AWS WAF에 서비스 연결 역할 사용 단원을 참조하십시오.

웹 ACL에 대한 로깅을 비활성화하려면

  1. 탐색 창에서 Web ACLs(웹 ACL)를 선택합니다.

  2. 로깅을 비활성화하려는 웹 ACL을 선택합니다.

  3. 로깅 탭에서 로깅 비활성화를 선택합니다.

  4. 대화 상자에서 로깅 비활성화를 선택합니다.

로그 필드

다음 목록에서는 가능한 로그 필드를 설명합니다.

timestamp

밀리초 단위의 타임스탬프.

formatVersion

로그의 포맷 버전.

webaclId

웹 ACL의 GUID.

terminatingRuleId

요청을 종료한 규칙의 ID. 요청을 종료하는 규칙이 없으면 이 값은 Default_Action입니다.

terminatingRuleType

요청을 종료한 규칙의 유형. 가능한 값 RATE_BASED, REGULAR, GROUP 및 MANAGED_RULE_GROUP.

--action

작업. 종료 규칙에 대한 가능한 값: 허용 및 블록. COUNT는 종료 규칙의 유효한 값이 아닙니다.

terminatingRuleMatchDetails

요청과 일치하는 종료 규칙에 대한 자세한 정보입니다. 종료 규칙에는 웹 요청에 대한 검사 프로세스를 종료하는 작업이 포함되어 있습니다. 종료 규칙에 가능한 작업은 ALLOW 및 BLOCK입니다. 이는 SQL 주입 및 XSS(교차 사이트 스크립팅) 일치 규칙 문에 대해서만 채워집니다. 두 개 이상의 항목을 검사하는 모든 규칙 문과 마찬가지로 AWS WAF에서는 첫 번째 일치하는 항목에 작업을 적용하고 웹 요청 검사를 중지합니다. 종료 작업을 포함하고 있는 웹 요청에는 로그에 보고된 위협 외에 다른 위협이 있을 수 있습니다.

httpSourceName

요청의 소스. 가능한 값 CF(소스가 있는 경우 Amazon CloudFront), APIGW(소스가 있는 경우) Amazon API Gateway) 및 ALB(소스가 있는 경우) Application Load Balancer) ).

httpSourceId

소스 ID. 이 필드에는 연결된 Amazon CloudFront 배포의 ID, API 게이트웨이에 대한 REST API, 또는 Application Load Balancer의 이름이 표시됩니다.

ruleGroupList

이 요청에 작용하는 규칙 그룹의 목록. 위의 코드 예제에서는 하나만 있습니다.

ruleGroupId

규칙 그룹의 ID. 규칙에서 요청을 차단한 경우 ruleGroupID의 ID는 terminatingRuleId의 ID와 동일합니다.

terminatingRule

요청을 종료한 규칙 그룹 내의 규칙. 이 항목이 null이 아닌 값인 경우 ruleidaction도 포함됩니다. 이 경우 이 작업은 항상 BLOCK입니다.

nonTerminatingMatchingRules

요청과 일치하는 규칙 그룹의 비 종료 규칙 목록입니다. 이 항목은 항상 COUNT 규칙입니다(일치하는 비 종료 규칙).

action(nonTerminatingMatchingRules group)

이 항목은 항상 COUNT입니다(일치하는 비 종료 규칙).

ruleId(nonTerminatingMatchingRules group)

규칙 그룹에서 요청에 부합되는 비 종료 규칙의 ID. 즉. COUNT 규칙입니다.

규칙 상세정보(비말단 중성자 그룹)

요청과 일치하는 규칙에 대한 자세한 정보. 이 필드는 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 주소.

국가

요청의 출처 국가.

headers

헤더 목록.

uri

요청의 URI. 위의 코드 예제는 이 필드가 삭제된 경우 값이 어떻게 되는지를 보여 줍니다.

@args

쿼리 문자열.

httpVersion

HTTP 버전.

httpMethod

요청의 HTTP 메서드.

requestId

기본 호스트 서비스에 의해 생성되는 요청의 ID입니다. Amazon CloudFront 및 Amazon API Gateway의 경우 요청 ID입니다. Application Load Balancer의 경우 추적 ID입니다.

limitKey

IP 주소 소스를 AWS WAF 요금 기반 규칙에 의해 요금 제한 요청을 집계하는 데 사용해야 합니다. 가능한 값은 다음과 같습니다. IP, 웹 요청 기원 FORWARDED_IP요청의 헤더에서 IP 전달된 경우.

한계값

rate-based rule(속도 기반 규칙)에 의해 사용된 IP 주소로서 rate limiting(속도 제한)에 대한 요청을 집계합니다. 요청서에 유효하지 않은 IP 주소가 포함되어 있는 경우 limitvalue is 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" } }