디렉터리 버킷의 기본 암호화 설정·모니터링
디렉터리 버킷의 기본 암호화 설정·모니터링 (Setting and monitoring default encryption for directory buckets)
Amazon S3 버킷은 기본으로 버킷 암호화가 활성화되어 있고, 새 객체는 Amazon S3 관리 키를 사용한 서버 측 암호화(SSE-S3)로 자동 암호화돼요. 이 암호화는 Amazon S3 버킷의 모든 새 객체에 적용되며 추가 비용이 들지 않아요.
키 회전과 접근 정책 권한을 관리하는 것처럼 암호화 키를 더 세밀하게 제어해야 한다면 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)를 선택할 수 있어요.
출처: 문서
본문
참고
- 버킷의 기본 암호화가 원하는 암호화 구성으로 설정되어 있도록 하고,
CreateSession요청이나PUT object요청에서 버킷 기본 암호화를 덮어쓰지 않는 것을 권장해요. 그러면 새 객체가 원하는 암호화 설정으로 자동 암호화돼요. 디렉터리 버킷의 암호화 덮어쓰기 동작에 대한 자세한 내용은 새 객체 업로드에 AWS KMS를 사용한 서버 측 암호화 지정 을 참고하세요.- 디렉터리 버킷의 새 객체를 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. 그러면 Zonal 엔드포인트 API 작업용 세션이 생성될 때 세션 중에 새 객체가 SSE-KMS와 S3 Bucket Keys로 자동 암호화·복호화돼요.
- 버킷 기본 암호화를 SSE-KMS로 설정하면 S3 Bucket Keys는 디렉터리 버킷의 GET 및 PUT 작업에 항상 활성화되며 비활성화할 수 없어요.
CopyObject,UploadPartCopy, Batch Operations의 Copy 작업, 또는 가져오기 작업으로 SSE-KMS 암호화 객체를 일반 용도 버킷과 디렉터리 버킷 사이(또는 디렉터리 버킷 사이)에서 복사할 때는 S3 Bucket Keys가 지원되지 않아요. 이 경우 Amazon S3는 KMS 암호화 객체에 대한 복사 요청이 있을 때마다 AWS KMS에 호출해요. S3 Bucket Keys가 AWS KMS 요청 비용을 줄이는 방법에 대한 자세한 내용은 Amazon S3 Bucket Keys로 SSE-KMS 비용 줄이기 를 참고하세요.- 디렉터리 버킷의 암호화에 AWS KMS 고객 관리 키를 지정할 때는 키 ID나 키 ARN만 사용해야 해요. KMS 키의 별칭(alias) 형식은 지원되지 않아요.
- AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)와 고객 제공 키를 사용한 서버 측 암호화(SSE-C)는 디렉터리 버킷의 기본 암호화에 지원되지 않아요.
기본 암호화 구성에 대한 자세한 내용은 기본 암호화 구성 을 참고하세요.
기본 암호화에 필요한 권한에 대한 자세한 내용은 Amazon Simple Storage Service API Reference의 PutBucketEncryption 을 참고하세요.
Amazon S3 콘솔, AWS SDK, Amazon S3 REST API, AWS CLI를 사용해 S3 버킷의 Amazon S3 기본 암호화를 구성할 수 있어요.
Amazon S3 버킷에 기본 암호화 구성하기
- AWS Management Console에 로그인하고 https://console.aws.amazon.com/s3/ 에서 Amazon S3 콘솔을 엽니다.
- 왼쪽 탐색 창에서 Buckets(버킷)을 선택합니다.
- Buckets 목록에서 원하는 버킷의 이름을 선택합니다.
- Properties(속성) 탭을 선택합니다.
- Server-side encryption settings(서버 측 암호화 설정)에서 디렉터리 버킷은 Server-side encryption with Amazon S3 managed keys (SSE-S3) 를 사용해요.
- Save changes(변경 사항 저장)를 선택합니다.
이 예제들은 SSE-S3 또는 S3 Bucket Key와 함께 SSE-KMS를 사용해 기본 암호화를 구성하는 방법을 보여줘요.
기본 암호화에 대한 자세한 내용은 Amazon S3 버킷의 기본 서버 측 암호화 동작 설정 을 참고하고, AWS CLI로 기본 암호화를 구성하는 방법은 put-bucket-encryption을 참고하세요.
예제 — SSE-S3를 사용한 기본 암호화
이 예제는 Amazon S3 관리 키로 버킷 기본 암호화를 구성해요. 실행 시 사용자 입력 자리표시자는 직접 채워 넣어야 합니다.
aws s3api put-bucket-encryption --bucket bucket-base-name--zone-id--x-s3 --server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "AES256"
}
}
]
}'
예제 — S3 Bucket Key를 사용한 SSE-KMS 기본 암호화
이 예제는 S3 Bucket Key와 함께 SSE-KMS로 버킷 기본 암호화를 구성해요. 실행 시 사용자 입력 자리표시자는 직접 채워 넣어야 합니다.
aws s3api put-bucket-encryption --bucket bucket-base-name--zone-id--x-s3 --server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "KMS-Key-ARN"
},
"BucketKeyEnabled": true
}
]
}'
REST API PutBucketEncryption 작업으로 사용할 서버 측 암호화 유형(SSE-S3 또는 SSE-KMS)을 지정해 기본 암호화를 설정할 수 있어요.
자세한 내용은 Amazon Simple Storage Service API Reference의 PutBucketEncryption 을 참고하세요.
AWS SDK를 사용할 때는 Amazon S3가 서버 측 암호화에 AWS KMS 키를 사용하도록 요청할 수 있어요. 다음 AWS SDK for Java와 .NET 예제들은 SSE-KMS 및 S3 Bucket Key로 디렉터리 버킷의 기본 암호화 구성을 설정해요. 다른 SDK에 대한 정보는 AWS Developer Center의 샘플 코드 및 라이브러리 를 참고하세요.
중요
Amazon S3에서 서버 측 암호화에 AWS KMS 키를 사용할 때는 대칭 암호화 KMS 키를 선택해야 해요. Amazon S3는 대칭 암호화 KMS 키만 지원해요. 이 키에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 대칭 암호화 KMS 키 를 참고하세요.
Java 예제 (AWS SDK for Java 2.x)
AWS SDK for Java 2.x에서는 applyServerSideEncryptionByDefault 메서드를 사용해 SSE-KMS로 데이터를 암호화할 디렉터리 버킷의 기본 암호화 구성을 지정하도록 Amazon S3에 요청할 수 있어요. 대칭 암호화 KMS 키를 만들고 이를 요청에 지정하면 돼요.
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutBucketEncryptionRequest;
import software.amazon.awssdk.services.s3.model.ServerSideEncryption;
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionByDefault;
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionConfiguration;
import software.amazon.awssdk.services.s3.model.ServerSideEncryptionRule;
public class Main {
public static void main(String[] args) {
S3Client s3 = S3Client.create();
String bucketName = "bucket-base-name--zoneid--x-s3";
String kmsKeyId = "your-kms-customer-managed-key-id";
// AWS managed KMS keys aren't supported. Only customer-managed keys are supported.
ServerSideEncryptionByDefault serverSideEncryptionByDefault = ServerSideEncryptionByDefault.builder()
.sseAlgorithm(ServerSideEncryption.AWS_KMS)
.kmsMasterKeyID(kmsKeyId)
.build();
// The bucketKeyEnabled field is enforced to be true.
ServerSideEncryptionRule rule = ServerSideEncryptionRule.builder()
.bucketKeyEnabled(true)
.applyServerSideEncryptionByDefault(serverSideEncryptionByDefault)
.build();
ServerSideEncryptionConfiguration serverSideEncryptionConfiguration = ServerSideEncryptionConfiguration.builder()
.rules(rule)
.build();
PutBucketEncryptionRequest putRequest = PutBucketEncryptionRequest.builder()
.bucket(bucketName)
.serverSideEncryptionConfiguration(serverSideEncryptionConfiguration)
.build();
s3.putBucketEncryption(putRequest);
}
}
고객 관리 키 만들기에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 AWS KMS API 프로그래밍 을 참고하세요.
객체 업로드 작업 코드 예제는 다음 주제를 참고하세요. 이 예제를 사용하려면 앞선 코드 조각에서 보여준 것처럼 코드 예제를 갱신하고 암호화 정보를 제공해야 해요.
- 단일 작업으로 객체를 업로드하려면 디렉터리 버킷에 객체 업로드하기 를 참고하세요.
- 멀티파트 업로드 API 작업은 디렉터리 버킷에 멀티파트 업로드 사용하기 를 참고하세요.
C# 예제 (AWS SDK for .NET)
AWS SDK for .NET에서는 ServerSideEncryptionByDefault 속성을 사용해 SSE-KMS로 데이터를 암호화할 디렉터리 버킷의 기본 암호화 구성을 지정하도록 Amazon S3에 요청할 수 있어요. 대칭 암호화 고객 관리 키를 만들고 이를 요청에 지정하면 돼요.
// Set the bucket server side encryption to use AWSKMS with a customer-managed key id.
// bucketName: Name of the directory bucket. "bucket-base-name--zonsid--x-s3"
// kmsKeyId: The Id of the customer managed KMS Key. "your-kms-customer-managed-key-id"
// Returns True if successful.
public static async Task SetBucketServerSideEncryption(string bucketName, string kmsKeyId)
{
var serverSideEncryptionByDefault = new ServerSideEncryptionConfiguration
{
ServerSideEncryptionRules = new List
{
new ServerSideEncryptionRule
{
ServerSideEncryptionByDefault = new ServerSideEncryptionByDefault
{
ServerSideEncryptionAlgorithm = ServerSideEncryptionMethod.AWSKMS,
ServerSideEncryptionKeyManagementServiceKeyId = kmsKeyId
}
}
}
};
try
{
var encryptionResponse =await _s3Client.PutBucketEncryptionAsync(new PutBucketEncryptionRequest
{
BucketName = bucketName,
ServerSideEncryptionConfiguration = serverSideEncryptionByDefault,
});
return encryptionResponse.HttpStatusCode == HttpStatusCode.OK;
}
catch (AmazonS3Exception ex)
{
Console.WriteLine(ex.ErrorCode == "AccessDenied"
? $"This account does not have permission to set encryption on {bucketName}, please try again."
: $"Unable to set bucket encryption for bucket {bucketName}, {ex.Message}");
}
return false;
}
고객 관리 키 만들기에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 AWS KMS API 프로그래밍 을 참고하세요.
객체 업로드 작업 코드 예제는 다음 주제를 참고하세요. 이 예제를 사용하려면 앞선 코드 조각에서 보여준 것처럼 코드 예제를 갱신하고 암호화 정보를 제공해야 해요.
- 단일 작업으로 객체를 업로드하려면 디렉터리 버킷에 객체 업로드하기 를 참고하세요.
- 멀티파트 업로드 API 작업은 디렉터리 버킷에 멀티파트 업로드 사용하기 를 참고하세요.
AWS CloudTrail로 디렉터리 버킷의 기본 암호화 모니터링
AWS CloudTrail 이벤트를 사용해 Amazon S3 디렉터리 버킷의 기본 암호화 구성 요청을 추적할 수 있어요. CloudTrail 로그에 사용되는 API 이벤트 이름은 다음과 같아요.
- PutBucketEncryption
- GetBucketEncryption
- DeleteBucketEncryption
참고
- EventBridge는 디렉터리 버킷에서 지원되지 않아요.
- AWS Key Management Service(AWS KMS) 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)나 고객 제공 암호화 키를 사용한 서버 측 암호화(SSE-C)는 디렉터리 버킷에서 지원되지 않아요.
AWS CloudTrail로 기본 암호화를 모니터링하는 방법에 대한 자세한 내용은 AWS CloudTrail 및 Amazon EventBridge로 기본 암호화 모니터링 을 참고하세요.