Zoom 작업 로그 수집
이 문서에서는 Google Cloud Storage를 사용하여 Zoom 작업 로그를 Google Security Operations에 수집하는 방법을 설명합니다. 파서는 원시 로그를 통합 데이터 모델 (UDM)로 변환합니다. 원시 로그 메시지에서 필드를 추출하고, 데이터 정리 및 정규화를 실행하고, 추출된 정보를 해당 UDM 필드에 매핑하여 궁극적으로 SIEM 시스템 내에서 분석 및 상관관계를 위한 데이터를 보강합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Cloud Storage API가 사용 설정된 GCP 프로젝트
- GCS 버킷을 만들고 관리할 수 있는 권한
- GCS 버킷의 IAM 정책을 관리할 수 있는 권한
- Cloud Run 함수, Pub/Sub 주제, Cloud Scheduler 작업을 만들 수 있는 권한
- Zoom에 대한 액세스 권한 관리
Zoom 작업 로그 수집 필수 요건
- Zoom 앱 Marketplace에 로그인합니다.
- 개발 > 앱 빌드 > 서버 간 OAuth로 이동합니다.
- 앱을 만들고
report:read:operation_logs:admin(또는report:read:admin) 범위를 추가합니다. 앱 사용자 인증 정보에서 다음 세부정보를 복사하여 안전한 위치에 저장합니다.
- 계정 ID
- Client ID
- 클라이언트 보안 비밀번호
권한 확인
계정에 필요한 권한이 있는지 확인하려면 다음 단계를 따르세요.
- Zoom 계정에 로그인합니다.
- 관리 > 계정 관리 > 계정 프로필로 이동합니다.
- 계정 설정에 액세스하고 작업 로그를 볼 수 있다면 필요한 권한이 있는 것입니다.
- 이러한 옵션에 액세스할 수 없는 경우 Zoom 관리자에게 문의하여 필요한 권한을 부여받으세요.
API 액세스 테스트
통합을 진행하기 전에 사용자 인증 정보를 테스트하세요.
# Replace with your actual credentials ZOOM_ACCOUNT_ID="<your-account-id>" ZOOM_CLIENT_ID="<your-client-id>" ZOOM_CLIENT_SECRET="<your-client-secret>" # Get OAuth token TOKEN=$(curl -s -X POST "https://zoom.us/oauth/token?grant_type=account_credentials&account_id=${ZOOM_ACCOUNT_ID}" \ -u "${ZOOM_CLIENT_ID}:${ZOOM_CLIENT_SECRET}" \ | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4) # Test API access curl -v -H "Authorization: Bearer ${TOKEN}" \ "https://api.zoom.us/v2/report/operationlogs?from=$(date -u -d '1 day ago' +%Y-%m-%d)&to=$(date -u +%Y-%m-%d)&page_size=10"
Google Cloud Storage 버킷 만들기
- Google Cloud Console로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: zoom-operation-logs)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
Cloud Run 함수의 서비스 계정 만들기
Cloud Run 함수에는 GCS 버킷에 쓸 수 있고 Pub/Sub에서 호출할 수 있는 권한이 있는 서비스 계정이 필요합니다.
서비스 계정 만들기
- GCP 콘솔에서 IAM 및 관리자 > 서비스 계정으로 이동합니다.
- 서비스 계정 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 서비스 계정 이름:
zoom-operationlogs-sa을 입력합니다. - 서비스 계정 설명:
Service account for Cloud Run function to collect Zoom operation logs을 입력합니다.
- 서비스 계정 이름:
- 만들고 계속하기를 클릭합니다.
- 이 서비스 계정에 프로젝트에 대한 액세스 권한 부여 섹션에서 다음 역할을 추가합니다.
- 역할 선택을 클릭합니다.
- 스토리지 객체 관리자를 검색하여 선택합니다.
- + 다른 역할 추가를 클릭합니다.
- Cloud Run 호출자를 검색하여 선택합니다.
- + 다른 역할 추가를 클릭합니다.
- Cloud Functions 호출자를 검색하여 선택합니다.
- 계속을 클릭합니다.
- 완료를 클릭합니다.
이러한 역할은 다음 작업에 필요합니다.
- 스토리지 객체 관리자: GCS 버킷에 로그를 쓰고 상태 파일을 관리합니다.
- 스토리지 객체 관리자: GCS 버킷에 로그를 쓰고 상태 파일을 관리합니다.
- Cloud Run 호출자: Pub/Sub가 함수를 호출하도록 허용
- Cloud Functions 호출자: 함수 호출 허용
GCS 버킷에 대한 IAM 권한 부여
GCS 버킷에 대한 쓰기 권한을 서비스 계정에 부여합니다.
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (예:
zoom-operation-logs)을 클릭합니다. - 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: 서비스 계정 이메일 (예:
zoom-operationlogs-sa@PROJECT_ID.iam.gserviceaccount.com)을 입력합니다. - 역할 할당: 스토리지 객체 관리자를 선택합니다.
- 주 구성원 추가: 서비스 계정 이메일 (예:
- 저장을 클릭합니다.
게시/구독 주제 만들기
Cloud Scheduler가 게시하고 Cloud Run 함수가 구독할 Pub/Sub 주제를 만듭니다.
- GCP Console에서 Pub/Sub > 주제로 이동합니다.
- 주제 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주제 ID:
zoom-operationlogs-trigger를 입력합니다. - 다른 설정은 기본값으로 둡니다.
- 주제 ID:
- 만들기를 클릭합니다.
로그를 수집하는 Cloud Run 함수 만들기
Cloud Run 함수는 Cloud Scheduler의 Pub/Sub 메시지에 의해 트리거되어 Zoom API에서 로그를 가져오고 GCS에 씁니다.
- GCP 콘솔에서 Cloud Run으로 이동합니다.
- 서비스 만들기를 클릭합니다.
- 함수를 선택합니다 (인라인 편집기를 사용하여 함수 만들기).
구성 섹션에서 다음 구성 세부정보를 제공합니다.
설정 값 서비스 이름 zoom-operationlogs-to-gcs리전 GCS 버킷과 일치하는 리전을 선택합니다 (예: us-central1).런타임 Python 3.12 이상 선택 트리거 (선택사항) 섹션에서 다음을 수행합니다.
- + 트리거 추가를 클릭합니다.
- Cloud Pub/Sub를 선택합니다.
- Cloud Pub/Sub 주제 선택에서
zoom-operationlogs-trigger을 선택합니다. - 저장을 클릭합니다.
인증 섹션에서 다음을 구성합니다.
- 인증 필요를 선택합니다.
- ID 및 액세스 관리 (IAM)를 확인합니다.
아래로 스크롤하고 컨테이너, 네트워킹, 보안을 펼칩니다.
보안 탭으로 이동합니다.
- 서비스 계정:
zoom-operationlogs-sa를 선택합니다.
- 서비스 계정:
컨테이너 탭으로 이동합니다.
- 변수 및 보안 비밀을 클릭합니다.
- 각 환경 변수에 대해 + 변수 추가를 클릭합니다.
변수 이름 예시 값 GCS_BUCKETzoom-operation-logsGCS_PREFIXzoom/operationlogs/STATE_KEYzoom/operationlogs/state.jsonZOOM_ACCOUNT_ID<your-zoom-account-id>ZOOM_CLIENT_ID<your-zoom-client-id>ZOOM_CLIENT_SECRET<your-zoom-client-secret>PAGE_SIZE300TIMEOUT30변수 및 보안 비밀 섹션에서 요청으로 스크롤합니다.
- 요청 제한 시간:
600초 (10분)를 입력합니다.
- 요청 제한 시간:
설정 탭으로 이동합니다.
- 리소스 섹션에서 다음을 수행합니다.
- 메모리: 512MiB 이상을 선택합니다.
- CPU: 1을 선택합니다.
- 리소스 섹션에서 다음을 수행합니다.
버전 확장 섹션에서 다음을 수행합니다.
- 최소 인스턴스 수:
0를 입력합니다. - 최대 인스턴스 수:
100을 입력합니다 (또는 예상 부하에 따라 조정).
- 최소 인스턴스 수:
만들기를 클릭합니다.
서비스가 생성될 때까지 기다립니다 (1~2분).
서비스가 생성되면 인라인 코드 편집기가 자동으로 열립니다.
함수 코드 추가
- 함수 진입점에 main을 입력합니다.
인라인 코드 편집기에서 다음 두 파일을 만듭니다.
- 첫 번째 파일: main.py:
import functions_framework from google.cloud import storage import json import os import urllib3 from datetime import datetime, date, timedelta, timezone import base64 import uuid import gzip import io # Initialize HTTP client with timeouts http = urllib3.PoolManager( timeout=urllib3.Timeout(connect=5.0, read=30.0), retries=False, ) # Initialize Storage client storage_client = storage.Client() # Environment variables GCS_BUCKET = os.environ.get('GCS_BUCKET') GCS_PREFIX = os.environ.get('GCS_PREFIX', 'zoom/operationlogs/') STATE_KEY = os.environ.get('STATE_KEY', 'zoom/operationlogs/state.json') ZOOM_ACCOUNT_ID = os.environ.get('ZOOM_ACCOUNT_ID') ZOOM_CLIENT_ID = os.environ.get('ZOOM_CLIENT_ID') ZOOM_CLIENT_SECRET = os.environ.get('ZOOM_CLIENT_SECRET') PAGE_SIZE = int(os.environ.get('PAGE_SIZE', '300')) TIMEOUT = int(os.environ.get('TIMEOUT', '30')) TOKEN_URL = "https://zoom.us/oauth/token" REPORT_URL = "https://api.zoom.us/v2/report/operationlogs" @functions_framework.cloud_event def main(cloud_event): """ Cloud Run function triggered by Pub/Sub to fetch Zoom operation logs and write to GCS. Args: cloud_event: CloudEvent object containing Pub/Sub message """ if not all([GCS_BUCKET, ZOOM_ACCOUNT_ID, ZOOM_CLIENT_ID, ZOOM_CLIENT_SECRET]): print('Error: Missing required environment variables') return try: bucket = storage_client.bucket(GCS_BUCKET) # Get OAuth token token = get_token() # Load state state = load_state(bucket, STATE_KEY) cursor_date = state.get('cursor_date', date.today().isoformat()) print(f'Processing logs for date: {cursor_date}') # Fetch logs from_date = cursor_date to_date = cursor_date total_written = 0 next_token = state.get('next_page_token') while True: page = fetch_page(token, from_date, to_date, next_token) items = page.get('operation_logs', []) or [] if items: write_chunk(bucket, items, datetime.now(timezone.utc)) total_written += len(items) next_token = page.get('next_page_token') if not next_token: break # Advance to next day if we've finished this date today = date.today().isoformat() if cursor_date < today: nxt = (datetime.fromisoformat(cursor_date) + timedelta(days=1)).date().isoformat() state['cursor_date'] = nxt state['next_page_token'] = None else: # stay on today; continue later with next_page_token=None state['next_page_token'] = None save_state(bucket, STATE_KEY, state) print(f'Successfully processed {total_written} logs for {from_date}') except Exception as e: print(f'Error processing logs: {str(e)}') raise def get_token(): """Get OAuth 2.0 access token from Zoom.""" params = f"grant_type=account_credentials&account_id={ZOOM_ACCOUNT_ID}" basic = base64.b64encode(f"{ZOOM_CLIENT_ID}:{ZOOM_CLIENT_SECRET}".encode('utf-8')).decode('utf-8') headers = { 'Authorization': f'Basic {basic}', 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json', 'Host': 'zoom.us' } response = http.request( 'POST', TOKEN_URL, body=params, headers=headers, timeout=TIMEOUT ) if response.status != 200: print(f'Token request failed: {response.status}') response_text = response.data.decode('utf-8') print(f'Response body: {response_text}') raise Exception(f'Failed to get OAuth token: {response.status}') body = json.loads(response.data.decode('utf-8')) return body['access_token'] def load_state(bucket, key): """Load state from GCS.""" try: blob = bucket.blob(key) if blob.exists(): state_data = blob.download_as_text() return json.loads(state_data) except Exception as e: print(f'Warning: Could not load state: {str(e)}') # Initial state: start today today = date.today().isoformat() return {'cursor_date': today, 'next_page_token': None} def save_state(bucket, key, state): """Save state to GCS.""" try: state['updated_at'] = datetime.now(timezone.utc).isoformat() blob = bucket.blob(key) blob.upload_from_string( json.dumps(state), content_type='application/json' ) except Exception as e: print(f'Warning: Could not save state: {str(e)}') def write_chunk(bucket, items, ts): """Write log chunk to GCS.""" key = f"{GCS_PREFIX}{ts:%Y/%m/%d}/zoom-operationlogs-{uuid.uuid4()}.json.gz" buf = io.BytesIO() with gzip.GzipFile(fileobj=buf, mode='w') as gz: for rec in items: gz.write((json.dumps(rec) + '\n').encode('utf-8')) buf.seek(0) blob = bucket.blob(key) blob.upload_from_file(buf, content_type='application/gzip') print(f'Wrote {len(items)} logs to {key}') return key def fetch_page(token, from_date, to_date, next_page_token): """Fetch a page of logs from Zoom API.""" params = { 'from': from_date, 'to': to_date, 'page_size': str(PAGE_SIZE) } if next_page_token: params['next_page_token'] = next_page_token # Build query string query_string = '&'.join([f"{k}={v}" for k, v in params.items()]) url = f"{REPORT_URL}?{query_string}" headers = { 'Authorization': f'Bearer {token}', 'Accept': 'application/json' } response = http.request( 'GET', url, headers=headers, timeout=TIMEOUT ) if response.status != 200: print(f'API request failed: {response.status}') response_text = response.data.decode('utf-8') print(f'Response body: {response_text}') raise Exception(f'Failed to fetch logs: {response.status}') return json.loads(response.data.decode('utf-8'))- 두 번째 파일: requirements.txt:
functions-framework==3.* google-cloud-storage==2.* urllib3>=2.0.0배포를 클릭하여 함수를 저장하고 배포합니다.
배포가 완료될 때까지 기다립니다 (2~3분).
Cloud Scheduler 작업 만들기
Cloud Scheduler는 일정 간격으로 Pub/Sub 주제에 메시지를 게시하여 Cloud Run 함수를 트리거합니다.
- GCP Console에서 Cloud Scheduler로 이동합니다.
- 작업 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 이름 zoom-operationlogs-schedule-15min리전 Cloud Run 함수와 동일한 리전 선택 주파수 */15 * * * *(15분마다)시간대 시간대 선택 (UTC 권장) 타겟 유형 Pub/Sub 주제 zoom-operationlogs-trigger선택메일 본문 {}(빈 JSON 객체)만들기를 클릭합니다.
일정 빈도 옵션
로그 볼륨 및 지연 시간 요구사항에 따라 빈도를 선택합니다.
빈도 크론 표현식 사용 사례 5분마다 */5 * * * *대용량, 저지연 15분마다 */15 * * * *일반(권장) 1시간마다 0 * * * *검색량 적음 6시간마다 0 */6 * * *일괄 처리
통합 테스트
- Cloud Scheduler 콘솔에서 작업 (예:
zoom-operationlogs-schedule-15min)을 찾습니다. - 강제 실행을 클릭하여 작업을 수동으로 트리거합니다.
- 몇 초 동안 기다립니다.
- Cloud Run > 서비스로 이동합니다.
- 함수 이름 (
zoom-operationlogs-to-gcs)을 클릭합니다. - 로그 탭을 클릭합니다.
함수가 성공적으로 실행되었는지 확인합니다. 다음을 확인하세요.
Processing logs for date: YYYY-MM-DD Page 1: Retrieved X events Wrote X records to zoom/operationlogs/YYYY/MM/DD/zoom-operationlogs-UUID.json.gz Successfully processed X logs for YYYY-MM-DDCloud Storage> 버킷으로 이동합니다.
버킷 이름 (
zoom-operation-logs)을 클릭합니다.접두사 폴더 (
zoom/operationlogs/)로 이동합니다.현재 타임스탬프를 사용하여 새
.json.gz파일이 생성되었는지 확인합니다.
로그에 오류가 표시되면 다음 단계를 따르세요.
- HTTP 401: 환경 변수에서 Zoom API 사용자 인증 정보 확인
- HTTP 403: Zoom 앱에
report:read:operation_logs:admin범위가 있는지 확인 - 환경 변수 누락: Cloud Run 함수 구성에 필요한 모든 변수가 설정되어 있는지 확인합니다.
Google SecOps 서비스 계정 가져오기
Google SecOps는 고유한 서비스 계정을 사용하여 GCS 버킷에서 데이터를 읽습니다. 이 서비스 계정에 버킷에 대한 액세스 권한을 부여해야 합니다.
서비스 계정 이메일 가져오기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
Zoom Operation Logs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 Zoom 작업 로그를 선택합니다.
서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.
Google SecOps 서비스 계정에 IAM 권한 부여
Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름 (예:
zoom-operation-logs)을 클릭합니다. - 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어를 선택합니다.
저장을 클릭합니다.
Zoom 작업 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
Zoom Operation Logs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 Zoom 작업 로그를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.
gs://zoom-operation-logs/zoom/operationlogs/다음과 같이 바꿉니다.
zoom-operation-logs: GCS 버킷 이름입니다.zoom/operationlogs/: 로그가 저장되는 접두사 경로입니다.
소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
- 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 로직 |
|---|---|---|
| action | metadata.product_event_type | 'action' 원시 로그 필드가 이 UDM 필드에 매핑됩니다. |
| category_type | additional.fields.key | 원시 로그 필드 'category_type'이 이 UDM 필드에 매핑됩니다. |
| category_type | additional.fields.value.string_value | 원시 로그 필드 'category_type'이 이 UDM 필드에 매핑됩니다. |
| 도 | target.user.department | 'operation_detail' 필드에서 추출된 원시 로그 필드 'Department'가 이 UDM 필드에 매핑됩니다. |
| 설명 | target.user.role_description | 원시 로그 필드 'Description'('operation_detail' 필드에서 추출됨)이 이 UDM 필드에 매핑됩니다. |
| 표시 이름 | target.user.user_display_name | 원시 로그 필드 '표시 이름'('operation_detail' 필드에서 추출됨)이 이 UDM 필드에 매핑됩니다. |
| 이메일 주소 | target.user.email_addresses | 'operation_detail' 필드에서 추출된 원시 로그 필드 '이메일 주소'가 이 UDM 필드에 매핑됩니다. |
| 이름 | target.user.first_name | 'operation_detail' 필드에서 추출된 원시 로그 필드 'First Name'이 이 UDM 필드에 매핑됩니다. |
| 직책 | target.user.title | 'operation_detail' 필드에서 추출된 원시 로그 필드 'Job Title'이 이 UDM 필드에 매핑됩니다. |
| 성 | target.user.last_name | 'Last Name'(last_name) 원시 로그 필드('operation_detail' 필드에서 추출됨)가 이 UDM 필드에 매핑됩니다. |
| 위치 | target.location.name | 'operation_detail' 필드에서 추출된 원시 로그 필드 'Location'이 이 UDM 필드에 매핑됩니다. |
| operation_detail | metadata.description | 원시 로그 필드 'operation_detail'이 이 UDM 필드에 매핑됩니다. |
| 연산자 | principal.user.email_addresses | 이메일 정규식과 일치하는 경우 원시 로그 필드 'operator'가 이 UDM 필드에 매핑됩니다. |
| 연산자 | principal.user.userid | 이메일 정규식과 일치하지 않는 경우 원시 로그 필드 'operator'가 이 UDM 필드에 매핑됩니다. |
| 방 이름 | target.user.attribute.labels.value | 'operation_detail' 필드에서 추출된 원시 로그 필드 'Room Name'이 이 UDM 필드에 매핑됩니다. |
| 역할 이름 | target.user.attribute.roles.name | 'operation_detail' 필드에서 추출된 원시 로그 필드 '역할 이름'이 이 UDM 필드에 매핑됩니다. |
| 시간 | metadata.event_timestamp.seconds | 원시 로그 필드 'time'이 파싱되어 이 UDM 필드에 매핑됩니다. |
| 유형 | target.user.attribute.labels.value | 원시 로그 필드 'Type'('operation_detail' 필드에서 추출됨)이 이 UDM 필드에 매핑됩니다. |
| 사용자 역할 | target.user.attribute.roles.name | 원시 로그 필드 'User Role'('operation_detail' 필드에서 추출됨)이 이 UDM 필드에 매핑됩니다. |
| 사용자 유형 | target.user.attribute.labels.value | 원시 로그 필드 '사용자 유형'('operation_detail' 필드에서 추출됨)이 이 UDM 필드에 매핑됩니다. |
| metadata.log_type | 'ZOOM_OPERATION_LOGS' 값이 이 UDM 필드에 할당됩니다. | |
| metadata.vendor_name | 'ZOOM' 값이 이 UDM 필드에 할당됩니다. | |
| metadata.product_name | 'ZOOM_OPERATION_LOGS' 값이 이 UDM 필드에 할당됩니다. | |
| metadata.event_type | 값은 다음 논리에 따라 결정됩니다. 1. 'event_type' 필드가 비어 있지 않으면 해당 값이 사용됩니다. 1. 'operator', 'email' 또는 'email2' 필드가 비어 있지 않으면 값이 'USER_UNCATEGORIZED'로 설정됩니다. 1. 그 외에는 값이 'GENERIC_EVENT'로 설정됩니다. | |
| json_data | about.user.attribute.labels.value | 원시 로그 필드 'json_data'('operation_detail' 필드에서 추출됨)가 JSON으로 파싱됩니다. 파싱된 JSON 배열의 각 요소에 있는 'assistant' 및 'options' 필드는 UDM의 'labels' 배열에 있는 'value' 필드에 매핑됩니다. |
| json_data | about.user.userid | 원시 로그 필드 'json_data'('operation_detail' 필드에서 추출됨)가 JSON으로 파싱됩니다. 파싱된 JSON 배열의 각 요소 (첫 번째 요소 제외)의 'userId' 필드는 UDM의 'about.user' 객체의 'userid' 필드에 매핑됩니다. |
| json_data | target.user.attribute.labels.value | 원시 로그 필드 'json_data'('operation_detail' 필드에서 추출됨)가 JSON으로 파싱됩니다. 파싱된 JSON 배열의 첫 번째 요소에 있는 'assistant' 및 'options' 필드가 UDM의 'labels' 배열에 있는 'value' 필드에 매핑됩니다. |
| json_data | target.user.userid | 원시 로그 필드 'json_data'('operation_detail' 필드에서 추출됨)가 JSON으로 파싱됩니다. 파싱된 JSON 배열의 첫 번째 요소에 있는 'userId' 필드는 UDM의 'target.user' 객체의 'userid' 필드에 매핑됩니다. |
| 이메일 | target.user.email_addresses | 'operation_detail' 필드에서 추출된 원시 로그 필드 'email'이 이 UDM 필드에 매핑됩니다. |
| email2 | target.user.email_addresses | 'operation_detail' 필드에서 추출된 원시 로그 필드 'email2'가 이 UDM 필드에 매핑됩니다. |
| 역할 | target.user.attribute.roles.name | 'operation_detail' 필드에서 추출된 원시 로그 필드 'role'이 이 UDM 필드에 매핑됩니다. |
도움이 더 필요한가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.