AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다루기
Nov. 11, 2022•0 likes
0 likes
Be the first to like this
Show More
•27 views
views
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download to read offline
Report
Internet
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다루기
Youtube: https://www.youtube.com/watch?v=nbEodu0s5VA&t=4750s
AWS Nitro Enclave 를 활용하여 어플리케이션을 어떻게 개발할 수 있는지 증명 기능을 활용한 AWS KMS 연동 방법에 대해서 설명합니다.
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 키를 통해 데이터 복호화가 불가능합니다.
예시 키정책