Cloud VPC 흐름 로그 수집
이 문서에서는 Google Cloud를 사용하여 Cloud VPC 흐름 로그를 Google Security Operations로 내보내는 방법을 설명합니다. 파서는 로그를 기본 제공 JSON 형식에서 Google Security Operations UDM으로 변환합니다. 소스 및 대상 IP, 포트, 프로토콜, 전송된 바이트와 같은 관련 필드를 추출한 다음 Google SecOps에서 정확하게 표현하기 위해 네트워크 방향과 특수 사례를 고려하여 해당 UDM 필드에 매핑합니다.
시작하기 전에
- Google SecOps 인스턴스가 있는지 확인합니다.
- VPC 흐름이 환경에 설정되어 있고 활성 상태인지 확인합니다. Google Cloud
- Google Cloud에 대한 권한이 있는지 확인합니다.
Google Cloud Storage 버킷 만들기
- Google Cloud 콘솔에 로그인합니다.
Cloud Storage 버킷 페이지로 이동합니다.
만들기를 클릭합니다.
버킷 만들기 페이지에서 버킷 정보를 입력합니다. 다음 단계를 완료할 때마다 계속을 클릭하여 다음 단계로 진행합니다.
시작하기 섹션에서 다음을 수행합니다.
- 버킷 이름 요구사항을 충족하는 고유한 이름을 입력합니다(예: vpcflow-logs).
계층적 네임스페이스를 사용 설정하려면 펼치기 화살표를 클릭하여 파일 지향 및 데이터 집약적인 워크로드에 최적화 섹션을 펼친 다음 이 버킷에서 계층적 네임스페이스 사용 설정을 선택합니다.
버킷 라벨을 추가하려면 펼치기 화살표를 클릭하여 라벨 섹션을 펼칩니다.
라벨 추가를 클릭하고 라벨의 키와 값을 지정합니다.
데이터 저장 위치 선택 섹션에서 다음을 수행합니다.
- 위치 유형을 선택합니다.
위치 유형 메뉴를 사용하여 버킷 내 객체 데이터가 영구적으로 저장될 위치를 선택합니다.
버킷 간 복제를 설정하려면 버킷 간 복제 설정 섹션을 펼칩니다.
데이터의 스토리지 클래스 선택 섹션에서 버킷의 기본 스토리지 클래스를 선택하거나, 버킷 데이터의 자동 스토리지 클래스 관리에 자동 클래스를 선택합니다.
객체 액세스를 제어하는 방식 선택 섹션에서 아니요를 선택하여 공개 액세스 방지를 적용하고 버킷의 객체에 대한 액세스 제어 모델을 선택합니다.
객체 데이터 보호 방법 선택 섹션에서 다음을 수행합니다.
- 데이터 보호에서 버킷에 설정할 옵션을 선택합니다.
- 객체 데이터를 암호화하는 방법을 선택하려면 데이터 암호화라는 펼치기 화살표를 클릭하고 데이터 암호화 방법을 선택합니다.
만들기를 클릭합니다.
Google Cloud VPC 흐름 로그 내보내기 구성
- 권한이 있는 계정을 사용하여 Google Cloud 계정에 로그인합니다.
- 시작 페이지에서 VPC 네트워크를 클릭합니다.
- 기본을 클릭하면 서브넷 페이지가 표시됩니다.
- 모든 로그를 선택합니다.
- 흐름 로그 > 구성을 클릭합니다.
- 집계 간격을 선택합니다(예: 30초).
- 샘플링 레이트를 입력합니다(예: 50%).
- 저장을 클릭합니다.
- 검색창에서 로깅을 검색하고 Enter 키를 클릭합니다.
- 로그 탐색기에서 로그 이름에서 VPC_flows를 선택하고 적용을 클릭하여 로그를 필터링합니다.
- 추가 작업을 클릭합니다.
- 싱크 만들기를 클릭합니다.
- 다음 구성을 제공합니다.
- 싱크 세부정보: 이름과 설명을 입력합니다.
- 다음을 클릭합니다.
- 싱크 대상 위치: Cloud Storage 버킷을 선택합니다.
- Cloud Storage 버킷: 이전에 만든 버킷을 선택하거나 새 버킷을 만듭니다.
- 다음을 클릭합니다.
- 싱크에 포함할 로그 선택: Cloud Storage 버킷에서 옵션을 선택하면 기본 로그가 채워집니다.
- 다음을 클릭합니다.
- 선택사항: 싱크에서 필터링할 로그 선택: 싱크하지 않을 로그를 선택합니다.
- 싱크 만들기를 클릭합니다.
Google SecOps에서 피드를 구성하여 Google Cloud VPC 흐름 로그를 수집합니다.
- SIEM 설정 > 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예: Google Cloud VPC 흐름 로그).
- 소스 유형으로 Google Cloud Storage를 선택합니다.
- 로그 유형으로 GCP VPC Flow를 선택합니다.
- Chronicle 서비스 계정으로 서비스 계정 가져오기를 클릭합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 스토리지 버킷 URI: Google Cloud
gs://my-bucket/<value>
형식의 스토리지 버킷 URL입니다. - URI Is A: 하위 디렉터리가 포함된 디렉터리를 선택합니다.
소스 삭제 옵션: 원하는 삭제 옵션을 선택합니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- 스토리지 버킷 URI: Google Cloud
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 표
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
connection.dest_ip | target.asset.ip target.ip |
network.direction이 OUTBOUND인 경우 직접 매핑 network.direction이 INBOUND인 경우 principal.ip에서 매핑됩니다. |
connection.dest_port | target.port | -1보다 크면 정수로 변환됩니다. |
connection.protocol | network.ip_protocol | 문자열로 변환된 후 정수로 매핑됩니다. 정수 값을 기반으로 IP 프로토콜 이름에 매핑됩니다 (예: TCP, UDP, ICMP) |
connection.src_ip | principal.ip | 직접 매핑 |
connection.src_port | principal.port | 정수로 변환됩니다. |
dest_instance.region | target.location.name | 직접 매핑 |
dest_instance.vm_name | target.asset.hostname | 직접 매핑 |
dest_location.city | target.location.city | 직접 매핑 |
dest_location.country | target.location.country_or_region | 직접 매핑 |
dest_location.region | target.location.state | 직접 매핑 |
dest_vpc.project_id | target.namespace | dest_vpc.vpc_name과 함께 사용하여 target.namespace를 형성합니다. |
dest_vpc.vpc_name | target.namespace | dest_vpc.project_id와 함께 사용하여 target.namespace를 만듭니다. |
insertId | metadata.product_log_id | 직접 매핑 |
jsonPayload.bytes_sent | network.sent_bytes | 이름을 network.sent_bytes로 바꾸고 uinteger로 변환했습니다. |
jsonPayload.packets_sent | network.sent_packets | 정수로 변환됩니다. |
labels.tunnel_id | additional.fields | Tunnel Id 키와 string_value 유형으로 additional.fields에 병합되었습니다. |
logName | security_result.category_details | 직접 매핑 |
resource.labels.project_id | target.resource.name | //cloudresourcemanager.googleapis.com/projects/{resource.labels.project_id} 형식으로 target.resource.name을 생성하는 데 사용됩니다. |
resource.labels.region | target.location.country_or_region | 직접 매핑 |
resource.labels.subnetwork_id | target.user.attribute.labels | subnetwork_id 키로 target.user.attribute.labels에 병합되었습니다. |
resource.type | metadata.product_event_type | 직접 매핑 |
줄이는 것을 | security_result.severity | 값이 DEBUG 이면 LOW 에 매핑됩니다. |
src_gke_details.cluster.cluster_location | principal.resource.attribute.labels | cluster_location 키를 사용하여 principal.resource.attribute.labels에 병합되었습니다. |
src_gke_details.cluster.cluster_name | principal.resource.attribute.labels | cluster_name 키를 사용하여 principal.resource.attribute.labels에 병합되었습니다. |
src_gke_details.pod.pod_name | principal.resource.attribute.labels | pod_name 키로 principal.resource.attribute.labels에 병합되었습니다. |
src_gke_details.pod.pod_namespace | principal.resource.attribute.labels | pod_namespace 키로 principal.resource.attribute.labels에 병합되었습니다. |
src_instance.region | principal.location.name | 직접 매핑 |
src_instance.vm_name | principal.asset.hostname | 직접 매핑 |
src_location.city | principal.location.city | 직접 매핑 |
src_location.country | principal.location.country_or_region | 직접 매핑 |
src_location.region | principal.location.state | 직접 매핑 |
src_vpc.project_id | principal.namespace | src_vpc.vpc_name과 함께 사용하여 principal.namespace를 만듭니다. |
src_vpc.vpc_name | principal.namespace | src_vpc.project_id와 함께 사용하여 principal.namespace를 만듭니다. |
textPayload | additional.fields | Textpayload 키와 string_value 유형으로 additional.fields에 병합되었습니다. |
타임스탬프 | metadata.event_timestamp | jsonPayload.end_time이 비어 있는 경우 event_timestamp를 채우는 데 사용됩니다. |
metadata.description | 신고자 (SRC 또는 DEST) 및 방향 (INBOUND 또는 OUTBOUND)을 비롯한 네트워크 흐름에 관한 설명은 'reporter' 필드를 기반으로 생성됩니다. | |
metadata.event_type | VPC 흐름 로그의 경우 NETWORK_CONNECTION 로, 다른 로그 유형의 경우 USER_RESOURCE_ACCESS 로 설정합니다. |
|
metadata.log_type | GCP_VPC_FLOW 로 설정합니다. |
|
metadata.product_name | GCP VPC Flow Logs 로 설정합니다. |
|
metadata.product_version | 1.0 로 설정합니다. |
|
metadata.vendor_name | Google Cloud 로 설정합니다. |
|
network.direction | target.port를 기준으로 결정됩니다. 포트가 잘 알려진 포트 또는 예약된 포트인 경우 INBOUND로 간주되고, 그렇지 않으면 OUTBOUND로 간주됩니다. | |
security_result.severity | 기본적으로 LOW 로 설정됩니다. |
|
target.resource.attribute.cloud.environment | GOOGLE_CLOUD_PLATFORM 로 설정합니다. |
|
target.resource.resource_type | CLOUD_PROJECT 로 설정합니다. |
변경사항
2024-10-24
개선사항:
principal.ip
,principal.port
의 매핑을 각각target.ip
,target.port
로 바꿨습니다.
2024-03-15
개선사항:
jsonPayload.src_gke_details.pod.pod_namespace
,jsonPayload.src_gke_details.pod.pod_name
,jsonPayload.src_gke_details.cluster.cluster_name
,jsonPayload.src_gke_details.cluster.cluster_location
를principal.resource.attribute.labels
에 매핑했습니다.jsonPayload.dest_gke_details.pod.pod_namespace
,jsonPayload.dest_gke_details.pod.pod_name
,jsonPayload.dest_gke_details.cluster.cluster_name
,jsonPayload.dest_gke_details.cluster.cluster_location
를target.resource.attribute.labels
에 매핑했습니다.
2023-05-23
개선사항:
- 'logName' 필드에 'vpc_flows'가 포함되지 않은 경우 'metadata.event_type'을 'USER_RESOURCE_ACCESS'에 매핑했습니다.
- 'timestamp'를 'events.timestamp'에 매핑했습니다.
- 'textPayload', 'labels.tunnel_id'가 'additional.fields'에 매핑되었습니다.
- 'resource.labels.region'이 'target.location.country_or_region'에 매핑되었습니다.
- 필요한 경우 다양한 필드에 null 검사를 추가했습니다.
2023-04-10
개선사항:
target.resource.attribute.cloud.environment
을GOOGLE_CLOUD_PLATFORM
로 설정합니다.target.resource.name
를 전체 리소스 이름 값으로 설정합니다.
2022-07-22
개선사항:
resource.labels.location
를principal.location.name
에 매핑했습니다.resource.labels.subnetwork_id
를target.user.attribute.labels
에 매핑했습니다.logName
를security_result.category_details
에 매핑했습니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가의 답변을 받으세요.