

# 디렉터리 버킷의 기본 암호화 설정 및 모니터링
<a name="s3-express-bucket-encryption"></a>

Amazon S3 버킷에는 기본적으로 버킷 암호화가 활성화되어 있으며, 새로운 객체는 Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 사용하여 자동으로 암호화됩니다. 이 암호화는 Amazon S3 버킷의 모든 새 객체에 적용되며 무료로 제공됩니다.

키 교체 및 액세스 정책 권한 부여 관리와 같이 암호화 키를 더 세밀하게 제어해야 하는 경우 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통한 서버 측 암호화를 사용하는 방법도 있습니다.

**참고**  
버킷의 기본 암호화는 원하는 암호화 구성을 사용하고 `CreateSession` 요청 또는 `PUT` 객체 요청에서 버킷 기본 암호화를 재정의하지 않는 것이 좋습니다. 그러면 새 객체가 원하는 암호화 설정으로 자동 암호화됩니다. 디렉터리 버킷의 암호화 재정의 동작에 대한 자세한 내용은 [Specifying server-side encryption with AWS KMS for new object uploads](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)를 참조하세요.
SSE-KMS로 디렉터리 버킷의 새 객체를 암호화하려면 KMS 키(특히 고객 관리형 키)를 사용하여 디렉터리 버킷의 기본 암호화 구성으로 SSE-KMS를 지정해야 합니다. 그런 다음 영역 엔드포인트 API 작업을 위한 세션이 생성되면 세션 중에 SSE-KMS 및 S3 버킷 키를 사용하여 새 객체가 자동으로 암호화되고 해독됩니다.
기본 버킷 암호화를 SSE-KMS로 설정하면 S3 버킷 키는 디렉터리 버킷의 `GET` 및 `PUT` 작업에 대해 항상 활성화되며 비활성화할 수 없습니다. [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html), [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html), [배치 운영의 Copy 작업](directory-buckets-objects-Batch-Ops.md) 또는 [import 작업](create-import-job.md)을 통해 SSE-KMS로 암호화된 객체를 범용 버킷에서 디렉터리 버킷으로, 디렉터리 버킷에서 범용 버킷으로 또는 디렉터리 버킷 간에 복사하는 경우 S3 버킷 키는 지원되지 않습니다. 이 경우 Amazon S3는 KMS 암호화 개체에 대한 사본 요청이 있을 때마다 AWS KMS를 직접적으로 호출합니다. S3 버킷 키로 AWS KMS 요청 비용을 절감하는 방법에 대한 자세한 내용은 [Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감](bucket-key.md) 섹션을 참조하세요.
디렉터리 버킷에서 암호화를 위한 [AWS KMS 고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 지정할 때는 키 ID 또는 키 ARN만 사용하세요. KMS 키의 키 별칭 형식은 지원되지 않습니다.
AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 및 고객 제공 키를 사용한 서버 측 암호화(SSE-C)는 디렉터리 버킷의 기본 암호화에서 지원되지 않습니다.

기본 암호화 구성 방법에 대한 자세한 내용은 [기본 암호화 구성](default-bucket-encryption.md) 섹션을 참조하세요.

기본 암호화에 필요한 권한에 대한 자세한 내용은 **Amazon Simple Storage Service API 참조의 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) 섹션을 참조하세요.

Amazon S3 콘솔, AWS SDK, Amazon S3 REST API 및 AWS Command Line Interface(AWS CLI)를 사용하여 S3 버킷에 대한 Amazon S3 기본 암호화를 구성할 수 있습니다.

## S3 콘솔 사용
<a name="s3-express-bucket-encryption-how-to-set-up-console"></a>

**Amazon S3 버킷에 대해 기본 암호화를 구성하는 방법**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **버킷(Buckets)**을 선택합니다.

1. **버킷(Buckets)** 목록에서 원하는 버킷의 이름을 선택합니다.

1. **속성** 탭을 선택합니다.

1. **서버 측 암호화 설정**에서 디렉터리 버킷이 **Amazon S3 관리형 키**를 사용한 서버 측 암호화(SSE-S3)를 통해 데이터를 암호화합니다.

1. **변경 사항 저장**을 선택합니다.

## AWS CLI 사용
<a name="s3-express-default-bucket-encryption-cli"></a>

다음 예시에서는 SSE-S3를 사용하거나 S3 버킷 키와 함께 SSE-KMS를 사용하여 기본 암호화를 구성하는 방법을 보여줍니다.

