보안 웹 프록시 로그 수집 Google Cloud

다음에서 지원:

이 문서에서는 Google Cloud Storage V2를 사용하여 Google Security Operations에 Google Cloud 보안 웹 프록시 로그를 수집하는 방법을 설명합니다.

보안 웹 프록시는 이그레스 웹 트래픽 (HTTP 및 HTTPS)을 보호하는 데 도움이 되는 클라우드 중심 서비스입니다. 클라우드 중심 ID 및 웹 애플리케이션을 기반으로 유연하고 세분화된 정책을 적용할 수 있는 관리형 프록시 솔루션을 제공합니다. 보안 웹 프록시는 정책을 준수하지 않는 트래픽을 식별하고 Cloud Logging에 로깅하여 인터넷 사용량을 모니터링하고, 네트워크에 대한 위협을 발견하고, 보안 사고에 대응할 수 있도록 지원합니다.

시작하기 전에

다음 기본 요건이 충족되었는지 확인합니다.

  • Google SecOps 인스턴스
  • Cloud Storage API가 사용 설정된 Google Cloud 프로젝트
  • GCS 버킷을 만들고 관리할 수 있는 권한
  • GCS 버킷의 IAM 정책을 관리할 수 있는 권한
  • 보안 웹 프록시가 Google Cloud 환경에서 활성화되고 구성되어 있습니다.
  • Google Cloud에 대한 액세스 권한 및 보안 웹 프록시 로그에 액세스할 수 있는 적절한 권한
  • Cloud Logging 싱크를 만들고 관리할 수 있는 권한

Google Cloud Storage 버킷 만들기

Google Cloud 콘솔 사용

  1. Google Cloud Console로 이동합니다.
  2. 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
  3. 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
  4. 버킷 만들기를 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.

    설정
    버킷 이름 지정 전역적으로 고유한 이름 (예: Google Cloud-swp-logs)을 입력합니다.
    위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전)
    위치 위치를 선택합니다 (예: us-central1).
    스토리지 클래스 Standard (자주 액세스하는 로그에 권장)
    액세스 제어 균일 (권장)
    보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정
  6. 만들기를 클릭합니다.

gcloud 명령줄 도구 사용

  • 또는 gcloud 명령어를 사용하여 버킷을 만듭니다.

    gcloud storage buckets create gs://gcp-swp-logs \
        --location=us-central1 \
        --default-storage-class=STANDARD
    
    • 다음과 같이 바꿉니다.
      • gcp-swp-logs: 원하는 버킷 이름 (전역적으로 고유함)입니다.
      • us-central1: 선호하는 리전입니다 (예: us-central1, europe-west1).

보안 웹 프록시 로그를 GCS로 내보내도록 Cloud Logging 구성

보안 웹 프록시는 프록시 트랜잭션 로그를 Cloud Logging에 자동으로 로깅합니다. 이러한 로그를 Cloud Storage로 내보내려면 Cloud Logging 싱크를 만들어야 합니다.

Google Cloud 콘솔 사용

  1. Google Cloud 콘솔에서 로깅 > 로그 라우터로 이동합니다.
  2. 싱크 만들기를 클릭합니다.
  3. 다음 구성 세부정보를 제공합니다.
    • 싱크 이름: 설명이 포함된 이름 (예: swp-export-sink)을 입력합니다.
    • 싱크 설명: 선택사항인 설명입니다.
  4. 다음을 클릭합니다.
  5. 싱크 서비스 선택 섹션에서 다음 단계를 따릅니다.
    • 싱크 서비스: Cloud Storage 버킷을 선택합니다.
    • Cloud Storage 버킷 선택: 드롭다운에서 gcp-swp-logs를 선택합니다.
  6. 다음을 클릭합니다.
  7. 싱크에 포함할 로그 선택 섹션에 다음 필터 쿼리를 입력합니다.

    logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"
    
    • <YOUR_PROJECT_ID>를 Google Cloud 프로젝트 ID로 바꿉니다.
  8. 다음을 클릭합니다.

  9. 구성을 검토하고 싱크 만들기를 클릭합니다.

싱크를 만들면 Cloud Logging에 싱크의 작성자 ID (서비스 계정 이메일)가 표시됩니다. 다음 단계를 위해 이 서비스 계정 이메일을 복사합니다.

gcloud 명령줄 도구 사용

  • 또는 gcloud 명령어를 사용하여 싱크를 만듭니다.

    gcloud logging sinks create swp-export-sink \
        storage.googleapis.com/gcp-swp-logs \
        --log-filter='logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"'
    
    • 다음과 같이 바꿉니다.
      • swp-export-sink: 원하는 싱크 이름입니다.
      • gcp-swp-logs: GCS 버킷 이름입니다.
      • <YOUR_PROJECT_ID>: Google Cloud 프로젝트 ID입니다.

