Aware 감사 로그 수집
이 문서에서는 Amazon S3를 사용하여 Aware 감사 로그를 Google Security Operations에 수집하는 방법을 설명합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Aware 테넌트에 대한 액세스 권한 관리
- AWS (S3, IAM, Lambda, EventBridge)에 대한 권한 액세스
Aware 필수사항 (ID, API 키, 조직 ID, 토큰) 수집
- Aware 관리 콘솔에 로그인합니다.
- 시스템 설정 > 통합 > API 토큰으로 이동합니다.
- + API 토큰을 클릭하고 감사 로그 읽기 전용 권한을 부여합니다.
- 다음 세부정보를 복사하여 안전한 위치에 저장합니다.
- API 토큰
- API 기본 URL:
https://api.aware.work/external/system/auditlogs/v1
Google SecOps용 AWS S3 버킷 및 IAM 구성
- 이 사용자 가이드(버킷 만들기)에 따라 Amazon S3 버킷을 만듭니다.
- 나중에 참조할 수 있도록 버킷 이름과 리전을 저장합니다 (예:
aware-audit-logs
). - 이 사용자 가이드(IAM 사용자 만들기)에 따라 사용자를 만듭니다.
- 생성된 사용자를 선택합니다.
- 보안 사용자 인증 정보 탭을 선택합니다.
- 액세스 키 섹션에서 액세스 키 만들기를 클릭합니다.
- 사용 사례로 서드 파티 서비스를 선택합니다.
- 다음을 클릭합니다.
- 선택사항: 설명 태그를 추가합니다.
- 액세스 키 만들기를 클릭합니다.
- CSV 파일 다운로드를 클릭하여 나중에 사용할 수 있도록 액세스 키와 비밀 액세스 키를 저장합니다.
- 완료를 클릭합니다.
- 권한 탭을 선택합니다.
- 권한 정책 섹션에서 권한 추가를 클릭합니다.
- 권한 추가를 선택합니다.
- 정책 직접 연결을 선택합니다.
- AmazonS3FullAccess 정책을 검색하여 선택합니다.
- 다음을 클릭합니다.
- 권한 추가를 클릭합니다.
S3 업로드용 IAM 정책 및 역할 구성
- AWS 콘솔에서 IAM > 정책 > 정책 만들기 > JSON 탭으로 이동합니다.
다음 정책을 입력합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::aware-audit-logs/*" }, { "Sid": "AllowGetStateObject", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::aware-audit-logs/aware/state.json" } ] }
- 다른 버킷 이름을 입력한 경우
aware-audit-logs
을 해당 이름으로 바꿉니다.
- 다른 버킷 이름을 입력한 경우
다음 > 정책 만들기를 클릭합니다.
IAM > 역할 > 역할 생성 > AWS 서비스 > Lambda로 이동합니다.
새로 만든 정책을 연결합니다.
역할 이름을
AwareAuditLambdaRole
로 지정하고 역할 만들기를 클릭합니다.
Lambda 함수 만들기
- AWS 콘솔에서 Lambda > 함수 > 함수 만들기로 이동합니다.
- 처음부터 작성을 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
설정 | 값 |
---|---|
이름 | aware-audit-poller |
런타임 | Python 3.13 |
아키텍처 | x86_64 |
실행 역할 | AwareAuditLambdaRole |
함수가 생성되면 코드 탭을 열고 스텁을 삭제하고 다음 코드를 입력합니다 (
aware-audit-poller.py
).import boto3, gzip, io, json, os, time, urllib.parse import urllib.request from datetime import datetime, timedelta, timezone from botocore.exceptions import ClientError AWARE_ENDPOINT = "https://api.aware.work/external/system/auditlogs/v1" API_TOKEN = os.environ["AWARE_API_TOKEN"] BUCKET = os.environ["S3_BUCKET"] PREFIX = os.environ.get("S3_PREFIX", "aware/audit/") STATE_KEY = os.environ.get("STATE_KEY", "aware/state.json") MAX_PER_PAGE = int(os.environ.get("MAX_PER_PAGE", "500")) s3 = boto3.client("s3") def _load_state(): try: obj = s3.get_object(Bucket=BUCKET, Key=STATE_KEY) return json.loads(obj["Body"].read().decode("utf-8")) except ClientError as e: if e.response.get("Error", {}).get("Code") == "NoSuchKey": return {} raise def _save_state(state): s3.put_object(Bucket=BUCKET, Key=STATE_KEY, Body=json.dumps(state).encode("utf-8")) def handler(event, context): tz_utc = timezone.utc now = datetime.now(tz=tz_utc) state = _load_state() start_date = ( datetime.fromisoformat(state["last_date"]).date() if "last_date" in state else (now - timedelta(days=1)).date() ) end_date = now.date() total = 0 day = start_date while day <= end_date: day_str = day.strftime("%Y-%m-%d") params = {"filter": f"startDate:{day_str},endDate:{day_str}", "limit": str(MAX_PER_PAGE)} offset = 1 out = io.BytesIO() gz = gzip.GzipFile(filename="aware_audit.jsonl", mode="wb", fileobj=out) wrote_any = False while True: q = urllib.parse.urlencode({**params, "offset": str(offset)}) req = urllib.request.Request(f"{AWARE_ENDPOINT}?{q}") req.add_header("X-Aware-Api-Key", API_TOKEN) with urllib.request.urlopen(req, timeout=30) as resp: payload = json.loads(resp.read().decode("utf-8")) items = (payload.get("value") or {}).get("auditLogData") or [] if not items: break for item in items: gz.write((json.dumps(item, separators=(",", ":")) + "n").encode("utf-8")) total += 1 wrote_any = True offset += 1 time.sleep(0.2) gz.close() if wrote_any: key = f"{PREFIX}{day.strftime('%Y/%m/%d')}/aware_audit_{now.strftime('%Y%m%d_%H%M%S')}.jsonl.gz" s3.put_object( Bucket=BUCKET, Key=key, Body=out.getvalue(), ContentType="application/json", ContentEncoding="gzip", ) _save_state({"last_date": day.isoformat()}) day += timedelta(days=1) return {"status": "ok", "written": total}
구성 > 환경 변수 > 수정 > 새 환경 변수 추가로 이동합니다.
다음 환경 변수를 입력하고 값으로 바꿉니다.
키 예시 값 S3_BUCKET
aware-audit-logs
S3_PREFIX
aware/audit/
STATE_KEY
aware/state.json
AWARE_API_TOKEN
<your-aware-api-token>
MAX_PER_PAGE
500
함수가 생성된 후 해당 페이지에 머무르거나 Lambda > Functions > your-function**을 엽니다.
구성 탭을 선택합니다.
일반 구성 패널에서 수정을 클릭합니다.
제한 시간을 5분 (300초)으로 변경하고 저장을 클릭합니다.
EventBridge 일정 만들기
- Amazon EventBridge > 스케줄러 > 일정 만들기로 이동합니다.
- 다음 구성 세부정보를 제공합니다.
- 반복 일정: 요율 (
1 hour
) - 타겟: Lambda 함수
aware-audit-poller
- 이름:
aware-audit-poller-1h
.
- 반복 일정: 요율 (
- 일정 만들기를 클릭합니다.
선택사항: Google SecOps용 읽기 전용 IAM 사용자 및 키 만들기
- AWS 콘솔에서 IAM > 사용자 > 사용자 추가로 이동합니다.
- Add users를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 사용자:
secops-reader
- 액세스 유형: 액세스 키 — 프로그래매틱 액세스
- 사용자:
- 사용자 만들기를 클릭합니다.
- 최소 읽기 정책 (맞춤) 연결: 사용자 > secops-reader > 권한 > 권한 추가 > 정책 직접 연결 > 정책 만들기
JSON 편집기에서 다음 정책을 입력합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::aware-audit-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::aware-audit-logs" } ] }
이름을
secops-reader-policy
로 설정합니다.정책 만들기 > 검색/선택 > 다음 > 권한 추가로 이동합니다.
보안 사용자 인증 정보> 액세스 키> 액세스 키 만들기로 이동합니다.
CSV를 다운로드합니다 (이러한 값은 피드에 입력됨).
Aware 감사 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- + 새 피드 추가를 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다 (예:
Aware Audit logs
). - 소스 유형으로 Amazon S3 V2를 선택합니다.
- 로그 유형으로 Aware 감사를 선택합니다.
- 다음을 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- S3 URI:
s3://aware-audit-logs/aware/audit/
- 소스 삭제 옵션: 환경설정에 따라 삭제 옵션을 선택합니다.
- 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
- 액세스 키 ID: S3 버킷에 대한 액세스 권한이 있는 사용자 액세스 키입니다.
- 보안 비밀 액세스 키: S3 버킷에 액세스할 수 있는 사용자 보안 비밀 키입니다.
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용된 라벨입니다.
- S3 URI:
- 다음을 클릭합니다.
- 확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가로부터 답변을 받으세요.