AWS CloudTrail

CH.dev·2025년 8월 7일
post-thumbnail

📄 요약

AWS CloudTrail은 내 계정의 모든 활동을 기록하는 블랙박스이자 CCTV다.
누가, 언제, 어디서, 어떤 리소스에 무슨 작업을 했는지 API 호출 단위로 기록하여 완벽한 감사 추적(Audit Trail)을 제공한다.
계정의 거버넌스, 규정 준수, 운영 및 위험 감사를 위한 필수 서비스이며, 특히 침해 사고 발생 시 원인을 분석하고 대응하는 첫 단추 역할을 한다. 이 글에서는 CloudTrail의 핵심 개념과 실전 분석 쿼리, 최신 기능까지 정리한다.


💡 핵심 개념

1. CloudTrail이란?

AWS 계정 내에서 발생하는 API 호출과 활동을 이벤트(Event) 형태로 기록하고 모니터링하는 서비스다.
사용자가 콘솔, SDK, CLI를 통해 수행하는 모든 작업(EC2 인스턴스 생성, S3 버킷 삭제, IAM 사용자 정책 변경 등)이 로그로 남는다.
단순 기록을 넘어서 보안 분석, 리소스 변경 추적, 규정 준수 감사의 핵심 데이터가 된다.


2. 이벤트(Event) vs. 추적(Trail)

📌 이벤트 히스토리 (Event History)

  • 기본 활성화: AWS 계정 생성 시 자동 적용됨
  • 조회 범위: 최근 90일간의 관리 이벤트만
  • 활용 목적: 간단한 활동 조회 용도에 적합
  • 제한점: 로그 영구 저장 불가, 분석 범위 좁음

📌 추적 (Trail)

  • 직접 생성 필요: 로그를 장기 보관하고 분석하려면 필수
  • 저장 대상: 지정한 S3 버킷, CloudWatch Logs, 또는 CloudTrail Lake
  • 전역 설정 가능: '모든 리전에 적용' 설정은 보안상 필수
  • 조직 전체 관리: AWS Organizations를 통해 Organization Trail 설정 가능
  • 활용 목적: 침해 사고 분석, 감사, 규정 준수 대응, Athena 분석

3. CloudTrail Lake — 장기 보존과 쿼리 분석을 위한 진화형 스토리지

  • Event Data Store를 만들어 API 로그를 최대 7년(기본), 10년(옵션)까지 저장할 수 있는 서비스
  • JSON 로그를 구조화하여 Athena 없이도 SQL로 직접 쿼리 가능
  • 비용은 저장량 + 쿼리량 기준이며, 대규모 조직의 보안 분석/감사용으로 적합
  • 기존 Trail이 단순 저장 위주라면, Lake는 저장 + 쿼리 플랫폼의 개념

4. 관리 이벤트 vs. 데이터 이벤트

유형설명예시기본 상태
관리 이벤트리소스 생성/삭제/수정 같은 제어 작업RunInstances, DeleteBucket✅ 활성화됨
데이터 이벤트리소스 내부 데이터 접근GetObject, PutObject, Invoke❌ 비활성화 (선택적 설정)
  • 데이터 이벤트는 로그 양이 많고 비용이 발생하므로, 반드시 필요한 리소스에만 적용해야 한다.

5. 침해 사고 분석 시나리오

CloudTrail 로그로 다음과 같은 이상 징후를 탐지할 수 있다:

  • 📌 비정상 IP/국가에서의 접근: ConsoleLogin 이벤트에서 해외 IP 등
  • 📌 권한 탈취 시도: AccessDenied 이벤트가 급증하면서 iam:* API 호출 시도
  • 📌 CloudTrail/GuardDuty 비활성화 시도: StopLogging, UpdateDetector 이벤트
  • 📌 대규모 리소스 삭제/생성: DeleteObject, RunInstances

🧠 실전 분석 쿼리 (Athena)

CloudTrail 로그를 S3에 저장하고 Athena로 쿼리하면 실시간 분석이 가능하다.


예제 1: 허용되지 않은 IP에서의 성공 로그인

SELECT  
 eventtime,  
 sourceipaddress,  
 useridentity.type AS user_type,  
 useridentity.arn AS user_arn,  
 eventsource,  
 eventname  
FROM"your_cloudtrail_table"  
WHERE  
 eventname = 'ConsoleLogin'AND errorcode IS NULL AND errormessage IS NULLAND sourceipaddress NOT IN ('203.0.113.10', '198.51.100.20')  
