AWS WAF 로그 수집
이 문서에서는 Google Security Operations 피드를 설정하여 AWS 웹 애플리케이션 방화벽 (WAF) 로그를 수집하는 방법을 설명합니다. 파서는 원시 JSON 형식 로그를 Google SecOps UDM을 준수하는 구조화된 형식으로 변환합니다. IP 주소, URL, 사용자 에이전트, 보안 규칙 세부정보와 같은 필드를 추출하여 일관된 표현과 분석을 위해 해당 UDM 필드에 매핑합니다.
시작하기 전에
*다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- AWS에 대한 액세스 권한
Amazon S3 버킷 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 사용할 수 있도록 버킷 이름과 리전을 저장합니다.
- 이 사용자 가이드(IAM 사용자 만들기)에 따라 사용자를 만듭니다.
- 생성된 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키와 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
WAF 웹 ACL (액세스 제어 목록) 만들기
아직 AWS WAF를 설정하지 않은 경우 WAF 웹 ACL (액세스 제어 목록)을 만들어야 합니다. 기존 설정의 경우 다음 절차로 건너뛰세요.
- AWS 콘솔에서 AWS WAF & Shield를 검색하여 선택합니다.
- 웹 ACL 만들기를 클릭합니다.
- 다음 설정을 입력합니다.
- Name: ACL에 이름을 지정합니다 (예:
my-waf-web-acl
). - 리전: WAF를 적용할 리전을 선택합니다.
- CloudWatch 측정항목: 트리거된 활동과 규칙을 추적하기 위해 측정항목 수집을 사용 설정합니다.
- Name: ACL에 이름을 지정합니다 (예:
- 생성한 후 로깅을 사용 설정할 웹 ACL을 선택합니다.
AWS WAF 로깅을 구성하는 방법
- AWS WAF 콘솔에서 웹 ACL의 로깅 탭으로 이동합니다.
- 로깅 사용 설정을 클릭합니다.
- 로그의 대상으로 Amazon S3를 선택합니다.
- 이전에 만든 S3 버킷을 선택하여 로그를 저장합니다.
- 선택사항: 로그를 정리하기 위한 로그 접두사를 구성합니다 (예:
waf-logs/
). - 저장을 클릭합니다.
S3 버킷 권한 확인
S3 버킷에 AWS WAF가 로그를 작성할 수 있는 적절한 권한이 있는지 확인합니다.
- S3 콘솔로 이동합니다.
- 로그가 저장될 버킷을 선택합니다.
권한 탭에서 AWS WAF가 로그를 작성할 수 있도록 다음 버킷 정책을 추가합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "wafv2.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-log-bucket-name/*" } ] }
- 저장을 클릭합니다.
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드 > 새 피드 추가
- 콘텐츠 허브 > 콘텐츠 팩 > 시작하기
AWS WAF 피드를 설정하는 방법
- Amazon Cloud Platform 팩을 클릭합니다.
- AWS WAF 로그 유형을 찾습니다.
다음 필드에 값을 지정합니다.
- 소스 유형: Amazon SQS V2
- Queue Name: 읽어올 SQS 큐 이름
- S3 URI: 버킷 URI입니다.
s3://your-log-bucket-name/
your-log-bucket-name
을 실제 S3 버킷 이름으로 바꿉니다.
소스 삭제 옵션: 수집 환경설정에 따라 삭제 옵션을 선택합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
SQS 대기열 액세스 키 ID: 20자리 영숫자 문자열인 계정 액세스 키입니다.
SQS 대기열 보안 비밀 액세스 키: 40자로 된 영숫자 문자열인 계정 액세스 키입니다.
고급 옵션
- 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
- 애셋 네임스페이스: 피드와 연결된 네임스페이스입니다.
- 수집 라벨: 이 피드의 모든 이벤트에 적용되는 라벨입니다.
피드 만들기를 클릭합니다.
이 제품군 내에서 다양한 로그 유형에 대해 여러 피드를 구성하는 방법에 관한 자세한 내용은 제품별 피드 구성을 참고하세요.
UDM 매핑 테이블
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
action | security_result.action | 작업이 ALLOW인 경우 security_result.action을 ALLOW로, security_result.severity를 INFORMATIONAL로 설정합니다. 작업이 BLOCK인 경우 security_result.action을 BLOCK으로 설정합니다. 작업이 CAPTCHA이고 captchaResponse.responseCode가 405인 경우 security_result.action을 BLOCK으로 설정하고 security_result.action_details를 'CAPTCHA {captchaResponse.failureReason}'으로 설정합니다. |
captchaResponse.failureReason | security_result.action_details | action 및 captchaResponse.responseCode와 함께 사용하여 security_result.action_details를 결정합니다. |
captchaResponse.responseCode | security_result.action_details | action 및 captchaResponse.failureReason과 함께 사용하여 security_result.action_details를 결정합니다. |
httpRequest.clientIp | principal.ip, principal.asset.ip | principal.ip 및 principal.asset.ip에 직접 매핑됩니다. |
httpRequest.headers | target.hostname, target.asset.hostname, network.http.user_agent, network.http.parsed_user_agent, network.http.referral_url, target.location.country_or_region, target.resource.attribute.labels, target.user.userid | httpRequest.headers의 각 헤더를 반복합니다. 헤더 이름이 'host' 또는 'Host'인 경우 값은 target.hostname 및 target.asset.hostname에 매핑됩니다. 헤더 이름이 'User-Agent' 또는 'user-agent'인 경우 값은 network.http.user_agent에 매핑되고 network.http.parsed_user_agent로 파싱됩니다. 헤더 이름이 'Referer' 또는 'referer'인 경우 값은 network.http.referral_url에 매핑됩니다. 헤더 이름이 '(?i)time-zone'이면 값은 target.location.country_or_region에 매핑됩니다. 헤더 이름이 'authorization'인 경우 값이 디코딩되고 사용자 이름이 추출되어 target.user.userid에 매핑됩니다. 다른 모든 헤더는 target.resource.attribute.labels에 키-값 쌍으로 추가됩니다. |
httpRequest.httpMethod | network.http.method | network.http.method에 직접 매핑됩니다. |
httpRequest.requestId | network.session_id | network.session_id에 직접 매핑됩니다. |
httpRequest.uri | target.url | target.url에 직접 매핑됩니다. |
httpSourceId | target.resource.name | target.resource.name에 직접 매핑됩니다. |
httpSourceName | metadata.product_event_type | metadata.product_event_type에 직접 매핑됩니다. |
라벨 | security_result.rule_labels | 라벨의 각 라벨을 반복합니다. 라벨 이름이 비어 있지 않으면 security_result.rule_labels에 키-값 쌍으로 추가됩니다. |
nonTerminatingMatchingRules | security_result.action_details, security_result.rule_labels | nonTerminatingMatchingRules의 각 규칙을 반복합니다. 작업이 ALLOW이고 규칙 작업이 CAPTCHA인 경우 security_result.action_details를 'CAPTCHA SUCCESSFUL'로 설정하고 키 'nonTerminatingCaptchaRuleName'을 사용하여 규칙 ID를 security_result.rule_labels에 추가합니다. 작업이 BLOCK 또는 ALLOW이고 규칙 작업이 COUNT인 경우 security_result.action_details를 'COUNT RULE'로 설정하고 키 'nonTerminatingCountRuleName'을 사용하여 security_result.rule_labels에 규칙 ID를 추가합니다. 작업이 BLOCK 또는 ALLOW이고 규칙 작업이 CHALLENGE인 경우 security_result.action_details를 'COUNT RULE'로 설정하고 키 'nonTerminatingChallengeRuleName'을 사용하여 규칙 ID를 security_result.rule_labels에 추가합니다. |
rateBasedRuleList | security_result.rule_id, security_result.rule_name, security_result.description | terminatingRuleType이 'RATE_BASED'인 경우 rateBasedRuleList의 각 규칙을 반복합니다. terminatingRuleId가 규칙 이름과 일치하면 규칙 ID, 규칙 이름, 설명이 각각 security_result.rule_id, security_result.rule_name, security_result.description에 매핑됩니다. |
responseCodeSent | network.http.response_code | network.http.response_code에 직접 매핑되고 정수로 변환됩니다. |
ruleGroupList | intermediary.labels, security_result.rule_id, security_result.rule_name, security_result.description, security_result.detection_fields | ruleGroupList의 각 규칙 그룹을 반복합니다. 규칙 그룹 ID가 intermediary.labels에 키-값 쌍으로 추가됩니다. terminatingRuleType이 'MANAGED_RULE_GROUP'이고 terminatingRuleId가 규칙 그룹 ID와 일치하면 규칙 ID, 규칙 이름, 설명이 각각 security_result.rule_id, security_result.rule_name, security_result.description에 매핑됩니다. terminatingRuleType이 'GROUP'인 경우 종료 규칙 ID가 추출되어 security_result.rule_name 및 security_result.description에 매핑됩니다. 종료 규칙 그룹 ID가 키 'terminatingRuleGroupName'과 함께 security_result.rule_labels에 추가됩니다. terminatingRuleType이 'REGULAR'인 경우 종료 규칙 작업이 추출되어 security_result.detectionfields에 키 'terminatingRuleAction{index}'와 함께 추가됩니다. |
terminatingRuleId | security_result.rule_id, security_result.rule_name, security_result.description | terminatingRuleType이 'RATE_BASED', 'MANAGED_RULE_GROUP' 또는 'REGULAR'인 경우 terminatingRuleId는 security_result.rule_id, security_result.rule_name에 매핑되고 security_result.description을 구성하는 데 사용됩니다. |
terminatingRuleMatchDetails | security_result.description, security_result.category_details, security_result.detection_fields | terminatingRuleMatchDetails의 각 일치를 반복합니다. security_result.description을 'Terminating Rule'로 설정합니다. 조건 유형이 비어 있지 않으면 security_result.category_details에 추가됩니다. 위치가 비어 있지 않으면 키 'location'과 함께 security_result.detection_fields에 추가됩니다. 일치하는 각 데이터 요소는 'matchedData' 키와 함께 security_result.detection_fields에 추가됩니다. |
terminatingRuleType | security_result.rule_type | security_result.rule_type에 직접 매핑됩니다. |
타임스탬프 | metadata.event_timestamp | 타임스탬프로 변환되어 metadata.event_timestamp에 매핑됩니다. |
webaclId | intermediary.resource.name | intermediary.resource.name에 직접 매핑됩니다. |
metadata.vendor_name | 'AMAZON'으로 설정합니다. | |
metadata.product_name | 'AWS 웹 애플리케이션 방화벽'으로 설정합니다. | |
metadata.log_type | 'AWS_WAF'로 설정됩니다. | |
network.application_protocol | 'HTTP'로 설정됩니다. | |
metadata.event_type | httpRequest.headers에 'host' 또는 'Host' 헤더가 포함된 경우 'NETWORK_HTTP'로 설정됩니다. 그 외의 경우에는 'STATUS_UPDATE'로 설정합니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.