보안 웹 프록시 로그 수집 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 콘솔 사용
- Google Cloud Console로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: Google Cloud-swp-logs)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
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 콘솔 사용
- Google Cloud 콘솔에서 로깅 > 로그 라우터로 이동합니다.
- 싱크 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 싱크 이름: 설명이 포함된 이름 (예:
swp-export-sink)을 입력합니다. - 싱크 설명: 선택사항인 설명입니다.
- 싱크 이름: 설명이 포함된 이름 (예:
- 다음을 클릭합니다.
- 싱크 서비스 선택 섹션에서 다음 단계를 따릅니다.
- 싱크 서비스: Cloud Storage 버킷을 선택합니다.
- Cloud Storage 버킷 선택: 드롭다운에서
gcp-swp-logs를 선택합니다.
- 다음을 클릭합니다.
싱크에 포함할 로그 선택 섹션에 다음 필터 쿼리를 입력합니다.
logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"<YOUR_PROJECT_ID>를 Google Cloud 프로젝트 ID로 바꿉니다.
다음을 클릭합니다.
구성을 검토하고 싱크 만들기를 클릭합니다.
싱크를 만들면 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 콘솔 사용
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (
gcp-swp-logs)을 클릭합니다. - 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Cloud Logging 싱크 작성자 ID 서비스 계정 이메일 (예:
serviceAccount:service-123456789@gcp-sa-logging.iam.gserviceaccount.com)을 붙여넣습니다. - 역할 할당: 스토리지 객체 관리자를 선택합니다.
- 주 구성원 추가: Cloud Logging 싱크 작성자 ID 서비스 계정 이메일 (예:
저장을 클릭합니다.
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에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
GGoogle CloudCP Secure Web Proxy Logs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
로그 유형으로 GCP 보안 웹 프록시를 선택합니다.
서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다(예:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.
다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.
gs://gcp-swp-logs/- 다음과 같이 바꿉니다.
gcp-swp-logs: GCS 버킷 이름입니다.
소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
Google SecOps 서비스 계정에 IAM 권한 부여
Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.
Google Cloud 콘솔 사용
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름을 클릭합니다.
- 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어를 선택합니다.
- 저장을 클릭합니다.
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 전문가에게 문의하여 답변을 받으세요.