AWS EC2 Enclaves 사용하기

JIPA
8 min readOct 30, 2020

--

작년 AWS re:Invent 2019 에서 소개되었던 EC2 환경에서 사용할 수 있는 격리된 컴퓨팅 서비스인 AWS Nitro Enclaves(이하 “Enclaves”) 라는 서비스가 올해 10월 28일 GA(General Availability) 되었습니다.

이 포스팅에서는 새롭게 소개된 Enclave 라는 서비스에 대해 간략하게 살펴보고 실제로 어떻게 사용이 되는지 실행해보도록 하겠습니다.

참고. Enclaves 는 아직 전체 Region 에서 지원하지는 않습니다. 지원하고 있는 Region 을 위 링크를 통해 확인하시기 바라며 아쉽지만 최초 GA 대상 리전에 서울리전은 포함되지 않았습니다.

사전 요구 사항

Enclaves 는 AWS EC2 중 Nitro 기반의 EC2 인스턴스를 사용하는 Linux 환경에서 사용할 수 있는 보안적으로 격리된 가상머신을 의미합니다. 2020년 10월 현재 사용 가능한 EC2 인스턴스의 조건은 다음과 같습니다.

  • 4vCPU 이상
  • t3, t3a, t4g, a1, c6g, c6gd, m6g, m6gd, r6g, and r6gd 을 제외한 Nitro 기반 EC2
  • Linux OS

Enclaves 란 무엇인가?

Enclave 를 설명하게이 앞서 AWS Cloud 환경에서 EC2 인스턴스의 격리 환경을 잠깐 살펴보도록 하겠습니다. AWS 에서는 On-premise 의 가상화환경과 마찬가지로 물리적인 서버에 Hypervisor 를 설치하여 가상화된 컴퓨팅 자원(EC2 인스턴스)을 생성하여 사용자에게 할당합니다. 그리고 이 가상화된 컴퓨팅 자원은 아래의 그림과 같이 논리적으로 격리되어 있으며 각각의 인스턴스에 할당된 고유의 CPU, 메모리 자원을 사용하게 됩니다.

Enclave 는 Enclave 자체만 본다면 Enclave 도 가상 머신이기 때문에 기본적으로 다른 인스턴스와 논리적으로 격리되어 있습니다. 다만, Enclave 는 Parent EC2(부모 EC2) 인스턴스에 의해 생성되는 가상 머신으로 Parent EC2 와도 격리는 되어 있지만 Parent EC2 와는 Virtual Socket 을 통해 통신이 가능한 경로를 가지고 있습니다.

즉, Enclave 는 특정 EC2 인스턴스와만 통신이 가능한 별도의 격리된 또 하나의 가상 머신을 이야기하는데요. Enclave 는 이와 같은 격리된 공간안에 사용자가 원하는 어플리케이션을 구동하거나 AWS Certificate Manager 에서 발급한 인증서의 Private Key를 Parent EC2 에서 사용할 수 있도록 저장하는 등의 용도로 사용하실 수 있습니다.

Enclave 의 간단한 사용 순서는 다음과 같습니다.

  1. EC2 인스턴스 선택(사전 요구 사항 참고) 후 Enclave 활성화
  2. Nitro CLI 설치
  3. Enclave 내에서 구동할 Image 준비
  4. Enclave 실행
  5. Enclave 동작 확인
  6. Enclave 제거(필요 시)
  1. Enclave 활성화
    : Enclave 는 Enclave 를 지원하는 Nitro 타입 EC2 인스턴스가 실행될 때 아래와 같은 “enclave-options” 라는 옵션을 통해 활성화할 수 있습니다.
aws ec2 run-instances --image-id support_ami_id --count 1 --instance-type supported_instance_type --key-name your_key_pair --enclave-options 'Enabled=true'

AWS CLI 를 이용하여 새로운 EC2 인스턴스를 실행합니다.

참고. Enclave 를 활성화하기 위해서는 AWS CLI Verison 2 를 사용하여야 합니다.

2. Nitro CLI 설치
: Enclave 가 활성화된 상태로 구동된 EC2 인스턴스에 접속하여 아래와 같은 명령어를 사용하여 Nitro CLI 를 설치합니다.

#sudo amazon-linux-extras install aws-nitro-enclaves-cli

샘플 어플리케이션 설치를 위하여 아래와 같이 Nitro Enclave 개발자 도구도 설치합니다.

#sudo yum install aws-nitro-enclaves-cli-devel -y

사용자를 “ne” 사용자 그룹에 추가한 후 사용자를 “docker” 사용자 그룹에 추가합니다.

#sudo usermod -aG ne username
#sudo usermod -aG docker username

Enclave 는 Parent EC2 인스턴스의 가상 자원을 할당받아 생성되는 가상 머신입니다. 따라서, Enclave 를 Parent EC2 인스턴스에서 생성할 때에는 얼마나 많은 수의 vCPU 나 Memory 를 Enclave 에 할당할 것인지 정해주어야 하는데요. 이 값은 아래의 yaml 파일을 이용하여 설정할 수 있습니다.

/etc/nitro_enclaves/allocator.yaml

저는 별도의 설정 변경 없이 기본값을 그대로 사용하여 Enclave 를 생성하도록 하겠습니다.

#sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
#sudo systemctl start docker && sudo systemctl enable docker

3. Enclave 내에서 구동할 Image 준비
: Enclave 는 Container 이미지를 통해 Parent EC2 인스턴스로부터 Enclave 내에 구동될 어플리케이션을 적용받게 됩니다. 따라서, Parent EC2 인스턴스에서 Docker Image 를 생성해주어야 하는데요. 이 포스팅에서는 위 과정에서 Enclave 개발자 도구가 설치되면서 함께 설치되 “Hello” 샘플 어플리케이션을 이용하여 Container Image 를 빌드하도록 하겠습니다.

#docker build /usr/share/nitro_enclaves/examples/hello -t hello

Docker Image 가 빌드되었다면 아래와 같은 명령어를 이용하여 Enclave 에서 사용 가능한 Image Format 으로 변환합니다.

#nitro-cli build-enclave --docker-uri hello:latest --output-file hello.eif

4. Enclave 실행
: EIF 포맷의 Enclave Image 가 생성이 되었으니 이제는 실제로 아래 명령어를 이용하여 Enclave 를 생성해보도록 하겠습니다.

#nitro-cli run-enclave --cpu-count 2 --memory 512 --eif-path hello.eif --debug-mode

5. Enclave 동작 확인
: Enclave 가 정상적으로 생성되었다면 아래와 같은 명령어를 통해서 Enclave 내에 설치한 어플리케이션이 정상동작하는지 확인하실 수 있습니다.

#nitro-cli console --enclave-id i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE

6. Enclave 삭제
: Enclave 의 삭제는 아래의 명령어를 통해 수행하실 수 있습니다.

#nitro-cli terminate-enclave --enclave-id i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE

감사합니다.

--

--

JIPA
JIPA

Written by JIPA

Always Day 1. Security is job zero.

No responses yet