GuardDuty 위협 탐지 - 정답 및 해설
"AWS 계정의 보안 위협을 AI가 자동으로 탐지하자"
강사 안내
- GuardDuty 활성화는 매우 간단하므로 개념 설명에 시간을 더 할애하세요
- 샘플 결과 분석 시 심각도별 대응 전략을 강조하세요
- 실제 위협이 아닌 샘플 결과임을 반드시 안내하세요 ([SAMPLE] 표시)
- Chapter 14 리소스 정리 시 GuardDuty 비활성화를 잊지 않도록 안내하세요
Step 1 정답: GuardDuty 활성화
정답
웹 콘솔 풀이
- AWS 콘솔에 로그인합니다.
- 상단 검색창에
GuardDuty를 입력하고 Amazon GuardDuty 서비스를 선택합니다. - 리전이 아시아 태평양 (서울) ap-northeast-2인지 확인합니다.
- "Get Started" 또는 "시작하기" 버튼을 클릭합니다.
- "Enable GuardDuty" 또는 "GuardDuty 활성화" 버튼을 클릭합니다.
- GuardDuty 대시보드가 표시되면 활성화 완료입니다.
AWS CLI 풀이
# GuardDuty 활성화 (Detector 생성)
aws guardduty create-detector \
--enable \
--region ap-northeast-2
# 출력 예시:
# {
# "DetectorId": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
# }
# Detector ID 저장 (이후 명령어에서 사용)
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
echo "Detector ID: ${DETECTOR_ID}"
GuardDuty는 리전별로 독립적으로 동작합니다. 서울 리전(ap-northeast-2)에서 활성화하면 서울 리전의 리소스만 모니터링합니다. 다른 리전도 모니터링하려면 각 리전에서 별도로 활성화해야 합니다.
Detector는 GuardDuty의 핵심 리소스입니다. 활성화하면 Detector가 생성되고, 이 Detector가 데이터 소스를 수집하고 분석합니다. Detector ID는 CLI에서 GuardDuty를 제어할 때 필요합니다.
30일 무료 체험: 활성화 시점부터 30일간 무료로 사용할 수 있습니다. Usage 메뉴에서 남은 무료 체험 기간과 예상 비용을 확인할 수 있습니다.
Step 2 정답: GuardDuty 대시보드 확인
정답
웹 콘솔 풀이
- Findings (결과) 메뉴 클릭:
- 현재 비어 있는 것이 정상입니다 (방금 활성화했으므로)
- "No findings" 또는 "결과 없음" 메시지가 표시됩니다
- Settings (설정) 메뉴 클릭:
- Detector ID를 확인합니다 (예:
a1b2c3d4e5f6...) - 데이터 소스 섹션에서 다음이 활성화되어 있는지 확인:
- CloudTrail management events: Enabled
- VPC Flow Logs: Enabled
- DNS logs: Enabled
- S3 data events: Enabled
- Detector ID를 확인합니다 (예:
- Usage (사용량) 메뉴 클릭:
- 무료 체험 남은 일수를 확인합니다
- 데이터 소스별 분석량과 예상 비용이 표시됩니다
- 방금 활성화했으므로 분석량이 거의 0에 가까울 수 있습니다
AWS CLI 풀이
# Detector ID 가져오기
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
echo "Detector ID: ${DETECTOR_ID}"
# Detector 상태 및 설정 확인
aws guardduty get-detector \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2
# 출력 예시:
# {
# "CreatedAt": "2026-03-03T10:00:00.000Z",
# "FindingPublishingFrequency": "SIX_HOURS",
# "ServiceRole": "arn:aws:iam::xxxx:role/aws-service-role/guardduty.amazonaws.com/...",
# "Status": "ENABLED",
# "DataSources": {
# "CloudTrail": { "Status": "ENABLED" },
# "DNSLogs": { "Status": "ENABLED" },
# "FlowLogs": { "Status": "ENABLED" },
# "S3Logs": { "Status": "ENABLED" }
# }
# }
# 현재 Findings 목록 확인 (아직 비어 있을 것)
aws guardduty list-findings \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2
# 출력 예시:
# {
# "FindingIds": []
# }
Detector 상태: "Status": "ENABLED"가 표시되면 GuardDuty가 정상적으로 활성화된 것입니다.
데이터 소스 4가지가 모두 "Status": "ENABLED"인지 확인합니다:
- CloudTrail: 관리 이벤트 (API 호출) 분석
- DNSLogs: EC2의 DNS 쿼리 분석 (악성 도메인 탐지)
- FlowLogs: VPC 네트워크 트래픽 분석
- S3Logs: S3 데이터 이벤트 분석
FindingPublishingFrequency: 결과를 CloudWatch Events에 게시하는 빈도입니다. 기본값은 6시간(SIX_HOURS)이지만, 새로운 결과는 즉시 콘솔에서 확인할 수 있습니다.
Step 3 정답: GuardDuty 샘플 결과 생성
정답
웹 콘솔 풀이
- GuardDuty 콘솔 왼쪽 메뉴에서 Settings (설정)를 클릭합니다.
- 페이지에서 "Generate sample findings" (샘플 결과 생성) 버튼을 찾아 클릭합니다.
- "Sample findings were successfully generated" 메시지가 표시되면 성공입니다.
- 왼쪽 메뉴에서 Findings (결과)를 클릭합니다.
- 다양한 유형의 샘플 결과가 생성되어 있는 것을 확인합니다.
- 모든 샘플 결과에는 [SAMPLE] 접두사가 붙어 있습니다.
AWS CLI 풀이
# Detector ID 가져오기
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
# 방법 1: 모든 유형의 샘플 결과 생성 (finding-types 생략 시 전체 생성)
aws guardduty create-sample-findings \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2
echo "모든 유형의 샘플 결과가 생성되었습니다."
# 방법 2: 특정 유형의 샘플 결과만 생성
aws guardduty create-sample-findings \
--detector-id ${DETECTOR_ID} \
--finding-types \
"Recon:EC2/PortProbeUnprotectedPort" \
"UnauthorizedAccess:EC2/SSHBruteForce" \
"CryptoCurrency:EC2/BitcoinTool.B!DNS" \
--region ap-northeast-2
echo "특정 유형의 샘플 결과가 생성되었습니다."
# 생성된 결과 개수 확인
FINDING_COUNT=$(aws guardduty list-findings \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2 \
--query "length(FindingIds)" \
--output text)
echo "현재 Findings 수: ${FINDING_COUNT}"
create-sample-findings 명령어에서 --finding-types를 생략하면 GuardDuty가 지원하는 모든 유형의 샘플 결과가 한꺼번에 생성됩니다. 수십 개의 다양한 위협 유형이 생성되어 Findings 목록이 가득 찹니다.
특정 유형만 생성하고 싶다면 --finding-types에 원하는 유형을 나열합니다. 주요 유형은 다음과 같습니다:
Recon:EC2/PortProbeUnprotectedPort- 포트 스캔 탐지UnauthorizedAccess:EC2/SSHBruteForce- SSH 무차별 대입 공격CryptoCurrency:EC2/BitcoinTool.B!DNS- 암호화폐 채굴 탐지UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B- 비정상 콘솔 로그인Exfiltration:S3/AnomalousBehavior- S3 데이터 유출 의심
모든 샘플 결과에는 [SAMPLE] 표시가 붙으므로 실제 위협과 혼동할 걱정이 없습니다.
Step 4 정답: 샘플 결과 분석
정답
웹 콘솔 풀이
- GuardDuty → Findings 페이지로 이동합니다.
- Severity 열 헤더를 클릭하여 심각도 기준으로 정렬합니다 (높은 순).
- High 심각도의 결과를 하나 클릭합니다 (예:
[SAMPLE] CryptoCurrency:EC2/BitcoinTool.B!DNS).- 오른쪽 상세 패널이 열립니다
- Finding type: CryptoCurrency:EC2/BitcoinTool.B!DNS
- Severity: 8 (High)
- Description: EC2 인스턴스가 비트코인 관련 도메인에 DNS 쿼리를 수행
- Resource affected: EC2 인스턴스 ID, 인스턴스 타입
- Action: DNS 쿼리 관련 정보 (쿼리된 도메인명 등)
- Actor: 위협 행위자 정보
- Medium 심각도의 결과를 하나 클릭하여 상세 정보를 확인합니다.
- Low 심각도의 결과를 하나 클릭하여 상세 정보를 확인합니다.
- 각 심각도별로 Finding type, Resource, Action의 차이를 비교합니다.
주요 샘플 결과 분석 예시
| Finding Type | 심각도 | 의미 | 권장 대응 |
|---|---|---|---|
CryptoCurrency:EC2/BitcoinTool.B!DNS |
High (8) | EC2 인스턴스가 암호화폐 채굴 관련 DNS 쿼리 수행 | 즉시 EC2 인스턴스 격리, 침해 조사 |
UnauthorizedAccess:EC2/SSHBruteForce |
Low (2) | EC2 인스턴스에 SSH 무차별 대입 로그인 시도 | SSH 포트를 특정 IP로 제한 (보안 그룹) |
Recon:EC2/PortProbeUnprotectedPort |
Low (2) | 보호되지 않은 포트에 대한 외부 포트 스캔 | 불필요한 포트 닫기, 보안 그룹 점검 |
UnauthorizedAccess:IAMUser/ConsoleLoginSuccess.B |
Medium (5) | 비정상적인 위치/IP에서 콘솔 로그인 성공 | 해당 IAM 사용자의 활동 조사, MFA 확인 |
AWS CLI 풀이
# Detector ID 가져오기
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
# ===== High 심각도 (7.0 이상) 결과 조회 =====
echo "=== High 심각도 결과 ==="
HIGH_FINDING_IDS=$(aws guardduty list-findings \
--detector-id ${DETECTOR_ID} \
--finding-criteria '{
"Criterion": {
"severity": {"Gte": 7}
}
}' \
--max-results 5 \
--region ap-northeast-2 \
--query "FindingIds" \
--output json)
echo "High Finding IDs: ${HIGH_FINDING_IDS}"
# High 심각도 결과 상세 조회
aws guardduty get-findings \
--detector-id ${DETECTOR_ID} \
--finding-ids ${HIGH_FINDING_IDS} \
--region ap-northeast-2 \
--query "Findings[*].{Type:Type,Severity:Severity,Title:Title,Description:Description}" \
--output table
# ===== Medium 심각도 (4.0 ~ 6.9) 결과 조회 =====
echo ""
echo "=== Medium 심각도 결과 ==="
MEDIUM_FINDING_IDS=$(aws guardduty list-findings \
--detector-id ${DETECTOR_ID} \
--finding-criteria '{
"Criterion": {
"severity": {"Gte": 4, "Lt": 7}
}
}' \
--max-results 5 \
--region ap-northeast-2 \
--query "FindingIds" \
--output json)
aws guardduty get-findings \
--detector-id ${DETECTOR_ID} \
--finding-ids ${MEDIUM_FINDING_IDS} \
--region ap-northeast-2 \
--query "Findings[*].{Type:Type,Severity:Severity,Title:Title}" \
--output table
# ===== Low 심각도 (1.0 ~ 3.9) 결과 조회 =====
echo ""
echo "=== Low 심각도 결과 ==="
LOW_FINDING_IDS=$(aws guardduty list-findings \
--detector-id ${DETECTOR_ID} \
--finding-criteria '{
"Criterion": {
"severity": {"Gte": 1, "Lt": 4}
}
}' \
--max-results 5 \
--region ap-northeast-2 \
--query "FindingIds" \
--output json)
aws guardduty get-findings \
--detector-id ${DETECTOR_ID} \
--finding-ids ${LOW_FINDING_IDS} \
--region ap-northeast-2 \
--query "Findings[*].{Type:Type,Severity:Severity,Title:Title}" \
--output table
# ===== 특정 결과 상세 조회 (전체 JSON) =====
echo ""
echo "=== 특정 결과 상세 정보 ==="
# 첫 번째 High Finding의 전체 상세 정보 조회
FIRST_HIGH_ID=$(echo ${HIGH_FINDING_IDS} | python3 -c "import sys,json; print(json.load(sys.stdin)[0])")
aws guardduty get-findings \
--detector-id ${DETECTOR_ID} \
--finding-ids "[\"${FIRST_HIGH_ID}\"]" \
--region ap-northeast-2
Finding 상세 정보의 구성 요소:
- Type: Finding 유형.
ThreatPurpose:ResourceTypeAffected/ThreatFamilyName.Variant!Artifact형식입니다. - Severity: 1.0~10.0 사이의 수치. 높을수록 위험합니다.
- Resource: 영향 받은 AWS 리소스 (EC2 인스턴스, IAM 사용자, S3 버킷 등).
- Action: 탐지된 활동의 상세 내용 (네트워크 연결, API 호출, DNS 쿼리 등).
- Actor: 위협 행위자 정보 (IP 주소, 지리적 위치, ISP 등).
CLI에서 --finding-criteria: JSON 형식으로 필터 조건을 지정합니다. severity 필드에 Gte(이상), Lt(미만) 등의 비교 연산자를 사용할 수 있습니다.
--query 옵션: JMESPath 쿼리를 사용하여 출력에서 필요한 필드만 추출할 수 있습니다. --output table과 함께 사용하면 보기 좋게 표시됩니다.
심각도별 대응 가이드
학생들에게 실무에서의 대응 프로세스를 설명할 때 다음 표를 활용하세요.
| 심각도 | 수치 | 예시 | 대응 절차 |
|---|---|---|---|
| High | 7.0 ~ 10.0 | 암호화폐 채굴, 자격 증명 유출 |
1. 즉시 영향받은 리소스 격리 (보안 그룹 변경) 2. CloudTrail에서 관련 API 호출 조사 3. 자격 증명 교체 (IAM 키 비활성화/삭제) 4. 근본 원인 분석 및 재발 방지 |
| Medium | 4.0 ~ 6.9 | 비정상 콘솔 로그인, 이상 API 호출 |
1. 해당 사용자/리소스의 최근 활동 조사 2. CloudTrail에서 상세 로그 확인 3. 정상 활동인지 확인, 비정상이면 조치 4. MFA 활성화 등 보안 강화 |
| Low | 1.0 ~ 3.9 | 포트 스캔, SSH 시도 |
1. 보안 그룹 규칙 점검 2. 불필요한 포트 닫기 3. 반복되면 IP 차단 고려 4. 기록 및 모니터링 |
High: 건물에 불이 났다! → 즉시 소방서 호출하고 대피
Medium: 수상한 사람이 건물 복도를 배회한다 → 경비원이 확인하고 신원 파악
Low: 누군가 건물 문을 흔들어 봤다 → CCTV 확인하고 잠금 상태 점검
트러블슈팅 가이드
자주 발생하는 문제와 해결 방법
원인: 같은 리전에서 이미 GuardDuty가 활성화되어 있습니다. 이전에 활성화한 적이 있거나, 다른 실습에서 활성화했을 수 있습니다.
해결: 이미 활성화되어 있으므로 다음 단계(Step 2)로 진행하면 됩니다.
# 이미 활성화된 Detector 확인
aws guardduty list-detectors \
--region ap-northeast-2
# Detector 상태 확인
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
aws guardduty get-detector \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2 \
--query "Status" \
--output text
# "ENABLED"가 출력되면 정상
원인: Settings 페이지의 위치가 AWS 콘솔 업데이트로 변경되었을 수 있습니다.
해결:
- 왼쪽 메뉴에서 Settings를 클릭합니다.
- 페이지를 아래로 스크롤하여 "Sample findings" 또는 "샘플 결과" 섹션을 찾습니다.
- 버튼이 보이지 않으면 CLI로 생성합니다:
# CLI로 샘플 결과 생성
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
aws guardduty create-sample-findings \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2
echo "샘플 결과가 생성되었습니다. Findings 페이지를 확인하세요."
원인: Detector ID가 잘못되었거나, 다른 리전의 Detector ID를 사용하고 있습니다.
해결:
# 올바른 리전에서 Detector ID 확인
aws guardduty list-detectors --region ap-northeast-2
# Detector가 없으면 새로 생성
aws guardduty create-detector \
--enable \
--region ap-northeast-2
# 리전을 명시적으로 지정하여 명령 실행
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
echo "Detector ID: ${DETECTOR_ID}"
원인: 필터가 적용되어 있거나, 시간 범위 필터 때문에 결과가 숨겨져 있을 수 있습니다.
해결:
- Findings 페이지 상단의 필터 바에서 모든 필터를 제거합니다.
- 시간 범위가 "Last 1 hour" 또는 "지난 1시간"으로 설정되어 있는지 확인합니다.
- 페이지를 새로고침(F5)합니다.
- 여전히 보이지 않으면 샘플 결과를 다시 생성합니다.
원인: 현재 IAM 사용자 또는 역할에 GuardDuty 관련 권한이 없습니다.
해결: 관리자(Administrator) 권한이 있는 IAM 사용자로 실행하거나, 다음 권한을 추가합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"guardduty:CreateDetector",
"guardduty:ListDetectors",
"guardduty:GetDetector",
"guardduty:CreateSampleFindings",
"guardduty:ListFindings",
"guardduty:GetFindings"
],
"Resource": "*"
}
]
}
이 실습에서는 AWS 콘솔(웹)에서 관리자 계정으로 진행하는 것을 권장합니다.
학생이 문제를 겪을 때 다음 순서로 디버깅하면 효율적입니다:
- 리전 확인: 콘솔 우측 상단이
ap-northeast-2(서울)인지 확인 - GuardDuty 상태 확인: Settings에서 "Status: Enabled" 확인
- Detector ID 확인: Settings에서 Detector ID 메모
- 필터 제거: Findings 페이지의 필터를 모두 제거
- CLI 리전 옵션:
--region ap-northeast-2명시적 지정
리소스 정리 참고 (Chapter 14)
Chapter 14 리소스 정리 시 GuardDuty를 반드시 비활성화하세요. 30일 무료 체험 종료 후 과금이 발생합니다.
웹 콘솔에서 비활성화
- GuardDuty → Settings (설정)
- 페이지 하단의 "Suspend GuardDuty" 또는 "Disable GuardDuty" 섹션을 찾습니다.
- "Disable GuardDuty"를 클릭합니다.
- 확인 창에서 "Disable"을 클릭합니다.
Suspend (일시 중지): GuardDuty를 일시 중지합니다. 기존 Findings는 보존되지만 새로운 분석은 중단됩니다. 나중에 다시 활성화할 수 있습니다.
Disable (비활성화): GuardDuty를 완전히 비활성화합니다. 모든 Findings와 설정이 삭제됩니다. 실습 후에는 Disable을 선택하세요.
AWS CLI에서 비활성화
# Detector ID 확인
DETECTOR_ID=$(aws guardduty list-detectors \
--region ap-northeast-2 \
--query "DetectorIds[0]" \
--output text)
echo "Detector ID: ${DETECTOR_ID}"
# 방법 1: GuardDuty 일시 중지 (Suspend)
# aws guardduty update-detector \
# --detector-id ${DETECTOR_ID} \
# --no-enable \
# --region ap-northeast-2
# 방법 2: GuardDuty 완전 비활성화 (Disable) - 실습 후 권장
aws guardduty delete-detector \
--detector-id ${DETECTOR_ID} \
--region ap-northeast-2
echo "GuardDuty가 비활성화되었습니다."
# 비활성화 확인
aws guardduty list-detectors \
--region ap-northeast-2
# DetectorIds가 빈 배열이면 완전 삭제 완료
Chapter 14의 리소스 정리 순서에서 GuardDuty 비활성화는 CloudWatch/SNS 삭제 단계(Step 1~2) 직후에 수행하는 것을 권장합니다. 모니터링/보안 서비스를 먼저 정리한 후 인프라 리소스를 삭제하는 순서가 효율적입니다.
학생들에게 Chapter 14 리소스 정리 시 "CloudTrail 추적 삭제 + GuardDuty 비활성화"를 함께 안내하세요.