ORDER BY eventtime DESC  
LIMIT 100;

예제 2: IAM 권한 상승 시도 탐지

SELECT  
 useridentity.arn AS user_arn,  
 eventname,  
 eventsource,COUNT(*) AS attempt_count  
FROM"your_cloudtrail_table"  
WHERE  
 errorcode = 'AccessDenied'AND (  
  eventname LIKE 'Create%' OR  
  eventname LIKE 'Delete%' OR  
  eventname LIKE 'Attach%' OR  
  eventname LIKE 'Put%')AND eventsource = 'iam.amazonaws.com'  
GROUP BY  
 useridentity.arn,  
 eventname,  
 eventsource  
ORDER BY attempt_count DESC  
LIMIT 50;

📜 주요 eventName 및 errorCode

✅ 자주 사용되는 eventName

eventName설명
ConsoleLoginAWS 콘솔 로그인 시도 (성공/실패 포함)
AssumeRoleSTS를 통한 임시 자격 증명 획득
CreateUserIAM 사용자 생성
AttachUserPolicy사용자에게 정책 연결
PutUserPolicy인라인 정책 직접 추가
UpdateLoginProfileIAM 사용자 비밀번호 변경
CreateAccessKey액세스 키 생성 (비밀 키 노출 위험)
DeleteAccessKey액세스 키 삭제
StopLoggingCloudTrail 로깅 중지 시도
StartLoggingCloudTrail 로깅 시작
PutBucketPolicyS3 버킷 정책 변경
GetObjectS3 객체 조회 (데이터 이벤트)
PutObjectS3 객체 업로드 (데이터 이벤트)
RunInstancesEC2 인스턴스 실행
TerminateInstancesEC2 인스턴스 종료
CreateSecurityGroup보안 그룹 생성
AuthorizeSecurityGroupIngress보안 그룹 인바운드 규칙 추가
UpdateDetectorGuardDuty 설정 변경 (비활성화 시도 탐지에 사용)

❗ 자주 발생하는 errorCode

errorCode설명
AccessDenied권한 부족으로 API 호출 실패
UnauthorizedOperation루트 또는 IAM 권한 부족
ThrottlingException호출 제한(쿼터) 초과
EntityAlreadyExists이미 존재하는 엔티티 (예: 사용자, 역할 등)
NoSuchEntity없는 리소스에 접근 시 발생
ServiceUnavailableAWS 서비스 일시적 중단 또는 내부 오류
InvalidClientTokenId잘못된 액세스 키 ID 사용
ExpiredToken세션 토큰 또는 자격 증명 만료
RequestLimitExceeded요청 횟수 초과
MalformedPolicyDocument잘못된 정책 JSON 형식

🔍 참고 쿼리 (Athena)

-- 최근 발생한 이벤트 이름 상위 50개
SELECT eventname, COUNT(*) AS cnt
FROM your_cloudtrail_table
GROUP BY eventname
ORDER BY cnt DESC
LIMIT 50;

-- 최근 30일간 발생한 AccessDenied 이벤트
SELECT *
FROM your_cloudtrail_table
WHERE errorcode = 'AccessDenied'
AND eventtime >= current_date - interval '30' day;

🔧 Athena 비용 최적화 팁

  • S3 파티셔닝 구조 적용: year, month, day, region, account_id 등의 디렉토리 기준으로 로그 저장
  • Athena 테이블 생성 시 파티션 명시: MSCK REPAIR TABLE 또는 Partition Projection 기능 활용
  • WHERE 조건에서 파티션 필터링 사용: 쿼리 비용 절감
SELECT * FROM cloudtrail_logs  
WHERE year = '2025' AND month = '08'  
AND eventname = 'DeleteBucket';

🔍 함께 사용하면 좋은 서비스

1. Amazon GuardDuty

  • VPC Flow Logs, CloudTrail, DNS 로그를 기반으로 비정상 API 호출, 이상 징후 탐지
  • 예: Tor Exit Node에서의 로그인, 비정상 IAM 권한 요청 등

2. AWS Config

  • 리소스의 구성 변경 이력 추적
  • CloudTrail이 '요청'을 기록한다면, Config는 '결과'를 기록함

3. AWS Security Hub

  • GuardDuty, Config, Inspector 등 다양한 보안 서비스의 결과를 중앙집중형으로 시각화/집계
profile
더 이상 미룰 수 없다 나의 공부 나의 성장

0개의 댓글