AWS WAF 로그 수집
다음에서 지원:
Google SecOps
SIEM
이 문서에서는 Google Security Operations 피드를 설정하여 AWS 웹 애플리케이션 방화벽 (WAF) 로그를 수집하는 방법을 설명합니다. 파서는 원시 JSON 형식 로그를 Google SecOps UDM을 준수하는 구조화된 형식으로 변환합니다. IP 주소, URL, 사용자 에이전트, 보안 규칙 세부정보와 같은 필드를 추출하여 일관된 표현과 분석을 위해 해당 UDM 필드에 매핑합니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- AWS에 대한 권한이 있는지 확인합니다.
Amazon S3 버킷 구성
- 버킷 만들기 사용자 가이드에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 사용할 수 있도록 버킷 이름 및 지역을 저장합니다.
- IAM 사용자 만들기 사용자 가이드에 따라 사용자를 만듭니다.
- 만든 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키 및 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- Attach policies directly(정책 직접 연결)를 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
WAF 웹 ACL (액세스 제어 목록) 만들기
아직 AWS WAF를 설정하지 않은 경우 WAF 웹 ACL (액세스 제어 목록)을 만들어야 합니다. 기존 설정의 경우 다음 절차로 건너뛸 수 있습니다.
- AWS 콘솔에서 AWS WAF 및 Shield를 검색하여 선택합니다.
- 웹 ACL 만들기를 클릭합니다.
- 다음 설정을 입력합니다.
- 이름: ACL 이름을 지정합니다 (예:
my-waf-web-acl
). - 리전: WAF를 적용할 리전을 선택합니다.
- CloudWatch 측정항목: 측정항목 수집을 사용 설정하여 트리거된 활동 및 규칙을 추적합니다.
- 이름: ACL 이름을 지정합니다 (예:
- 생성되면 로깅을 사용 설정할 웹 ACL을 선택합니다.
AWS WAF 로깅 구성
- AWS WAF 콘솔에서 웹 ACL의 Logging 탭으로 이동합니다.
- 로깅 사용 설정을 클릭합니다.
- 로그의 대상으로 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/*" } ] }
- 저장을 클릭합니다.
AWS WAF 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: AWS WAF 로그).
- 소스 유형으로 Amazon S3를 선택합니다.
- 로그 유형으로 AWS WAF를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI입니다.
s3://your-log-bucket-name/waf-logs/
- 다음을 바꿉니다.
your-log-bucket-name
: 버킷의 실제 이름입니다.
- 다음을 바꿉니다.
- URI: 디렉터리 또는 하위 디렉터리가 포함된 디렉터리를 선택합니다.
- 소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.
- 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
action | security_result.action | 작업이 ALLOW인 경우 security_result.action을 ALLOW로, security_result.severity를 INFORMATIONAL로 설정합니다. 작업이 BLOCK인 경우 security_result.action을 BLOCK으로 설정합니다. action이 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' 키를 사용하여 security_result.rule_labels에 규칙 ID를 추가합니다. 액션이 BLOCK 또는 ALLOW이고 규칙 액션이 COUNT인 경우 security_result.action_details를 'COUNT RULE'로 설정하고 'nonTerminatingCountRuleName' 키를 사용하여 규칙 ID를 security_result.rule_labels에 추가합니다. 작업이 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.detection필드에 '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'로 설정합니다. |
변경사항
2024-03-14
- 올바른 JSON 형식을 보장하기 위해 로그 메시지에서 잘못된 이스케이프 문자의 처리를 개선했습니다.
2023-12-29
- 'user-agent' 정보를 적절한 UDM 필드에 매핑하는 작업을 표준화했습니다.
- HTTP 요청의 'authorization' 헤더에서 사용자 ID를 추출했습니다.
2023-12-08
- 호스트 이름 매핑, 대상 URL 추출, 규칙 처리와 관련된 여러 버그가 수정되었습니다.
- 파서의 특정 섹션에서 오류 처리가 개선되었습니다.
2023-12-11
- 새로운 Grok 패턴을 도입하여 새 로그 형식 지원을 추가했습니다.
2023-08-16
- 감지 필드의 보안 규칙 작업을 UDM 필드에 매핑하는 기능이 개선되었습니다.
2022-12-16
- 날짜 필터링 로직을 최적화하고 잘못된 JSON 데이터 처리를 개선했습니다.
- HTTP 헤더의 사용자 에이전트 정보를 전용 UDM 필드에 매핑했습니다.
2022-12-11
- CSV 및 SYSLOG 메시지 로그를 처리하기 위한 불필요한 로직을 삭제했습니다.
2022-07-22
- 이것이 파서가 처음 생성된 시점입니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.