F5 Distributed Cloud Services 로그 수집
이 문서에서는 Google Cloud Storage V2를 사용하여 F5 Distributed Cloud Services 로그를 Google Security Operations에 수집하는 방법을 설명합니다.
F5 Distributed Cloud Services는 멀티 클라우드 및 에지 위치 전반에서 분산 클라우드 인프라, 애플리케이션 제공, API 보안, 웹 애플리케이션 방화벽 기능을 제공하는 SaaS 기반 보안, 네트워킹, 애플리케이션 관리 플랫폼입니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Cloud Storage API가 사용 설정된 Google Cloud 프로젝트
- GCS 버킷을 만들고 관리할 수 있는 권한
- GCS 버킷의 IAM 정책을 관리할 수 있는 권한
- F5 Distributed Cloud 콘솔에 대한 액세스 권한
- F5 Distributed Cloud에서 전역 로그 수신기 객체를 만들 권한
Google Cloud Storage 버킷 만들기
- Google Cloud 콘솔로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: f5-dcs-logs)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
GCS로 내보내도록 F5 Distributed Cloud 구성
방화벽 허용 목록에 GCS 버킷 추가
F5 Distributed Cloud Global Log Receiver를 사용하려면 다음 IP 주소 범위를 방화벽 허용 목록에 추가해야 합니다.
193.16.236.64/29185.160.8.152/29
GCS 버킷에서 VPC 서비스 제어 또는 방화벽 규칙을 사용하는 경우 이러한 IP 범위를 허용 목록에 추가합니다.
F5 Distributed Cloud용 Google Cloud 서비스 계정 만들기
- Google Cloud 콘솔에서 IAM 및 관리자 > 서비스 계정으로 이동합니다.
- 서비스 계정 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
- 서비스 계정 이름:
f5-dcs-log-writer(또는 설명이 포함된 이름)을 입력합니다. - 서비스 계정 설명:
Service account for F5 Distributed Cloud to write logs to GCS를 입력합니다.
- 서비스 계정 이름:
만들고 계속하기를 클릭합니다.
이 서비스 계정에 프로젝트에 대한 액세스 권한 부여 섹션에서 다음 단계를 따르세요.
- 역할 선택을 클릭합니다.
- 스토리지 객체 관리자를 검색하여 선택합니다.
계속을 클릭합니다.
완료를 클릭합니다.
서비스 계정 키 만들기
- 서비스 계정 목록에서 만든 서비스 계정 (예:
f5-dcs-log-writer)을 클릭합니다. - 키 탭으로 이동합니다.
- 키 추가 > 새 키 만들기를 클릭합니다.
- 키 유형으로 JSON을 선택합니다.
- 만들기를 클릭합니다.
- JSON 키 파일이 컴퓨터에 다운로드됩니다.
- 이 파일을 안전하게 저장하세요. 다음 단계에서 필요합니다.
GCS 버킷에 IAM 권한 부여
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (예:
f5-dcs-logs)을 클릭합니다. - 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: 서비스 계정 이메일 (예:
f5-dcs-log-writer@PROJECT_ID.iam.gserviceaccount.com)을 입력합니다. - 역할 할당: 스토리지 객체 관리자를 선택합니다.
- 주 구성원 추가: 서비스 계정 이메일 (예:
- 저장을 클릭합니다.
F5 Distributed Cloud 콘솔에서 Google Cloud 사용자 인증 정보 만들기
https://<tenant>.console.ves.volterra.io에서 F5 Distributed Cloud 콘솔에 로그인합니다.- 홈페이지에서 Multi-Cloud Network Connect 서비스를 선택합니다.
- 관리 > 사이트 관리 > 클라우드 사용자 인증 정보로 이동합니다.
- Add Cloud Credentials(클라우드 사용자 인증 정보 추가)를 클릭합니다.
- 메타데이터 섹션에서 다음을 수행합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
gcp-chronicle-logs). - 설명 (선택사항):
Cloud Storage credentials for Google SecOps log export를 입력합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
- 클라우드 사용자 인증 정보 유형 섹션에서 GCP 사용자 인증 정보를 선택합니다.
- GCP 사용자 인증 정보 필드에서 구성을 클릭합니다.
- 사용자 인증 정보 유형 드롭다운에서 서비스 계정 사용자 인증 정보 파일을 선택합니다.
- 파일 업로드를 클릭하고 이전 단계에서 다운로드한 JSON 키 파일을 선택합니다.
- 적용을 클릭합니다.
- 저장 후 종료를 클릭합니다.
전역 로그 수신기 만들기
- F5 Distributed Cloud Console에서 Multi-Cloud Network Connect 서비스에 있는지 확인합니다.
- 관리 > 로그 관리 > 전역 로그 수신기로 이동합니다.
- Add Global Log Receiver(전역 로그 수신기 추가)를 클릭합니다.
메타데이터 섹션에서 다음을 수행합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
chronicle-gcs-receiver). - 설명 (선택사항):
Global log receiver for Google SecOps SIEM를 입력합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
로그 유형 드롭다운에서 내보낼 로그 유형을 선택합니다.
- 요청 로그: 사용자, 경로, 메서드, 응답 코드가 포함된 HTTP 요청/응답 로그
- 보안 이벤트: WAF 이벤트, DDoS, API 보호, 봇 방어 이벤트
- 감사 로그: 공개 API를 통한 구성 변경사항
- DNS 요청 로그: DNS 쿼리 로그
로그 메시지 선택 드롭다운에서 다음 중 하나를 선택합니다.
- 현재 네임스페이스의 로그 선택: 현재 네임스페이스의 로그만 전송합니다.
- 모든 네임스페이스의 로그 선택: 모든 네임스페이스의 로그를 전송합니다 (전체적인 가시성을 위해 권장됨).
- 특정 네임스페이스의 로그 선택: 지정된 네임스페이스의 로그를 전송합니다 (항목 추가를 클릭하여 네임스페이스 이름을 추가).
수신기 구성 드롭다운에서 GCP 버킷 수신기를 선택합니다.
GCP 버킷 이름 필드에 GCS 버킷의 이름을 입력합니다 (예:
f5-dcs-logs).GCP Cloud Credentials 드롭다운에서 이전에 만든 클라우드 사용자 인증 정보 (예:
gcp-chronicle-logs)를 선택합니다.선택사항: 고급 필드 표시를 펼쳐 일괄 옵션을 구성합니다.
- 일괄 제한 시간 옵션: 제한 시간(초)을 선택하고 값을 입력합니다(기본값:
300초). - 일괄 최대 이벤트: 최대 이벤트를 선택하고 32~2000 사이의 값을 입력합니다 (제한이 없으면 설정하지 않음).
- 일괄 처리 바이트: 최대 바이트를 선택하고 4096~1048576 사이의 값을 입력합니다 (기본값:
10485760바이트 / 10MB).
- 일괄 제한 시간 옵션: 제한 시간(초)을 선택하고 값을 입력합니다(기본값:
저장 후 종료를 클릭합니다.
연결 테스트
- 전역 로그 수신기 목록에서 만든 수신기를 찾습니다 (예:
chronicle-gcs-receiver). - 작업 열에서 점 3개 (...)를 클릭합니다.
- 연결 테스트를 선택합니다.
- 테스트가 완료될 때까지 기다립니다.
연결이 성공했음을 나타내는 메시지가 표시됩니다.
GCS 버킷에서 로그 확인
- GCP 콘솔에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (예:
f5-dcs-logs)을 클릭합니다. - 로그 파일이 버킷에 생성되고 있는지 확인합니다.
F5 Distributed Cloud는 다음 폴더 구조로 로그를 구성합니다.
YYYY/MM/DD/HH/- 날짜별로 폴더가 생성됩니다 (YYYY/MM/DD).
- 각 날짜 폴더 내에 시간 (HH)별로 하위 폴더가 생성됩니다.
- 5분마다 새로운 압축 gzip 파일이 시간별 하위 폴더에 작성됩니다.
- 파일은 NDJSON 형식 (줄바꿈으로 구분된 JSON)입니다.
gzip 파일을 클릭하여 다운로드하고 로그 형식을 검사합니다.
Google SecOps 서비스 계정 가져오기
Google SecOps는 고유한 서비스 계정을 사용하여 GCS 버킷에서 데이터를 읽습니다. 이 서비스 계정에 버킷에 대한 액세스 권한을 부여해야 합니다.
서비스 계정 이메일 가져오기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
F5 DCS Logs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 F5 Distributed Cloud Services를 선택합니다.
서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.
다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
스토리지 버킷 URL: GCS 버킷 URI를 입력합니다.
gs://f5-dcs-logs/f5-dcs-logs을 GCS 버킷 이름으로 바꿉니다.소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다 (기본값은 180일).
애셋 네임스페이스: 애셋 네임스페이스
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
Google SecOps 서비스 계정에 IAM 권한 부여
Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (예:
f5-dcs-logs)을 클릭합니다. - 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어 선택
저장을 클릭합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| _id | metadata.product_log_id | 값이 직접 복사됨 |
| src | principal.namespace | 값이 직접 복사됨 |
| kubernetes_labels_app | target.resource.attribute.labels | app_label에서 병합됨 (kubernetes_labels_app에서 파생됨) |
| kubernetes_host | target.hostname | 값이 직접 복사됨 |
| kubernetes_container_name | target.resource.product_object_id | 값이 직접 복사됨 |
| bot_info.classification | security_result.detection_fields | bot_info_classification_label (bot_info.classification에서 파생됨)에서 병합됨 |
| bot_info.name | security_result.detection_fields | bot_info_name_label (bot_info.name에서 파생됨)에서 병합됨 |
| bot_info.type | security_result.detection_fields | bot_info_type_label (bot_info.type에서 파생됨)에서 병합됨 |
| 타임스탬프 | @timestamp | RFC3339, UNIX, ISO8601을 사용하여 날짜 필터로 파싱됨 |
| visitor_id | security_result.detection_fields | visitor_id_label (visitor_id에서 파생됨)에서 병합됨 |
| 태그 | security_result.detection_fields | tag_label에서 병합됨 (태그에서 파생됨) |
| action | security_result.action | 일치 항목이 허용되면 ALLOW로 설정하고, 일치 항목이 거부되면 BLOCK으로 설정합니다. |
| 줄이는 것을 | security_result.severity | 오류/경고인 경우 HIGH, 심각한 경우 CRITICAL, 알림인 경우 MEDIUM, 정보/정보인 경우 LOW로 설정합니다. |
| 줄이는 것을 | security_result.severity_details | 값이 직접 복사됨 |
| api_endpoint | target.labels | api_endpoint_label에서 병합됨 (api_endpoint에서 파생됨) |
| app_firewall_name | principal.process.command_line | 값이 직접 복사됨 |
| app_type | security_result.detection_fields | about_app_type (app_type에서 파생됨)에서 병합됨 |
| as_org | security_result.detection_fields | about_as_org (as_org에서 파생됨)에서 병합됨 |
| asn | security_result.detection_fields | about_asn에서 병합됨 (asn에서 파생됨) |
| kubernetes.pod_id | security_result.detection_fields | about_pod_id에서 병합됨 (kubernetes.pod_id에서 파생됨) |
| kubernetes.pod_name | security_result.detection_fields | about_pod_name (kubernetes.pod_name에서 파생됨)에서 병합됨 |
| 위도 | principal.location.region_latitude | 부동 소수점으로 변환됨 |
| longitude | principal.location.region_longitude | 부동 소수점으로 변환됨 |
| req_params | additional.fields | about_req_params (req_params에서 파생됨)에서 병합됨 |
| as_number | additional.fields | about_as_number에서 병합됨 (as_number에서 문자열로 변환됨) |
| x_forwarded_for | intermediary.ip | 유효한 IP인 경우 병합됨 |
| x_forwarded_for | security_result.about.resource.attribute.labels | IP가 아닌 경우 x_forwarded_for_label에서 병합됨 |
| policy_hit.malicious_user_mitigate_action | security_result.detection_fields | malicious_user_label에서 병합됨 (policy_hit.malicious_user_mitigate_action에서 파생됨) |
| policy_hit.policy | security_result.about.resource.attribute.labels | policy_label에서 병합됨 (policy_hit.policy에서 파생됨) |
| policy_hit.policy_namespace | additional.fields | policy_namespace_label에서 병합됨 (policy_hit.policy_namespace에서 파생됨) |
| policy_hit.policy_rule | security_result.rule_name | 값이 직접 복사됨 |
| policy_hit.policy_rule_description | security_result.description | 값이 직접 복사됨 |
| policy_hit.policy_set | target.resource.name | 값이 직접 복사됨 |
| policy_hit.result | additional.fields | result_label에서 병합됨 (policy_hit.result에서 파생됨) |
| vhost_id | security_result.detection_fields | vhostlabel에서 병합됨 (vhost_id에서 파생됨) |
| messageid | security_result.detection_fields | messageid_label (messageid에서 파생됨)에서 병합됨 |
| sec_event_name | security_result.detection_fields | sec_event_name_label (sec_event_name에서 파생됨)에서 병합됨 |
| sec_event_type | security_result.detection_fields | sec_event_type_label (sec_event_type에서 파생됨)에서 병합됨 |
| vh_name | security_result.detection_fields | vhost_name_label (vh_name에서 파생됨)에서 병합됨 |
| tls_fingerprint | security_result.detection_fields | tls_fingerprint_label (tls_fingerprint에서 파생됨)에서 병합됨 |
| 시간 | additional.fields | time_label (시간에서 파생됨)에서 병합됨 |
| kubernetes.namespace_name | additional.fields | namespace_name_label (kubernetes.namespace_name에서 파생됨)에서 병합됨 |
| src_instance | additional.fields | src_instance_label (src_instance에서 파생됨)에서 병합됨 |
| violation_rating | additional.fields | violation_rating_label (violation_rating에서 파생됨)에서 병합됨 |
| req_size | additional.fields | req_size_label에서 병합됨 (req_size에서 문자열로 변환됨) |
| rsp_code | additional.fields | rsp_code_label에서 병합됨 (rsp_code에서 문자열로 변환됨) |
| rsp_code_class | additional.fields | rsp_code_class_label에서 병합됨 (rsp_code_class에서 문자열로 변환됨) |
| rsp_size | additional.fields | rsp_size_label에서 병합됨 (rsp_size에서 문자열로 변환됨) |
| original_path | additional.fields | original_path_label (original_path에서 파생됨)에서 병합됨 |
| req_path | target.url | 값이 직접 복사됨 |
| req_headers_size | additional.fields | req_headers_size_label (req_headers_size에서 파생됨)에서 병합됨 |
| recommended_action | additional.fields | recommended_action_label (recommended_action에서 파생됨)에서 병합됨 |
| enforcement_mode | additional.fields | enforcement_mode_label (enforcement_mode에서 파생됨)에서 병합됨 |
| src_ip | principal.ip, principal.asset.ip | IPv4 정규식과 일치하는 경우 병합됨 |
| 호스트 | principal.ip, principal.asset.ip | IPv4 정규식과 일치하는 경우 병합됨 |
| 호스트 이름 | principal.hostname, principal.asset.hostname | 비어 있지 않거나 다음인 경우 값이 직접 복사됩니다. |
| http_version | network.application_protocol_version | 값이 직접 복사됨 |
| http_version | network.application_protocol | HTTP를 포함하는 경우 HTTP로, HTTPS를 포함하는 경우 HTTPS로 설정됩니다. |
| 네트워크 | principal.nat_ip | IPv4 정규식과 일치하는 경우 병합됨 |
| dst_ip | target.ip, target.asset.ip | IPv4 정규식과 일치하는 경우 병합됨 |
| dst_port | target.port | 정수로 변환됨 |
| src_port | principal.port | 정수로 변환됨 |
| src_site | additional.fields | src_site_field (src_site에서 파생됨)에서 병합됨 |
| 사이트 | additional.fields | site_field에서 병합됨 (사이트에서 파생됨) |
| cluster_name | additional.fields | cluster_name_field (cluster_name에서 파생됨)에서 병합됨 |
| 도메인 | principal.administrative_domain | 값이 직접 복사됨 |
| 메서드 | network.http.method | 비어 있지 않거나 N/A인 경우 값이 직접 복사됨 |
| 네임스페이스 | target.namespace | 값이 직접 복사됨 |
| city | principal.location.city | 값이 직접 복사됨 |
| 스트림 | security_result.detection_fields | stream_label (스트림에서 파생됨)에서 병합됨 |
| 리전 | principal.location.country_or_region | 값이 직접 복사됨 |
| 사용자 | principal.user.userid | user_id의 grok 패턴을 사용하여 사용자로부터 추출됨 |
| user_ip | target.ip, target.asset.ip | 추출된 user_ip에서 병합됨 |
| 쿠키 | additional.fields | 쿠키에서 병합됨 (req_headers의 쿠키에서 파생됨) |
| X-F5-Request-Id | security_result.detection_fields | x_f5_request_id에서 병합됨 (req_headers의 X-F5-Request-Id에서 파생됨) |
| X-Request-Id | security_result.detection_fields | request_id에서 병합됨 (req_headers의 X-Request-Id에서 파생됨) |
| security_result | security_result | 직접 병합됨 |
| has_network, has_principal, has_target | metadata.event_type | 모두 true인 경우 NETWORK_CONNECTION으로 설정, has_principal이 true인 경우 STATUS_UPDATE로 설정, 그 외의 경우 GENERIC_EVENT로 설정 |
| metadata.vendor_name | 'F5_DCS'로 설정 | |
| metadata.product_name | 'F5 DCS'로 설정 | |
| intermediary | intermediary | 직접 병합됨 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.