포스팅 목차
방법1) SSE-S3
- AWS가 처리 및 관리하는 key를 사용해 S3 객체를 암호화 하는 방법
- 객체는 서버 측에서 암호화 된다
- 암호화 유형은 AES-256 알고리즘
- 객체를 업로드하고 SSE S3 암호화를 설정하려면 "x-amz-server-side-encryption":"AE256” 로 header에 세팅해야한다.
- 객체 업로드를 위해 HTTP(S) 프로토콜을 사용할 수 있는데 헤더에 "x-amz-server-side-encryption":"AE256”를 추가해서 전송하면 Amazon S3는 이 헤더 내용을 통해 고유의 S3 관리 데이터 키를 사용해야 한다는 사실을 인식하고 S3 관리 데이터 키와 객체를 사용해서 암호화되고 S3 버킷에 저장된다. Amazon S3에서 데이터 키를 전부 소유 및 관리한다.
방법2) SSE-KMS
- AWS KMS (키관리 서비스)를 이용한 암호화 키를 관리하는 방법
- 왜 SSE-S3 대신 KMS를 사용할까? 누가 어떤 키에 접근할 수 있을지 제어가 가능하고 감사 추적을 할 수 있기 때문이다.
- 객체가 서버 측에서 암호화 된다.
- 객체를 업로드하고 SSE KMS 암호화를 설정하려면 "x-amz-server-side-encryption":"aws:kms” 로 header에 세팅해야한다.
- SSE S3와 비슷하고 "x-amz-server-side-encryption":"aws:kms” 로 헤더를 설정하여 보내면 Amazon S3은 미리 정의해 둔 KMS 고객 마스터 키를 사용하게 된다. 고객 마스트 키를 사용하면 (지정된 키와 객체를 사용하면) 암호화가 이루어지고 파일은 SSE-KMS 암호화 방식 하에 S3 버킷에 저장된다.
방법3) SSE-C
- 서버 측 암호화 방식을 뜻하며 AWS의 외부에서 고객이 관리하는 키를 사용한다.
- Amazon S3 는 고객이 제공한 암호화 키를 저장하지 않는다. 암호화를 위해서는 당연히 키를 사용하겠지만 그 후에는 키를 폐기한다.
- 데이터를 AWS 로 전송할 때는 반드시 HTTPS를 사용해야 한다.
- 암호화 키가 HTTP 헤더에 제공되어야 하는데 모든 HTTP 요청마다 매번 제공되어야 한다. 항상 사용후 폐기 되기 때문이다.
- 객체를 클라이언트의 키를 사용하여 암호화 하고자 하고 HTTPS 프로토콜을 사용하고 헤더에 Data key를 넣어 보내면 서버측에서 암호화 된다.
- 만약 SSE-C를 통해 Amazon S3로 부터 파일을 다시 받으려면 동일한 클라이언트 측 데이터 키를 제공해야 한다.
방법4) Client Side Encryption (CSE)
- 클라이언트 측 암호화
- Amazon S3에 객체를 업로드하기 전 클라이언트에서 객체를 암호화 하는 방식이다
- 클라이언트 라이브러리를 사용할 수 있는데 Amazon S3 Encryption Client 등으로 클라이언트 측 암호화를 수행할 수 있다.
- 만약 전달 받은 데이터가 CSE를 사용해 암호화 되었다면 데이터를 복호화할 책임도 사용자에게 달려있다.
- 키와 암호화 주기 전체를 클라이언트가 전부 관리하게 된다.
Encryption in transit(SSL/TLS) - 전송 중 암호화
- Amazon S3 exposes :
- HTTP endpoint : 암호화 되지 않음
- HTTPS endpoint : 전송 중 암호화 서비스 제공
- 원하는 endpoint를 사용해도 되지만 기본적으로 HTTPS를 추천한다.
- HTTPS를 사용하면 클라이언트 및 S3 사이를 이동하는 데이터가 모두 암호화 되면 전송 중 암호화라고 한다.
- SSE-C, 서버측 암호화를 사용할때 클라이언트가 키를 제공할때는 HTTPS가 필수이다.
- 전송 중 암호화는 SSL/TLS 라고도 불리는데 SSL와 TLS 인증서를 사용하기 때문이다.