Gmail 로그 수집
이 문서에서는 Google Cloud Storage V2를 사용하여 Gmail 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
Gmail은 Google Workspace의 이메일 서비스로, 스팸 및 피싱 방지 기능이 내장된 안전하고 지능적인 이메일을 제공합니다. Gmail 로그는 이메일 전송, 보안 이벤트, Gmail 인프라를 통한 메시지 흐름에 관한 세부정보를 캡처합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Cloud Storage API 및 BigQuery API가 사용 설정된 GCP 프로젝트
- 적절한 버전 (Enterprise Standard, Enterprise Plus, Education Standard 또는 Education Plus)의 Google Workspace 계정
- Google Workspace 관리 콘솔에 대한 최고 관리자 액세스 권한
- GCS 버킷을 만들고 관리할 수 있는 권한
- GCS 버킷의 IAM 정책을 관리할 수 있는 권한
- BigQuery 예약 쿼리를 만들 수 있는 권한
- 서비스 계정 gapps-reports@system.gserviceaccount.com에 BigQuery 프로젝트의 편집자 역할이 있어야 합니다.
Google Cloud Storage 버킷 만들기
Google Cloud 콘솔 사용
- Google Cloud Console로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: gmail-logs-export)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
gcloud 명령줄 도구 사용
또는
gcloud명령어를 사용하여 버킷을 만듭니다.gcloud storage buckets create gs://gmail-logs-export \ --location=us-central1 \ --default-storage-class=STANDARD- 다음과 같이 바꿉니다.
gmail-logs-export: 원하는 버킷 이름 (전역적으로 고유함)입니다.us-central1: 선호하는 리전입니다 (예:us-central1,europe-west1).
- 다음과 같이 바꿉니다.
BigQuery로 로그를 내보내도록 Google Workspace 구성하기
Gmail 로그를 포함한 Google Workspace 로그는 통합 Workspace 로그 및 보고서 기능을 통해 BigQuery로 내보내집니다.
Workspace 로그에 BigQuery 내보내기 사용 설정
- 최고 관리자 계정으로 Google 관리 콘솔에 로그인합니다.
- 메뉴 > 보고 > 데이터 통합으로 이동합니다.
- BigQuery Export 카드를 가리킨 다음 수정을 클릭합니다.
- Google BigQuery로 Google Workspace 데이터 내보내기 사용 설정 체크박스를 선택합니다.
- BigQuery 프로젝트 ID에서 로그를 저장할 프로젝트를 선택합니다.
- 프로젝트 내 새 데이터 세트에서 로그 저장에 사용할 데이터 세트 이름을 입력합니다 (예:
workspace_logs). - 선택사항: 데이터 세트를 특정 지리적 위치로 제한 체크박스를 선택하고 메뉴에서 위치를 선택합니다.
저장을 클릭합니다.
내보내기를 사용 설정하면 일반적으로 10분 이내에 활동 로그 이벤트를 사용할 수 있습니다. 데이터는 지정된 데이터 세트의 activity_YYYYMMDD라는 테이블로 내보내집니다.
BigQuery에서 GCS로 내보내기 위한 예약 쿼리 만들기
BigQuery에서 Gmail 로그를 Cloud Storage로 반복적으로 자동 내보내려면 EXPORT DATA 문을 사용하여 예약된 쿼리를 만드세요.
BigQuery 콘솔 사용
- Google Cloud 콘솔에서 BigQuery로 이동합니다.
- 왼쪽 탐색 메뉴에서 예약된 쿼리를 클릭합니다.
- 예약된 쿼리 만들기를 클릭합니다.
쿼리 편집기에 다음 SQL을 입력합니다.
EXPORT DATA OPTIONS( uri='gs://gmail-logs-export/gmail-logs/*.json', format='JSON', overwrite=false ) AS SELECT * FROM `PROJECT_ID.workspace_logs.activity_*` WHERE record_type = 'gmail' AND _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))- 다음과 같이 바꿉니다.
gmail-logs-export: GCS 버킷 이름PROJECT_ID: GCP 프로젝트 ID입니다.workspace_logs: BigQuery 데이터 세트 이름
- 다음과 같이 바꿉니다.
일정 옵션 섹션에서 다음을 수행합니다.
- 반복: 시간을 선택합니다.
- Every(매주):
1를 입력합니다. - 시작일 및 실행 시간: 현재 날짜와 시간을 선택합니다.
쿼리 결과의 대상 섹션에서 다음을 수행합니다.
- 데이터 세트: 쿼리 메타데이터의 데이터 세트를 선택합니다 (내보낸 데이터 아님).
저장을 클릭합니다.
bq 명령줄 도구 사용
또는
bq명령어를 사용하여 예약된 쿼리를 만듭니다.bq mk \ --transfer_config \ --project_id=PROJECT_ID \ --data_source=scheduled_query \ --display_name='Gmail Logs Export to GCS' \ --schedule='every 1 hours' \ --params='{ "query":"EXPORT DATA OPTIONS(uri=\"gs://gmail-logs-export/gmail-logs/*.json\", format=\"JSON\", overwrite=false) AS SELECT * FROM `PROJECT_ID.workspace_logs.activity_*` WHERE record_type = \"gmail\" AND _TABLE_SUFFIX = FORMAT_DATE(\"%Y%m%d\", DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))", "destination_table_name_template":"gmail_export_metadata", "write_disposition":"WRITE_TRUNCATE" }'- 다음과 같이 바꿉니다.
PROJECT_ID: GCP 프로젝트 ID입니다.gmail-logs-export: GCS 버킷 이름workspace_logs: BigQuery 데이터 세트 이름
- 다음과 같이 바꿉니다.
Google SecOps 서비스 계정 가져오기
Google SecOps는 고유한 서비스 계정을 사용하여 GCS 버킷에서 데이터를 읽습니다. 이 서비스 계정에 버킷에 대한 액세스 권한을 부여해야 합니다.
Gmail 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
Gmail Logs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
로그 유형으로 GMAIL 로그를 선택합니다.
서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.
다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.
gs://gmail-logs-export/gmail-logs/- 다음과 같이 바꿉니다.
gmail-logs-export: GCS 버킷 이름gmail-logs: 로그가 저장되는 접두사/폴더 경로
- 다음과 같이 바꿉니다.
소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
Google SecOps 서비스 계정에 IAM 권한 부여
Google SecOps 서비스 계정에는 GCS 버킷에 대한 스토리지 객체 뷰어 역할이 필요합니다.
Google Cloud 콘솔 사용
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름을 클릭합니다.
- 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어를 선택합니다.
- 저장을 클릭합니다.
gcloud 명령줄 도구 사용
또는
gcloud명령어를 사용하여 권한을 부여합니다.gcloud storage buckets add-iam-policy-binding gs://gmail-logs-export \ --member="serviceAccount:SECOPS_SERVICE_ACCOUNT_EMAIL" \ --role="roles/storage.objectViewer"- 다음과 같이 바꿉니다.
gmail-logs-export: 버킷 이름입니다.SECOPS_SERVICE_ACCOUNT_EMAIL: Google SecOps 서비스 계정 이메일입니다.
- 다음과 같이 바꿉니다.
gsutil 명령줄 도구 사용 (기존)
SecOps 서비스 계정에 Gmail 로그 내보내기 버킷에 대한 객체 뷰어 액세스 권한을 부여합니다.
gsutil iam ch serviceAccount:SECOPS_SERVICE_ACCOUNT_EMAIL:objectViewer \ gs://gmail-logs-export
권한 확인
권한이 올바르게 부여되었는지 확인하려면 다음 단계를 따르세요.
gcloud storage buckets get-iam-policy gs://gmail-logs-export \ --flatten="bindings[].members" \ --filter="bindings.role:roles/storage.objectViewer"
출력에 Google SecOps 서비스 계정 이메일이 표시됩니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| attachment.file_extension_type, attachment.sha256, attachment.file_name, domains | 정보 | 첨부파일 세부정보 및 링크 도메인과 병합됨 |
| message_info.post_delivery_info.action_type, gmail.message_info.post_delivery_info.action_type, event_info.mail_event_type, gmail.event_info.mail_event_type, tok.product_bucket, tok.scope_name, record_type, token.client_type, message_info.num_message_attachments, gmail.message_info.num_message_attachments | additional.fields | 다양한 추가 메타데이터 필드와 병합됨 |
| action_type, description, rule_id | metadata.description | action_type 값 또는 설명에 따라 구체적인 설명으로 설정하거나 rule_id == 7인 경우 '부적절한 콘텐츠'로 설정 |
| metadata.event_type | 'EMAIL_TRANSACTION'으로 설정 | |
| event_name | metadata.product_event_type | 값이 직접 복사됨 |
| metadata.product_name | 'GMAIL'로 설정 | |
| metadata.vendor_name | 'Google'로 설정 | |
| __incoming_message, __outcoming_message | network.direction | 수신 메시지가 감지되면 'INBOUND'로 설정하고 발신 메시지가 감지되면 'OUTBOUND'로 설정합니다. |
| destination.address | network.email.cc | 색인이 0보다 큰 대상 주소에서 병합됨 |
| message_info.source.from_header_address, message_info.source.address | network.email.from | 비어 있지 않으면 from_header_address의 값, 비어 있으면 source.address의 값 |
| message_info.rfc2822_message_id, gmail.message_info.rfc2822_message_id | network.email.mail_id | rfc2822_message_id에서 추출, < > 삭제, grok 사용 |
| message_info.subject, gmail.message_info.subject | network.email.subject | 비어 있지 않은 경우 message_info.subject의 값, 비어 있는 경우 gmail.message_info.subject |
| destination.address | network.email.to | 첫 번째 대상 주소에서 병합됨 |
| network.ip_protocol | 'TCP'로 설정 | |
| _payload_size | network.received_bytes | 수신 메시지인 경우 _payload_size로 설정 |
| _payload_size | network.sent_bytes | 나가는 메시지인 경우 _payload_size로 설정 |
| token.app_name, message_info.source.service, message_info.source.selector, gmail.message_info.source.service, gmail.message_info.source.selector | principal.application | 비어 있지 않은 경우 token.app_name의 값, 그렇지 않은 경우 source.service 및 source.selector에서 연결된 값 |
| message_info.connection_info.client_host_zone, gmail.message_info.connection_info.client_host_zone | principal.asset.hostname | client_host_zone의 값 |
| client_ip | principal.asset.ip | 값이 직접 복사됨 |
| message_info.connection_info.client_host_zone, gmail.message_info.connection_info.client_host_zone | principal.hostname | client_host_zone의 값 |
| client_ip | principal.ip | 값이 직접 복사됨 |
| message_info.connection_info.ip_geo_country, gmail.message_info.connection_info.ip_geo_country | principal.location.country_or_region | ip_geo_country의 값 |
| email, source_address | principal.user.email_addresses | email_address 및 source_address에서 병합됨 |
| token.client_id | principal.user.group_identifiers | 값이 직접 복사됨 |
| message_info.source.from_header_displayname, gmail.message_info.source.from_header_displayname | principal.user.user_display_name | from_header_displayname의 값 |
| source_address | principal.user.userid | 값이 직접 복사됨 |
| action | security_result.action | 값이 직접 복사됨 |
| 카테고리 | security_result.category | 값이 직접 복사됨 |
| category_details | security_result.category_details | 값이 직접 복사됨 |
| message_info.connection_info.smtp_response_reason, gmail.message_info.connection_info.smtp_response_reason, rule_description, reason | security_result.description | SMTP 응답 이유, 규칙 설명 또는 분류 이유로 설정됩니다. |
| stringMatch.predefined_detector_name, stringMatch.matched_string, stringMatch.match_expression, stringMatch.source, stringMatch.type | security_result.detection_fields | 감지 필드 객체와 병합됨 |
| rule_id | security_result.rule_id | 값이 직접 복사됨 |
| rule_name | security_result.rule_name | 값이 직접 복사됨 |
| _err_summary, rule_id, description | security_result.summary | 오류 요약, 규칙별 요약 또는 설명으로 설정 |
| _target_host | target.administrative_domain | 값이 직접 복사됨 |
| message_info.destination.0.service, message_info.destination.0.selector, gmail.message_info.destination.0.service, gmail.message_info.destination.0.selector | target.application | 서비스와 선택기에서 연결됨 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.