EC2 Instance Metadata 보안

JIPA
10 min readOct 7, 2020

AWS 에서 가장 기본이 되는 EC2 서비스는 AWS Cloud 환경을 이해하는데 도움이 되는 다양한 서비스나 기능들이 모여 있는 대표적인 서비스입니다. 따라서, 많은 AWS 고객들이 EC2 서비스를 사용해왔고 AWS 에서도 다양한 부가 기능들이나 서비스를 EC2 와 연계하여 사용할 수 있도록 개발해오고 있는데요. 오늘은 EC2 서비스와 관련된 여러가지 기능 중 EC2 인스턴스 메타데이터 보안에 대해 살펴 보려고 합니다.

EC2 인스턴스 메타데이터는 여러분들이 EC2 인스턴스를 생성하게 되면 해당 인스턴스에 자동으로 연결되어 정보를 제공하는 서비스라고 생각하시면 되는데요.

EC2 인스턴스 메타데이터는 기본적으로 EC2 인스턴스에서만 실행하고 정보를 수집할 수 있는 서비스이며 사용 방법은 아래와 같이 curl 을 이용하거나 Browser 등을 이용하여 접근할 수 있습니다.

curl http://169.254.169.254/latest/meta-data/

위 명령을 EC2 인스턴스에서 실행하면 아래와 같은 결과물을 얻을 수 있는데요. 화면에 보이는 것처럼 ami-id, hostname, profile 등 해당 EC2 인스턴스와 관련한 다양한 정보들을 인스턴스 메타데이터를 통해 얻을 수 있습니다.

이런 다양한 정보를 포함하는 EC2 인스턴스 메타데이터는 다양한 용도로 활용이 될 수 있는데요. 우리가 대표적으로 가장 많이 사용하고 오늘 포스팅의 주제가 될 내용은 메타데이터를 이용한 IAM Role 권한의 획득입니다. 여러분들은 EC2 인스턴스를 생성할 때 IAM Role 을 할당할 수 있다는 것을 알고 계실텐데요. IAM Role 이 EC2 인스턴스에 할당되게 된다면 이 Role 이 갖게 되는 권한을 인스턴스 메타데이터를 통해 획득하실 수 있습니다.

인스턴스 메타데이터를 통해 Role 의 권한을 획득하려면 먼저 EC2 인스턴스에 어떤 Role 이 할당되어 있는지 확인을 해야하는데요. 아래와 같은 명령을 입력하시면 인스턴스 메타데이터 정보 중에 Role 과 관련한 정보를 출력하게 됩니다.

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

제가 생성한 EC2 에는 아래와 같이 EC2RoleforSSM 이라는 이름의 IAM Role 이 할당되어 있는 상태임을 확인할 수 있습니다.

이제 IAM Role 의 이름을 알았으니 이 Role 을 사용할 수 있는 자격증명을 확인해보도록 하겠습니다. 아래의 명령을 입력하면 인스턴스 메타데이터를 통해 해당 IAM Role 의 자격증명을 발급받을 수 있습니다.

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2RoleforSSM

아래 화면처럼 위 명령을 입력한 후에 EC2RoleforSSM 이라는 IAM Role 을 사용할 수 있는 IAM 자격증명 정보를 획득하였습니다.

인스턴스 메타데이터를 통해 Access Key/Secret Key/Token 값을 모두 얻었으니 이제 이 값들을 이용하면 EC2RoleforSSM 이 가지고 있는 권한을 아주 자유롭게 사용할 수 있습니다.

그런데 이렇게 메타데이터를 통해 IAM 의 자격증명을 얻을 수 있는 방법이 편리해보일 수는 있지만 다른 시각으로보면 너무나 단순한 방법으로 IAM 의 자격증명을 얻을 수 있어 보안상으로도 취약해 보이기도 하는데요. 사실 EC2 인스턴스 메타데이터는 2가지 버전이 존재합니다. Version 1 과 Version 2 인데요. 지금까지 보여드린 인스턴스 메타데이터 사용법은 Version 1 이고 Version 1 의 이용환경을 보다 보안적으로 강화한 것이 Version 2 입니다.

Version 1 이 갖고 있는 대표적인 취약점 중 하나 가 SSRF(Server Side Request Forgery) 공격에 취약하다는 것인데요. 지금까지 보신 것처럼 EC2 인스턴스 메타데이터 Versoin 1 은 사용자나 악의적인 공격자가 EC2 인스턴스에 GET 요청을 전달할 수 있는 환경만 된다면 누구나 쉽게 메타데이터에 접근할 수 있기 때문에 AWS 사용자가 SSRF 와 같은 공격으로부터 인스턴스 메타데이터 서비스를 보호할 수 있도록 적절할 조치를 취하지 않는다면 공격에 취약할 수 밖에 없는 것이 사실입니다.

EC2 인스턴스 메타데이터 Version 2 는 이러한 취약점을 개선하였는데요. 가장 먼저 인스턴스 메타데이터를 사용하는 방법이 바뀌었습니다. Version 1 은 정해진 메타데이터 URL 에 대해 GET 요청을 하면 누구나 메타데이터에 접근할 수 있었지만 Version 2 는 메타데이터에 GET 요청을 하기 전에 PUT 요청을 통해 Token 을 발급받아야하는 과정이 추가되었습니다.

