Area 1 로그 수집
이 문서에서는 AWS S3를 사용하여 Area 1 Email Security (Cloudflare 제공) 로그를 Google Security Operations로 수집하는 방법을 설명합니다. 파서는 JSON 형식으로 로그를 처리합니다. 중첩된 JSON 구조에서 관련 필드를 추출하고, 이를 통합 데이터 모델 (UDM)에 매핑하고, 첨부파일 해시 및 처리와 같은 지리 정보와 보안 세부정보로 데이터를 보강합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Windows 2016 이상 또는
systemd
가 설치된 Linux 호스트 - 프록시 뒤에서 실행하는 경우 방화벽 포트가 열려 있음
- Area 1 Email Security (Cloudflare 제공)에 대한 액세스 권한 관리
AWS IAM 및 S3 버킷 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- AWS 콘솔에 로그인합니다.
- S3 > 버킷 만들기로 이동합니다.
- 버킷 이름을 입력합니다 (예:
area1-security-logs
). - 다른 기본값은 그대로 두거나 필요한 경우 암호화 및 버전 관리를 구성합니다.
- 만들기를 클릭합니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다.
- 이 사용자 가이드(IAM 사용자 만들기)에 따라 사용자를 만듭니다.
- 생성된 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하고 나중에 사용할 수 있도록 액세스 키와 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책에서 권한 추가를 클릭합니다.
- 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색합니다.
- 정책을 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
Get Area 1 API Credentials(Area 1 API 사용자 인증 정보 가져오기)
- Area 1 Security (Cloudflare) 대시보드에 로그인합니다.
- 설정 > API 액세스로 이동합니다.
- API 키 (토큰)를 생성합니다.
- 토큰을 복사하여 안전한 장소에 저장합니다.
필수 Python 패키지 구성
로그 수집 호스트 (예: AWS VM)에 로그인하고 다음을 실행하여 AWS 사용자 인증 정보를 구성합니다.
pip install boto3 requests aws configure
Area 1 Log Puller 스크립트 만들기
sudo vi area1_to_s3.py
를 입력하여 다음 파일을 만들고 다음 코드를 복사합니다.- 다음을 조정합니다.
#!/usr/bin/env python3 import os import requests import boto3 import datetime import json # Configuration AREA1_API_TOKEN = os.environ.get("AREA1_API_TOKEN") # Load securely from env AWS_PROFILE = os.environ.get("AWS_PROFILE", None) # Optional, for named profiles S3_BUCKET_NAME = "area1-security-logs" LOG_TYPE = "events" # Time range end_time = datetime.datetime.utcnow() start_time = end_time - datetime.timedelta(days=1) def fetch_area1_logs(): url = f"https://api.area1security.com/v1/{LOG_TYPE}" headers = { "Authorization": f"Bearer {AREA1_API_TOKEN}", "Accept": "application/json" } params = { "startDate": start_time.strftime("%Y-%m-%dT%H:%M:%SZ"), "endDate": end_time.strftime("%Y-%m-%dT%H:%M:%SZ") } response = requests.get(url, headers=headers, params=params) response.raise_for_status() return response.json() def upload_to_s3(data): filename = f"area1_{LOG_TYPE}_{start_time.strftime('%Y%m%d')}.json" session = boto3.Session(profile_name=AWS_PROFILE) if AWS_PROFILE else boto3.Session() s3 = session.client("s3") s3.put_object( Bucket=S3_BUCKET_NAME, Key=f"logs/{filename}", Body=json.dumps(data).encode("utf-8"), ContentType="application/json" ) print(f"[✓] Uploaded {filename} to s3://{S3_BUCKET_NAME}/logs/") if __name__ == "__main__": logs = fetch_area1_logs() upload_to_s3(logs)
저장하고 종료하기
vi
:esc
를 클릭한 다음:wq
를 입력합니다.
환경 변수 저장
/etc/area1.env
(또는/home/user/.area1.env
)에 환경 변수를 저장할 보안 파일 만들기export AREA1_API_TOKEN="your_actual_area1_api_token" export AWS_PROFILE="<your_aws_programmatic_username>"
파일이 안전한지 확인합니다.
chmod 600 /etc/area1.env
스크립트 실행 및 테스트
다음 스크립트를 실행합니다.
python3 area1_to_s3.py
다음과 같이 표시됩니다.
Uploaded area1_events_20250701.json to s3://area1-security-logs/logs/
Cron으로 자동화
sudo vi /usr/local/bin/run_area1.sh
를 실행하여 Cron용 래퍼 스크립트를 만든 다음 다음 코드를 복사합니다.#!/usr/bin/env bash set -euo pipefail source /etc/area1.env /usr/bin/python3 /opt/scripts/area1_to_s3.py
파일을 실행 가능하게 만듭니다.
chmod +x /usr/local/bin/run_area1.sh
매일 오전 1시(UTC)에 실행되도록 설정합니다.
crontab -e 0 1 * * * /usr/local/bin/run_area1.sh >> /var/log/area1_to_s3.log 2>&1
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드
- 콘텐츠 허브 > 콘텐츠 팩
SIEM 설정 > 피드에서 피드 설정
피드를 구성하려면 다음 단계를 따르세요.
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예:
Area1 Logs
). - 소스 유형으로 Amazon S3를 선택합니다.
- 로그 유형으로 Area1 Security를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- 리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI (형식은
s3://<your-log-bucket-name>
이어야 함). 다음을 대체합니다.your-log-bucket-name
: 버킷의 이름입니다.
- URI is a: 하위 디렉터리가 포함된 디렉터리를 선택합니다.
- 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 액세스 키 ID: s3 버킷에 액세스할 수 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: s3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
콘텐츠 허브에서 피드 설정하기
다음 필드의 값을 지정합니다.
리전: Amazon S3 버킷이 있는 리전입니다.
- S3 URI: 버킷 URI (형식은
s3://<your-log-bucket-name>
이어야 함). 다음을 대체합니다.your-log-bucket-name
: 버킷의 이름입니다.
- URI is a: 하위 디렉터리가 포함된 디렉터리를 선택합니다.
- 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 액세스 키 ID: s3 버킷에 액세스할 수 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: s3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.§
- S3 URI: 버킷 URI (형식은
고급 옵션
- 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
- 소스 유형: Google SecOps로 로그를 수집하는 데 사용되는 방법입니다.
- 애셋 네임스페이스: 피드와 연결된 네임스페이스입니다.
- 수집 라벨: 이 피드의 모든 이벤트에 적용되는 라벨입니다.
UDM 매핑 테이블
로그 필드 | UDM 매핑 | 논리 |
---|---|---|
alert_id | security_result.rule_id | 값은 alert_id 필드에서 가져옵니다. |
alert_reasons | security_result.description | 값은 alert_reasons 필드에서 가져옵니다. |
attachments.att_size | security_result.about.file.size | 값은 attachments.att_size 필드에서 가져와 부호 없는 정수로 변환됩니다. |
attachments.disposition | security_result.about.user.attribute.labels.value | 값은 attachments.disposition 필드에서 가져옵니다. |
attachments.extension | security_result.about.file.mime_type | 값은 attachments.extension 필드에서 가져옵니다. |
attachments.md5 | security_result.about.file.md5 | 값은 attachments.md5 필드에서 가져옵니다. |
attachments.name | security_result.about.file.full_path | 값은 attachments.name 필드에서 가져옵니다. |
attachments.sha1 | security_result.about.file.sha1 | 값은 attachments.sha1 필드에서 가져옵니다. |
attachments.sha256 | security_result.about.file.sha256 | 값은 attachments.sha256 필드에서 가져옵니다. |
attachments.ssdeep | security_result.about.file.ssdeep | 값은 attachments.ssdeep 필드에서 가져옵니다. |
delivery_mode | security_result.detection_fields.value | 값은 delivery_mode 필드에서 가져옵니다. |
envelope_from | principal.user.email_addresses, network.email.from | 값은 envelope_from 필드에서 가져옵니다. |
envelope_to | network.email.to, target.user.email_addresses | 값은 envelope_to 필드에서 가져옵니다. |
final_disposition | security_result.category_details | 값은 final_disposition 필드에서 가져옵니다. |
message_id | metadata.product_log_id | 값은 '<' 및 '>' 문자를 삭제한 후 message_id 필드에서 가져옵니다. |
replyto | network.email.bounce_address | 값은 replyto 필드에서 가져옵니다. |
smtp_helo_server_ip | principal.ip | 값은 smtp_helo_server_ip 필드에서 가져옵니다. |
smtp_helo_server_ip_as_name | principal.location.name | 값은 smtp_helo_server_ip_as_name 필드에서 가져옵니다. |
smtp_helo_server_ip_as_number | principal.asset_id | 값은 smtp_helo_server_ip_as_number 필드에서 가져오고 asset_id: 이 앞에 추가됩니다. |
smtp_helo_server_ip_geo | principal.location.country_or_region, principal.location.state, principal.location.city | 값은 Grok 패턴을 사용하여 smtp_helo_server_ip_geo 필드에서 추출됩니다. |
smtp_helo_server_name | principal.administrative_domain | 값은 smtp_helo_server_name 필드에서 가져옵니다. |
source | metadata.vendor_name | 값은 source 필드에서 가져옵니다. 필드가 비어 있으면 값이 area1security 로 설정됩니다. |
subject | network.email.subject | 값은 subject 필드에서 가져옵니다. |
시간 | metadata.event_timestamp | 값은 time 필드에서 가져와 타임스탬프로 변환됩니다. |
metadata.event_type | 값은 EMAIL_TRANSACTION 로 설정됩니다. |
|
metadata.product_name | 값은 AREA1 로 설정됩니다. |
|
metadata.log_type | 값은 AREA1 로 설정됩니다. |
|
security_result.about.user.attribute.labels.key | 값은 disposition 로 설정됩니다. |
|
security_result.category | 값은 SOFTWARE_MALICIOUS 로 설정됩니다. |
|
security_result.detection_fields.key | 값은 delivery_mode 로 설정됩니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.