SlideShare uma empresa Scribd logo
1 de 23
Baixar para ler offline
SEOUL
Nitro Enclave를 이용하여
안전하게 고객 정보 다루기
김주형 | HAECHI-LABS
KOREA
발표자
HAECHI-LABS 소프트웨어 엔지니어
Github: https://github.com/zerofruit
Medium: https://medium.com/@zerofruit
Blog: http://getoutsidedoor.com
KOREA
AWS Nitro Enclave 서비스 소개
AWS Nitro Enclave를 활용한 어플리케이션 개발
AWS Nitro Enclave와 AWS KMS
발표 내용
KOREA
AWS Nitro Enclave 서비스를 사용하게된 배경
서비스 이용자 정보 중 일부를 KMS를 통해서 암호화하여 저장하고 필요시에 복호화하여 사용합니다.
정해진 주체 외에 암호화된 정보를 복호화할 수 없어야 합니다. 서비스를 운영하는 회사를 포함해서요.
안전하게 데이터를 복호화할 수 있는 영역이 필요합니다.
KOREA
AWS Nitro Enclave 서비스 소개
EC2에서 지원해주는 기능입니다.
EC2 머신 안에서 CPU/Memory가 격리된 환경을 만들어주고 이 환경을 ‘Enclave’라고 부릅니다.
Enclave 바깥에 있는 CPU/Memory 영역을 ‘Parent’라고 부릅니다.
KOREA
AWS Nitro Enclave 서비스 소개 (Cont’d)
Parent와 Enclave는 VSOCK 소켓 통신을 통해서만 네트워크 통신이 가능합니다. 😇
Enclave는 인터넷과 직접 연결되어 있지 않습니다.
그래서 중요한 데이터를 암/복호화 하는데 활용할 수 있습니다.
SSH 불가능, 프로세스 접근 불가능
VSOCK에 대해서는 나중에 설명
또한 증명(Attestation) 기능을 제공해줍니다.
Enclave 환경에서 돌아가는 어플리케이션, OS 등에 따라 고유한 값(PCRs)을 Nitro Hypervisor가
생성한다. 이를 통해 Enclave 환경의 어플리케이션이 변경되었는지 체크할 수 있습니다.
AWS KMS와 같이 사용하면 특정 PCR에 해당하는 어플리케이션에 키 암/복호화 권한을 부여할 수
있습니다.
Enclave 환경 로그가 출력되지 않습니다. 😇
KOREA
AWS Nitro Enclave 서비스 소개 (Cont’d)
Enclave 환경의 어플리케이션이 생성되는 방식
EC2 내에 Enclave 환경을 위한 vCPU, Memory 영역 할당
nitro-cli 를 통해 컨테이너 이미지를 기반으로한 Enclave Image File (EIF) 파일 생성
nitro-cli 를 통해 EIF 파일 실행
시연 🍿
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발
VSOCK?
이전에 이야기했듯이 Enclave 환경에서는 직접 인터넷에 연결할 수 없고 Parent와만 통신할 수 있
다. Enclave와 Parent 사이의 통신방식도 VSOCK으로 제한됩니다.
VM Socket 이라고도 불린다. VM Socket(VSOCK)은 VM과 호스트 사이의 통신을 쉽게하기 위해
등장했습니다. (‘참고 자료’)
POSIX Socket API와 동일합니다. (‘참고 자료’)
그래서 TCP Socket 프로그램을 작성할 때 썼었던 bind(), connect() 함수를 그대로 쓸 수 있습니다.
그래서 TCP Socket을 활용한 오픈소스가 있다면 쉽게 가져다가 쓸 수 있습니다.
TCP: socket(AF_INET, SOCK_STREAM, 0) VSOCK: socket(AF_VSOCK, SOCK_STREAM, 0)
TCP: 112.169.79.192:8080 (<ip>:<port>) VSOCK: 3:3031 (<cid>:<port>)
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
그래도 Enclaves 환경에 있는 어플리케이션이 뭔가를 하려면 외부와 통신해야하지 않나요?
결국 Enclaves 환경의 어플리케이션이 뭔가를 하려면 인터넷으로부터 데이터를 받고 다시 인터넷으
로 전달해야합니다.
추상적으로 보자면 아래와 같이 통신을 해야합니다.
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
외부 서비스 - KMS
Nitro Enclaves와 통합했을 때 가장 시너지가 좋은 KMS는 AWS에서 ‘무려’ C로 된 Nitro Enclave 용
SDK를 제공해줍니다. 😊 (‘참고 자료’)
그래서 다른 언어로 Enclave 환경 어플리케이션을 만든다고 하면 해당 SDK를 exec() 으로 실행해
서 사용해볼 수는 있지만 성능 이슈가 있을 수 있기 때문에 한번 꼭 테스트를 해보시고 사용하는 것을
권장합니다. (왜 알고 있을까요..?)
SDK에서 해주는 일은 꽤 단순합니다. 요청값을 만들어서 VSOCK을 통해 정해진 Proxy로 요청을
보내고 받은 응답값을 처리해줍니다.
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
외부 서비스 - 3rd party 서비스
어플리케이션에서 꼭 KMS가 아니더라도 다른 서비스에 요청을 보내서 값을 받아와야하는 경우가 있
습니다.
SDK를 사용할 때 문제가 발생
echo “127.0.0.1 www.googleapis.com” >> /etc/hosts
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
외부 서비스 - 3rd party 서비스
어플리케이션에서 꼭 KMS가 아니더라도 다른 서비스에 요청을 보내서 값을 받아와야하는 경우가 있
습니다.
SDK를 사용할 때 문제가 발생
echo “127.0.0.1 www.googleapis.com” >> /etc/hosts 이 방식에는 한계점이 있음
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
외부 서비스 - 서버
SDK를 사용할 때보다 방식은 좀 더 간단합니다
VSOCK을 통해 Parent 환경 Proxy로 요청 전달
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
Enclave 환경 어플리케이션 로직은 최소화하자
Enclave 환경에서 돌아가는 어플리케이션 로그는 출력되지 않습니다. 🫠
개발 과정에서 디버그 모드로 실행하면 로그가 출력되긴 하지만 실제 운영에서는 끄고 실행해야합니
다. PCR 값이 0으로 출력
Parent 환경에 Proxy 기능을 포함한 서버를 만들어 Enclave에 들어가고 나오는 로그 수집 + 필요한
로직 수행 Ambassador
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
Socket 코드를 최소화하자
단순하게 생각했을 때 VSOCK에서 패킷을 받은 후 byte[]를 deserialize 해야 어플리케이션에서 사
용할 수 있겠다고 생각
하지만 Socket 관련 코드가 프로덕션에서 트래픽을 받을 것이라 생각하니 어떤 난관이 있을지 전혀
예측할 수 없었습니다.
최대한 검증된 오픈소스를 사용해서 직접 짜는 Socket 코드를 최소화하자
기존 TCP 프록시 오픈소스를 커스텀
Go 어플리케이션이라면 TCP <> VSOCK Proxy 오픈소스가 존재
(‘참고 자료’)
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
Socket 코드를 최소화하자
TCP <> VSOCK Proxy 가 있다면
이제 우리가 원하는 HTTP 프레임워크를 사용하여 어플리케이션을 작성할 수 있습니다 🎉
Ambassador와 Enclave 어플리케이션 코드의 복잡도가 엄청 줄어듭니다.
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
확장성의 문제: /etc/hosts, 프록시를 계속 추가해야하는 문제
Enclave 어플리케이션이 단순하다면 별 문제는 없습니다.
두 개 이상의 외부 서비스(SDK)를 사용하면 /etc/hosts 를 사용하는 방식에 문제가 생깁니다.
echo “127.0.0.1 www.googleapis.com” >> /etc/hosts
echo “127.0.0.1 www.otherservice.com” >> /etc/hosts 😱
Proxy는 자신이 받은 패킷을 하나의 목적지로 프록시하기 때문에 외부 서비스를 사용할 때마다
Proxy를 추가해주어야한다.
SOCKS5 Proxy
KOREA
AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d)
확장성의 문제: /etc/hosts, 프록시를 계속 추가해야하는 문제
SOCKS5 Proxy를 통해 외부 서비스 라우팅을 처리
SOCKS5: Proxy를 사이에 둔 Client/Server가 쉽게 통신할 수 있게 도와주는 프로토콜
패킷에 도달해야하는 서버 주소를 명시할 수 있어 Proxy는 해당 주소를 통해 라우팅
KOREA
AWS Nitro Enclave와 KMS
Nitro Enclave 증명 기능
Nitro Hypervisor 가 Enclave 환경을 만들면서 platform configuration registers (PCRs)를 만듭
니다.
PCRs은 PCR0, PCR1, … PCR8 과 같이 여러개의 값으로 이루어져있으며 각각의 값은 서로 다른
특성에 의해 생성됩니다. (‘참고 자료’)
이 중 PCR0은 EIF 파일의 기반이 되는 컨테이너 이미지에 따라서 결정됩니다.
PCRs 값을 통해서 다른 서비스는 요청이 Enclave 환경에서 왔는지 확인할 수 있고 어떤 어플리케이
션이 요청을 보냈는지도 식별할 수 있습니다.
다시 말해, 동일한 이미지로 EIF를 만들면 항상 동일한 PCR0 값이 나옵니다.
KOREA
AWS Nitro Enclave와 KMS
Nitro Enclave 증명 기능
KMS 키정책 Condition에 kms:RecipientAttestation 을 명시하는 것으로 특정 Enclave 어플리케
이션만 KMS을 통해서 데이터 암/복호화가 가능합니다.
Principal에 root 계정을 명시하지 않으면 최고 관리자도 해
당 KMS 키를 통해 데이터 복호화가 불가능합니다.
예시 키정책
KOREA
KOREA
KOREA
해치랩스는 채용중입니다
KOREA
참고 자료
VSOCK Linux Commit: https://github.com/torvalds/linux/commit/
d021c344051af91f42c5ba9fdedc176740cbd238
Linux VSOCK Internals: https://terenceli.github.io/%E6%8A%80%E6%9C%AF/2020/04/
18/vsock-internals
AWS Nitro Enclave SDK C: https://github.com/aws/aws-nitro-enclaves-sdk-c
brave/viproxy: https://github.com/brave/viproxy
AWS Nitro Enclave Docs PCRs: https://docs.aws.amazon.com/enclaves/latest/user/set-
up-attestation.html#where