기본 암호화에 대한 자세한 내용은 [Amazon S3 버킷에 대한 기본 서버 측 암호화 동작 설정](bucket-encryption.md) 섹션을 참조하세요. AWS CLI를 사용하여 기본 암호화를 구성하는 방법에 대한 자세한 내용은 [put-bucket-encryption](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-encryption.html)을 참조하세요.

**Example – 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"
            }
        }
    ]
}'
```

**Example - S3 버킷 키와 SSE-KMS를 사용한 기본 암호화**  
이 예제에서는 S3 버킷 키와 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 사용
<a name="s3-express-bucket-encryption-how-to-set-up-api"></a>

REST API `PutBucketEncryption` 작업을 사용하여 사용할 서버 측 암호화 유형(SSE-S3 또는 SSE-KMS)으로 기본 암호화를 설정합니다.

자세한 내용은 *Amazon Simple Storage Service API 참조*에서 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html)를 참조하세요.

## AWS SDK 사용
<a name="s3-express-kms-put-bucket-encryption-using-sdks"></a>

AWS SDK를 사용하는 경우 서버 측 암호화에 AWS KMS keys를 사용하도록 Amazon S3에 요청할 수 있습니다. 다음 AWS SDKs for Java 및 .NET 예제에서는 SSE-KMS 및 S3 버킷 키로 디렉터리 버킷의 기본 암호화 구성을 구성합니다. 다른 SDK 사용에 대한 자세한 내용은 AWS 개발자 센터의 [샘플 코드 및 라이브러리](https://aws.amazon.com/code)를 참조하세요.

**중요**  
Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원합니다. 이들 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [대칭 암호화 KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하십시오.

------
#### [ Java ]

AWS SDK for Java 2.x 사용 시 `applyServerSideEncryptionByDefault` 메서드를 통해 SSE-KMS로 데이터 암호화를 위한 디렉터리 버킷의 기본 암호화 구성을 지정하여 Amazon S3에 AWS KMS key 사용을 요청할 수 있습니다. 대칭 암호화 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 개발자 가이드*의 [AWS KMS API 프로그래밍](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)을 참조하십시오.

객체를 업로드하는 사용 가능한 코드 예제는 다음 주제를 참조하십시오. 이 예시를 사용하려면 코드 예시를 업데이트하고 이전 코드 조각에서 표시된 바와 같이 암호화 정보를 제공해야 합니다.
+ 단일 작업으로 객체를 업로드하려면 [디렉터리 버킷에 객체 업로드](directory-buckets-objects-upload.md) 단원을 참조하십시오.
+ 멀티파트 업로드 API 작업에 대해서는 [디렉터리 버킷에 멀티파트 업로드 사용](s3-express-using-multipart-upload.md) 섹션을 참조하세요.

------
#### [ .NET ]

AWS SDK for .NET 사용 시 `ServerSideEncryptionByDefault` 속성을 통해 SSE-KMS로 데이터 암호화를 위한 디렉터리 버킷의 기본 암호화 구성을 지정하여 Amazon S3에 AWS KMS key 사용을 요청할 수 있습니다. 대칭 암호화 고객 관리형 키를 만들고 요청에서 지정할 수 있습니다.

```
    // 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<bool> SetBucketServerSideEncryption(string bucketName, string kmsKeyId)
    {
        var serverSideEncryptionByDefault = new ServerSideEncryptionConfiguration
        {
            ServerSideEncryptionRules = new List<ServerSideEncryptionRule>
            {
                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 개발자 가이드*의 [AWS KMS API 프로그래밍](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)을 참조하십시오.

객체를 업로드하는 사용 가능한 코드 예제는 다음 주제를 참조하십시오. 이 예시를 사용하려면 코드 예시를 업데이트하고 이전 코드 조각에서 표시된 바와 같이 암호화 정보를 제공해야 합니다.
+ 단일 작업으로 객체를 업로드하려면 [디렉터리 버킷에 객체 업로드](directory-buckets-objects-upload.md) 단원을 참조하십시오.
+ 멀티파트 업로드 API 작업에 대해서는 [디렉터리 버킷에 멀티파트 업로드 사용](s3-express-using-multipart-upload.md) 섹션을 참조하세요.

------

## AWS CloudTrail을 사용하여 디렉터리 버킷의 기본 암호화 모니터링
<a name="s3-express-bucket-encryption-tracking"></a>

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를 사용한 기본 암호화 모니터링](bucket-encryption-tracking.md) 섹션을 참조하세요.