맞춤 보안 데이터 분석 로그 수집
이 문서에서는 여러 수집 방법을 사용하여 맞춤 보안 분석 데이터를 Google Security Operations로 수집하는 방법을 설명합니다. 이 가이드는 사전 빌드된 파서나 로그 유형이 없는 맞춤 보안 데이터 소스를 위한 것입니다.
맞춤 보안 데이터 분석에는 독점 보안 텔레메트리, 맞춤 애플리케이션 로그, 내부 보안 도구 또는 기본 Google SecOps 통합이 없는 소스의 보안 관련 데이터가 포함됩니다. 이 데이터를 비구조화 로그로 수집하고 필요에 따라 커스텀 파서를 사용하여 정규화할 수 있습니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- JSON, CSV, SYSLOG 또는 기타 구조화된 형식으로 로그를 내보낼 수 있는 맞춤 보안 데이터 소스
- 다음 중 하나에 대한 액세스 권한이 있어야 합니다.
- Google Cloud 콘솔 (API 키 생성 및 GCS용)
- AWS 콘솔 (S3 또는 Firehose용)
- Azure Portal (Azure Blob Storage용)
- 웹훅 요청을 전송할 수 있는 HTTP 클라이언트 또는 애플리케이션
- Google SecOps에서 피드를 만들고 관리할 수 있는 권한
수집 방법 선택
Google SecOps는 맞춤 보안 데이터를 위한 여러 수집 방법을 지원합니다. 데이터 소스 기능에 가장 적합한 방법을 선택합니다.
| 수집 방법 | 사용 사례 | 지연 시간 | 설정 난이도 |
|---|---|---|---|
| 웹훅 | 애플리케이션의 실시간 푸시 | 초 | 낮음 |
| Amazon S3 V2 | S3 버킷으로 일괄 내보내기 | 수 분에서 수 시간 | 보통 |
| Google Cloud Storage V2 | GCS 버킷으로 일괄 내보내기 | 수 분에서 수 시간 | 보통 |
| Azure Blob Storage V2 | Azure 스토리지로 일괄 내보내기 | 수 분에서 수 시간 | 보통 |
| Amazon Data Firehose | AWS의 실시간 스트리밍 | 초 | 높음 |
옵션 1: 웹훅 수집 (실시간 푸시)
맞춤 보안 애플리케이션이 외부 엔드포인트에 HTTP POST 요청을 보낼 수 있는 경우 이 메서드를 사용하세요.
Google SecOps에서 웹훅 피드 만들기
피드 만들기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
custom-security-analytics-webhook). - 소스 유형으로 웹훅을 선택합니다.
- 로그 유형으로 맞춤 보안 데이터 분석을 선택합니다.
- 다음을 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- 분할 구분 기호: 선택사항: 여러 줄 이벤트를 분할할 구분 기호를 입력합니다. 일반적인 값:
\n- 줄바꿈 구분자 (NDJSON에 가장 일반적임)- 각 요청에 단일 이벤트가 포함된 경우 비워 둡니다.
- 애셋 네임스페이스: 애셋 네임스페이스
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
- 분할 구분 기호: 선택사항: 여러 줄 이벤트를 분할할 구분 기호를 입력합니다. 일반적인 값:
- 다음을 클릭합니다.
- 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
보안 비밀 키 생성 및 저장
피드를 만든 후 인증을 위한 보안 비밀 키를 생성해야 합니다.
- 피드 세부정보 페이지에서 보안 비밀 키 생성을 클릭합니다.
- 대화상자에 보안 비밀 키가 표시됩니다.
보안 비밀번호를 안전하게 복사하여 저장합니다.
피드 엔드포인트 URL 가져오기
- 피드의 세부정보 탭으로 이동합니다.
- 엔드포인트 정보 섹션에서 피드 엔드포인트 URL을 복사합니다.
URL 형식은 다음과 같습니다.
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate또는
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate다음 단계를 위해 이 URL을 저장합니다.
완료를 클릭합니다.
Google Cloud API 키 만들기
Google SecOps에는 인증을 위한 API 키가 필요합니다. Google Cloud 콘솔에서 제한된 API 키를 만듭니다.
API 키 만들기
- Google Cloud 콘솔 사용자 인증 정보 페이지로 이동합니다.
- 프로젝트 (Chronicle 인스턴스와 연결된 프로젝트)를 선택합니다.
- 사용자 인증 정보 만들기 API 키를 클릭합니다.
- API 키가 생성되어 대화상자에 표시됩니다.
- API 키 수정을 클릭하여 키를 제한합니다.
API 키 제한
- API 키 설정 페이지에서 다음을 수행합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
Chronicle Webhook API Key).
- 이름: 설명이 포함된 이름을 입력합니다 (예:
- API 제한사항에서 다음을 수행합니다.
- 키 제한을 선택합니다.
- API 선택 드롭다운에서 Google SecOps API (또는 Chronicle API)를 검색하여 선택합니다.
- 저장을 클릭합니다.
- 페이지 상단의 API 키 필드에서 API 키 값을 복사합니다.
API 키를 안전하게 저장합니다.
데이터를 전송하도록 맞춤 애플리케이션 구성
Chronicle 웹훅 엔드포인트에 HTTP POST 요청을 보내도록 맞춤 보안 애플리케이션 또는 스크립트를 구성합니다.
웹훅 URL을 구성합니다.
Chronicle 엔드포인트 URL과 API 키를 결합합니다.
<ENDPOINT_URL>?key=<API_KEY>예:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
HTTP 요청 형식:
메서드: POST
URL:
<ENDPOINT_URL>?key=<API_KEY>헤더:
Content-Type: application/json x-chronicle-auth: <SECRET_KEY>본문 (단일 이벤트):
{ "timestamp": "2025-01-15T10:30:00Z", "event_type": "authentication", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45", "custom_field_1": "value1", "custom_field_2": "value2" }본문 (줄바꿈 구분자가 있는 여러 이벤트):
{"timestamp": "2025-01-15T10:30:00Z", "event_type": "authentication", "action": "login"} {"timestamp": "2025-01-15T10:30:05Z", "event_type": "file_access", "action": "read"} {"timestamp": "2025-01-15T10:30:10Z", "event_type": "authentication", "action": "logout"}
예:
예: Python 스크립트:
import requests import json from datetime import datetime # Configuration ENDPOINT_URL = "https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate" API_KEY = "your-api-key-here" SECRET_KEY = "your-secret-key-here" # Construct full URL url = f"{ENDPOINT_URL}?key={API_KEY}" # Headers headers = { "Content-Type": "application/json", "x-chronicle-auth": SECRET_KEY } # Sample event event = { "timestamp": datetime.utcnow().isoformat() + "Z", "event_type": "custom_security_event", "severity": "high", "source": "custom_security_tool", "message": "Suspicious activity detected", "user": "admin@example.com", "ip_address": "192.168.1.100" } # Send request response = requests.post(url, headers=headers, data=json.dumps(event)) if response.status_code == 200: print("Event sent successfully") else: print(f"Error: {response.status_code} - {response.text}")예: cURL 명령어:
curl -X POST \ "https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=YOUR_API_KEY" \ -H "Content-Type: application/json" \ -H "x-chronicle-auth: YOUR_SECRET_KEY" \ -d '{ "timestamp": "2025-01-15T10:30:00Z", "event_type": "security_alert", "severity": "critical", "source": "custom_tool", "message": "Threat detected" }'
인증 방법 참조
Google SecOps 웹훅 피드는 여러 인증 방법을 지원합니다. 애플리케이션에서 지원하는 방법을 선택합니다.
방법 1: 맞춤 헤더 (권장)
애플리케이션에서 맞춤 HTTP 헤더를 지원하는 경우 보안을 강화하려면 이 메서드를 사용하세요.
요청 형식:
POST <ENDPOINT_URL> HTTP/1.1 Content-Type: application/json x-goog-chronicle-auth: <API_KEY> x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }장점:
- API 키와 보안 비밀은 URL에 표시되지 않습니다.
- 헤더가 웹 서버 액세스 로그에 기록되지 않으므로 더 안전합니다.
- 애플리케이션에서 지원하는 경우 선호되는 방법입니다.
방법 2: 쿼리 매개변수
애플리케이션에서 맞춤 헤더를 지원하지 않으면 사용자 인증 정보를 URL에 추가합니다.
URL 형식:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>예:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...요청 형식:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }단점:
- 사용자 인증 정보가 URL에 표시됩니다.
- 사용자 인증 정보가 웹 서버 액세스 로그에 기록될 수 있습니다.
- 헤더보다 보안이 취약합니다.
방법 3: 하이브리드 (URL + 헤더)
일부 구성에서는 URL에 API 키를 사용하고 헤더에 비밀 키를 사용합니다.
요청 형식:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json x-chronicle-auth: <SECRET_KEY> { "event": "data", "timestamp": "2025-01-15T10:30:00Z" }
웹훅 한도 및 권장사항
요청 한도
| 한도 | 값 |
|---|---|
| 최대 요청 크기 | 4MB |
| 최대 QPS (초당 쿼리 수) | 15,000 |
| 요청 제한 시간 | 30초 |
| 재시도 동작 | 지수 백오프를 사용한 자동 |
권장사항
- 이벤트 일괄처리: 줄바꿈으로 구분된 JSON (NDJSON) 형식을 사용하여 단일 요청으로 여러 이벤트를 전송하여 오버헤드를 줄입니다.
- 타임스탬프 포함: 정확한 이벤트 순서를 위해 항상 ISO 8601 형식의 타임스탬프 필드를 포함합니다.
- 정형 데이터 사용: 더 쉽게 파싱하고 필드를 추출할 수 있도록 JSON 형식으로 데이터를 전송합니다.
- 재시도 로직 구현: 지수 백오프로 일시적인 실패를 처리합니다.
- 응답 코드 모니터링: 200이 아닌 응답을 로깅하고 알림을 표시합니다.
옵션 2: Amazon S3 V2 수집 (일괄 내보내기)
맞춤 보안 애플리케이션이 로그를 Amazon S3 버킷으로 내보낼 수 있는 경우 이 방법을 사용하세요.
Amazon S3 버킷 만들기
- Amazon S3 콘솔을 엽니다.
- 버킷 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 버킷 이름: 버킷의 의미 있는 이름을 입력합니다 (예:
custom-security-analytics-logs). - 리전: 원하는 AWS 리전을 선택합니다 (예:
us-east-1).
- 버킷 이름: 버킷의 의미 있는 이름을 입력합니다 (예:
- 만들기를 클릭합니다.
S3 액세스 권한이 있는 IAM 사용자 만들기
- IAM 콘솔을 엽니다.
- 사용자 > 사용자 추가를 클릭합니다.
- 사용자 이름을 입력합니다 (예:
chronicle-s3-reader). - 프로그래매틱 액세스를 선택합니다.
- 다음: 권한을 클릭합니다.
- 기존 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess를 검색하여 선택합니다.
- 다음: 태그를 클릭합니다.
- 다음: 검토를 클릭합니다.
- 사용자 만들기를 클릭합니다.
- .csv 파일 다운로드를 클릭하여 액세스 키 ID와 보안 비밀 액세스 키를 저장합니다.
- 닫기를 클릭합니다.
S3로 내보내도록 애플리케이션 구성
S3 버킷에 로그 파일을 쓰도록 맞춤 보안 애플리케이션을 구성합니다. 애플리케이션은 다음을 충족해야 합니다.
- 구조화된 형식 (JSON, CSV 또는 일반 텍스트)으로 로그를 작성합니다.
- 일관된 파일 이름 지정 규칙을 사용합니다.
- 선택사항: 날짜별로 파일을 정리합니다 (예:
logs/2025/01/15/events.json). 전체 파일을 작성합니다 (부분 쓰기 방지).
파일 구조 예:
s3://custom-security-analytics-logs/ ├── security-events/ │ ├── 2025/01/15/ │ │ ├── events-10-00.json │ │ ├── events-11-00.json │ │ └── events-12-00.json로그 파일 형식 예 (NDJSON):
{"timestamp": "2025-01-15T10:00:00Z", "event_type": "login", "user": "alice@example.com", "result": "success"} {"timestamp": "2025-01-15T10:05:00Z", "event_type": "file_access", "user": "bob@example.com", "file": "/data/sensitive.txt"} {"timestamp": "2025-01-15T10:10:00Z", "event_type": "logout", "user": "alice@example.com"}
S3용 Google SecOps 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
custom-security-analytics-s3). - 소스 유형으로 Amazon S3 V2를 선택합니다.
- 로그 유형으로 맞춤 보안 데이터 분석을 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
S3 URI: 버킷 URI(형식:
s3://custom-security-analytics-logs/security-events/)소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
- 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다 (기본값은 180일).
액세스 키 ID: IAM 사용자의 액세스 키를 입력합니다.
보안 비밀 액세스 키: IAM 사용자의 보안 비밀 키를 입력합니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
옵션 3: Google Cloud Storage V2 수집 (일괄 내보내기)
맞춤 보안 애플리케이션이 Google Cloud Storage 버킷으로 로그를 내보낼 수 있는 경우 이 방법을 사용하세요.
GCS 버킷 만들기
- Google Cloud Console로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: custom-security-analytics-logs)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 도구 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
GCS로 내보내도록 애플리케이션 구성
다음 방법 중 하나를 사용하여 GCS 버킷에 로그 파일을 쓰도록 맞춤 보안 애플리케이션을 구성합니다.
- Google Cloud SDK:
gsutil또는 클라이언트 라이브러리 사용 - 서비스 계정: 스토리지 객체 생성자 역할이 있는 서비스 계정을 만듭니다.
서명된 URL: 임시 쓰기 액세스를 위한 서명된 URL 생성
gsutil을 사용하는 예:
gsutil cp /path/to/logs/events.json gs://custom-security-analytics-logs/security-events/Python 클라이언트 라이브러리를 사용하는 예:
from google.cloud import storage import json # Initialize client client = storage.Client() bucket = client.bucket('custom-security-analytics-logs') # Upload log file blob = bucket.blob('security-events/2025/01/15/events.json') # Write NDJSON data events = [ {"timestamp": "2025-01-15T10:00:00Z", "event_type": "login"}, {"timestamp": "2025-01-15T10:05:00Z", "event_type": "logout"} ] ndjson_data = '\n'.join([json.dumps(event) for event in events]) + '\n' blob.upload_from_string(ndjson_data, content_type='application/x-ndjson')
Google SecOps 서비스 계정 가져오기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
custom-security-analytics-gcs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 맞춤 보안 데이터 분석을 선택합니다.
- 서비스 계정 가져오기를 클릭합니다.
고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com다음 단계에서 사용할 수 있도록 이 이메일 주소를 복사합니다.
IAM 권한 부여
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름을 클릭합니다.
- 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어를 선택합니다.
저장을 클릭합니다.
GCS용 Google SecOps 피드 구성
- 피드 생성 페이지에서 계속 진행하거나 SIEM 설정 > 피드 > 새 피드 추가로 이동합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
스토리지 버킷 URL: 다음 접두사 경로를 사용하여 GCS 버킷 URI를 입력합니다.
gs://custom-security-analytics-logs/security-events/소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다 (테스트에 권장).
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
- 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다 (기본값은 180일).
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
옵션 4: Azure Blob Storage V2 수집 (일괄 내보내기)
맞춤 보안 애플리케이션이 로그를 Azure Blob Storage로 내보낼 수 있는 경우 이 방법을 사용하세요.
Azure 스토리지 계정 만들기
- Azure 포털에서 스토리지 계정을 검색합니다.
- + 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 구독 Azure 구독 선택 리소스 그룹 기존 항목 선택 또는 새로 만들기 스토리지 계정 이름 고유한 이름 (예: customsecuritylogs)을 입력합니다.리전 리전을 선택합니다 (예: East US).성능 표준 (권장) 중복성 GRS (지리적 중복 스토리지) 또는 LRS (로컬 중복 스토리지) 검토 + 만들기를 클릭합니다.
계정 개요를 검토하고 만들기를 클릭합니다.
배포가 완료될 때까지 기다립니다.
스토리지 계정 사용자 인증 정보 가져오기
- 방금 만든 스토리지 계정으로 이동합니다.
- 왼쪽 탐색 메뉴의 보안 + 네트워킹에서 액세스 키를 선택합니다.
- 키 표시를 클릭합니다.
- 나중에 사용할 수 있도록 다음을 복사하여 저장합니다.
- 스토리지 계정 이름:
customsecuritylogs - 키 1 또는 키 2: 공유 액세스 키
- 스토리지 계정 이름:
블로그 컨테이너 만들기
- 동일한 스토리지 계정의 왼쪽 탐색에서 컨테이너를 선택합니다.
- + 컨테이너를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- Name: 컨테이너 이름을 입력합니다 (예:
security-events). - 공개 액세스 수준: 비공개 (익명 액세스 없음)를 선택합니다.
- Name: 컨테이너 이름을 입력합니다 (예:
- 만들기를 클릭합니다.
Azure Blob으로 내보내도록 애플리케이션 구성
다음 방법 중 하나를 사용하여 Azure Blob 컨테이너에 로그 파일을 쓰도록 맞춤 보안 애플리케이션을 구성합니다.
- Azure CLI:
az storage blob upload사용 - Azure SDK: 프로그래밍 언어용 클라이언트 라이브러리 사용
- AzCopy: AzCopy 명령줄 도구 사용
예
Azure CLI를 사용하는 예:
az storage blob upload \ --account-name customsecuritylogs \ --container-name security-events \ --name logs/2025/01/15/events.json \ --file /path/to/events.json \ --account-key <YOUR_ACCESS_KEY>Python SDK를 사용하는 예:
from azure.storage.blob import BlobServiceClient import json # Initialize client connection_string = "DefaultEndpointsProtocol=https;AccountName=customsecuritylogs;AccountKey=<YOUR_KEY>;EndpointSuffix=core.windows.net" blob_service_client = BlobServiceClient.from_connection_string(connection_string) # Get container client container_client = blob_service_client.get_container_client("security-events") # Upload log file blob_client = container_client.get_blob_client("logs/2025/01/15/events.json") # Write NDJSON data events = [ {"timestamp": "2025-01-15T10:00:00Z", "event_type": "login"}, {"timestamp": "2025-01-15T10:05:00Z", "event_type": "logout"} ] ndjson_data = '\n'.join([json.dumps(event) for event in events]) + '\n' blob_client.upload_blob(ndjson_data, overwrite=True)
Azure Blob용 Google SecOps 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
custom-security-analytics-azure). - 소스 유형으로 Microsoft Azure Blob Storage V2를 선택합니다.
- 로그 유형으로 맞춤 보안 데이터 분석을 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
Azure URI: 컨테이너 경로와 함께 Blob 서비스 엔드포인트 URL을 입력합니다.
https://customsecuritylogs.blob.core.windows.net/security-events/소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 삭제 안함: 전송 후 파일을 삭제하지 않습니다.
- 전송된 파일 삭제: 전송이 완료되면 파일을 삭제합니다.
- 전송된 파일 및 빈 디렉터리 삭제: 전송이 완료되면 파일과 빈 디렉터리를 삭제합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다 (기본값은 180일).
공유 키: 스토리지 계정의 공유 키 값 (액세스 키)을 입력합니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
옵션 5: Amazon Data Firehose 수집 (실시간 스트리밍)
맞춤 보안 애플리케이션이 Amazon CloudWatch Logs에 로그를 작성하고 Google SecOps로 실시간 스트리밍해야 하는 경우 이 방법을 사용하세요.
Google SecOps Firehose 피드 만들기
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
custom-security-analytics-firehose). - 소스 유형으로 Amazon Data Firehose를 선택합니다.
- 로그 유형으로 맞춤 보안 데이터 분석을 선택합니다.
- 다음을 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- 분할 구분 기호: 선택사항: 줄바꿈으로 구분된 로그를 분할하려면
\n를 입력합니다. - 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
- 분할 구분 기호: 선택사항: 줄바꿈으로 구분된 로그를 분할하려면
- 다음을 클릭합니다.
- 피드 구성을 검토하고 제출을 클릭합니다.
- 보안 비밀 키 생성을 클릭하여 이 피드를 인증하기 위한 보안 비밀 키를 생성합니다.
- 이 보안 비밀을 다시 볼 수 없으므로 보안 비밀 키를 복사하여 저장합니다.
- 세부정보 탭으로 이동합니다.
- 엔드포인트 정보 필드에서 피드 엔드포인트 URL을 복사합니다.
- 완료를 클릭합니다.
Google Cloud API 키 만들기
- https://console.cloud.google.com/apis/credentials의 Google Cloud 콘솔 사용자 인증 정보 페이지로 이동합니다.
- 사용자 인증 정보 만들기를 클릭한 후 API 키를 선택합니다.
- API 키 수정을 클릭하여 키를 제한합니다.
- API 제한사항에서 키 제한을 선택합니다.
- Google SecOps API를 검색하여 선택합니다.
- 저장을 클릭합니다.
- API 키를 복사하고 저장합니다.
엔드포인트 URL 구성
다음 형식으로 피드 엔드포인트 URL에 API 키를 추가합니다.
<FEED_ENDPOINT_URL>?key=<API_KEY>예:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...다음 단계를 위해 이 전체 URL을 저장합니다.
Firehose용 IAM 정책 만들기
- AWS 콘솔에서 IAM > 정책 > 정책 만들기 > JSON 탭으로 이동합니다.
다음 정책 JSON을 붙여넣습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<REGION>:<ACCOUNT_ID>:deliverystream/CustomSecurityToChronicle" } ] }다음을 바꿉니다.
<REGION>: AWS 리전 (예:us-east-1)<ACCOUNT_ID>: AWS 계정 ID (12자리 숫자)입니다.
CloudWatchLogsToFirehosePolicy정책의 이름을 지정합니다.정책 만들기를 클릭합니다.
CloudWatch Logs용 IAM 역할 만들기
- IAM > 역할 > 역할 만들기로 이동합니다.
커스텀 트러스트 정책을 선택하고 다음을 붙여넣습니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<REGION>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }<REGION>을 AWS 리전으로 바꿉니다.다음을 클릭합니다.
이전 단계에서 만든 정책
CloudWatchLogsToFirehosePolicy를 검색하고 선택합니다.다음을 클릭합니다.
역할 이름을
CloudWatchLogsToFirehoseRole로 지정합니다.역할 만들기를 클릭합니다.
Kinesis Data Firehose 전송 스트림 만들기
- AWS 콘솔에서 Kinesis > Data Firehose > 전송 스트림 만들기로 이동합니다.
다음 구성 세부정보를 제공합니다.
소스 및 대상:
- 소스: 직접 PUT 또는 기타 소스를 선택합니다.
- 대상: HTTP 엔드포인트를 선택합니다.
전송 스트림 이름:
- 전송 스트림 이름:
CustomSecurityToChronicle을 입력합니다.
- 전송 스트림 이름:
HTTP 엔드포인트 대상:
- HTTP 엔드포인트 URL: 이전에 구성한 전체 엔드포인트 URL (피드 엔드포인트 + API 키)을 입력합니다.
- 콘텐츠 인코딩: GZIP을 선택합니다 (대역폭 절약에 권장).
맞춤 HTTP 헤더:
- 맞춤 HTTP 헤더 추가를 클릭합니다.
- 헤더 이름:
X-Goog-Chronicle-Auth를 입력합니다. - 헤더 값: 이전 단계에서 저장한 보안 비밀 키를 입력합니다.
백업 설정:
- Amazon S3의 소스 레코드 백업: 실패한 데이터만을 선택합니다 (권장).
- S3 버킷: 기존 버킷을 선택하거나 실패한 레코드를 위한 새 버킷을 만듭니다.
버퍼 힌트:
- 버퍼 크기:
1MiB (HTTP 엔드포인트의 최소값)를 입력합니다. - 버퍼 간격:
60초 입력
- 버퍼 크기:
재시도 기간:
- 재시도 기간:
300초 (5분)를 입력합니다.
- 재시도 기간:
전송 스트림 만들기를 클릭합니다.
전송 스트림 상태가 활성으로 변경될 때까지 기다립니다 (1~2분).
CloudWatch 로그 그룹을 Firehose에 구독
- AWS 콘솔에서 CloudWatch > 로그 > 로그 그룹으로 이동합니다.
- 맞춤 보안 분석 로그가 포함된 타겟 로그 그룹을 선택합니다.
- 구독 필터 탭을 클릭합니다.
- 만들기 > Amazon Kinesis Data Firehose 구독 필터 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 대상: 전송 스트림
CustomSecurityToChronicle를 선택합니다. - 권한 부여: 역할
CloudWatchLogsToFirehoseRole를 선택합니다. - 구독 필터 이름:
CustomSecurityToChronicle을 입력합니다. - 로그 형식: 기타를 선택합니다 (Google SecOps에서 파싱을 처리함).
- 구독 필터 패턴: 모든 이벤트를 전송하려면 비워 두고 특정 이벤트만 전송하려면 필터 패턴을 입력합니다.
- 대상: 전송 스트림
- 스트리밍 시작을 클릭합니다.
- 이제 로그가 Firehose를 통해 Google SecOps로 실시간 스트리밍됩니다.
맞춤 파서 만들기 (선택사항)
구조화되지 않은 로그로 맞춤 보안 데이터를 수집한 후 더 나은 검색 가능성과 감지를 위해 데이터를 UDM 형식으로 정규화하는 맞춤 파서를 만들 수 있습니다.
맞춤 파서를 만들어야 하는 경우
다음과 같은 경우 맞춤 파서를 만드세요.
- 맞춤 로그 형식에서 특정 필드를 추출해야 합니다.
- 맞춤 데이터에서 UDM 검색을 사용 설정하고 싶습니다.
- 감지 규칙을 위해 맞춤 필드를 표준 UDM 필드에 매핑해야 합니다.
- 특정 필드를 색인화하여 검색 성능을 개선하려고 합니다.
맞춤 로그 유형 만들기
- SIEM 설정 > 사용 가능한 로그 유형으로 이동합니다.
- 로그 유형 요청을 클릭합니다.
- 맞춤 로그 유형 만들기 또는 사전 빌드된 로그 유형 요청 섹션에서 맞춤 로그 유형 만들기를 선택합니다.
- 다음 정보를 제공합니다.
- 로그 유형 이름: 설명이 포함된 이름을 입력합니다 (예:
CUSTOM_SECURITY_ANALYTICS). - 설명: 로그 유형에 대한 설명을 입력합니다.
- 샘플 로그: 원시 형식의 샘플 로그 항목 5~10개를 붙여넣습니다.
- 로그 유형 이름: 설명이 포함된 이름을 입력합니다 (예:
- 제출을 클릭합니다.
- 맞춤 로그 유형은 약 10분 후에 사용할 수 있습니다.
맞춤 파서 만들기
- SIEM 설정 > 파서로 이동합니다.
- 파서 만들기를 클릭합니다.
- 맞춤 파서를 선택합니다.
- 다음 정보를 제공합니다.
- 파서 이름: 설명이 포함된 이름을 입력합니다.
- 로그 유형: 맞춤 로그 유형을 선택합니다 (예:
CUSTOM_SECURITY_ANALYTICS). - 파서 코드: Google SecOps의 파서 구성 언어를 사용하여 파서 구성을 입력합니다.
- 샘플 로그로 파서를 테스트합니다.
- 제출을 클릭하여 파서를 활성화합니다.
파서 구성 예
맞춤 JSON 로그 형식의 경우:
{ "timestamp": "2025-01-15T10:30:00Z", "event_type": "authentication", "user": "john.doe@example.com", "action": "login", "result": "success", "source_ip": "203.0.113.45" }파서 구성 예:
filter { json { fields { timestamp: timestamp event_type: event_type user: user action: action result: result source_ip: source_ip } } } event { $e.metadata.event_timestamp.seconds = parseTimestamp(timestamp, "yyyy-MM-dd'T'HH:mm:ss'Z'") $e.metadata.event_type = "USER_LOGIN" $e.principal.user.email_addresses = user $e.target.ip = source_ip $e.security_result.action = if(result == "success", "ALLOW", "BLOCK") }맞춤 파서 만들기에 대한 자세한 내용은 사전 빌드된 파서 및 맞춤 파서 관리를 참고하세요.
데이터 수집 확인
피드를 구성한 후 데이터가 성공적으로 수집되고 있는지 확인합니다.
피드 상태 확인
- SIEM 설정> 피드로 이동합니다.
- 목록에서 피드를 찾습니다.
- 상태 열을 확인합니다.
- 활성: 피드가 실행 중이며 데이터를 수집하고 있습니다.
- 오류: 피드에 오류가 발생했습니다 (자세한 내용을 보려면 클릭하세요).
- 일시중지됨: 피드가 일시중지됨
수집된 로그 검색
- 검색 > 원시 로그 스캔으로 이동합니다.
검색어를 입력하여 맞춤 로그를 찾습니다.
metadata.log_type = "CUSTOM_SECURITY_DATA_ANALYTICS"필요한 경우 시간 범위를 조정합니다.
검색을 클릭합니다.
로그가 결과에 표시되는지 확인합니다.
피드 측정항목 모니터링
- SIEM 설정> 피드로 이동합니다.
- 피드 이름을 클릭합니다.
- 측정항목 탭으로 이동합니다.
- 다음 측정항목을 검토합니다.
- 수집된 이벤트: 수집된 총 이벤트 수
- 수집된 바이트: 수집된 총 데이터 볼륨
- 수집률: 초당 이벤트 수
- 오류: 수집 오류 수
문제 해결
웹훅 수집 문제
문제: HTTP 401 승인되지 않음
- 원인: 잘못된 API 키 또는 보안 비밀 키
- 해결 방법: API 키와 보안 비밀 키가 올바르고 만료되지 않았는지 확인합니다.
문제: HTTP 403 금지됨
- 원인: API 키에 Chronicle API 권한이 없음
- 해결 방법: API 키를 수정하고 API 제한사항에서 Chronicle API가 선택되어 있는지 확인합니다.
문제: HTTP 400 잘못된 요청
- 원인: 요청 형식 또는 페이로드가 잘못됨
- 해결 방법: Content-Type 헤더가
application/json로 설정되어 있고 페이로드가 유효한 JSON인지 확인합니다.
S3/GCS/Azure Blob 수집 문제
문제: 데이터가 수집되지 않음
- 원인: 버킷 URI가 잘못되었거나 권한이 누락됨
- 해결 방법: 버킷 URI에 후행 슬래시가 포함되어 있고 서비스 계정에 스토리지 객체 뷰어 역할이 있는지 확인합니다.
문제: 인제스트 후 파일이 삭제되지 않음
- 원인: 서비스 계정에 삭제 권한이 없음
- 해결 방법: 스토리지 객체 뷰어 대신 스토리지 객체 관리자 역할 부여
문제: 이전 파일이 수집되지 않음
- 원인: 최대 파일 기간 설정으로 인해 오래된 파일이 제외됨
- 해결책: 피드 구성에서 최대 파일 기간 값 늘리기
Firehose 수집 문제
문제: 전송 스트림에 오류가 표시됨
- 원인: 엔드포인트 URL 또는 인증이 잘못됨
- 해결 방법: 엔드포인트 URL에 API 키 매개변수가 포함되어 있고 X-Goog-Chronicle-Auth 헤더에 올바른 보안 키가 포함되어 있는지 확인합니다.
문제: 데이터 최신성 측정항목이 높음
- 원인: Firehose가 제한되거나 전송 실패가 발생함
- 솔루션:
ThrottledRecords및DeliveryToHTTP.Success비율에 대한 CloudWatch 측정항목 확인
문제: CloudWatch에서 스트리밍되는 로그가 없음
- 원인: 구독 필터가 구성되지 않았거나 IAM 역할에 권한이 누락됨
- 해결 방법: 구독 필터가 활성 상태이고 IAM 역할에
firehose:PutRecord권한이 있는지 확인합니다.
UDM 매핑 테이블
맞춤 보안 데이터 분석 로그는 구조화되지 않은 데이터로 수집됩니다. UDM 필드 매핑을 사용 설정하려면 위의 '맞춤 파서 만들기' 섹션에 설명된 대로 맞춤 파서를 만드세요.
커스텀 파서를 만들면 파서 구성에 따라 UDM 필드가 채워집니다. 보안 분석 데이터의 일반적인 UDM 필드는 다음과 같습니다.
| UDM 필드 | 설명 |
|---|---|
metadata.event_timestamp |
이벤트 타임스탬프 |
metadata.event_type |
이벤트 유형 (예: USER_LOGIN, FILE_ACCESS) |
principal.user.email_addresses |
사용자 이메일 주소 |
principal.ip |
소스 IP 주소 |
target.resource.name |
대상 리소스 이름 |
security_result.action |
보안 작업 (허용, 차단 등) |
security_result.severity |
이벤트 심각도 |
UDM 필드의 전체 목록은 UDM 필드 참조를 참고하세요.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.