Mais conteúdo relacionado

Semelhante a AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다루기

Amazon EKS로 웹 애플리케이션 구축하기-awskrug.pdf
Amazon EKS로 웹 애플리케이션 구축하기-awskrug.pdfAmazon EKS로 웹 애플리케이션 구축하기-awskrug.pdf
Amazon EKS로 웹 애플리케이션 구축하기-awskrug.pdf
Byungho Lee
 
AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)
AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)
AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)
Amazon Web Services Korea
 
AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...
AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...
AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...
Amazon Web Services Korea
 

Semelhante a AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다루기 (20)

Spring cloud on kubernetes
Spring cloud on kubernetesSpring cloud on kubernetes
Spring cloud on kubernetes
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Cloud-Barista 제7차 컨퍼런스 : 멀티클라우드 인프라 서비스 연동 (CB-Spider)
Cloud-Barista 제7차 컨퍼런스 : 멀티클라우드 인프라 서비스 연동 (CB-Spider)Cloud-Barista 제7차 컨퍼런스 : 멀티클라우드 인프라 서비스 연동 (CB-Spider)
Cloud-Barista 제7차 컨퍼런스 : 멀티클라우드 인프라 서비스 연동 (CB-Spider)
 
[웨비나] 다중 AWS 계정에서의 CI/CD 구축
[웨비나] 다중 AWS 계정에서의 CI/CD 구축[웨비나] 다중 AWS 계정에서의 CI/CD 구축
[웨비나] 다중 AWS 계정에서의 CI/CD 구축
 
