Akamai WAF 로그 수집
다음에서 지원:
Google SecOps
SIEM
개요
이 파서는 syslog 및 CEF 형식을 모두 지원하는 Akamai 웹 애플리케이션 방화벽 (WAF) 로그를 처리합니다. IP 주소, URL, HTTP 메서드, 응답 코드, 사용자 에이전트, 보안 규칙 정보와 같은 필드를 추출하여 일관된 표현을 위해 UDM에 매핑합니다. 또한 파서는 attackData
및 clientReputation
와 같은 특정 Akamai 필드를 처리하여 필요한 데이터 변환을 실행하고 UDM 출력을 보강합니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- AWS IAM 및 S3에 대한 액세스 권한이 있는지 확인합니다.
- Akamai에 대한 권한이 있는지 확인합니다.
Amazon S3 버킷 구성
- 버킷 만들기 사용자 가이드에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 참고할 수 있도록 버킷 이름 및 리전을 저장합니다.
- IAM 사용자 만들기 사용자 가이드에 따라 사용자를 만듭니다.
- 만든 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- .csv 파일 다운로드를 클릭합니다. 나중에 참고할 수 있도록 액세스 키 및 보안 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- Attach policies directly(정책 직접 연결)를 선택합니다.
- AmazonS3FullAccess 정책을 검색합니다.
- 정책을 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
Amazon S3로 로그를 전송하도록 Akamai WAF 구성
- Akamai Control Center에 로그인합니다.
- 보안 섹션으로 이동합니다.
- 로그를 선택합니다.
새 로그 전송을 구성합니다.
- 로그 소스: WAF 구성을 선택합니다.
- 전송 대상: Amazon S3를 선택합니다.
- S3 버킷: 만든 S3 버킷의 이름을 지정합니다.
- 리전: S3 버킷이 있는 AWS 리전을 선택합니다.
- 액세스 키 ID 및 보안 비밀 액세스 키: 생성한 사용자 인증 정보를 입력합니다.
- 로그 형식: 관련 로그 형식 (예: JSON)을 선택합니다.
- 전송 빈도: 로그 전송에 적절한 빈도를 선택합니다 (예: 5분마다).
로그 전송 확인:
- LDS를 구성한 후 S3 버킷에서 수신되는 로그 파일을 모니터링합니다.
Akamai WAF 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예: Akamai WAF 로그).
- 소스 유형으로 Amazon S3를 선택합니다.
- 로그 유형으로 Akamai WAF를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI입니다.
s3:/BUCKET_NAME
다음을 바꿉니다.BUCKET_NAME
: 버킷의 이름입니다.
- URI: 로그 스트림 구성에 따라 단일 파일 | 디렉터리 | 하위 디렉터리가 포함된 디렉터리 중에서 URI 유형을 선택합니다.
- 소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.
- 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 표
로그 필드 (오름차순) | UDM 매핑 | 논리 |
---|---|---|
attackData.clientIP |
principal.ip , principal.asset.ip |
요청을 시작한 클라이언트의 IP 주소입니다. akamai_siem 로그의 attackData.clientIP 필드에서 추출됩니다. |
attackData.configId |
metadata.product_log_id |
보안 구성 ID입니다. akamai_siem 로그의 attackData.configId 필드에서 추출됩니다. security_result 객체에 detection_field로 추가되었습니다. |
attackData.policyId |
해당 사항 없음 | 파서 로직에서 security_result.summary 를 'PolicyId:[value]' 값으로 채우는 데 사용됩니다. |
attackData.ruleActions |
security_result.action , security_result.action_details |
트리거된 규칙에 따라 취해진 조치입니다. akamai_siem 로그의 attackData.ruleActions 필드에서 추출됩니다. 'deny'는 BLOCK에 매핑되고 다른 값 ('alert', 'monitor', 'allow', 'tarpit')은 ALLOW에 매핑됩니다. 원래 값은 action_details 에도 저장됩니다. |
attackData.ruleData |
security_result.detection_fields |
트리거된 규칙과 연결된 데이터입니다. akamai_siem 로그의 attackData.ruleData 필드에서 추출됩니다. 'RuleData' 키로 security_result.detection_fields 에 추가되었습니다. |
attackData.ruleMessages |
security_result.threat_name |
트리거된 규칙과 연결된 메시지입니다. akamai_siem 로그의 attackData.ruleMessages 필드에서 추출됩니다. |
attackData.ruleSelectors |
security_result.detection_fields |
트리거된 규칙과 연결된 선택자입니다. akamai_siem 로그의 attackData.ruleSelectors 필드에서 추출됩니다. 'RuleSelector' 키로 security_result.detection_fields 에 추가되었습니다. |
attackData.ruleTags |
security_result.category_details |
트리거된 규칙과 연결된 태그입니다. akamai_siem 로그의 attackData.ruleTags 필드에서 추출됩니다. |
attackData.ruleVersions |
security_result.detection_fields |
트리거된 규칙의 버전입니다. akamai_siem 로그의 attackData.ruleVersions 필드에서 추출됩니다. 'Rule Version' 키로 security_result.detection_fields 에 추가되었습니다. |
clientReputation |
principal.labels |
고객 평판 정보 akamai_siem 로그의 clientReputation 필드에서 추출됩니다. 'reputation' 키를 사용하여 사용자에게 라벨로 추가되었습니다. |
cliIP , cli_ip , principal_ip |
principal.ip , principal.asset.ip |
클라이언트 IP 주소입니다. 로그 형식에 따라 cliIP , cli_ip 또는 principal_ip 에서 추출됩니다. |
cp |
additional.fields |
CP 코드 cp 필드에서 추출됩니다. 'cp' 키로 additional.fields 에 추가되었습니다. |
eventId |
metadata.product_log_id |
이벤트 ID eventId 필드에서 추출됩니다. |
eventTime , log_date |
metadata.event_timestamp |
이벤트 타임스탬프 로그 형식에 따라 eventTime 에서 추출되거나 log_date 에서 파싱됩니다. |
eventType.eventDefinition.eventDefinitionId |
target.resource.product_object_id |
이벤트 정의 ID입니다. eventType.eventDefinition.eventDefinitionId 에서 추출되었습니다. |
eventType.eventDefinition.eventDescription |
metadata.description |
이벤트 설명 eventType.eventDefinition.eventDescription 에서 추출되었습니다. |
eventType.eventDefinition.eventName |
metadata.product_event_type |
이벤트 이름 eventType.eventDefinition.eventName 에서 추출되었습니다. |
eventType.eventTypeId |
additional.fields |
이벤트 유형 ID입니다. eventType.eventTypeId 에서 추출했습니다. 'eventTypeId' 키로 additional.fields 에 추가되었습니다. |
eventType.eventTypeName |
additional.fields |
이벤트 유형 이름입니다. eventType.eventTypeName 에서 추출되었습니다. 'eventTypeName' 키로 additional.fields 에 추가되었습니다. |
format |
해당 사항 없음 | 파서에서 로그 형식을 결정하는 데 사용됩니다. |
geo.asn |
principal.location.name |
자율 시스템 번호 (ASN) 로그 형식에 따라 geo.asn 또는 AkamaiSiemASN 에서 추출됩니다. 값의 접두사는 'ASN '입니다. |
geo.city |
principal.location.city |
도시. 로그 형식에 따라 geo.city 또는 AkamaiSiemCity 에서 추출됩니다. |
geo.country |
principal.location.country_or_region |
국가 로그 형식에 따라 geo.country 또는 AkamaiSiemContinent 에서 추출됩니다. |
httpMessage.bytes |
network.sent_bytes |
HTTP 메시지로 전송된 바이트입니다. httpMessage.bytes 에서 추출되었습니다. |
httpMessage.host |
target.hostname , target.asset.hostname |
호스트 이름 로그 형식에 따라 httpMessage.host 또는 reqHost 에서 추출됩니다. |
httpMessage.method |
network.http.method |
HTTP 메서드 로그 형식에 따라 httpMessage.method , network_http_method 또는 reqMethod 에서 추출됩니다. 대문자로 변환됩니다. |
httpMessage.path |
target.url |
요청 경로입니다. 로그 형식에 따라 httpMessage.path , target_url 또는 reqPath 에서 추출됩니다. httpMessage.query 가 있는 경우 '?' 구분자로 경로에 추가됩니다. |
httpMessage.port |
target.port |
포트 로그 형식에 따라 httpMessage.port 또는 reqPort 에서 추출됩니다. |
httpMessage.protocol |
해당 사항 없음 | 파서에서 프로토콜을 결정하는 데 사용됩니다. |
httpMessage.query |
해당 사항 없음 | 파서 로직에서 httpMessage.path 에 추가하는 데 사용됩니다(있는 경우). |
httpMessage.requestId |
network.session_id |
요청 ID입니다. 로그 형식에 따라 httpMessage.requestId 또는 reqId 에서 추출됩니다. |
httpMessage.requestHeaders , AkamaiSiemRequestHeaders |
additional.fields |
요청 헤더 로그 형식에 따라 httpMessage.requestHeaders 또는 AkamaiSiemRequestHeaders 에서 추출됩니다. additional.fields 에 'AkamaiSiemRequestHeaders' 키로 추가되었습니다. |
httpMessage.responseHeaders , AkamaiSiemResponseHeaders |
additional.fields |
응답 헤더 로그 형식에 따라 httpMessage.responseHeaders 또는 AkamaiSiemResponseHeaders 에서 추출됩니다. 'AkamaiSiemResponseHeaders' 키로 additional.fields 에 추가되었습니다. |
httpMessage.status , AkamaiSiemResponseStatus , network_http_response_code , statusCode |
network.http.response_code |
HTTP 응답 코드입니다. 로그 형식에 따라 httpMessage.status 또는 AkamaiSiemResponseStatus 또는 network_http_response_code 또는 statusCode 에서 추출됩니다. |
httpMessage.tls , AkamaiSiemTLSVersion , tlsVersion |
network.tls.version |
TLS 버전 로그 형식에 따라 httpMessage.tls , AkamaiSiemTLSVersion 또는 tlsVersion 에서 추출됩니다. |
httpMessage.useragent , network_http_user_agent , UA , useragent |
network.http.user_agent |
사용자 에이전트 로그 형식에 따라 httpMessage.useragent 또는 network_http_user_agent 또는 UA 또는 useragent 에서 추출됩니다. |
log_description |
metadata.description |
로그 설명 log_description 에서 추출되었습니다. |
log_rule |
security_result.rule_name |
로그 규칙 log_rule 에서 추출되었습니다. |
message |
해당 사항 없음 | 원시 로그 메시지입니다. 파서에서 다양한 추출에 사용합니다. |
network_http_referral_url |
network.http.referral_url |
HTTP 추천 URL network_http_referral_url 에서 추출되었습니다. |
proto |
해당 사항 없음 | attackData.policyId 가 없는 경우 security_result.summary 를 채우기 위해 파서 로직에서 사용됩니다. |
reqHost |
target.hostname , target.asset.hostname |
호스트를 요청합니다. reqHost 에서 추출되었습니다. |
reqId |
metadata.product_log_id , network.session_id |
요청 ID입니다. reqId 에서 추출되었습니다. |
reqMethod |
network.http.method |
요청 메서드 reqMethod 에서 추출되었습니다. |
reqPath |
target.url |
요청 경로입니다. reqPath 에서 추출되었습니다. |
reqPort |
target.port |
포트를 요청합니다. reqPort 에서 추출되었습니다. |
rspContentType |
target.file.mime_type |
응답 콘텐츠 유형입니다. rspContentType 에서 추출되었습니다. |
securityRules |
security_result.rule_name , security_result.about.resource.attribute.labels |
보안 규칙을 선택합니다. securityRules 에서 추출되었습니다. 첫 번째 부분은 rule_name 에 매핑되고 나머지는 'non_deny_rules' 및 'deny_rule_format' 키가 있는 라벨로 추가됩니다. |
statusCode |
network.http.response_code |
상태 코드 statusCode 에서 추출되었습니다. |
state |
principal.location.state , target.user.personal_address.state |
주/도 state 에서 추출했습니다. |
tlsVersion |
network.tls.version |
TLS 버전 tlsVersion 에서 추출되었습니다. |
type |
metadata.product_event_type |
이벤트 유형입니다. type 에서 추출되었습니다. |
UA |
network.http.user_agent |
사용자 에이전트 UA 에서 추출되었습니다. |
version |
metadata.product_version , principal.asset.software.version |
버전 version 에서 추출되었습니다. |
해당 사항 없음 | metadata.event_timestamp |
이벤트 타임스탬프는 akamai_lds 로그의 _ts 필드, akamai_siem 로그의 httpMessage.start 필드 또는 다른 형식의 log_date 필드에서 가져옵니다. |
해당 사항 없음 | metadata.vendor_name |
'Akamai'로 하드코딩됨 |
해당 사항 없음 | metadata.product_name |
'Kona'로 하드코딩되었습니다. |
해당 사항 없음 | metadata.log_type |
'AKAMAI_WAF'로 하드코딩되었습니다. |
해당 사항 없음 | network.application_protocol |
akamai_siem 및 akamai_lds 로그의 경우 'HTTP'로, 다른 형식의 경우 'DNS'로 설정합니다. |
해당 사항 없음 | security_result.severity |
'알림' 작업의 경우 MEDIUM, '거부' 작업의 경우 CRITICAL, 기타 작업의 경우 HIGH로 설정합니다. |
해당 사항 없음 | event.idm.read_only_udm.metadata.event_type |
대부분의 로그 형식의 경우 'NETWORK_HTTP', eventId 또는 eventData 필드가 있는 이벤트의 경우 'GENERIC_EVENT', cli_ip 또는 p_ip 필드가 있지만 reqHost 필드가 없는 이벤트의 경우 'STATUS_UPDATE'로 설정합니다. |
변경사항
2024-05-21
- 개선
- 'rules.data'가 'security_result.detection_fields'에 매핑되었습니다.
- 'rules.action', 'rules.selector', 'rules.version'이 'security_result.action_details'에 매핑되었습니다.
- 'rules.id'가 'security_result.rule_id'에 매핑되었습니다.
- 'rules.tag'가 'security_result.category_details'에 매핑되었습니다.
- 'rules.message'가 'security_result.threat_name'에 매핑되었습니다.
2024-03-01
- 개선
- 'attackData.configId'가 'metadata.product_log_id' 및 'security_result.detection_fields'에 매핑되었습니다.
2023-10-27
- 개선
- 'rule.id'가 'security_result.rule_id'에 매핑되었습니다.
- 'httpMessage.host'가 없는 경우 'metadata.event_type'에 설정된 값을 'NETWORK_HTTP'에서 'GENERIC_EVENT'로 변경했습니다.
- 'attackData.rules'가 배열인 경우 'attackData'를 파싱하는 지원을 추가했습니다.
2023-04-24
- 개선
- CEF 형식으로 처리된 파싱된 로그
2023-04-04
- 개선
- 'reqHost'가 'target.hostname'에 매핑되었습니다.
- 'reqPort'가 'target.port'에 매핑되었습니다.
- 'reqPath'를 'target.url'에 매핑했습니다.
- 'reqId'가 'network.session_id'에 매핑되었습니다.
- 'statusCode'를 'network.http.response_code'에 매핑했습니다.
- 'reqMethod'가 'network.http.method'에 매핑되었습니다.
- 'UA'가 'network.http.user_agent'에 매핑되었습니다.
- 'bytes'가 'network.sent_bytes'에 매핑되었습니다.
- 'reqMethod'를 'network.http.method'에 매핑했습니다.
- syslog 형식의 오류 로그를 파싱했습니다.
- 올바른 파싱을 위해 'attackData.rules'에 대한 조건 검사를 추가했습니다.
- 가능한 경우 'metadata.event_type'을 'STATUS_UPDATE'에서 'NETWORK_HTTP'로 수정했습니다.
2022-08-12
- 개선
- 'security_policy_id'가 security_result.rule_name에 매핑되었습니다.
- 'non_deny_rules'가 security_result.about.resource.attribute.labels에 매핑되었습니다.
- 'deny_rule_format'이 security_result.about.resource.attribute.labels에 매핑되었습니다.
2022-11-07
- 개선
- 데이터에서도 ['-'] 을 확인하도록 SecurityRules를 업데이트합니다.
2022-06-14
- 개선
- security_rules를 security_result.rule_name에 매핑했습니다.
- 도시를 principal.location.city에 매핑했습니다.
- 국가가 principal.location.country_or_region에 매핑되었습니다.
- cli_ip를 principal.ip에 매핑했습니다.
- state가 target.user.personal_address.state에 매핑되었습니다.
- 버전을 metadata.product_version에 매핑했습니다.
- useragent를 network.http.user_agent에 매핑했습니다.
2022-06-14
- Enhancement-
- proto를 security_result.summary에 매핑했습니다.
- securityRules를 security_result.rule_name에 매핑했습니다.
- 도시를 principal.location.city에 매핑했습니다.
- 국가가 principal.location.country_or_region에 매핑되었습니다.
- cliIP를 principal.ip에 매핑했습니다.
- cp를 event.idm.read_only_udm.additional.fields에 매핑했습니다.
- reqId가 metadata.product_log_id에 매핑되었습니다.
- rspContentType이 target.file.mime_type에 매핑되었습니다.
- state가 target.user.personal_address.state에 매핑되었습니다.
- 버전을 principal.asset.software.version에 매핑했습니다.
2022-03-23
- 버그 수정: 모든 일치 패턴으로 데이터를 파싱하지 못하는 문제 수정
- 새 필드에 대한 매핑이 추가되었습니다.
- eventId가 metadata.product_log_id에 매핑되었습니다.
- eventDefinitionId가 target.resource.product_object_id에 매핑되었습니다.
- eventDescription이 metadata.description에 매핑됨
- eventName이 metadata.product_event_type에 매핑되었습니다.
- eventTypeName이 additional.fields에 매핑되었습니다.
- eventTypeId가 additional.fields에 매핑되었습니다.
- eventData가 additional.fields에 매핑되었습니다.