Cloudflare WAF 로그 수집

다음에서 지원:

이 파서는 Cloudflare 웹 애플리케이션 방화벽 (WAF) JSON 로그에서 필드를 추출하고 이를 변환하여 통합 데이터 모델 (UDM)에 매핑합니다. 이 스크립트는 다양한 Cloudflare 작업을 처리하여 메타데이터와 네트워크 정보로 데이터를 보강한 후 출력을 UDM 형식으로 구성합니다.

시작하기 전에

  • Google SecOps 인스턴스가 있는지 확인합니다.
  • Google Cloud에 대한 권한이 있는지 확인합니다.
  • Cloudflare Enterprise 요금제를 사용하고 있는지 확인합니다.
  • Cloudflare에 대한 액세스 권한이 있는지 확인합니다.

Google Cloud Storage 버킷 만들기

  1. Google Cloud 콘솔에 로그인합니다.
  2. Cloud Storage 버킷 페이지로 이동합니다.

    버킷으로 이동

  3. 만들기를 클릭합니다.

  4. 버킷을 구성합니다.

    • 이름: 버킷 이름 요구사항을 충족하는 고유한 이름을 입력합니다 (예: cloudflare-waf).
    • 데이터 저장 위치 선택: 위치를 선택합니다.
    • 데이터의 스토리지 클래스 선택: 버킷의 기본 스토리지 클래스를 선택하거나 자동 스토리지 클래스 관리를 위해 자동 클래스를 선택합니다.
    • 객체 액세스를 제어하는 방식 선택: 아니요를 선택하여 공개 액세스 방지를 적용하고 버킷의 객체에 대한 액세스 제어 모델을 선택합니다.
    • 스토리지 클래스: 필요에 따라 선택합니다 (예: 표준).
  5. 만들기를 클릭합니다.

Cloudflare IAM 사용자에게 버킷 권한 부여

  1. Google Cloud에서 저장소 > 브라우저 > 버킷 > 권한으로 이동합니다.
  2. 스토리지 객체 관리자 권한으로 계정 logpush@cloudflare-data.iam.gserviceaccount.com 를 추가합니다.

Cloudflare UI를 사용하여 WAF 로그의 Logpush 작업 만들기

  1. Cloudflare에 로그인합니다.
  2. 분석 및 로그 > Logpush로 이동합니다.
  3. Logpush 작업 만들기를 선택합니다.
  4. 대상 선택에서 Google Cloud Storage를 선택합니다.
  5. 다음 대상 세부정보를 입력합니다.
    • 버킷: Google Cloud 저장소 버킷 이름
    • 경로: 저장소 컨테이너 내의 버킷 위치
    • 일별 하위 폴더로 로그 정리를 선택합니다.
  6. 계속을 클릭합니다.
  1. 스토리지에 푸시할 보안 (WAF) 데이터 세트를 선택합니다.
  2. logpush 작업을 구성합니다.
    • 작업 이름을 입력합니다.
    • 로그가 일치하는 경우에서 로그에 포함하거나 로그에서 삭제할 이벤트를 선택할 수 있습니다. 자세한 내용은 필터를 참고하세요. 일부 데이터 세트에서는 이 옵션을 사용할 수 없습니다.
    • 다음을 전송 필드에서 모든 로그를 저장소 대상에 푸시하거나 푸시할 로그를 선택적으로 선택할 수 있습니다.
  3. 제출을 클릭합니다.

Cloudflare WAF 로그를 수집하도록 Google SecOps에서 피드 구성

  1. SIEM 설정 > 피드로 이동합니다.
  2. 새로 추가를 클릭합니다.
  3. 피드 이름 필드에 피드 이름을 입력합니다 (예: Cloudflare WAF 로그).
  4. 소스 유형으로 Google Cloud Storage를 선택합니다.
  5. 로그 유형으로 Cloudflare WAF를 선택합니다.
  6. 서비스 계정 가져오기를 클릭합니다.
  7. 다음을 클릭합니다.
  8. 다음 입력 매개변수의 값을 지정합니다.

    • GCS URI: Cloud Storage URL입니다.
    • URI: 하위 디렉터리가 포함된 디렉터리를 선택합니다.
    • 소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.
    • 애셋 네임스페이스: 애셋 네임스페이스입니다.
    • 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
  9. 다음을 클릭합니다.

  10. 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.

UDM 매핑 표

