AWS에서 서버를 운영하다 보면, 스크립트 또는 로그에서 169.254.169.254 라는 낯선 IP를 마주하게 됩니다.
이 주소는 외부에서도, 같은 서브넷에 있는 다른 인스턴스에서도 접근할 수 없지만 EC2 내부에서는 언제든지 접근 가능한 특수 시스템 엔드포인트입니다.
많은 자동화 도구, 배포 스크립트, Observability 에이전트, 서버 초기화 스크립트가 이 엔드포인트를 사용합니다.
그러나 대부분은 “그냥 쓰던 것” 정도로만 알고 있을 뿐, 왜 필요한지 / 내부적으로 어떻게 동작하는지 / 보안 이슈는 무엇인지 모르는 경우가 많습니다.
이 IP는 Link-local IPv4 주소(169.254.0.0/16) 에 속합니다.
특징:
AWS는 이 주소를 EC2 하이퍼바이저(가상화 계층)에 바인딩하여, 인스턴스가 스스로 환경 정보를 조회할 수 있도록 만들어 놓았습니다.
요약하면:
169.254.169.254 = EC2 인스턴스 전용 내부 OS 정보 조회 시스템
EC2 내부에서 인스턴스 정보를 조회할 수 있는 서비스입니다.
접근 경로:
http://169.254.169.254/latest/meta-data/
| 카테고리 | 내용 |
|---|---|
| 인스턴스 정보 | instance-id, AMI ID, 인스턴스 타입, 호스트네임 |
| 네트워크 정보 | private-ip, public-ip, MAC주소, subnet-id, vpc-id |
| IAM 정보 | Role 이름, AccessKey / SecretKey / SessionToken(임시) |
| 스토리지 | 블록 디바이스 매핑 (/dev/xvda 등) |
| 시스템 | 보안 그룹, 인스턴스 프로파일 |
| 기타 | user-data(첫 부팅 스크립트) |
즉, 운영 자동화에서 필요한 대부분의 “환경 정보”를 EC2 자체가 직접 조회할 수 있습니다.
IMDSv1은 단순합니다.
curl http://169.254.169.254/latest/meta-data/
이렇게 GET 요청 하나만으로 모든 메타데이터를 가져올 수 있었습니다.
웹 애플리케이션이 SSRF(Server Side Request Forgery) 취약점을 갖고 있다면, 공격자는 앱을 통해 다음 요청을 보내게 할 수 있습니다.
http://169.254.169.254/latest/meta-data/iam/security-credentials/<RoleName>
이 URL은 EC2에 설정된 IAM Role Credentials(AccessKey / SecretKey / SessionToken)을 그대로 반환합니다.
그러면 공격자는:
등 사실상 AWS 전체 권한을 탈취할 수 있습니다.
2019년 Capital One 해킹 사고도 바로 이 취약점으로 인해 발생했습니다.
IMDSv2는 "세션 토큰 기반 인증"을 도입하여 SSRF 공격을 원천 차단합니다.
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/instance-id
토큰이 없으면 401/403으로 즉시 거절됩니다.
기업 보안 기준에서는:
이 세 가지를 거의 기본 정책으로 사용합니다.
많은 운영 자동화 스크립트는 인스턴스 정보를 동적으로 가져와야 합니다.
예: EC2 로그 자동 백업 스크립트
INSTANCE_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id)
이 값을 이용해 다음처럼 S3 경로를 구성합니다.
s3://my-service-logs/<INSTANCE_ID>/<날짜>/...
Auto Scaling 환경에서는 서버가 계속 새로 생성되고 삭제되므로, 고정된 서버 이름을 쓸 수 없습니다.
따라서 인스턴스 ID 등은 반드시 런타임에 조회해야 합니다.
또한 다음 AWS 기능들도 내부적으로 모두 IMDS를 사용합니다.
IMDS가 꺼져 있으면 많은 운영 도구가 제대로 작동하지 않습니다.
EC2 생성 시 다음을 설정할 수 있습니다.
Hop limit = 메타데이터 요청이 몇 hop까지 허용되는지 설정
대부분의 보안 규정은 다음을 요구합니다.
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/placement/availability-zone
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/
curl -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/iam/security-credentials/<RoleName>
(매우 민감 — 절대 로그로 남기면 안 됨)