EC2 메타데이터 서비스 v2 (IMDSv2)
학습 목표
- EC2 인스턴스 메타데이터 서비스(IMDS)의 역할을 이해한다
- IMDSv1의 보안 취약점과 SSRF 공격 위험을 체험한다
- IMDSv2 전용 모드로 전환하여 보안을 강화한다
- IMDSv2 토큰 기반 방식으로 메타데이터를 안전하게 조회한다
왜 IMDSv2가 필요한가?
EC2 인스턴스는 자기 자신에 대한 정보(인스턴스 ID, IP 주소, IAM 역할 자격증명 등)를 인스턴스 메타데이터 서비스(IMDS)를 통해 조회할 수 있습니다. 이 서비스는 http://169.254.169.254라는 특수한 주소로 접근합니다.
169.254.169.254는 링크-로컬 주소(Link-Local Address)입니다. 이 주소는 인터넷에서 접근할 수 없고, EC2 인스턴스 내부에서만 접근 가능합니다. AWS가 EC2 인스턴스에 자기 자신의 정보를 제공하기 위해 예약한 특수 주소입니다.
마치 "내 정보 조회 창구"와 같은 역할을 합니다. 인스턴스 ID, 할당된 IAM 역할의 임시 자격증명, 네트워크 정보 등을 HTTP 요청으로 가져올 수 있습니다.
IMDSv1 = 누구나 열 수 있는 서랍장
서랍장에 회사 비밀 서류(IAM 자격증명)가 들어있는데, 잠금장치가 없어서 아무나 서랍을 열고 서류를 가져갈 수 있습니다. 단순히 서랍에 손을 넣기만 하면(GET 요청) 됩니다.
IMDSv2 = 열쇠가 있어야 열 수 있는 금고
금고를 열려면 먼저 열쇠(토큰)를 발급받아야 합니다. 열쇠 발급 과정(PUT 요청)은 금고 앞에 직접 서 있어야만 가능하므로, 원격으로 누군가를 시켜서(SSRF) 열쇠를 받아오는 것이 매우 어렵습니다.
SSRF 공격이란?
SSRF(Server-Side Request Forgery)는 웹 서버에 악의적인 요청을 보내, 서버가 내부 리소스에 대신 접근하도록 속이는 공격입니다.
(포트 5000)
IAM 자격증명 반환
해커가 ShopEasy API 서버에 특수한 요청을 보내면, 서버가 해커 대신 http://169.254.169.254/에 접근하여 IAM 임시 자격증명(AccessKeyId, SecretAccessKey, Token)을 가져와 해커에게 반환합니다. 해커는 이 자격증명으로 S3, DynamoDB 등에 자유롭게 접근할 수 있게 됩니다.
2019년 미국 Capital One은행에서 SSRF 공격으로 1억 명 이상의 고객 개인정보가 유출되었습니다.
- 해커는 WAF(Web Application Firewall)의 취약점을 이용하여 SSRF 공격을 실행
- EC2 인스턴스의 IMDSv1에 접근하여 IAM 역할의 임시 자격증명을 탈취
- 탈취한 자격증명으로 S3 버킷에서 고객 이름, 주소, 신용점수 등 대량 유출
- 피해 규모: 약 1억 6백만 명의 고객 정보, 수억 달러의 손실
ShopEasy의 Node.js API 서버(포트 5000)도 동일한 위험에 노출될 수 있습니다. EC2에 ShopEasy-EC2-Role이 연결되어 있고, 이 역할은 S3, DynamoDB, CloudWatch에 접근할 수 있기 때문입니다!
IMDSv1 vs IMDSv2 비교
| 구분 | IMDSv1 | IMDSv2 |
|---|---|---|
| 인증 방식 | 없음 (단순 GET 요청) | 토큰 필요 (PUT으로 토큰 획득 → GET에 토큰 포함) |
| SSRF 방어 | 취약 (GET 요청은 SSRF로 쉽게 전달) | 안전 (PUT 요청은 SSRF로 전달하기 어려움) |
| 요청 방식 | curl http://169.254.169.254/... |
1) 토큰 발급 (PUT) → 2) 토큰으로 조회 (GET) |
| AWS 권장 | 비권장 | 강력 권장 |
SSRF 공격에서 해커는 보통 URL을 조작하여 서버가 특정 주소로 GET 요청을 보내도록 합니다. 하지만 IMDSv2에서 토큰을 발급받으려면 PUT 요청에 특별한 헤더(X-aws-ec2-metadata-token-ttl-seconds)를 포함해야 합니다.
대부분의 SSRF 취약점은 URL만 변경할 수 있고, HTTP 메서드를 PUT으로 바꾸거나 커스텀 헤더를 추가하는 것은 불가능합니다. 이것이 IMDSv2가 SSRF에 안전한 핵심 이유입니다.
2024년부터 새로 생성하는 EC2 인스턴스는 기본적으로 IMDSv2만 허용(required)됩니다. 하지만 이전에 생성된 기존 인스턴스는 여전히 IMDSv1도 허용(optional) 상태일 수 있습니다. 기존 인스턴스도 반드시 IMDSv2 전용으로 전환해야 합니다!
실습: EC2 메타데이터 서비스 보안 강화
IMDS 설정 변경은 추가 비용이 발생하지 않습니다. 인스턴스 재시작도 필요 없으며, 변경 즉시 적용됩니다.
-
Step 1: 현재 IMDS 설정 확인
먼저 ShopEasy EC2 인스턴스의 현재 메타데이터 서비스 설정을 확인합니다. 설정이 "optional"(v1+v2 모두 허용)인지, "required"(v2만 허용)인지 파악하는 것이 첫 단계입니다.
방법 1: AWS 콘솔에서 확인
- EC2 콘솔 → Instances → ShopEasy 인스턴스 선택
- 하단 "세부 정보(Details)" 탭 → "메타데이터 옵션(Metadata options)" 섹션 확인
- IMDSv2 항목이
Optional이면 v1도 허용,Required이면 v2만 허용
방법 2: EC2에 SSH 접속 후 직접 테스트
EC2 인스턴스에 SSH로 접속한 후 아래 두 명령어를 실행하여 현재 IMDS 설정을 체험합니다.
bash# IMDSv1 방식 (단순 GET 요청) curl http://169.254.169.254/latest/meta-data/위 명령이 성공하면(메타데이터 목록이 반환되면) IMDSv1이 허용된 상태입니다.
bash# 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/IMDSv2 방식은 어떤 설정이든 항상 동작합니다.
AWS 콘솔에서 확인: EC2 → Instances → ShopEasy 인스턴스 선택 → 하단 Details 탭 스크롤 → "IMDSv2" 항목을 찾으세요.
Optional이면 v1도 허용된 상태입니다.AWS CLI로도 확인 가능합니다.
aws ec2 describe-instances명령어의MetadataOptions필드를 확인하세요. -
Step 2: IMDSv1으로 민감 정보 접근 시연 (위험성 체험)
IMDSv1이 허용된 상태에서 얼마나 쉽게 민감한 정보에 접근할 수 있는지 직접 체험합니다. EC2에 SSH로 접속한 상태에서 다음 명령어를 실행합니다.
bash# 인스턴스 ID 확인 (IMDSv1) curl http://169.254.169.254/latest/meta-data/instance-idbash# IAM 역할의 임시 자격증명 확인 (IMDSv1) - 가장 위험! curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ShopEasy-EC2-Role위 명령의 결과로 AccessKeyId, SecretAccessKey, Token이 표시됩니다. 아무런 인증 없이 단순 GET 요청만으로 이 정보를 가져올 수 있습니다!
이 자격증명이 유출되면?위 명령으로 확인한 임시 자격증명(AccessKeyId, SecretAccessKey, Token)은 해커가 탈취하면 S3, DynamoDB, CloudWatch 등에 자유롭게 접근할 수 있습니다. ShopEasy의 고객 데이터, 상품 이미지, 리뷰 정보가 모두 위험해집니다. 이것이 IMDSv2가 반드시 필요한 이유입니다!
만약 IMDSv1 접근이 이미 차단된 상태(401 Unauthorized)라면, 인스턴스가 이미 IMDSv2 전용으로 설정되어 있을 수 있습니다. Step 1에서 확인한 설정이 "required"인지 다시 확인하세요.
이 경우 Step 3를 건너뛰고 Step 4로 바로 진행해도 됩니다.
-
Step 3: IMDSv2 전용으로 변경
이제 EC2 인스턴스의 메타데이터 설정을 IMDSv2 전용(required)으로 변경하여 보안을 강화합니다.
변경 설정
설정 값 설명 HttpTokens required토큰 필수 (IMDSv2만 허용) HttpPutResponseHopLimit 1토큰 요청이 인스턴스 외부로 나가지 못하도록 제한 (컨테이너 환경이 아니므로 1로 충분) HttpEndpoint enabled메타데이터 서비스 활성화 유지 변경 방법: AWS 콘솔
- EC2 콘솔 → Instances → ShopEasy 인스턴스 선택
- Actions → Instance settings → Modify instance metadata options
- IMDSv2를
Required로 변경 - Save 클릭
변경 후 확인: IMDSv1 차단 테스트
EC2에 SSH 접속 후 IMDSv1으로 접근을 시도합니다.
bash# IMDSv1 접근 시도 - 차단되어야 함! curl http://169.254.169.254/latest/meta-data/예상 결과:
401 - Unauthorized가 반환됩니다. IMDSv1이 차단된 것입니다!bash# IMDSv2 접근 - 정상 동작해야 함 TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") && \ curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/예상 결과: 메타데이터 목록이 정상적으로 반환됩니다.
콘솔: EC2 → Instances → 인스턴스 선택 → Actions → Instance settings → Modify instance metadata options
CLI:
aws ec2 modify-instance-metadata-options명령어를 사용합니다.--http-tokens required옵션이 핵심입니다. -
Step 4: IMDSv2로 메타데이터 안전하게 조회
IMDSv2 전용으로 전환 후, 토큰 기반 방식으로 메타데이터를 안전하게 조회하는 방법을 실습합니다.
bash# 1. 토큰 발급 (유효시간: 6시간 = 21600초) TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \ -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") # 2. 인스턴스 ID 조회 curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/instance-id # 3. 프라이빗 IP 조회 curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/local-ipv4 # 4. IAM 자격증명 조회 (토큰 포함이므로 안전) curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/iam/security-credentials/ShopEasy-EC2-RoleAPI 서버 정상 동작 확인
IMDSv2로 전환해도 ShopEasy API 서버가 정상 동작하는지 확인합니다.
bash# EC2 내부에서 API 서버 확인 curl http://localhost:5000/api/productsAWS SDK(v3)는 자동으로 IMDSv2를 사용합니다ShopEasy API 서버가 사용하는 AWS SDK(v3)는 자동으로 IMDSv2 토큰을 발급받고 관리합니다. 따라서 IMDSv2로 전환해도 ShopEasy API 서버의 코드 변경은 필요 없습니다. S3 이미지 업로드, DynamoDB 리뷰 조회, CloudWatch 로그 전송 등 모든 기능이 그대로 동작합니다.
토큰의 TTL(Time To Live)은 최소 1초, 최대 21600초(6시간)까지 설정할 수 있습니다. 토큰이 만료되면 새 토큰을 발급받아야 합니다.
AWS SDK는 이 토큰 발급/갱신을 자동으로 처리하므로, 애플리케이션 코드에서 토큰을 직접 관리할 필요가 없습니다.
확인 사항
- 현재 IMDS 설정이 "optional"인지 "required"인지 확인했다
- IMDSv1으로 IAM 자격증명에 접근 가능한 것을 확인했다 (위험성 체험)
- EC2 메타데이터 설정을 IMDSv2 전용(required)으로 변경했다
- IMDSv1 요청이 차단(401 Unauthorized)되는 것을 확인했다
- IMDSv2 토큰 방식으로 메타데이터 조회가 정상 동작한다
- API 서버(포트 5000)가 정상 동작한다
- EC2 인스턴스 메타데이터 서비스(IMDS)의 역할과 동작 원리 이해
- IMDSv1의 보안 취약점과 SSRF 공격 위험성을 직접 체험
- IMDSv2 전용 모드로 전환하여 SSRF 공격 방어
- 토큰 기반 메타데이터 조회 방식 실습
- AWS SDK가 IMDSv2를 자동으로 지원함을 확인
IMDSv2로 메타데이터 접근을 보호했습니다. 다음 챕터에서는 SSM Session Manager를 설정하여 SSH 키 없이도 EC2에 안전하게 접속하는 방법을 학습합니다. SSH 포트(22)를 완전히 닫을 수 있어 보안이 더욱 강화됩니다.