Amazon Web Services 한국 블로그

AWS Nitro Enclaves – 기밀 데이터 처리를 위한 격리된 EC2 환경 출시

AWS Nitro System처음 소개할 때 이렇게 말했습니다.

Nitro System은 다양한 방식으로 조립할 수 있는 수많은 구성 요소를 모은 컬렉션으로, 선택의 폭이 계속 다양해지는 컴퓨팅, 스토리지, 메모리 및 네트워킹 옵션을 통해 EC2 인스턴스 유형을 설계하고 빠르게 제공할 수 있는 유연성을 지원합니다.

지금까지는 이러한 구성 요소를 사용하여 약속을 이행해왔으며, M5, C5, R5, T3, I3, A1, P3dn, z1d, 고용량 메모리 인스턴스와 같은 기능을 출시했습니다. 빠르게 늘어나는 AWS의 인스턴스 컬렉션은 빠르게 증가하는 고객 요구 사항을 충족하도록 설계되었습니다.

새로운 격리 과제
금융 서비스, 국방, 미디어 및 엔터테인먼트, 생명 과학 등 다양한 업계의 AWS 고객은 AWS 클라우드에서 매우 민감한 데이터를 주기적으로 처리합니다. 민감할 데이터를 처리할 때는 내부 및 외부 위협으로부터 데이터를 보호해야 하며 상호 신뢰할 수 없는 여러 파트너, 공급업체, 고객 및 직원과 관련된 복잡한 상황도 처리해야 합니다. 현재는 VPC를 사용하여 제한된 사용자 집합으로만 액세스할 수 있도록 연결성을 제한 및 통제하는 고도로 격리된 환경을 만듭니다.

Nitro Enclaves
오늘은 AWS Nitro Enclaves 출시를 통해 이러한 중요한 요구 사항을 해결해 보고자 합니다. 이 서비스를 사용하면 Nitro System에 의해 구동되는 모든 EC2 인스턴스에서 격리된 환경을 구축할 수 있습니다. Nitro System은 동일한 하드웨어에서 실행 중인 여러 EC2 인스턴스를 이미 격리하고 있습니다. Nitro Enclaves는 단일 “상위” EC2 인스턴스의 CPU 및 메모리를 분할하여 추가 격리를 제공하며, 동일한 인스턴스에서 실행되는 다른 사용자 또는 애플리케이션으로부터 매우 민감한 데이터를 보호합니다. 환경은 안전하며, 상위 EC2 인스턴스에서 실행되는 다른 애플리케이션, 사용자 또는 프로세스에 액세스할 수 없습니다. 이 환경은 매우 유연하며, 가장 까다로운 프로덕션 워크로드의 요구 사항을 충족하도록 설계되었고, 격리된 환경에 할당되는 메모리 양과 처리 능력을 완벽하게 제어할 수 있습니다.

AWS는 EC2 인스턴스당 단일 엔클레이브 생성에 대한 지원을 시작하고 있으며, 향후 여러 엔클레이브에 대한 지원도 추가할 예정입니다. 인스턴스의 코어 중 하나를 제외한 모든 메모리를 사용할 수 있으며(하이퍼스레드 프로세서를 사용하는 인스턴스의 경우 vCPU 2개), 해당 엔클레이브에 대해 거의 모든 메모리를 사용할 수 있습니다.

각 엔클레이브는 독립 커널을 실행하고, 메모리와 CPU 리소스에 독점 액세스 권한을 보유하고 있습니다. 엔클레이브에는 전체 IAM 권한이 있어도 외부 네트워크 연결, 영구 스토리지 및 사용자 액세스가 없습니다. 엔클레이브로 송수신되는 모든 데이터는 EC2 인스턴스에서 종료되는 로컬 가상 소켓(vsock) 연결을 통해 이동합니다.

니트로 하이퍼바이저는 각 니트로 엔클레이브를 생성할 때 증명 문서를 생성하고 이에 서명합니다. 이 문서는 특히, 암호화에 기반하여 부팅 프로세스의 건전한 측정 기능을 제공하는 플랫폼 구성 레지스터(PCR) 집합을 포함합니다. 이러한 값은 KMS 키 정책에 연결된 경우 엔클레이브를 생성할 때 예상되는 이미지, OS, 애플리케이션, IAM 역할 및 인스턴스 ID가 사용되었는지 확인하는 데 사용됩니다. KMS에서 이 확인 단계를 수행한 후에는 엔클레이브에서 실행 중인 코드에서 요청하는 원하는 API 작업(복호화, 데이터 키 생성 또는 임의 값 생성)을 수행합니다.

엔클레이브 생성 및 사용
인스턴스는 새 Nitro CLI를 포함하는 AMI를 실행 중이어야 합니다. 이러한 도구는 엔클레이브를 호스팅할 인스턴스에서 실행하도록 설계되었습니다. 인스턴스 자체는 enclave-enabled 옵션을 활성화하여 부팅해야 합니다.

$ aws ec2 run-instances ...  --enclave-options Enabled=true

편의상 Docker 이미지를 엔클레이브 이미지(*.eif)의 기초로 사용할 수 있습니다. Nitro CLI 리포지토리에서 hello 예제를 사용하여 Docker 이미지를 구축합니다.

$ docker build hello -t hello

그런 다음, EIF를 구축합니다.

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

앞서 언급했듯이, PCR은 예상되는 이미지, 커널 및 애플리케이션이 엔클레이브에서 실행 중인지 확인하는 데 사용됩니다. 다음은 EIF를 구축할 때 생성되는 3개의 PCR입니다.

  • PCR0 – 이미지의 SHA384 해시.
  • PCR1 – OS 커널 및 부트스트랩 프로세스의 SHA384 해시.
  • PCR2 – 애플리케이션의 SHA384 해시.