즉, 사용자는 인스턴스 메타데이터를 사용하려면 PUT 요청을 통해 Token 을 발급받은 후 발급받은 Token 을 이용하여 GET 요청을 메타데이터 URL 로 전송하여야 원하는 메타데이터에 접근할 수 있습니다.

EC2 인스턴스 메타데이터 Version 2 사용 방법

EC2 인스턴스는 기본값으로 Version 1 과 Version 2 를 동시에 사용할 수 있습니다. 다만, 언급한 것처럼 사용방법이 다른데요. Version 2 사용을 위해서는 아래와 같은 명령을 통해 Token 을 먼저 발급 받은 후 Token 을 이용하여 메타데이터를 호출하여야 합니다.

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" -v http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2RoleforSSM

위 명령을 사용하여 아래처럼 인스턴스 메타데이터를 통해 EC2RoleforSSM 이라는 IAM Role 의 자격 증명을 획득하였습니다.

그럼 왜 Version 2 가 Version 1 보다 보안이 강화되고 안전한 것일까요?

위에 언급한 것처럼 Version 2를 사용하려면 먼저 PUT 요청을 통해 Token 을 발급받아야 합니다. Token 을 발급받는 부분만 본다면 아래와 같이 /latest/api/token 이라는 경로에서 Token 을 발급받을 수 있는데요.

curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"

첫번째, 여기서 주목할 점은 GET 요청이 아닌 PUT 요청을 사용한다는 점입니다. SSRF 와 같은 공격을 시도하려는 공격자의 입장에서는 인스턴스 메타데이터에 접근하기 위하여 취약한 웹 어플리케이션을 경유해서 SSRF 공격을 시도하려할텐데요. 메타데이터의 접근을 위해 PUT 을 통해 Token 을 발급받아야한다는 것 자체가 공격자 입장에서는 아주 커다란 난관이 될 수 있습니다.

두번째 Version 2에서 제공하는 보안 강화 기능은 인스턴스 메타데이터 응답 시 Hop Count 지정입니다. 인스턴스 메타데이터 Version 는 인스턴스 메타데이터가 사용자에게 데이터를 회신할 때 Packet 의 Lifetime 의 기준이 되는 Hop Count 를 지정하는 옵션을 제공합니다. 예를 들어 Hop Count 가 “1” 로 설정되어 있는데 메타데이터를 수신하여야 하는 사용자가 EC2 인스턴스 자신이 아닌 ( Network Hop 이 “1” 이 아닌 ) 곳에 있는 경우라면 Packet 이 네트워크 구간에서 더 이상 전송되지 않도록 구성할 수 있습니다.

기본값은 “1” 이며 이 값을 수정 가능합니다.

이처럼 EC2 인스턴스 메타데이터 서비스의 Version 2 는 Version 1에 비해 여러가지 보안적인 장점들을 가지고 있습니다. 따라서, 가급적이면 Version 2를 사용하는 것이 보다 안전한 인스턴스 메타데이터 이용환경이라고 볼 수 있을텐데요. 그럼 인스턴스 메타데이터 Version 2 이용 환경을 어떻게 구성할 수 있는지 살펴보도록 하겠습니다.

말씀드린 것처럼 EC2 인스턴스는 기본값으로 인스턴스 메타데이터 Version 1 과 Version 2를 모두 사용할 수 있습니다. 하지만 이런 기본 설정은 EC2 인스턴스 생성 과정에서 수정하실 수 있습니다.

Management Console 에서의 인스턴스 메타데이터 버전 설정

Management Console 에서 EC2 인스턴스를 생성하는 경우 EC2 인스턴스 생성 과정에서 아래와 같이 “Advanced Details” 항목에서 제공하는 “Metadata Version” 을 V2 만을 사용하도록 지정하실 수 있습니다.

AWS CLI 에서의 인스턴스 메타데이터 버전 설정

AWS CLI 에서는 아래와 같이 CLI 옵션에 메타데이터 옵션을 추가하여 Version 2 만을 사용하도록 지정하실 수 있습니다.

aws ec2 run-instances 
--image-id ami-0abcdef1234567890
--instance-type c3.large
--metadata-options "HttpEndpoint=enabled,HttpTokens=required"

EC2 인스턴스 메타데이터 Version 은 인스턴스 실행 중에도 AWS CLI 를 이용하여 변경하실 수 있습니다.

EC2 인스턴스 메타데이터 Version 2 사용과 관련하여 유의하실 점은 이미 Version 1 을 기반으로 메타데이터를 사용하도록 일부 어플리케이션이나 서비스들이 구성되어 있는 경우라면 이런 어플리케이션이나 서비스들이 Version 2 를 사용하는 환경으로 모두 변경된 것을 확인한 후에 Version 2 만을 사용하는 환경으로 전환하여야 한다는 것입니다. 어플리케이션이나 서비스는 아직 Version 2 이용 환경으로 바꾸지 못했는데 갑자기 Version 1 사용이 불가능해 진다면 서비스 문제가 발생할 수 있으니까요.

그리고 어느 정도 인스턴스 메타데이터 서비스가 Version 2 를 사용하는 환경으로 전환되었다면 그 때 부터는 새로운 EC2 인스턴스 생성 시 반드시 메타데이터 Version 2 만을 사용하도록 IAM 정책등을 적용하여 조직 내에 인스턴스 메타데이터 Version 1 을 사용한 새로운 EC2 인스턴스가 생성되지 않도록 강제하실 수 있습니다.

감사합니다.

--

--