MuleSoft Anypoint 로그 수집
이 문서에서는 AWS S3를 사용하여 MuleSoft Anypoint 플랫폼 로그의 감사 추적 이벤트를 Google Security Operations에 수집하는 방법을 설명합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- MuleSoft에 대한 액세스 권한 관리
- AWS에 대한 액세스 권한
MuleSoft 조직 ID 가져오기
- Anypoint Platform에 로그인합니다.
- 메뉴 > 액세스 관리로 이동합니다.
- 비즈니스 그룹 표에서 조직 이름을 클릭합니다.
- 조직 ID (예:
0a12b3c4-d5e6-789f-1021-1a2b34cd5e6f
)를 복사합니다.
- 또는 MuleSoft 비즈니스 그룹으로 이동하여 URL에서 ID를 복사합니다.
Google SecOps용 AWS S3 버킷 및 IAM 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다 (예:
mulesoft-audit-logs
). - 이 사용자 가이드(IAM 사용자 만들기)에 따라 사용자를 만듭니다.
- 생성된 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- 액세스 키와 비밀 액세스 키를 저장하여 나중에 참고하려면 CSV 파일 다운로드를 클릭합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
MuleSoft 연결된 앱 만들기
- Anypoint Platform에 로그인합니다.
- 액세스 관리 > 연결된 앱 > 앱 만들기로 이동합니다.
- 다음 구성 세부정보를 제공합니다.
- 앱 이름: 고유한 이름을 입력합니다 (예:
Google SecOps export
). - 앱이 자체적으로 작동 (클라이언트 사용자 인증 정보)을 선택합니다.
- 범위 추가 → 감사 로그 뷰어 → 다음을 클릭합니다.
- 로그가 필요한 모든 비즈니스 그룹을 선택합니다.
- 다음 > 범위 추가를 클릭합니다.
- 앱 이름: 고유한 이름을 입력합니다 (예:
- 저장을 클릭하고 클라이언트 ID와 클라이언트 보안 비밀번호를 복사합니다.
S3 업로드를 위한 IAM 정책 및 역할 구성
정책 JSON (
mulesoft-audit-logs
을 버킷 이름으로 대체):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutAuditObjects", "Effect": "Allow", "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::mulesoft-audit-logs/*" } ] }
AWS 콘솔 > IAM > 정책 > 정책 생성 > JSON 탭으로 이동합니다.
정책을 복사하여 붙여넣습니다.
다음 > 정책 만들기를 클릭합니다.
IAM > 역할 > 역할 생성 > AWS 서비스 > Lambda로 이동합니다.
새로 만든 정책을 연결합니다.
역할 이름을
WriteMulesoftToS3Role
로 지정하고 역할 만들기를 클릭합니다.
Lambda 함수 만들기
설정 | 값 |
---|---|
이름 | mulesoft_audit_to_s3 |
런타임 | Python 3.13 |
아키텍처 | x86_64 |
실행 역할 | 기존 > WriteMulesoftToS3Role 사용 |
함수가 생성되면 코드 탭을 열고 스텁을 삭제한 후 다음 코드를 입력합니다 (
mulesoft_audit_to_s3.py
).#!/usr/bin/env python3 import os, json, gzip, io, uuid, datetime as dt, urllib.request, urllib.error, urllib.parse import boto3 ORG_ID = os.environ["MULE_ORG_ID"] CLIENT_ID = os.environ["CLIENT_ID"] CLIENT_SECRET = os.environ["CLIENT_SECRET"] S3_BUCKET = os.environ["S3_BUCKET_NAME"] TOKEN_URL = "https://anypoint.mulesoft.com/accounts/api/v2/oauth2/token" QUERY_URL = f"https://anypoint.mulesoft.com/audit/v2/organizations/{ORG_ID}/query" def http_post(url, data, headers=None): raw = json.dumps(data).encode() if headers else urllib.parse.urlencode(data).encode() req = urllib.request.Request(url, raw, headers or {}) try: with urllib.request.urlopen(req, timeout=30) as r: return json.loads(r.read()) except urllib.error.HTTPError as e: print("MuleSoft error body →", e.read().decode()) raise def get_token(): return http_post(TOKEN_URL, { "grant_type": "client_credentials", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET })["access_token"] def fetch_audit(token, start, end): headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } body = { "startDate": f"{start.isoformat(timespec='milliseconds')}Z", "endDate": f"{end.isoformat(timespec='milliseconds')}Z", "limit": 200, "offset": 0, "ascending": False } while True: data = http_post(QUERY_URL, body, headers) if not data.get("data"): break yield from data["data"] body["offset"] += body["limit"] def upload(events, ts): key = f"{ts:%Y/%m/%d}/mulesoft-audit-{uuid.uuid4()}.json.gz" buf = io.BytesIO() with gzip.GzipFile(fileobj=buf, mode="w") as gz: for ev in events: gz.write((json.dumps(ev) + "\n").encode()) buf.seek(0) boto3.client("s3").upload_fileobj(buf, S3_BUCKET, key) def lambda_handler(event=None, context=None): now = dt.datetime.utcnow().replace(microsecond=0) start = now - dt.timedelta(days=1) token = get_token() events = list(fetch_audit(token, start, now)) if events: upload(events, start) print(f"Uploaded {len(events)} events") else: print("No events in the last 24 h") # For local testing if __name__ == "__main__": lambda_handler()
구성 > 환경 변수 > 수정 > 새 환경 변수 추가로 이동합니다.
제공된 다음 환경 변수를 입력하고 값을 바꿉니다.
키 예시 값 MULE_ORG_ID
your_org_id
CLIENT_ID
your_client_id
CLIENT_SECRET
your_client_secret
S3_BUCKET_NAME
mulesoft-audit-logs
Lambda 함수 예약 (EventBridge 스케줄러)
- 구성 > 트리거 > 트리거 추가 > EventBridge 스케줄러 > 규칙 만들기로 이동합니다.
- 다음 구성 세부정보를 제공합니다.
- 이름:
daily-mulesoft-audit export
. - 일정 패턴: 크론 표현식
- 표현식:
0 2 * * *
(매일 02:00 UTC에 실행됨)
- 이름:
- 나머지는 기본값으로 두고 만들기를 클릭합니다.
MuleSoft 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새로 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예:
MuleSoft Logs
). - 소스 유형으로 Amazon S3 V2를 선택합니다.
- 로그 유형으로 Mulesoft를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
- S3 URI: 버킷 URI입니다.
s3://mulesoft-audit-logs/
mulesoft-audit-logs
을 버킷의 실제 이름으로 바꿉니다.
소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
액세스 키 ID: s3 버킷에 액세스할 수 있는 사용자 액세스 키입니다.
보안 비밀 액세스 키: s3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
- S3 URI: 버킷 URI입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.