Start building the Enclave Image...
Start building the Enclave Image...
Enclave Image successfully created.
Enclave Image successfully created.
{
  "Measurements": {
    "HashAlgorithm": "Sha384 { ... }",
    "PCR0": "951f851181bb490bd112b8ab855e40e3ac60c0dcc31e408c5b8485f85c4db276b1753b401dcc0a787ff79c2fae81b3ae",
    "PCR1": "aca6e62ffbf5f7deccac452d7f8cee1b94048faf62afc16c8ab68c9fed8c38010c73a669f9a36e596032f0b973d21895",
    "PCR2": "242201df93225622132c9f3b0c315fbc85485c6aa7a2ced2491d5a290c015c053d5d5a7028b13f3a23a22c2e529d29de"
  }
}

다음으로, 엔클레이브를 시작합니다(테스트를 위해 디버그 모드를 사용함).

$ nitro-cli run-enclave --eif-path hello.eif --memory 512 --cpu-count 2 --debug-mode
Start allocating memory...
Started enclave with enclave-cid: 21, memory: 512 MiB, cpu-ids: [1, 9]
{
  "EnclaveID": "i-070d1d4d2f0389aea-enc1755616f36f444b",
  "ProcessID": 4720,
  "EnclaveCID": 21,
  "NumberOfCPUs": 2,
  "CPUIDs": [
    1,
    9
  ],
  "MemoryMiB": 512
}

엔클레이브를 볼 수 있습니다.

$ nitro-cli describe-enclaves
[
  {
    "EnclaveID": "i-070d1d4d2f0389aea-enc1755616f36f444b",
    "ProcessID": 4720,
    "EnclaveCID": 21,
    "NumberOfCPUs": 2,
    "CPUIDs": [
      1,
      9
    ],
    "MemoryMiB": 512,
    "State": "RUNNING",
    "Flags": "DEBUG_MODE"
  }
]

콘솔 출력을 살펴보십시오(디버그 모드에서만 사용 가능).

$ nitro-cli console --enclave-id i-070d1d4d2f0389aea-enc1755616f36f444b
Connecting to the console for enclave 21...
Successfully connected to the console.
Command line: reboot=k panic=30 pci=off nomodules console=ttyS0 i8042.noaux i8042.nomux i8042.nopnp i8042.dumbkbd random.trust_cpu=on virtio_mmio.device=4K@0xd0000000:5 virtio_mmio.device=4K@0xd0001000:6
[    0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
[    0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
...

[   1] Hello from the enclave side!
[   2] Hello from the enclave side!
[   3] Hello from the enclave side!
[   4] Hello from the enclave side!
[   5] Hello from the enclave side!

실제 프로덕션 시나리오에서는 이미지가 엔클레이브 애플리케이션 코드를 시작하도록 구성됩니다. 코드는 Nitro Enclaves SDK를 사용하여 키를 가져오고 수신 데이터를 복호화하기 위해 KMS와 통신합니다. 또한, KMS에서 제공하는 데이터 키를 사용하여 데이터 처리 후 암호화합니다.

엔클레이브에서 작업을 마치면 엔클레이브를 종료합니다.

$ nitro-cli terminate-enclave --enclave-id i-070d1d4d2f0389aea-enc1755616f36f444b
Successfully terminated enclave i-070d1d4d2f0389aea-enc1755616f36f444b.
{
  "EnclaveID": "i-070d1d4d2f0389aea-enc1755616f36f444b",
  "Terminated": true
}

증명
지금까지 엔클레이브를 설정하고 실행하며 마지막으로 종료하는 방법을 보여드렸습니다. 이제 가장 중요한 개념인 증명에 대해 이야기해보려고 합니다. 간단히 말하면, 증명이란, 엔클레이브에서 실행되는 이미지, 운영 체제 및 애플리케이션 코드가 어떠한 방식으로든 변조되거나 우연히 수정되지 않도록 보장하는 프로세스입니다. 앞서 설명과 같이, PCR 값은 암호화에 기반하여 각 요소의 건전한 표현을 제공합니다. 실제 환경에서는 Condition 문의 일부로 PCR 값을 검사하는 KMS 키 정책을 생성합니다.

"Condition": {
        "StringEqualsIgnoreCase": {
          "kms:RecipientAttestation:ImageSha384": "ecfd7aa6d1dcca1e0bba646e7d49ede2761651c68f13cee68b1141c182cd836baae37d05dd8e6260aa847369a7b27e24"
        }

AWS Certificate Manager for Nitro Enclaves는 AWS Nitro Enclaves를 통해 EC2 인스턴스에서 실행하는 웹 애플리케이션 및 웹 서버에서 무료 퍼블릭 및 프라이빗 SSL/TLS 인증서를 사용할 수 있는 샘플 애플리케이션입니다. 자세한 내용은 Nitro Enclaves 애플리케이션: AWS Certificate Manager for Nitro Enclaves를 참조하십시오.

정식 출시
오늘 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오레곤), EU(프랑크푸르트), EU(아일랜드), EU(런던), EU(파리), EU(스톡홀름), 아시아 태평양(홍콩), 아시아 태평양(뭄바이), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄), 남아메리카(상파울루) 리전에서 추가 비용 없이 Intel 및 AMD 기반 프로세서에서 엔클레이브를 생성하고 사용해볼 수 있습니다. 앞으로 Graviton 기반 프로세스에 대한 지원과 리전도 곧 추가될 예정입니다. EC2 인스턴스 및 KMS 호출에 대한 일반 요금만 지불하면 됩니다.

Jeff