AWS CloudTrail과 GuardDuty 정리
AWS CloudTrail과 GuardDuty 정리
개요, 설치, 설정, 위협 대응
1. 두 서비스는 무엇을 하나
AWS 계정 보안의 기본은 "누가 무엇을 했는지 남기는 것"과 "지금 이상한 일이 일어나는지 알아채는 것"입니다. CloudTrail이 앞의 일을, GuardDuty가 뒤의 일을 맡습니다.
| 구분 | AWS CloudTrail | Amazon GuardDuty |
|---|---|---|
| 역할 | 기록 (누가, 언제, 무엇을 했는지) | 탐지 (지금 의심스러운 일이 있는지) |
| 보는 것 | 콘솔, CLI, SDK, API로 한 행동 | CloudTrail 관리 이벤트, VPC 흐름 로그, DNS 로그 등 |
| 결과물 | 이벤트 로그 (S3, CloudWatch Logs) | finding (심각도 Low ~ Critical) |
| 범위 | 트레일 설정에 따름 (다중 리전 권장) | 리전 서비스 (리전마다 활성화) |
| 기본 상태 | 최근 90일 이벤트 기록 자동 보관 | 직접 활성화 (30일 무료 체험) |
GuardDuty는 CloudTrail 관리 이벤트를 자기 스트림으로 직접 받습니다. 그래서 트레일이 없어도 동작하고 트레일 설정에도 영향을 주지 않습니다. 다만 사고가 난 뒤 몇 달 전 기록을 뒤져야 할 때는 트레일이 있어야 합니다.
2. CloudTrail 개요
기록하는 이벤트 네 가지
| 이벤트 | 내용 | 예시 | 트레일 기본값 |
|---|---|---|---|
| 관리 이벤트 | 리소스 생성과 변경 (컨트롤 플레인) | CreateSubnet, AttachRolePolicy, ConsoleLogin | 기록 |
| 데이터 이벤트 | 리소스 안의 작업 (데이터 플레인), 양이 많음 | S3 GetObject, Lambda Invoke | 꺼짐, 추가 요금 |
| 네트워크 활동 이벤트 | VPC 엔드포인트를 거친 API 호출 | - | 꺼짐, 추가 요금 |
| Insights 이벤트 | API 호출량과 오류율이 평소와 다르게 변함 | - | 꺼짐, 추가 요금 |
기록이 남는 곳 세 가지
- 이벤트 기록(Event history): 계정을 만들면 자동으로 생기고 무료입니다. 리전별 최근 90일 관리 이벤트만 볼 수 있습니다.
- 트레일(Trail): S3에 로그 파일로 쌓고 CloudWatch Logs와 EventBridge로도 보냅니다. 관리 이벤트 첫 사본은 CloudTrail 요금이 없고 S3 저장 비용만 듭니다.
- CloudTrail Lake: SQL로 조회하는 관리형 저장소입니다. 2026-05-31부터 신규 고객은 쓸 수 없으니 새로 시작한다면 트레일을 씁니다.
3. GuardDuty 개요
- 기본 데이터 소스: CloudTrail 관리 이벤트, VPC 흐름 로그, DNS 로그. GuardDuty를 켜기만 하면 직접 수집하므로 흐름 로그를 따로 켤 필요가 없습니다.
- 분석: 위협 인텔리전스(악성 IP, 도메인, 파일 해시)와 머신러닝을 씁니다.
- 결과: finding을 만들고 EventBridge로 자동 발행합니다.
- Extended Threat Detection: 여러 단계에 걸친 공격을 하나로 묶어 공격 시퀀스 finding(Critical)을 만듭니다. GuardDuty를 켜면 자동으로 적용되고 추가 비용이 없습니다.
보호 플랜
기본 탐지 외에 리소스 유형별 보호 플랜을 더 켤 수 있습니다.
| 보호 플랜 | 보는 것 | 처음 활성화 시 | 30일 무료 체험 |
|---|---|---|---|
| S3 Protection | S3 데이터 이벤트 (유출, 파괴 시도) | 켜짐 | 있음 |
| EKS Protection | EKS 감사 로그 | 켜짐 | 있음 |
| Runtime Monitoring | EKS, EC2, ECS(Fargate)의 OS 수준 이벤트 | 꺼짐 | 있음 |
| Malware Protection for EC2 | EBS 볼륨 스캔 | GuardDuty 시작 스캔만 켜짐 | 시작 스캔만 있음 |
| Malware Protection for S3 | 새로 올라온 객체 | 꺼짐 | 없음 (월 1GB, 1,000건 무료) |
| Malware Protection for AWS Backup | 스냅샷, AMI, 복구 지점 | 꺼짐 | 없음 |
| RDS Protection | Aurora와 RDS 로그인 활동 | 켜짐 | 있음 |
| Lambda Protection | Lambda 네트워크 활동 | 켜짐 | 있음 |
| AI Protection | Bedrock, AgentCore, SageMaker AI 호출 | 꺼짐 (직접 활성화) | 있음 |
AI Protection은 기본 활성화 목록에 없고, 문서도 "AI 워크로드 위협을 탐지하려면 AI Protection을 켜야 한다"고 안내합니다. 보호 플랜 화면의 Configure all enablements에서 켭니다.
4. 설치
CloudTrail
- 콘솔: Create trail → 이름 → S3 버킷(새 버킷이면 버킷 정책 자동 생성) → SSE-KMS → 로그 파일 검증 → 이벤트 유형 선택. 콘솔에서 만든 트레일은 항상 다중 리전이고 만드는 즉시 로깅이 시작됩니다.
CloudTrail 콘솔 추적 생성 1단계 화면 (계정 ID 가림)
- CLI: 기본값이 단일 리전이므로
--is-multi-region-trail을 붙입니다. CLI로 만들면 로깅이 자동으로 시작되지 않으므로start-logging을 따로 실행합니다.
aws cloudtrail create-trail --name my-trail \
--s3-bucket-name <bucket> \
--is-multi-region-trail --enable-log-file-validation
aws cloudtrail start-logging --name my-trail
aws cloudtrail get-trail-status --name my-trail # IsLogging: true 확인
- Terraform:
aws_cloudtrail리소스를 씁니다.is_multi_region_trail과enable_log_file_validation은 기본값이 false라 true로 지정합니다.enable_logging은 기본값이 true라 생성 뒤 로깅이 켜집니다.
GuardDuty
리전 서비스이므로 감시할 리전마다 켭니다. AWS는 지원되는 모든 리전에서 켜기를 권장합니다.
- 콘솔: Get started → Enable GuardDuty. 켠 리전에서 30일 무료 체험이 시작됩니다.

