S3 Encryption for Objects
- S3에 객체를 업로드할 경우 AWS 서버 내의 객체로 접근이 불가능하게끔 보호해야 함
- S3에서 객체 암호화를 위한 네 가지 방법이 존재
1) SSE-S3 : AWS가 처리 및 관리하는 키를 사용해 S3 객체를 암호화
2) SSE-KMS : AWS 키 관리 서비스를 사용해서 암호화 키를 관리
3) SSE-C : 사용자가 만든 암호화 키를 관리
4) 클라이언트 측 암호화 (SSE-CSE)
SSE-S3
- Amazon S3에서 처리하고 관리하는 키를 암호화에 사용하는 방식으로 객체는 서버 측에서 암호화됨
즉, SSE = Server Side Encryption - 암호화 유형은 AES-256으로 객체를 업로드하고 암호화를 설정하려고 하면
헤더에 “x-amz-server-side-encryption": "AES256"를 설정 - S3로 객체를 업로드해서 SSE-S3 암호화하기 위해 우선 HTTP 혹은 HTTPS 프로토콜을 사용해 S3에 객체를 업로드하며
업로드를 할 때 헤더에 “x-amz-server-side-encryption": "AES256"를 설정
그렇게 되면 S3는 헤더를 통해 고유의 S3 관리 데이터 키를 사용해야한다는 사실을 인식하고
S3 관리 데이터 키와 객체를 사용해서 암호화가 이루어지고 객체는 암호화되어 S3 버킷에 저장
- 간단하지만 S3에서 데이터 키를 전부 소유하고 관리해야 함
SSE-KMS
- KMS는 키 관리 서비스를 의미하여 암호화 서비스들 중 하나로 SSE-KMS에서의 암호화 키는 KMS 서비스에서 처리 및 관리
- SSE-S3보다 KMS를 사용할 경우 누가 어떤 키에 접근할 수 있는지 제어가 가능하며 감사 추적을 할 수 있음
- 객체는 서버 측에서 암호화되며 헤더를 설정할 때 서버 측 암호화 값을 "aws:kms"로 설정
- SSE-S3과 동일한 원리로 작동하며 헤더를 통해 S3는 미리 정의해 둔 KMS 고객 마스터 키와 객체를 사용해 암호화한 후 저장
SSE-C
- 서버측 암호화를 뜻하며 AWS 외부에서 고객이 완전히 관리하는 키를 사용하기 때문에 고객에 제공한 키를 저장하지 않으므로
암호화를 위해 키를 사용한 후 키를 폐기 - S3로 객체를 업로드하기 위해 데이터를 AWS로 전송할 때는 암호도 전달해야 하므로
전송되는 동안에도 암호화가 필요하므로 의무적으로 HTTPS를 사용함 - 클라이언트 측 데이터 키를 제공해서 암호화해야 하기 때문에 객체와 암호 키를 모두 HTTPS를 통해 전송한 후
S3는 클라이언트에게서 제공받은 데이터와 키를 이용해 암호화한 후 암호화된 객체를 S3 버킷에 저장
- 만약 다시 파일을 받으려면 클라이언트 측 데이터 키가 제공되어야 하며
클라이언트가 데이터 키를 관리하므로 클라이언트 측에서 해야할 일이 많아짐
Client Side Encryption
- S3에 객체를 업로드하기 전 클라이언트가 객체를 암호화하는 것으로 클라이언트가 전부 관리
- 클라이언트 라이브러리를 사용할 수 있으며 Amazon S3 Encryption Client 등으로 암호화를 수행할 수 있음
- 클라이언트는 데이터를 S3로 보내기 전에 암호화하므로 전달받은 데이터가 CSE를 사용해 암호화되어 있다면
데이터를 해독할 책임도 클라이언트에게 달려있으므로 클라이언트는 올바른 키를 가지고 있어야 함 - S3는 버킷 상태이며 어떤 암호화도 제공해주지 않으므로 클라이언트 측 암호화이며
클라이언트는 암호화 SDK를 사용해 객체와 클라이언트 측 데이터 키를 제공하여 클라이언트 측에서 완전히 암호화한 후
S3에 업로드하게 됨
Encryption in transit (SSL/TLS)
- 통신 중 암호화
- S3가 이 서비스를 주도하며 암호화되지 않은 상태의 HTTP 엔드 포인트를 노출하거나
암호화된 HTTPS 엔드 포인트를 노출해 전송 중 암호화 서비스를 제공 - 이 때 SSL과 TLS 인증서의 도움을 받게 됨
- 대부분의 클라이언트가 HTTPS 엔드 포인트를 사용하며,
이는 클라이언트 및 S3 사이를 이동하는 데이터를 모두 암호화하므로 전송 중 암호화라는 이름을 가짐
<S3 암호화 실습>
- 암호화 셋팅
현재 기본 암호화는 비활성화되어 있으며 서버 측 암호화는 None이므로 객체가 암호화되지 않은 상태
coffee.jpg 파일을 업로드하면서 Additional upload options을 누르면 서버 측 암호화 설정이 존재하므로
SSE-S3 키를 사용하면 Amazon S3 키를 사용하여 S3가 생성 및 관리, 사용을 하도록 할 수 있으므로 이 유형을 사용해 파일 생성
같은 방법으로 beach.jpg 파일을 업로드하면서 서버측 암호화 설정의 SSE-KMS를 사용하면 암호화 키가 KMS 서비스로 보호됨
여기에는 AWS 관리 키인 aws/s3, 고유 키 생성을 위해 KMS 마스터 키 중에서 고르기,
다른 계정에 키가 있는 경우 KMS 마스터 키 ARN 선택이 존재하는데
그 중 가장 기본인 aws/s3를 사용하여 KMS 서비스에 API 호출을 함으로써 키 암호화가 이루어지도록 함
- 암호화된 파일 확인
방금 업로드한 beach.jpg를 확인하면 암호화 설정이 AWS-KMS 마스터 키인 SSE-KMS로 암호화된 것을 확인할 수 있으며
이전에 업로드한 beach.jpg를 혹인하면 서버 측 암호화가 None인 것을 확인할 수 있음
즉, 암호화 설정은 특정 파일 및 그에 해당하는 특정 버전 ID에만 적용됨
- 버킷의 기본 암호화 방법 지정 및 작동 확인
각 파일에 대해 암호화 설정을 지정할 수 있지만 필요한 경우 Properties 탭에서 버킷의 기본 암호화 방법을 지정할 수 있음
서버 측 암호화를 기본으로 해두면 모든 객체가 S3 키로 업로드되도록 하므로
암호화 없이 파일을 업로드하더라도 기본 암호화 설정이 활성화되어 있으므로 SSE-S3로 암호화 설정이 적용됨
- 암호화 덮어쓰기 및 이외의 암호화
기본 암호화 설정에서 암호화 키 덮어쓰기를 선택하면 암호화를 다시 설정할 수 있음
SSE-C의 경우 객체 암호화를 위해서 암호화 키를 AWS로 안전하게 전달하기 위해 CLI를 통해서만 설정 가능
클라이언트 측 암호화의 경우 우리의 컴퓨터에서 객체를 암호화하므로
S3은 암호화 여부에 관계 없이 전부 전달받으므로 해당 옵션은 콘솔에 나타나지 않는 것을 볼 수 있음
그러므로 콘솔에서는 SSE-S3와 SSE-KMS만 선택이 가능
'Cloud > AWS' 카테고리의 다른 글
[SAA] S3 웹사이트 (0) | 2022.03.23 |
---|---|
[SAA] S3 보안 및 버킷 정책 (0) | 2022.03.23 |
[SAA] S3 버전 관리 (0) | 2022.03.21 |
[SAA] S3 버킷 및 객체 (0) | 2022.03.21 |
[SAA] Beanstalk (0) | 2022.03.21 |