클라우드(AWS)/DVA-C03

[AWS] S3의 SSE(Server Side Encryption) 사용하기 (SSE-S3, SSE-KMS, SSE-C의 차이점, 설정 방법)

찌르비 2024. 11. 3. 17:15
반응형

 

SSE란? 참고: https://jibinary.tistory.com/248

 

[AWS] KMS란? 쉽게 개념 정리 (Key Management Service, SSE, CSE)

◇  공부 기록용으로 작성하였으니 틀린점, 피드백 주시면 감사하겠습니다 ◇  Key Management ServiceAWS KMS KMS는 AWS의 애플리케이션에서 사용하는 데이터의 암호화/복호화를 위한 키를 생성/관

jibinary.tistory.com

 

 

 

S3의 SSE 종류

  1. SSE-S3: S3가 키를 관리하고, 설정이 가장 간단.
  2. SSE-KMS: KMS를 통해 키를 관리하며, 더 높은 보안 및 세분화된 권한 제어가 가능
  3. SSE-C: 고객이 직접 키를 제공하며, S3는 키를 저장하지 않아 보안성이 높지만 관리가 까다롭다.

(참고) 공식 문서: https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html

 

Using server-side encryption with Amazon S3 managed keys (SSE-S3) - Amazon Simple Storage Service

Amazon S3 now applies server-side encryption with Amazon S3 managed keys (SSE-S3) as the base level of encryption for every bucket in Amazon S3. Starting January 5, 2023, all new object uploads to Amazon S3 are automatically encrypted at no additional cost

docs.aws.amazon.com

 

 

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)를 사용하여 객체를 서버 측 암호화하여 저장해야 합니다. 이 요구 사항을 충족할 수 있는 솔루션은 무엇입니까?

 

  1. AWS 키 관리 서비스(AWS KMS) 키를 생성하고, 이 KMS 키를 S3 버킷에 할당합니다.
  2. PutObject API 작업을 호출할 때 x-amz-server-side-encryption 헤더를 설정합니다.
  3. 모든 요청의 HTTP 헤더에 암호화 키를 제공합니다.
  4. 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는 전송 중 데이터의 보안을 제공하지만, 이 질문은 저장된 데이터의 암호화에 관한 것이다.

 

728x90
반응형