[EC2 IMDS] EC2 Metadata란? IMDS 확인 설정하기

2022. 12. 27. 20:30IT/AWS

728x90

보안상, 그리고 Terraform 코드를 정적 분석하는 툴 tfsec에서는 IMDSv2를 사용하도록 권고한다. IMDS가 무엇이고, IMDSv1 → IMDSv2로 변경하는 방법을 공유한다.

 

인스턴스 생성 시, 메타데이터에 대한 옵션들을 설정할 수 있다. 콘솔 상으로 어떤 값을 의미하는지 설명되어 있는데, 사실 Version을 선택함에 있어서 충분한 사전 파악은 필요하다.

 

EC2 인스턴스 생성

  • 메타데이터 액세스 가능: 메타데이터 HTTP 엔트포인트 조회 기능을 활성화 또는 비활성화 할 수 있다.
  • 메타데이터 버전: 메타데이터 버전을 설정할 수 있다. 기본은 v1 및 v2로 설정된다.
  • 메타데이터 응답 홉 제한: 메타데이터 토큰이 이동할 수 있는 네트워크 홉 수를 설정한다. 기본 값은 1이다. EC2 서버에서 컨테이너를 실행할 경우 설정 고려해야 한다.
  • 메타데이터에서 태그 허용: 메타데이터 통해서 인스턴스의 태그 액세스를 활성화 또는 비활성화 할 수 있다.

EC2 인스턴스 메타데이터 버전 선택

 

1. IMDS 정의, 종류

 인스턴스 메타데이터 서비스는 실행 중인 인스턴스를 구성 또는 관리하는 데 사용될 수 있는 인스턴스 관련 데이터이다.
다음 방법 중 하나를 사용하여 실행 중인 인스턴스에서 인스턴스 메타데이터에 액세스할 수 있다.

 

  • 인스턴스 메타데이터 서비스 버전 1(IMDSv1) : 요청/응답 방법
  • 인스턴스 메타데이터 서비스 버전 2(IMDSv2) : 세션 지향 방법

 

 기본적으로 IMDSv1 또는 IMDSv2를 사용하거나 둘 다 사용할 수 있다.
인스턴스 메타데이터 서비스는 특정 요청에 대해 IMDSv2에 고유한 PUT 또는 GET 헤더가 해당 요청에 있는지 여부에 따라 IMDSv1 및 IMDSv2 요청을 구별한다.

IMDSv1의 경우 요청/응답 형식으로 사용방법이 쉽고 간단하기 때문에 SSRF(Server-Side Request Forgery) 취약점에 악용될 수 있으며, 권한이 유출될 가능성도 존재한다.

IMDSv2의 경우 토큰이라는 별도의 인증값을 발급받아 사용하기 때문에 EC2 인스턴스의 메타데이터를 사용하는 경우에는 IMDSv2를 사용해야 한다.

 

2. IMDS 설정

2.1 IMDS Version 확인

 아래 CLI를 통해 IMDSv1 또는 IMDSv2의 사용 여부를 확인할 수 있다. 명령어 수행 결과, ‘httptokens’ 값이 ‘optional’ 일 경우 IMDS V1, ‘required’ 일 경우 IMDS V2를 사용하는 것이다.

$ aws configure 
$ aws ec2 describe-instances | grep -i "httptokens"

 

 아래 CLI를 통해 상세 IMDS 옵션을 확인할 수 있다. 특히 HttpTokens과 HttpEndpoint 설정을 하도록 권고한다. 이외 옵션은 변경 영향도를 고려하여 적용한다.

$ aws ec2 describe-instances --instance-ids {인스턴스ID} --region ap-northeast-2 --output json --query "Reservations[].Instances[].MetadataOptions"
[{"State": "applied",
"HttpTokens": "optional", #토큰: optional 상태 v1,v2 모두 사용가능, required 상태 v2 만 가능
"HttpPutResponseHopLimit": 1, #질의 가능한 네트웍 hop 수를 제약함, 기본 1 일경우 OS 에서만 가능, 2 이상일때 컨테이너에서 가능
"HttpEndpoint": "enabled", #HTTP 활성 상태 ( IMDS 질의 자체를 거부하고 싶은 경우에 v1,v2 모두 )
"HttpProtocolIpv6": "disabled", #IPv6 를 사용할 경우에 인스턴스 메타데이터 서비스의 IPv4 주소를 사용합니다.
"InstanceMetadataTags": "disabled" #Metadata 질의를 통하여 인스턴스 TAG 를 질의하려고 하는 경우}]

 

2.2 IMDS Version 변경

 IMDSv1을 사용하고 있는 경우 IMDSv2로 전환이 필요하며, 작업 시 에이전트(Agent) 및 애플리케이션(Application) 환경 등을 고려하여 충분한 사전 테스트를 통해 예기치 않은 오류를 최소화하도록 한다.

아래 CLI를 통해 IMDSv2로 전환할 수 있다. (현재 Console 상에서는 전환할 수 있는 방법은 존재하지 않는다. 아쉬운 부분이다.)

$ aws ec2 modify-instance-metadata-options \ 
--instance-id {인스턴스ID} \ 
--http-tokens required \ 
--http-endpoint enabled

 

2.3 IMDS Version 변경 영향도

 IMDS v1와 v2를 함께 사용한다면, 특별한 문제없이 v2 를 사용할 수 있다.

 IMDS v2 만 사용한다면, OS 에 설치된 기본 운영 패키지 중 cloud-init, amazon-ssm-agent, awscli 등의 버전을 각 OS 의 패키지(yum, apt, snap) 명령어를 통하여 최신 버전으로 업데이트한 후 사용하는 것이 필요하다. AWS 에서는 2019년 11월부터 IMDSv2 를 지원하기 시작했다. 인스턴스가 생성된지 1~2년 이상 되었다면 패키지의 버전 확인 후 사용이 필요하다.

또한 OS 에서 컨테이너(eks, k8s 등) 을 사용 중이고 컨테이너 안에서 메타데이터를 호출하는 경우, IMDSv2 에서는 HttpPutResponseHopLimit 제약 때문에 질의가 실패할 수 있다. 이 경우에는 3 이상 Hop 수를 설정해야 한다. 이 기능은 OS level 에서만 직접 질의 가능하도록 설정한 제약 값으로, 외부에서 네트웍 Hop을 넘어서 들어오는 쿼리에 대한 보호 목적으로 기본 1 로 셋팅되어 있다. 

마지막으로 AWS SDK를 사용하는 경우, 버전 최신화하는 것을 권장한다. 가장 좋은 방법은 인스턴스 변환 전에 테스트용을 별도 생성하여 IMDSv2의 동작 상태를 확인하는 것이다.

 

 IMDS Version을 변경했을 때의 영향도는 중요한 문제이다. (이것으로 AWS Support에 이것저것 질의도 해보았다.)

운영 서버를 변경하기 전, 여러 제약들에 대해서 사전 확인이 필요하다.

그리고, Datadog을 통하여 EC2 서버를 모니터링하고 있는데, EKS/ECS 인스턴스 노드에서 IMDS v2 사용 시 모니터링이 되지 않았던 이슈도 있었다. 무엇보다 사전에 충분한 점검이 중요하겠다!

 

[References]

[1] AWS Documentation (https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)

[2] AWS Documentation (https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)

300x250