Cloud Logging 서비스 계정에 권한 부여

Cloud Logging 싱크 작성자 ID 서비스 계정에는 GCS 버킷에 로그를 쓸 수 있는 권한이 필요합니다.

Google Cloud 콘솔 사용

  1. Cloud Storage> 버킷으로 이동합니다.
  2. 버킷 이름 (gcp-swp-logs)을 클릭합니다.
  3. 권한 탭으로 이동합니다.
  4. 액세스 권한 부여를 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.
    • 주 구성원 추가: Cloud Logging 싱크 작성자 ID 서비스 계정 이메일 (예: serviceAccount:service-123456789@gcp-sa-logging.iam.gserviceaccount.com)을 붙여넣습니다.
    • 역할 할당: 스토리지 객체 관리자를 선택합니다.
  6. 저장을 클릭합니다.

gcloud 명령줄 도구 사용

  • 또는 gcloud 명령어를 사용하여 권한을 부여합니다.

    gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \
        --member="serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>" \
        --role="roles/storage.objectAdmin"
    
    • 다음과 같이 바꿉니다.
      • gcp-swp-logs: 버킷 이름입니다.
      • <LOGGING_SERVICE_ACCOUNT_EMAIL>: Cloud Logging 싱크 작성자 ID 서비스 계정 이메일입니다.

gsutil 명령줄 도구 사용 (기존)

  • 로깅 서비스 계정에 객체 관리자 역할을 할당합니다.

    gsutil iam ch serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>:objectAdmin \
        gs://gcp-swp-logs
    

권한 확인

  • 권한이 올바르게 부여되었는지 확인하려면 다음 단계를 따르세요.

    gcloud storage buckets get-iam-policy gs://gcp-swp-logs \
        --flatten="bindings[].members" \
        --filter="bindings.role:roles/storage.objectAdmin"
    

출력에 Cloud Logging 서비스 계정 이메일이 표시됩니다.

Google SecOps 서비스 계정 가져오기

Google SecOps는 고유한 서비스 계정을 사용하여 GCS 버킷에서 데이터를 읽습니다. 이 서비스 계정에 버킷에 대한 액세스 권한을 부여해야 합니다.