GuardDuty를 켜기 전 시작 화면
- CLI:
aws guardduty create-detector --enable \
--finding-publishing-frequency FIFTEEN_MINUTES \
--features '[{"Name":"S3_DATA_EVENTS","Status":"ENABLED"}]'
- Terraform:
aws_guardduty_detector, 보호 플랜은aws_guardduty_detector_feature, S3 악성코드 보호는aws_guardduty_malware_protection_plan.
여러 계정을 쓴다면
| 구분 | CloudTrail 조직 트레일 | GuardDuty 위임 관리자 |
|---|---|---|
| 설정 주체 | 관리 계정 또는 위임 관리자가 생성 | 관리 계정이 위임 관리자 계정을 지정 |
| 적용 범위 | 조직의 모든 멤버 계정 | 리전마다 지정, 자동 활성화 범위 선택 (ALL, NEW, NONE) |
| 멤버 계정 | 트레일 수정, 삭제, 로깅 중지 불가 | 위임 관리자 하나당 멤버 최대 50,000개 |
CloudTrail 보안 모범 사례는 로그 아카이브 계정의 전용 S3 버킷에 조직 트레일을 모으는 구성을 권합니다.
5. 설정 방안
CloudTrail 권장 설정
| 항목 | 권장 설정 | 비고 |
|---|---|---|
| 리전 범위 | 다중 리전 트레일 1개 | 전역 서비스 이벤트까지 수집 |
| 무결성 검증 | 로그 파일 검증 활성화 | 매시간 SHA-256 다이제스트 생성, 검증은 aws cloudtrail validate-logs |
| 저장 버킷 | 트레일 전용 S3 버킷 | 정책은 cloudtrail.amazonaws.com에 GetBucketAcl과 PutObject만, aws:SourceArn에 트레일 ARN |
| 삭제 방지 | 버킷 MFA Delete | |
| 암호화 | SSE-KMS | 키 정책에 CloudTrail 사용과 로그 조회자의 복호화 허용 |
| 알림 | CloudWatch Logs 전달과 지표 필터 알람 | 예: 콘솔 로그인 실패 |
| 데이터 이벤트 | 필요한 버킷과 함수만 선택 | 10만 건당 0.10 USD |
트레일 상세 화면: 로깅, 다중 리전, 로그 파일 검증 확인
GuardDuty 보호 플랜 판단 기준
기본 탐지는 끌 수 없습니다. 보호 플랜은 해당 리소스가 계정에 있을 때 켭니다.
| 계정에 있는 리소스 | 켤 보호 플랜 |
|---|---|
| S3 버킷 | S3 Protection |
| Aurora, RDS | RDS Protection |
| EKS | EKS Protection |
| Lambda | Lambda Protection |
| Bedrock, SageMaker AI | AI Protection |
| EC2, ECS, EKS 내부 프로세스 | Runtime Monitoring (에이전트 필요) |
| 외부에서 파일을 받는 버킷 | Malware Protection for S3 |
GuardDuty 방지 플랜 화면: 플랜별 활성화 상태와 무료 평가판 표시
켜기 전에 확인할 것
Runtime Monitoring (ECS Fargate)
- 자동 에이전트 관리를 켜면 새로 뜨는 태스크에 GuardDuty 사이드카 컨테이너가 붙습니다. 제외할 클러스터는 켜기 전에 제외 태그를 답니다.
- Linux, 플랫폼 버전 1.4.0 이상만 지원합니다(Windows 미지원).
- 인터넷이 없는 프라이빗 서브넷은 ECR VPC 엔드포인트가 있어야 에이전트 이미지를 받습니다.
- 태스크 수준 CPU와 메모리를 지정해야 합니다. 에이전트 메모리 한도는 4 vCPU까지 128MB, 8 vCPU 256MB 또는 512MB, 16 vCPU 1GB입니다.
- CPU 오버헤드는 공식 문서에 수치가 없습니다. ECS 문서는 "약간의 오버헤드가 있다"고만 쓰고, Container Insights 지표로 직접 확인하라고 안내합니다.
Malware Protection for S3
- IAM 역할이 필요합니다(신뢰 주체
malware-protection-plan.guardduty.amazonaws.com). 권한은 EventBridge 관리 규칙, S3 객체 읽기와 태그, 버킷 알림입니다. - SSE-KMS 버킷이면
kms:GenerateDataKey,kms:Decrypt를kms:ViaService조건으로 허용합니다. - 같은 리전 버킷만 됩니다. 객체는 최대 100GB, 계정과 리전당 버킷 25개까지입니다.
- 보호 상태는 Active, Warning, Error가 있고 Warning은 대개 제한적인 버킷 정책 때문입니다.
Malware Protection for S3 보호된 버킷 화면 (상태 Active)
6. 위협 탐지와 대응 (사용 방법)
설치와 설정만으로는 절반입니다. finding이 왔을 때 무엇을 보고 어떻게 움직일지까지 정해 둬야 합니다.
finding 유형 이름 읽는 법
이름 형식은 ThreatPurpose:ResourceTypeAffected/ThreatFamilyName.DetectionMechanism!Artifact입니다.
문서 예시 CryptoCurrency:EC2/BitcoinTool.B!DNS를 나누면 이렇습니다.
| 구성 | 뜻 | 예시 |
|---|---|---|
| ThreatPurpose | 공격 목적 또는 단계 (대부분 MITRE ATT&CK 전술) | CryptoCurrency |
| ResourceTypeAffected | 공격 대상 리소스 유형 | EC2 |
| ThreatFamilyName | 탐지한 위협 종류 | BitcoinTool |
| DetectionMechanism | 탐지 방식 (.Custom은 사용자 위협 목록) |
B |
| Artifact (선택) | 악성 활동에 쓰인 자원 | DNS |
심각도와 권장 조치
| 심각도 | 범위 | 뜻과 권장 조치 |
|---|---|---|
| Critical | 9.0 ~ 10.0 | 공격 시퀀스가 진행 중일 수 있음. 최우선으로 조치 |
| High | 7.0 ~ 8.9 | 리소스가 침해되어 무단 사용 중. 즉시 조치 (인스턴스 정리, IAM 자격 증명 교체 등) |
| Medium | 4.0 ~ 6.9 | 평소와 다른 의심 활동. 승인된 활동인지 빨리 조사 |
| Low | 1.0 ~ 3.9 | 침해되지 않은 시도 (포트 스캔 등). 즉시 조치는 없고 기록 |
눈여겨볼 finding 예시
ECS Fargate, S3 업로드 버킷, IAM을 쓰는 환경을 기준으로 골랐습니다.
| finding 유형 | 기본 심각도 | 내용 |
|---|---|---|
| UnauthorizedAccess:IAMUser/ResourceCredentialExfiltration.OutsideAWS | High | ECS 태스크나 Lambda 자격 증명이 AWS 밖에서 사용됨 |
| CredentialAccess:IAMUser/CompromisedCredentials | High | 위협 인텔리전스가 유출로 판단한 액세스 키 사용 |
| UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B | Medium | 같은 사용자가 여러 지역에서 동시에 콘솔 로그인 |
| Stealth:IAMUser/CloudTrailLoggingDisabled | Low | 트레일 삭제나 변경, 로그 버킷 삭제 |
| Policy:IAMUser/RootCredentialUsage | Low | 루트 사용자 자격 증명으로 API 호출 |
| CryptoCurrency:Runtime/BitcoinTool.B | High | 컨테이너가 암호화폐 관련 IP 조회 |
| Execution:Runtime/ReverseShell | High | 컨테이너에서 리버스 셸 생성 |
| Object:S3/MaliciousFile | High | 업로드 객체에서 악성코드 탐지 |
샘플 결과로 동작 확인하기
- 콘솔: 설정 → 샘플 결과 생성. 유형마다 1건씩 만들어지고 제목이
[SAMPLE]로 시작합니다. - CLI로 필요한 유형만 만들 수도 있습니다. 실제로 해 보니 Runtime 유형은 리소스 종류별로 여러 건이 생겨 8개 유형에 17건이 만들어졌습니다.
aws guardduty create-sample-findings --detector-id <ID> \
--finding-types "Object:S3/MaliciousFile" "Execution:Runtime/ReverseShell"
- 샘플은 EventBridge 규칙과 필터를 시험할 때 씁니다. GuardDuty에는 finding을 지우는 API가 없습니다(보관과 보관 해제만 있음).
시험이 끝나면 보관 처리하고, 보관한 finding은 90일 뒤 사라집니다.
샘플 결과 17건이 들어온 결과 목록 (제목 앞 [샘플])
aws guardduty archive-findings --detector-id <ID> --finding-ids <ID1> <ID2> ...
finding 상세 패널: 유형, 심각도, 대상 리소스, 시각 (계정 ID 가림)
알림 연결: EventBridge
- 새 finding은 거의 실시간으로 EventBridge에 전송됩니다.
- 같은 finding이 반복되면 묶어서 6시간(기본), 1시간, 15분 주기로 보냅니다.
- 규칙 대상으로 SNS(이메일), Amazon Q Developer in chat applications(Slack), Lambda를 연결합니다.
{"source": ["aws.guardduty"], "detail-type": ["GuardDuty Finding"]}
90일보다 오래 남기기: S3 내보내기
- GuardDuty는 finding을 90일 보관합니다. 더 오래 남기려면 S3로 내보냅니다.
- 같은 리전의 KMS 키와 버킷 정책이 필요하고 리전마다 설정합니다. 보관 처리된 finding은 내보내지 않습니다.
오탐 줄이기: 억제 규칙과 신뢰 목록
- 억제 규칙: 조건에 맞는 새 finding을 자동으로 보관합니다. 보관된 finding은 EventBridge, S3, Security Hub로 가지 않지만 콘솔에서 90일간 볼 수 있습니다. AWS는 반복 오탐이 확인된 유형에만 좁게 만들라고 권합니다. 넓게 만들면 Extended Threat Detection이 그 finding을 공격 시퀀스 신호로 쓰지 못합니다.
- 신뢰 목록과 위협 목록: 신뢰 목록에 있는 IP와 도메인은 finding을 만들지 않고(계정과 리전당 1개), 위협 목록에 있는 것은 finding을 만듭니다(최대 6개). 공용 IPv4와 도메인에만 적용되고 반영까지 약 15분(최대 40분) 걸립니다.
CloudTrail로 경위 추적
finding에 나온 주체, 액세스 키, 시각으로 CloudTrail 기록을 찾습니다.
- 최근 90일: 이벤트 기록에서 속성 하나와 시간 범위로 검색합니다. 쓸 수 있는 속성은 EventId, EventName, ReadOnly, Username, ResourceType, ResourceName, EventSource, AccessKeyId입니다. 데이터 이벤트와 Insights 이벤트는 보이지 않습니다.
aws cloudtrail lookup-events \
--lookup-attributes AttributeKey=AccessKeyId,AttributeValue=<키 ID> \
--start-time 2026-11-03T00:00:00Z
- 90일 이후: 트레일 S3 로그를 Athena로 조회합니다. CloudTrail 콘솔 이벤트 기록 → Athena 테이블 생성 → 트레일 버킷을 고르면 됩니다(조직 트레일은 Athena 콘솔에서 직접 만듭니다).
- finding에서 볼 값: 액세스 키 ID가 AKIA로 시작하면 장기 키, ASIA로 시작하면 STS 임시 키입니다. 역할이면 CloudTrail 기록의 sessionIssuer로 발급 경위를 봅니다.
대응 절차
- finding 확인: 유형, 심각도, 리소스, API, IP
- CloudTrail로 주체와 시각 확인
- 당사자에게 그 시각에 그 IP에서 그 API를 호출했는지 확인
- 정상이면 억제 규칙, 확인이 안 되면 침해로 보고 조치
- 조치 결과 기록 (S3 내보내기로 90일 이후에도 보관)
| 대상 | 권장 조치 |
|---|---|
| IAM 자격 증명 | IAM 콘솔에서 권한과 Access Advisor 확인, 자격 증명 교체, AWS re:Post "My AWS account may be compromised" 절차 |
| ECS 태스크 | 컨테이너 이미지 악성코드 확인, ListTasks로 같은 이미지를 쓰는 태스크 찾기, 영향 태스크의 인바운드와 아웃바운드 차단 |
| S3 객체 | S3ObjectDetails로 객체 확인, 태그 기반 접근 제어로 격리, 필요 없으면 삭제나 격리 버킷으로 이동 |
7. 비용
CloudTrail (서울과 미국 동부 단가 동일)
| 항목 | 단가 |
|---|---|
| 관리 이벤트 첫 사본 | 무료 (S3 저장 비용 별도) |
| 관리 이벤트 추가 사본 | 10만 건당 2.00 USD |
| 데이터 이벤트 | 10만 건당 0.10 USD |
| Insights 이벤트 | 분석 10만 건당 0.35 USD |
GuardDuty (서울)
| 항목 | 단가 |
|---|---|
| CloudTrail 관리 이벤트 분석 | 100만 건당 4.60 USD |
| VPC 흐름 로그, DNS 로그 | GB당 1.15 USD (첫 500GB) |
| S3 데이터 이벤트 | 100만 건당 0.90 USD |
| Runtime Monitoring | vCPU당 월 1.66 USD |
| RDS Protection | vCPU당 월 1.20 USD |
| Malware Protection for S3 | 검사 GB당 0.1095 USD |
- 30일 무료 체험은 계정과 리전마다 따로 적용됩니다.
플랜마다 표시되는 무료 평가판 30일 배지
- 체험 기간에 CloudWatch
AWS/GuardDuty사용량 지표로 실제 양을 보고 Pricing Calculator로 월 비용을 추정한 뒤 유지할 플랜을 정합니다. 체험 3주차쯤 Billing에서 예상 비용을 한 번 보는 것을 권합니다. - 일시 중지는 finding을 남기고 GuardDuty 요금이 나가지 않습니다. 비활성화는 finding과 설정을 지웁니다. 둘 다 Malware Protection for S3 요금은 멈추지 않습니다.
8. 권장 도입 순서 (공식 문서 내용을 바탕으로 정리한 권장안)
- 다중 리전 트레일과 전용 버킷 구성
- 로그 파일 무결성 검증과 CloudWatch 알람
- 지원되는 모든 리전에서 GuardDuty 활성화
- 리소스가 있는 보호 플랜만 활성화
- finding을 EventBridge로 알림 연결
- 샘플 결과로 알림과 대응 절차 시험
- 체험 3주차에 사용량과 예상 비용 확인
- 유지할 보호 플랜 확정
참고 문서
- CloudTrail 사용 설명서: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html
- CloudTrail 보안 모범 사례: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/best-practices-security.html
- CLI로 트레일 생성: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail-by-using-the-aws-cli-create-trail.html
- 이벤트 기록: https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html
- Athena로 CloudTrail 로그 조회: https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html
- GuardDuty 사용 설명서: https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html
- GuardDuty 요금과 무료 체험: https://docs.aws.amazon.com/guardduty/latest/ug/guardduty-pricing.html
- AI Protection: https://docs.aws.amazon.com/guardduty/latest/ug/ai-protection.html
- Fargate Runtime Monitoring 전제 조건: https://docs.aws.amazon.com/guardduty/latest/ug/prereq-runtime-monitoring-ecs-support.html
- Malware Protection for S3: https://docs.aws.amazon.com/guardduty/latest/ug/gdu-malware-protection-s3.html
- finding 형식: https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_finding-format.html
- finding 심각도: https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings-severity.html
- 샘플 결과 생성: https://docs.aws.amazon.com/guardduty/latest/ug/sample_findings.html
- EventBridge로 finding 처리: https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings_eventbridge.html
- 억제 규칙: https://docs.aws.amazon.com/guardduty/latest/ug/findings_suppression-rule.html
- finding 대응(Remediating): https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_remediate.html
- CloudTrail 요금: https://aws.amazon.com/cloudtrail/pricing/
- GuardDuty 요금: https://aws.amazon.com/guardduty/pricing/