Chapter 13 정답

GuardDuty 위협 탐지 - 정답 및 해설

"AWS 계정의 보안 위협을 AI가 자동으로 탐지하자"

강사 안내

  • GuardDuty 활성화는 매우 간단하므로 개념 설명에 시간을 더 할애하세요
  • 샘플 결과 분석 시 심각도별 대응 전략을 강조하세요
  • 실제 위협이 아닌 샘플 결과임을 반드시 안내하세요 ([SAMPLE] 표시)
  • Chapter 14 리소스 정리 시 GuardDuty 비활성화를 잊지 않도록 안내하세요

Step 1 정답: GuardDuty 활성화

정답

웹 콘솔 풀이

  1. AWS 콘솔에 로그인합니다.
  2. 상단 검색창에 GuardDuty를 입력하고 Amazon GuardDuty 서비스를 선택합니다.
  3. 리전이 아시아 태평양 (서울) ap-northeast-2인지 확인합니다.
  4. "Get Started" 또는 "시작하기" 버튼을 클릭합니다.
  5. "Enable GuardDuty" 또는 "GuardDuty 활성화" 버튼을 클릭합니다.
  6. GuardDuty 대시보드가 표시되면 활성화 완료입니다.

AWS CLI 풀이

bash
# 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 대시보드 확인

정답

웹 콘솔 풀이

  1. Findings (결과) 메뉴 클릭:
    • 현재 비어 있는 것이 정상입니다 (방금 활성화했으므로)
    • "No findings" 또는 "결과 없음" 메시지가 표시됩니다
  2. Settings (설정) 메뉴 클릭:
    • Detector ID를 확인합니다 (예: a1b2c3d4e5f6...)
    • 데이터 소스 섹션에서 다음이 활성화되어 있는지 확인:
      • CloudTrail management events: Enabled
      • VPC Flow Logs: Enabled
      • DNS logs: Enabled
      • S3 data events: Enabled
  3. Usage (사용량) 메뉴 클릭:
    • 무료 체험 남은 일수를 확인합니다
    • 데이터 소스별 분석량과 예상 비용이 표시됩니다
    • 방금 활성화했으므로 분석량이 거의 0에 가까울 수 있습니다

AWS CLI 풀이

bash
# 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 샘플 결과 생성

정답

웹 콘솔 풀이

  1. GuardDuty 콘솔 왼쪽 메뉴에서 Settings (설정)를 클릭합니다.
  2. 페이지에서 "Generate sample findings" (샘플 결과 생성) 버튼을 찾아 클릭합니다.
  3. "Sample findings were successfully generated" 메시지가 표시되면 성공입니다.
  4. 왼쪽 메뉴에서 Findings (결과)를 클릭합니다.
  5. 다양한 유형의 샘플 결과가 생성되어 있는 것을 확인합니다.
  6. 모든 샘플 결과에는 [SAMPLE] 접두사가 붙어 있습니다.

AWS CLI 풀이

bash
# 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 정답: 샘플 결과 분석

정답

웹 콘솔 풀이

  1. GuardDuty → Findings 페이지로 이동합니다.
  2. Severity 열 헤더를 클릭하여 심각도 기준으로 정렬합니다 (높은 순).
  3. 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: 위협 행위자 정보
  4. Medium 심각도의 결과를 하나 클릭하여 상세 정보를 확인합니다.
  5. Low 심각도의 결과를 하나 클릭하여 상세 정보를 확인합니다.
  6. 각 심각도별로 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 풀이

bash
# 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 확인하고 잠금 상태 점검

트러블슈팅 가이드

자주 발생하는 문제와 해결 방법

문제 1: "GuardDuty is already enabled" - 이미 활성화되어 있다는 메시지

원인: 같은 리전에서 이미 GuardDuty가 활성화되어 있습니다. 이전에 활성화한 적이 있거나, 다른 실습에서 활성화했을 수 있습니다.

해결: 이미 활성화되어 있으므로 다음 단계(Step 2)로 진행하면 됩니다.

bash
# 이미 활성화된 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"가 출력되면 정상
문제 2: "Generate sample findings" 버튼을 찾을 수 없음

