IMDS(Instance Metadata Service)란
EC2 인스턴스 내부에서 http://169.254.169.254/로 접근하면 인스턴스 자신의 메타데이터를 조회할 수 있는 서비스입니다.
조회 가능한 정보:
- 인스턴스 ID, 리전, AZ
- 보안 그룹, 네트워크 정보
- IAM Role의 임시 자격증명 (Access Key, Secret Key, Session Token)
- UserData (인스턴스 시작 스크립트)
IMDSv1 vs IMDSv2
| IMDSv1 | IMDSv2 | |
|---|---|---|
| 요청 방식 | 단순 GET 요청 | PUT으로 토큰 발급 → 토큰으로 GET 요청 (2단계) |
| SSRF 공격 | 취약 | 방어됨 (토큰 발급 시 PUT 필요, 리다이렉트 차단) |
| 도입 시기 | EC2 출시부터 | 2019년 11월 |
# IMDSv1 (토큰 없이 바로 조회 - 위험)
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/[role-name]
# IMDSv2 (토큰 발급 후 조회 - 안전)
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/[role-name]SSRF 공격으로 인한 실제 피해 사례
Capital One 해킹 사건 (2019년)
- 피해 규모: 1억 600만 명 개인정보 유출, 벌금 $8,000만 이상
- 공격 방식: WAF의 SSRF 취약점 → EC2 메타데이터(IMDSv1)에서 IAM Role 자격증명 탈취 → S3 버킷 700개 접근
- 이 사건 이후 AWS가 IMDSv2를 출시
참고: Krebs on Security, Wiz.io
SSRF → IAM 자격증명 탈취 → RCE 공격 시나리오
1. 웹 애플리케이션의 SSRF 취약점 발견
→ 서버가 사용자 입력 URL로 요청을 보내는 기능 악용
2. SSRF로 EC2 메타데이터 접근
→ http://169.254.169.254/latest/meta-data/iam/security-credentials/[role-name]
→ IAM Role의 AccessKeyId, SecretAccessKey, Token 획득
3. 탈취한 자격증명으로 AWS 리소스 접근
→ S3 버킷 데이터 다운로드, EC2 인스턴스 제어
4. (심화) UserData를 이용한 원격 코드 실행(RCE)
→ 인스턴스 중지 → UserData에 리버스 쉘 삽입 → 재시작 시 쉘 탈취
IMDSv2가 SSRF를 방어하는 원리
IMDSv2는 토큰 발급 시 PUT 요청이 필요한데, 일반적인 SSRF 취약점은 GET/POST 리다이렉트만 가능하고 PUT 요청을 보내기 어렵습니다. 또한 커스텀 헤더(X-aws-ec2-metadata-token-ttl-seconds)가 필수인데, SSRF로는 커스텀 헤더 추가가 어렵습니다.
| SSRF 공격 단계 | IMDSv1 | IMDSv2 |
|---|---|---|
| 메타데이터 URL 접근 | GET으로 바로 가능 | 토큰 없이 접근 불가 |
| 토큰 발급 | 불필요 | PUT + 커스텀 헤더 필요 (SSRF로 어려움) |
| 자격증명 탈취 | 성공 | 차단됨 |
현재 상태 확인 방법
CLI로 확인
aws ec2 describe-instances \
--instance-ids i-[instance-id] \
--query "Reservations[*].Instances[*].MetadataOptions.HttpTokens" \
--output text
# "required" → 안전 / "optional" → 위험콘솔에서 확인
EC2 콘솔 → 인스턴스 선택 → "세부 정보" 탭 → "인스턴스 메타데이터 옵션" 섹션에서 IMDSv2 값을 확인합니다.
- "필수(Required)" → IMDSv2만 허용 (안전)
- "선택 사항(Optional)" → IMDSv1도 허용 (위험)
IMDSv2 강제 적용 방법
aws ec2 modify-instance-metadata-options \
--instance-id i-[instance-id] \
--http-tokens required \
--http-endpoint enabled인스턴스 재부팅 불필요, 즉시 적용됩니다.
적용 전 확인사항
IMDSv2를 "필수"로 변경하면 IMDSv1 요청이 즉시 차단됩니다.
| 확인 항목 | 확인 방법 |
|---|---|
| AWS SDK 버전 | 2019년 이후 버전이면 IMDSv2 자동 지원 |
| CloudWatch Agent | v1.247350.0 이상이면 지원 |
| SSM Agent | v2.3.672.0 이상이면 지원 |
| 직접 작성한 스크립트 | curl http://169.254.169.254/... 형태의 IMDSv1 호출 확인 |
CloudWatch 메트릭으로 IMDSv1 사용 여부 확인
EC2 인스턴스의 MetadataNoToken 메트릭 값을 확인하면 IMDSv1 요청 횟수를 알 수 있습니다.
- 값이 0 → IMDSv1 사용 프로세스 없음 → 안전하게 IMDSv2 강제 가능
- 값이 0보다 큼 → 해당 프로세스 업데이트 필요
적용 우선순위
| 우선순위 | 대상 | 이유 |
|---|---|---|
| 높음 | 웹 애플리케이션 실행 인스턴스 | SSRF 취약점 노출 가능성 높음 |
| 높음 | IAM Role이 할당된 인스턴스 | 자격증명 탈취 시 피해 큼 |
| 높음 | 퍼블릭 서브넷 인스턴스 | 외부 공격 표면 넓음 |
| 중간 | 프라이빗 서브넷 인스턴스 | 내부에서만 접근 가능하지만 보험 차원 |
| 낮음 | IAM Role 없는 인스턴스 | 탈취할 자격증명 없음 |
정리
- IMDSv1은 SSRF 공격으로 IAM 자격증명이 탈취될 수 있는 심각한 보안 취약점
- Capital One 해킹 사건(1억 600만 명 유출)이 대표적 실제 피해 사례
- IMDSv2는 PUT + 커스텀 헤더 기반 토큰 발급으로 SSRF를 원천 차단
MetadataNoToken메트릭으로 사전 영향도 확인 후 안전하게 적용 가능- AWS Config
ec2-imdsv2-check규칙으로 미적용 인스턴스 지속 감시