Amazon EKS로 웹 애플리케이션 구축하기-awskrug.pdf
Amazon EKS로 웹 애플리케이션 구축하기-awskrug.pdfAmazon EKS로 웹 애플리케이션 구축하기-awskrug.pdf
Amazon EKS로 웹 애플리케이션 구축하기-awskrug.pdf
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
Cloud-Barista 제3차 오픈 컨퍼런스 : CB-Spider - 멀티 클라우드 인프라 연동(Multi-Cloud Infrastruc...
 
20150115 AWS BlackBelt - Amazon VPC (Korea)
20150115 AWS BlackBelt - Amazon VPC (Korea)20150115 AWS BlackBelt - Amazon VPC (Korea)
20150115 AWS BlackBelt - Amazon VPC (Korea)
 
AWS DevDay 실습 가이드 - 콘테이너
AWS DevDay 실습 가이드 - 콘테이너AWS DevDay 실습 가이드 - 콘테이너
AWS DevDay 실습 가이드 - 콘테이너
 
OpenStack Horizon AWS Plugin For Hybrid Cloud
OpenStack Horizon AWS Plugin For Hybrid CloudOpenStack Horizon AWS Plugin For Hybrid Cloud
OpenStack Horizon AWS Plugin For Hybrid Cloud
 
[AWS Builders] AWS 네트워크 서비스 소개 및 사용 방법 - 김기현, AWS 솔루션즈 아키텍트
[AWS Builders] AWS 네트워크 서비스 소개 및 사용 방법 - 김기현, AWS 솔루션즈 아키텍트[AWS Builders] AWS 네트워크 서비스 소개 및 사용 방법 - 김기현, AWS 솔루션즈 아키텍트
[AWS Builders] AWS 네트워크 서비스 소개 및 사용 방법 - 김기현, AWS 솔루션즈 아키텍트
 
AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)
AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)
AWS CLOUD 2018- AWS 네트워크 신규 기능 업데이트  (강동환 솔루션즈 아키텍트)
 
AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...
AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...
AWS CLOUD 2018- 관리형 Kubernetes 지원과 새로운 컨테이너 서비스 Amazon Fargate 소개 (정영준 솔루션즈 아...
 
클라우드 춘추전국시대 서버 개발자 생존기
클라우드 춘추전국시대 서버 개발자 생존기클라우드 춘추전국시대 서버 개발자 생존기
클라우드 춘추전국시대 서버 개발자 생존기
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
AWS의 하둡 관련 서비스 - EMR/S3
AWS의 하둡 관련 서비스 - EMR/S3AWS의 하둡 관련 서비스 - EMR/S3
AWS의 하둡 관련 서비스 - EMR/S3
 
AWS Meetup 프리젠테이션.pdf
AWS Meetup 프리젠테이션.pdfAWS Meetup 프리젠테이션.pdf
AWS Meetup 프리젠테이션.pdf
 
CloudFront(클라우드 프론트)와 Route53(라우트53) AWS Summit Seoul 2015
CloudFront(클라우드 프론트)와 Route53(라우트53) AWS Summit Seoul 2015CloudFront(클라우드 프론트)와 Route53(라우트53) AWS Summit Seoul 2015
CloudFront(클라우드 프론트)와 Route53(라우트53) AWS Summit Seoul 2015
 
20180124 스타트업부터 대기업까지 aws와 함께한 7년
20180124 스타트업부터 대기업까지 aws와 함께한 7년20180124 스타트업부터 대기업까지 aws와 함께한 7년
20180124 스타트업부터 대기업까지 aws와 함께한 7년
 
[slideshare]k8s.pptx
[slideshare]k8s.pptx[slideshare]k8s.pptx
[slideshare]k8s.pptx
 

AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다루기

  • 1. SEOUL Nitro Enclave를 이용하여 안전하게 고객 정보 다루기 김주형 | HAECHI-LABS
  • 2. KOREA 발표자 HAECHI-LABS 소프트웨어 엔지니어 Github: https://github.com/zerofruit Medium: https://medium.com/@zerofruit Blog: http://getoutsidedoor.com
  • 3. KOREA AWS Nitro Enclave 서비스 소개 AWS Nitro Enclave를 활용한 어플리케이션 개발 AWS Nitro Enclave와 AWS KMS 발표 내용
  • 4. KOREA AWS Nitro Enclave 서비스를 사용하게된 배경 서비스 이용자 정보 중 일부를 KMS를 통해서 암호화하여 저장하고 필요시에 복호화하여 사용합니다. 정해진 주체 외에 암호화된 정보를 복호화할 수 없어야 합니다. 서비스를 운영하는 회사를 포함해서요. 안전하게 데이터를 복호화할 수 있는 영역이 필요합니다.
  • 5. KOREA AWS Nitro Enclave 서비스 소개 EC2에서 지원해주는 기능입니다. EC2 머신 안에서 CPU/Memory가 격리된 환경을 만들어주고 이 환경을 ‘Enclave’라고 부릅니다. Enclave 바깥에 있는 CPU/Memory 영역을 ‘Parent’라고 부릅니다.
  • 6. KOREA AWS Nitro Enclave 서비스 소개 (Cont’d) Parent와 Enclave는 VSOCK 소켓 통신을 통해서만 네트워크 통신이 가능합니다. 😇 Enclave는 인터넷과 직접 연결되어 있지 않습니다. 그래서 중요한 데이터를 암/복호화 하는데 활용할 수 있습니다. SSH 불가능, 프로세스 접근 불가능 VSOCK에 대해서는 나중에 설명 또한 증명(Attestation) 기능을 제공해줍니다. Enclave 환경에서 돌아가는 어플리케이션, OS 등에 따라 고유한 값(PCRs)을 Nitro Hypervisor가 생성한다. 이를 통해 Enclave 환경의 어플리케이션이 변경되었는지 체크할 수 있습니다. AWS KMS와 같이 사용하면 특정 PCR에 해당하는 어플리케이션에 키 암/복호화 권한을 부여할 수 있습니다. Enclave 환경 로그가 출력되지 않습니다. 😇
  • 7. KOREA AWS Nitro Enclave 서비스 소개 (Cont’d) Enclave 환경의 어플리케이션이 생성되는 방식 EC2 내에 Enclave 환경을 위한 vCPU, Memory 영역 할당 nitro-cli 를 통해 컨테이너 이미지를 기반으로한 Enclave Image File (EIF) 파일 생성 nitro-cli 를 통해 EIF 파일 실행 시연 🍿
  • 8. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 VSOCK? 이전에 이야기했듯이 Enclave 환경에서는 직접 인터넷에 연결할 수 없고 Parent와만 통신할 수 있 다. Enclave와 Parent 사이의 통신방식도 VSOCK으로 제한됩니다. VM Socket 이라고도 불린다. VM Socket(VSOCK)은 VM과 호스트 사이의 통신을 쉽게하기 위해 등장했습니다. (‘참고 자료’) POSIX Socket API와 동일합니다. (‘참고 자료’) 그래서 TCP Socket 프로그램을 작성할 때 썼었던 bind(), connect() 함수를 그대로 쓸 수 있습니다. 그래서 TCP Socket을 활용한 오픈소스가 있다면 쉽게 가져다가 쓸 수 있습니다. TCP: socket(AF_INET, SOCK_STREAM, 0) VSOCK: socket(AF_VSOCK, SOCK_STREAM, 0) TCP: 112.169.79.192:8080 (<ip>:<port>) VSOCK: 3:3031 (<cid>:<port>)
  • 9. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 그래도 Enclaves 환경에 있는 어플리케이션이 뭔가를 하려면 외부와 통신해야하지 않나요? 결국 Enclaves 환경의 어플리케이션이 뭔가를 하려면 인터넷으로부터 데이터를 받고 다시 인터넷으 로 전달해야합니다. 추상적으로 보자면 아래와 같이 통신을 해야합니다.
  • 10. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 외부 서비스 - KMS Nitro Enclaves와 통합했을 때 가장 시너지가 좋은 KMS는 AWS에서 ‘무려’ C로 된 Nitro Enclave 용 SDK를 제공해줍니다. 😊 (‘참고 자료’) 그래서 다른 언어로 Enclave 환경 어플리케이션을 만든다고 하면 해당 SDK를 exec() 으로 실행해 서 사용해볼 수는 있지만 성능 이슈가 있을 수 있기 때문에 한번 꼭 테스트를 해보시고 사용하는 것을 권장합니다. (왜 알고 있을까요..?) SDK에서 해주는 일은 꽤 단순합니다. 요청값을 만들어서 VSOCK을 통해 정해진 Proxy로 요청을 보내고 받은 응답값을 처리해줍니다.
  • 11. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 외부 서비스 - 3rd party 서비스 어플리케이션에서 꼭 KMS가 아니더라도 다른 서비스에 요청을 보내서 값을 받아와야하는 경우가 있 습니다. SDK를 사용할 때 문제가 발생 echo “127.0.0.1 www.googleapis.com” >> /etc/hosts
  • 12. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 외부 서비스 - 3rd party 서비스 어플리케이션에서 꼭 KMS가 아니더라도 다른 서비스에 요청을 보내서 값을 받아와야하는 경우가 있 습니다. SDK를 사용할 때 문제가 발생 echo “127.0.0.1 www.googleapis.com” >> /etc/hosts 이 방식에는 한계점이 있음
  • 13. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 외부 서비스 - 서버 SDK를 사용할 때보다 방식은 좀 더 간단합니다 VSOCK을 통해 Parent 환경 Proxy로 요청 전달
  • 14. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) Enclave 환경 어플리케이션 로직은 최소화하자 Enclave 환경에서 돌아가는 어플리케이션 로그는 출력되지 않습니다. 🫠 개발 과정에서 디버그 모드로 실행하면 로그가 출력되긴 하지만 실제 운영에서는 끄고 실행해야합니 다. PCR 값이 0으로 출력 Parent 환경에 Proxy 기능을 포함한 서버를 만들어 Enclave에 들어가고 나오는 로그 수집 + 필요한 로직 수행 Ambassador
  • 15. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) Socket 코드를 최소화하자 단순하게 생각했을 때 VSOCK에서 패킷을 받은 후 byte[]를 deserialize 해야 어플리케이션에서 사 용할 수 있겠다고 생각 하지만 Socket 관련 코드가 프로덕션에서 트래픽을 받을 것이라 생각하니 어떤 난관이 있을지 전혀 예측할 수 없었습니다. 최대한 검증된 오픈소스를 사용해서 직접 짜는 Socket 코드를 최소화하자 기존 TCP 프록시 오픈소스를 커스텀 Go 어플리케이션이라면 TCP <> VSOCK Proxy 오픈소스가 존재 (‘참고 자료’)
  • 16. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) Socket 코드를 최소화하자 TCP <> VSOCK Proxy 가 있다면 이제 우리가 원하는 HTTP 프레임워크를 사용하여 어플리케이션을 작성할 수 있습니다 🎉 Ambassador와 Enclave 어플리케이션 코드의 복잡도가 엄청 줄어듭니다.
  • 17. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 확장성의 문제: /etc/hosts, 프록시를 계속 추가해야하는 문제 Enclave 어플리케이션이 단순하다면 별 문제는 없습니다. 두 개 이상의 외부 서비스(SDK)를 사용하면 /etc/hosts 를 사용하는 방식에 문제가 생깁니다. echo “127.0.0.1 www.googleapis.com” >> /etc/hosts echo “127.0.0.1 www.otherservice.com” >> /etc/hosts 😱 Proxy는 자신이 받은 패킷을 하나의 목적지로 프록시하기 때문에 외부 서비스를 사용할 때마다 Proxy를 추가해주어야한다. SOCKS5 Proxy
  • 18. KOREA AWS Nitro Enclave를 활용한 어플리케이션 개발 (Cont’d) 확장성의 문제: /etc/hosts, 프록시를 계속 추가해야하는 문제 SOCKS5 Proxy를 통해 외부 서비스 라우팅을 처리 SOCKS5: Proxy를 사이에 둔 Client/Server가 쉽게 통신할 수 있게 도와주는 프로토콜 패킷에 도달해야하는 서버 주소를 명시할 수 있어 Proxy는 해당 주소를 통해 라우팅
  • 19. KOREA AWS Nitro Enclave와 KMS Nitro Enclave 증명 기능 Nitro Hypervisor 가 Enclave 환경을 만들면서 platform configuration registers (PCRs)를 만듭 니다. PCRs은 PCR0, PCR1, … PCR8 과 같이 여러개의 값으로 이루어져있으며 각각의 값은 서로 다른 특성에 의해 생성됩니다. (‘참고 자료’) 이 중 PCR0은 EIF 파일의 기반이 되는 컨테이너 이미지에 따라서 결정됩니다. PCRs 값을 통해서 다른 서비스는 요청이 Enclave 환경에서 왔는지 확인할 수 있고 어떤 어플리케이 션이 요청을 보냈는지도 식별할 수 있습니다. 다시 말해, 동일한 이미지로 EIF를 만들면 항상 동일한 PCR0 값이 나옵니다.
  • 20. KOREA AWS Nitro Enclave와 KMS Nitro Enclave 증명 기능 KMS 키정책 Condition에 kms:RecipientAttestation 을 명시하는 것으로 특정 Enclave 어플리케 이션만 KMS을 통해서 데이터 암/복호화가 가능합니다. Principal에 root 계정을 명시하지 않으면 최고 관리자도 해 당 KMS 키를 통해 데이터 복호화가 불가능합니다. 예시 키정책
  • 23. KOREA 참고 자료 VSOCK Linux Commit: https://github.com/torvalds/linux/commit/ d021c344051af91f42c5ba9fdedc176740cbd238 Linux VSOCK Internals: https://terenceli.github.io/%E6%8A%80%E6%9C%AF/2020/04/ 18/vsock-internals AWS Nitro Enclave SDK C: https://github.com/aws/aws-nitro-enclaves-sdk-c brave/viproxy: https://github.com/brave/viproxy AWS Nitro Enclave Docs PCRs: https://docs.aws.amazon.com/enclaves/latest/user/set- up-attestation.html#where