[AWS] S3의 SSE(Server Side Encryption) 사용하기 (SSE-S3, SSE-KMS, SSE-C의 차이점, 설정 방법)
SSE란? 참고: https://jibinary.tistory.com/248
S3의 SSE 종류
- SSE-S3: S3가 키를 관리하고, 설정이 가장 간단.
- SSE-KMS: KMS를 통해 키를 관리하며, 더 높은 보안 및 세분화된 권한 제어가 가능
- SSE-C: 고객이 직접 키를 제공하며, S3는 키를 저장하지 않아 보안성이 높지만 관리가 까다롭다.
(참고) 공식 문서: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html
Server Side Encryption - S3
1. SSE-S3 설정 방법
S3에서 관리하는 키를 사용하여 암호화합니다. 설정이 가장 간단하며 추가 비용이 들지 않는다.
AWS Management Console > S3 Bucket > Properties > Default Encryption > 암호화 방식을 SSE-S3로 선택
(객체 업로드)PutObject API를 사용해 객체를 암호화하려면 요청에 x-amz-server-side-encryption
: AES256 헤더를 추가한다
(객체 다운로드)GetObject 시에는 별도의 암호화 키를 제공할 필요가 없다. S3가 자동으로 복호화하여 객체를 제공한다.
import boto3
s3_client = boto3.client('s3')
# 객체 업로드 예시
response = s3_client.put_object(
Bucket='my-bucket',
Key='my-object-key',
Body=b'Hello, SSE-S3!',
ServerSideEncryption='AES256' # SSE-S3 사용 설정
)
Server Side Encryption - KMS
2. SSE-KMS 설정 방법
AWS KMS를 통해 암호화 키를 관리하며, 더 강력한 보안을 제공합니다. KMS를 사용하기에 KMS의 비용이 발생한다
AWS Management Console > S3 Bucket > Properties > Default Encryption > AWS-KMS로 선택 > 사용하고자 하는 KMS 키를 선택
(객체 업로드) PutObject API로 객체 암호화 시에는 x-amz-server-side-encryption
: aws:kms 헤더와 함께 x-amz-server-side-encryption-aws-kms-key-id
: <KMS 키 ID>를 추가한다.
(객체 다운로드) GetObject 시 추가적인 설정 없이도 자동으로 복호화된다. 그러나, 해당 KMS 키에 대한 접근 권한이 있어야 한다.
import boto3
s3_client = boto3.client('s3')
# KMS 키 ARN
kms_key_id = 'arn:aws:kms:region:account-id:key/key-id'
# 객체 업로드 예시
response = s3_client.put_object(
Bucket='my-bucket',
Key='my-object-key',
Body=b'Hello, SSE-KMS!',
ServerSideEncryption='aws:kms', # SSE-KMS 사용 설정
SSEKMSKeyId=kms_key_id # KMS 키 ARN 지정
)
Server Side Encryption - Customer-Provided Keys
3. SSE-C 설정 방법
사용자가 직접 제공하는 암호화 키로 객체를 암호화하려면 매번 요청 시 암호화 키를 제공해야 한다
(객체 업로드) PutObject API 요청 시 x-amz-server-side-encryption-customer-algorithm
, x-amz-server-side-encryption-customer-key
, x-amz-server-side-encryption-customer-key-MD5
헤더를 사용하여 키 정보를 전달해야한다.
import boto3
import base64
import hashlib
s3_client = boto3.client('s3')
# 사용자가 제공하는 암호화 키
encryption_key = b"your-secret-encryption-key"
# 키의 MD5 해시 생성 (Base64 인코딩)
key_md5 = base64.b64encode(hashlib.md5(encryption_key).digest()).decode('utf-8')
# Base64로 인코딩된 키
encoded_key = base64.b64encode(encryption_key).decode('utf-8')
# 객체 업로드 예시
response = s3_client.put_object(
Bucket='my-bucket',
Key='my-object-key',
Body=b'Hello, SSE-C!',
SSECustomerAlgorithm='AES256',
SSECustomerKey=encoded_key,
SSECustomerKeyMD5=key_md5
)
🤔 문제
개발자는 애플리케이션을 통해 Amazon S3 버킷에 데이터를 저장하며, HTTP API를 사용해 객체를 저장하고 검색합니다. PutObject API 작업을 통해 S3 버킷에 객체가 추가될 때, 개발자는 Amazon S3 관리 키(SSE-S3)를 사용하여 객체를 서버 측 암호화하여 저장해야 합니다. 이 요구 사항을 충족할 수 있는 솔루션은 무엇입니까?
- AWS 키 관리 서비스(AWS KMS) 키를 생성하고, 이 KMS 키를 S3 버킷에 할당합니다.
- PutObject API 작업을 호출할 때 x-amz-server-side-encryption 헤더를 설정합니다.
- 모든 요청의 HTTP 헤더에 암호화 키를 제공합니다.
- S3 버킷에 대한 트래픽을 암호화하기 위해 TLS를 적용합니다.
정답 & 오답
정답: 2번.
PutObject API 작업을 호출할 때 x-amz-server-side-encryption 헤더를 설정합니다.
이 옵션은 PutObject API 호출 시 x-amz-server-side-encryption 헤더를 설정하여 S3에 객체를 SSE-S3로 암호화하라고 지시한다. 이를 통해 객체가 S3에 저장될 때 Amazon S3 관리 키를 사용하여 암호화된다.
1번: 문제에서 SSE-S3를 사용한다고 했기 때문에 1번은 오답
3번: SSE-C에 해당된다
4번: TLS는 전송 중 데이터의 보안을 제공하지만, 이 질문은 저장된 데이터의 암호화에 관한 것이다.