원인: Settings 페이지의 위치가 AWS 콘솔 업데이트로 변경되었을 수 있습니다.

해결:

  1. 왼쪽 메뉴에서 Settings를 클릭합니다.
  2. 페이지를 아래로 스크롤하여 "Sample findings" 또는 "샘플 결과" 섹션을 찾습니다.
  3. 버튼이 보이지 않으면 CLI로 생성합니다:
bash
# 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 페이지를 확인하세요."
문제 3: CLI에서 "DetectorNotFoundException" 에러 발생

원인: Detector ID가 잘못되었거나, 다른 리전의 Detector ID를 사용하고 있습니다.

해결:

bash
# 올바른 리전에서 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}"
문제 4: Findings 페이지에서 샘플 결과가 보이지 않음

원인: 필터가 적용되어 있거나, 시간 범위 필터 때문에 결과가 숨겨져 있을 수 있습니다.

해결:

  1. Findings 페이지 상단의 필터 바에서 모든 필터를 제거합니다.
  2. 시간 범위가 "Last 1 hour" 또는 "지난 1시간"으로 설정되어 있는지 확인합니다.
  3. 페이지를 새로고침(F5)합니다.
  4. 여전히 보이지 않으면 샘플 결과를 다시 생성합니다.
문제 5: CLI에서 권한 부족(AccessDeniedException) 에러

원인: 현재 IAM 사용자 또는 역할에 GuardDuty 관련 권한이 없습니다.

해결: 관리자(Administrator) 권한이 있는 IAM 사용자로 실행하거나, 다음 권한을 추가합니다.

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "guardduty:CreateDetector",
        "guardduty:ListDetectors",
        "guardduty:GetDetector",
        "guardduty:CreateSampleFindings",
        "guardduty:ListFindings",
        "guardduty:GetFindings"
      ],
      "Resource": "*"
    }
  ]
}

이 실습에서는 AWS 콘솔(웹)에서 관리자 계정으로 진행하는 것을 권장합니다.

강사 참고: 디버깅 순서

학생이 문제를 겪을 때 다음 순서로 디버깅하면 효율적입니다:

  1. 리전 확인: 콘솔 우측 상단이 ap-northeast-2(서울)인지 확인
  2. GuardDuty 상태 확인: Settings에서 "Status: Enabled" 확인
  3. Detector ID 확인: Settings에서 Detector ID 메모
  4. 필터 제거: Findings 페이지의 필터를 모두 제거
  5. CLI 리전 옵션: --region ap-northeast-2 명시적 지정

리소스 정리 참고 (Chapter 14)

GuardDuty 비활성화 방법

Chapter 14 리소스 정리 시 GuardDuty를 반드시 비활성화하세요. 30일 무료 체험 종료 후 과금이 발생합니다.

웹 콘솔에서 비활성화

  1. GuardDuty → Settings (설정)
  2. 페이지 하단의 "Suspend GuardDuty" 또는 "Disable GuardDuty" 섹션을 찾습니다.
  3. "Disable GuardDuty"를 클릭합니다.
  4. 확인 창에서 "Disable"을 클릭합니다.
Suspend vs Disable

Suspend (일시 중지): GuardDuty를 일시 중지합니다. 기존 Findings는 보존되지만 새로운 분석은 중단됩니다. 나중에 다시 활성화할 수 있습니다.

Disable (비활성화): GuardDuty를 완전히 비활성화합니다. 모든 Findings와 설정이 삭제됩니다. 실습 후에는 Disable을 선택하세요.

AWS CLI에서 비활성화

bash
# 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 리소스 정리 순서에서의 위치

Chapter 14의 리소스 정리 순서에서 GuardDuty 비활성화는 CloudWatch/SNS 삭제 단계(Step 1~2) 직후에 수행하는 것을 권장합니다. 모니터링/보안 서비스를 먼저 정리한 후 인프라 리소스를 삭제하는 순서가 효율적입니다.

학생들에게 Chapter 14 리소스 정리 시 "CloudTrail 추적 삭제 + GuardDuty 비활성화"를 함께 안내하세요.