GCP 보안 웹 프록시 로그를 수집하도록 Google SecOps에서 피드 구성

  1. SIEM 설정> 피드로 이동합니다.
  2. 새 피드 추가를 클릭합니다.
  3. 단일 피드 구성을 클릭합니다.
  4. 피드 이름 필드에 피드 이름을 입력합니다(예: GGoogle CloudCP Secure Web Proxy Logs).
  5. 소스 유형으로 Google Cloud Storage V2를 선택합니다.
  6. 로그 유형으로 GCP 보안 웹 프록시를 선택합니다.

  7. 서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다(예:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  8. 다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.

  9. 다음을 클릭합니다.

  10. 다음 입력 매개변수의 값을 지정합니다.

    • 스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.
    gs://gcp-swp-logs/
    
    • 다음과 같이 바꿉니다.
      • gcp-swp-logs: GCS 버킷 이름입니다.
    • 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.

      • 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
      • 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
      • 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.

    • 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.

    • 애셋 네임스페이스: 애셋 네임스페이스입니다.

    • 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.

  11. 다음을 클릭합니다.

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

Google SecOps 서비스 계정에 IAM 권한 부여

Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.

Google Cloud 콘솔 사용

  1. Cloud Storage> 버킷으로 이동합니다.
  2. 버킷 이름을 클릭합니다.
  3. 권한 탭으로 이동합니다.
  4. 액세스 권한 부여를 클릭합니다.
  5. 다음 구성 세부정보를 제공합니다.
    • 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
    • 역할 할당: 스토리지 객체 뷰어를 선택합니다.
  6. 저장을 클릭합니다.

gcloud 명령줄 도구 사용

  • 또는 gcloud 명령어를 사용하여 권한을 부여합니다.

    gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \
        --member="serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>" \
        --role="roles/storage.objectViewer"
    
    • 다음과 같이 바꿉니다.
      • gcp-swp-logs: 버킷 이름입니다.
      • <SECOPS_SERVICE_ACCOUNT_EMAIL>: Google SecOps 서비스 계정 이메일입니다.

gsutil 명령줄 도구 사용 (기존)

  • 다음 명령어를 실행하여 SecOps 서비스 계정에 객체 뷰어 권한을 부여합니다.

    gsutil iam ch serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>:objectViewer \
        gs://gcp-swp-logs
    

권한 확인

  • 권한이 올바르게 부여되었는지 확인하려면 다음 단계를 따르세요.

    gcloud storage buckets get-iam-policy gs://gcp-swp-logs \
        --flatten="bindings[].members" \
        --filter="bindings.role:roles/storage.objectViewer"
    

출력에 Google SecOps 서비스 계정 이메일이 표시됩니다.

UDM 매핑 테이블

로그 필드 UDM 매핑 논리
httpRequest.latency, jsonPayload.@type, logName additional.fields latency_label (키 'HTTPRequest Latency', 지연 시간의 값), type_label (키 'Log Type', @type의 값), logname (키 'Log Name', logName의 값)과 병합됨
receiveTimestamp metadata.collected_timestamp RFC3339 타임스탬프로 파싱됨
metadata.event_type has_principal이 true이고 has_target이 true이며 프로토콜이 (?i)http와 일치하는 경우 NETWORK_HTTP로 설정됩니다. has_principal이 true이고 has_target이 true이며 network가 ''이 아닌 경우 NETWORK_CONNECTION으로 설정됩니다. has_principal이 true이고 has_target이 true이며 has_principal_user가 true인 경우 USER_LOGIN으로 설정됩니다. has_principal이 true인 경우 STATUS_UPDATE로 설정됩니다. 그 밖의 경우에는 GENERIC_EVENT로 설정됩니다.
insertId metadata.product_log_id 값이 직접 복사됨
httpRequest.protocol network.application_protocol 그로크 패턴 %{DATA:protocol}/%{INT:http_version}을 사용하여 추출된 프로토콜입니다. ["HTTP","HTTPS"]에 있는 경우 설정됩니다.
httpRequest.protocol network.application_protocol_version grok 패턴 %{DATA:protocol}/%{INT:http_version}을 사용하여 http_version을 추출했습니다.
httpRequest.requestMethod network.http.method 값이 직접 복사됨
httpRequest.userAgent network.http.parsed_user_agent 값이 직접 복사되고 parseduseragent로 변환됨
httpRequest.status network.http.response_code 문자열로 변환한 후 정수로 변환
httpRequest.userAgent network.http.user_agent 값이 직접 복사됨
httpRequest.responseSize network.received_bytes 값이 직접 복사되고 uinteger로 변환됨
httpRequest.requestSize network.sent_bytes 값이 직접 복사되고 uinteger로 변환됨
httpRequest.serverIp principal.asset.ip grok 패턴 %{IP:server_ip}를 사용하여 추출된 IP입니다. 비어 있지 않은 경우 설정됩니다.
httpRequest.serverIp principal.ip grok 패턴 %{IP:server_ip}를 사용하여 추출된 IP입니다. 비어 있지 않은 경우 설정됩니다.
jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action security_result.action rule.action == ALLOW인 경우 ALLOW로 설정하고 rule.action == DENIED인 경우 BLOCK으로 설정합니다.
jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action security_result.action_details rule.action에서 직접 복사된 값
jsonPayload.enforcedGatewaySecurityPolicy.requestWasTlsIntercepted, resource.labels.gateway_name, resource.labels.resource_container, resource.labels.gateway_type security_result.detection_fields tls_intercepted_label('requestWasTlsIntercepted' 키, requestWasTlsIntercepted의 값), gateway_name_label('gateway-name' 키, gateway_name의 값), resource_container_label('resource_container' 키, resource_container의 값), gateway_type_label('gateway-type' 키, gateway_type의 값)과 병합됨
jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].name security_result.rule_name 값이 직접 복사됨
줄이는 것을 security_result.severity 심각도가 CRITICAL이면 CRITICAL로 설정, 심각도가 ERROR이면 ERROR로 설정, 심각도가 [ALERT, EMERGENCY]에 있으면 HIGH로 설정, 심각도가 [INFO, NOTICE]에 있으면 INFORMATIONAL로 설정, 심각도가 DEBUG이면 LOW로 설정, 심각도가 WARNING이면 MEDIUM으로 설정, 그 외의 경우 UNKNOWN_SEVERITY로 설정
jsonPayload.enforcedGatewaySecurityPolicy.hostname target.asset.hostname 값이 직접 복사됨
httpRequest.remoteIp target.asset.ip grok 패턴 %{IP:remote_ip}를 사용하여 추출된 IP입니다. 비어 있지 않은 경우 설정됩니다.
jsonPayload.enforcedGatewaySecurityPolicy.hostname target.hostname 값이 직접 복사됨
httpRequest.remoteIp target.ip grok 패턴 %{IP:remote_ip}를 사용하여 추출된 IP입니다. 비어 있지 않은 경우 설정됩니다.
resource.labels.location target.resource.attribute.cloud.availability_zone 값이 직접 복사됨
resource.labels.network_name, resource.type target.resource.attribute.labels rc_network_name_label (키 'rc_network_name', network_name의 값), resource_type (키 'Resource Type', resource.type의 값)과 병합됨
httpRequest.requestUrl target.url 값이 직접 복사됨

도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.