로그 필드 UDM 매핑 논리
Action security_result.action_details 원시 로그의 Action 값이 이 UDM 필드에 직접 할당됩니다.
Action security_result.action 이 필드의 값은 원시 로그의 Action 필드에서 파생됩니다. Action이 '허용'인 경우 UDM 필드는 ALLOW로 설정됩니다. Action가 'challengeSolved', 'jschallengeSolved', 'managedchallengenoninteractivesolved' 또는 'managedchallengeinteractivesolved'인 경우 UDM 필드는 ALLOW_WITH_MODIFICATION로 설정됩니다. Action가 'drop', 'block' 또는 'connectionclose'인 경우 UDM 필드는 BLOCK로 설정됩니다. Action가 'challengefailed' 또는 'jschallengefailed'인 경우 UDM 필드는 FAIL로 설정됩니다. 그렇지 않으면 UNKNOWN_ACTION로 설정됩니다.
ClientASN network.asn 원시 로그의 ClientASN 값은 문자열로 변환된 후 이 UDM 필드에 직접 할당됩니다.
ClientASNDescription additional.fields.key 키는 'ClientASNDescription'으로 정적으로 설정됩니다.
ClientASNDescription additional.fields.value.string_value 원시 로그의 ClientASNDescription 값이 이 UDM 필드에 직접 할당됩니다.
ClientCountry principal.location.country_or_region 원시 로그의 ClientCountry 값이 이 UDM 필드에 직접 할당됩니다.
ClientIP principal.ip 원시 로그의 ClientIP 값이 이 UDM 필드에 직접 할당됩니다.
ClientRefererHost intermediary.hostname 원시 로그의 ClientRefererHost 값이 이 UDM 필드에 직접 할당됩니다.
ClientRefererPath network.http.referral_url 원시 로그의 ClientRefererPath 값이 이 UDM 필드에 직접 할당됩니다.
ClientRequestHost target.hostname 원시 로그의 ClientRequestHost 값이 이 UDM 필드에 직접 할당됩니다.
ClientRequestMethod network.http.method 원시 로그의 ClientRequestMethod 값이 이 UDM 필드에 직접 할당됩니다.
ClientRequestPath target.file.full_path 원시 로그의 ClientRequestPath 값이 이 UDM 필드에 직접 할당됩니다.
ClientRequestProtocol network.application_protocol ClientRequestProtocol의 프로토콜 부분 (예: 'HTTP/1.1'의 'HTTP')가 grok를 사용하여 추출되고 대문자로 변환된 후 이 UDM 필드에 할당됩니다.
ClientRequestUserAgent network.http.user_agent 원시 로그의 ClientRequestUserAgent 값이 이 UDM 필드에 직접 할당됩니다.
Datetime metadata.event_timestamp 원시 로그의 Datetime 값은 RFC 3339 타임스탬프로 파싱되고 이 UDM 필드에 할당됩니다.
EdgeColoCode additional.fields.key 키는 'EdgeColoCode'로 고정적으로 설정됩니다.
EdgeColoCode additional.fields.value.string_value 원시 로그의 EdgeColoCode 값이 이 UDM 필드에 직접 할당됩니다.
EdgeResponseStatus network.http.response_code 원시 로그의 EdgeResponseStatus 값이 이 UDM 필드에 직접 할당되고 정수로 변환됩니다.
Kind metadata.product_event_type 원시 로그의 Kind 값이 이 UDM 필드에 직접 할당됩니다.
Metadata.filter target.resource.attribute.labels.value 원시 로그의 Metadata.filter 값은 target.resource.attribute.labels 내 라벨의 value 필드에 할당됩니다. 이 라벨의 key는 '메타데이터 필터'로 정적으로 설정됩니다.
Metadata.type target.resource.attribute.labels.value 원시 로그의 Metadata.type 값은 target.resource.attribute.labels 내 라벨의 value 필드에 할당됩니다. 이 라벨의 key는 '메타데이터 유형'으로 고정적으로 설정됩니다. 이 필드의 값은 ClientIP, ClientRequestHost, app_protocol의 존재 여부와 값을 기반으로 파생됩니다. 특정 로직은 파서 코드를 참고하세요. 고정적으로 'Cloudflare'로 설정됩니다. 'Cloudflare 로그 애그리게이터'로 고정적으로 설정됩니다. 고정적으로 'CLOUDFLARE_WAF'로 설정됩니다.
RayID metadata.product_log_id 원시 로그의 RayID 값이 이 UDM 필드에 직접 할당됩니다.
RuleID security_result.rule_id 원시 로그의 RuleID 값이 이 UDM 필드에 직접 할당됩니다.
Source security_result.rule_name 원시 로그의 Source 값이 이 UDM 필드에 직접 할당됩니다.
timestamp metadata.event_timestamp, events.timestamp 원시 로그의 timestamp 값이 이러한 UDM 필드에 직접 할당됩니다.

변경사항

2024-08-08

  • 'ClientRequestHost' 및 'ClientRequestURI'에서 데이터를 추출하고 병합한 후 결과를 'target.url'에 매핑했습니다.

2023-08-30

  • 'ClientRequestPath' 필드를 초기화했습니다.

2023-02-02

  • 이벤트에 병합되기 전에 'security_result' 값을 검증했습니다.

2022-09-16

  • 'Action' 필드가 'security_result.action_details'에 매핑되었습니다.
  • 작업에 'challengeSolved', 'jschallengeSolved', 'managedchallengenoninteractivesolved', 'managedchallengeinteractivesolved'가 포함된 경우 'security_result.action'이 'ALLOW_WITH_MODIFICATION'에 매핑되었습니다.
  • 작업에 'drop', 'block', 'connectionclose'가 포함된 경우 'security_result.action'이 'BLOCK'에 매핑되었습니다.
  • 작업에 'challengefailed', 'jschallengefailed'가 포함된 경우 'security_result.action'이 'FAIL'에 매핑되었습니다.

2022-07-25

  • 새로 생성된 파서