S3 암호화
S3 객체 암호화 기능 종류 및 사용하기
- S3 데이터를 암호화 하는 방식은 크게 두 가지가 존재
- 데이터를 저장할 때 암호화 KEY 를 이용해 암호화 ∙ 복호화로 관리하거나, Amazon 의 암호화된 API 엔드포인트를 이용해 S3 에서 다른 서비스 또는 리소스로 전송되는 데이터를 암호화 할 수 있음
🔖 암호화 KEY 이용
- 키를 이용해 S3 데이터를 암호화 할 때 어느 주체 기준으로 암호화하는지에 따라 서버 측과 클라이언트 측으로 나뉘게 됨
- 이 둘은 각 상황과 특징에 따라 쓰임새가 달라 자신의 서비스 환경에 맞게 선택해야 함
💻 서버 측 암호화
AWS: 서버 측 암호화를 사용하여 데이터 보호
- 서버 측 암호화는 데이터를 받는 애플리케이션 또는 서비스에 의해 데이터를 암호화하는 것
- 서버 측 암호화는 S3 플랫폼 내에서 진행되며 디스크에 저장될 때 데이터 객체를 암호화하고 적절한 권한 증빙을 통해 데이터 인출을 요청할 때 복호화해 전송
- 서버 측에서 S3 암호화를 하는 방법은 3가지 존재
- SSE-S3
- SSE-KMS
- Amazon Key Management Service 에 저장된
KMS
키를 사용한 암호화
- SSE-C
- 사용자에 의해 직접 정의된 키들을 이용해 암호화
🗂 SSE-S3
- Amazon S3 에서 관리하는 키를 사용하여 암호화하는 방법
- S3 Managed Data Key 는 S3 에 의해 완전히 소유되고 관리됨
- 각 객체는 고유한 키로 암호화됨
- 또한 추가 보안 조치로 주기적으로 교체되는 루트 키를 사용하여 키 자체를 암호화
- Amazon S3 서버 측 암호화는 가장 강력한 블록 암호 중 하나인
AES-256
( 256 비트 Advanced Encryption Standard ) 를 사용하여 데이터를 암호화
- 서버에서 암호화 하기 위해서는 헤더에 아래 내용을 보내야 함
"x-amz-server-side-encryption": "AES256"
- 암호화 과정
- 암호화되지 않은 객체를 S3 로 업로드하여 SSE-S3 암호화 실행
- S3 로 객체를 전송할 때
HTTP
/ HTTPS
프로토콜로 헤더에 "x-amz-server-side-encryption":"AES256"
을 설정해 전송
- 그러면 Amazon S3 는 이 헤더를 통해 S3 Managed Data Key 로 전송받은 객체를 암호화 하고 저장
🗂 SSE-KMS (Key Manager Service)
AWS: SSE-KMS 와 함께 서버 측 암호화 사용
- SSE-KMS 는 Amazon KMS Keys 를 사용한 서버 측 암호화로 SSE-S3 와 유사하지만 이 서비스 사용 시 몇 가지 추가적인 이점이 있고 비용이 발생
KMS
란 Amazon 키 관리를 중점으로 하는 하나의 서비스
- SSE-S3 과의 달리 조금 더 사용자 단위의 컨트롤을 할 수 있음
- Amazon S3 의 객체에 대한 무단 액세스에 대응하여 추가적인 보호를 제공하는
KMS
키를 사용하려면 별도의 권한이 필요
- SSE-KMS 도
KMS
키가 사용된 때와 사용 주체를 표시하는 감사 추적 기능을 제공
- 또한 고객 관리형 키를 생성하고 관리하거나 사용자 ∙ 서비스 및 리전에 고유한 Amazon 관리형
CMK
를 사용할 수 있음
- 객체는 SSE-S3 에서와 마찬가지로 서버에서 암호화 됨
- 서버에서 암호화 하기 위해서는 헤더에 아래 내용을 보내야 함
"x-amz-server-side-encryption": "aws:kms"
- 암호화 과정
- Amazon S3 는 전송받은 객체의 헤더를 확인하고 어떤 방식으로 암호화 할 지 설정
- SSE-KMS 방식이기 때문에 S3 에서 암호화 할 때
KMS
에서 미리 세팅해놓은 KMS Customer Master Key 를 사용하여 전송받은 객체를 암호화
- 암호화 한 객체를 S3 버킷에 저장
🗂 SSE-C
- 사용자가 완전하게 키 관리하는 암호화 방식
- Amazon S3 는 사용자가 제공한 암호화 키를 서버에 저장하지 않으며 사용한 키는 바로 폐기됨
- S3 는 제공된 키를 가지고 암호화 시키는 역할만 수행
- SSE-C 를 사용하면 사용자는 암호화 키를 관리하고 Amazon S3 는 암호화 (디스크에 쓸 때) 및 복호화 (객체에 액세스할 때) 를 관리
- 따라서 데이터를 전송할 때는 반드시
HTTPS
프로토콜을 사용해야 함
- 사용자가 키를 보내야 하기 때문에 암호화는 필수
- 키는
HTTPS
헤더에 담아 전송
- 암호화 과정
- 사용자는
HTTPS
프로토콜을 사용하여 암호화 키와 객체를 Amazon S3 로 전송
- S3 에서는 전송받은 키로 객체를 암호화하여 S3 버킷에 저장
- S3 로부터 파일을 받으려면 암호화를 할 때 사용되었던 것과 동일한 키를 S3 로 보내줘야 함
- 사용자가 직접
HTTPS
를 사용해 데이터를 암호화하고 버킷에 업로드 하는 형식으로 S3 콘솔 메뉴를 지원을 하지 않음
- 따라서 REST API 를 호출하여 객체를 생성할 때 사용자가 제공 암호화 키 ( SSE-C ) 를 사용하여 암호화
- SSE-C 를 사용하는 경우 아래와 같은 헤더를 포함하여 직접 암호화 키 정보를 제공해야 함
x-amz-server-side-encryption-customer-algorithm
- 헤더를 사용하여 암호화 알고리즘을 지정
- 헤더 값은 "AES256"
x-amz-server-side-encryption-customer-key
- 이 헤더를 사용하여 256 비트의 base64 인코딩 암호화 키를 Amazon S3 에 제공하여 데이터를 암호화 및 복호화
x-amz-server-side-encryption-customer-key-MD5
- 이 헤더를 사용하여 RFC 1321 에 따라 암호화 키의 128 비트 base64 인코딩 MD5 다이제스트를 제공
- Amazon S3 는 메시지 무결성 검사에 이 헤더를 사용하여 암호화 키가 오류 없이 전송 되었음을 확인
💻 클라이언트 측 암호화
- 클라이언트 측 암호화 ( Client Side Encryption ) 는 로컬에서 데이터를 암호화하는 작업
- SSE-C 와 차이점은 S3 서버가 암호화 과정에 전혀 관여하지 않는다는 점
- 객체를 S3에 업로드 하기 전에 클라이언트에서 암호화
Amazon S3 Encryption Client
라는 라이브러리를 사용하여 암호화
- 이 때문에 복호화 할 때도 클라이언트에서 암호화 키를 이용해 복호화 해야 함
- 클라이언트가 암호화 키와 암호화 과정을 관리
- 대부분은 간단하게 설정 할 수 있는 서버 측 암호화를 사용
- 기업 및 기관에 따라 암호화 키를 직접 생성 및 관리하려는 경우 클라이언트 측 암호화 기능을 사용
- 암호화 과정
- 클라이언트는 Amazon 에서 제공하는 암호화 SDK 를 사용하여 객체를 암호화
- 암호화가 클라이언트 측에서 일어나므로 객체는 로컬에서 완전히 암호화 됨
- 암호화 된 객체를 S3 버킷에 업로드
Tip! 추가 내용
💻 S3 전송 중 암호화
🗂 SSL / TLS
- 통신 암호화 방식으로
SSL
과 TLS
가 사용됨
HTTPS
를 이용하는 경우 전송 중 암호화를 하게 되는데 이 때 SSL
/ TLS
인증서를 이용
HTTPS
를 사용하면 Amazon S3 과 클라이언트 사이를 이동하는 데이터가 모두 암호화되어 전송되는데 이것을 Encryption In Transit 라고 부름
- 클라이언트가 암호 키를 제공해야 하는 경우에는
HTTPS
프로토콜 사용이 필수