

# AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 사용
<a name="UsingDSSEncryption"></a>

AWS Key Management Service(AWS KMS) 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)를 사용하면 Amazon S3에 객체를 업로드할 때 객체에 두 계층의 암호화가 적용됩니다. DSSE-KMS를 사용하면 데이터에 다중 계층 암호화를 적용하고 암호화 키를 완전하게 제어할 것을 요구하는 규정 준수 표준을 보다 쉽게 충족할 수 있습니다.

DSSE-KMS의 '이중'은 다음과 같이 데이터에 적용되는 AES-256 암호화의 독립 계층 2개를 나타냅니다.
+ *첫 번째 계층:* AWS KMS에서 생성된 고유 데이터 암호화 키(DEK)를 사용하여 데이터가 암호화됨
+ *두 번째 계층:* 이미 암호화된 데이터는 Amazon S3에서 관리하는 별도의 AES-256 암호화 키를 사용하여 다시 암호화됨

이는 단일 암호화 계층만 적용하는 표준 SSE-KMS와 다릅니다. 이중 계층 접근 방식은 한 암호화 계층이 손상되더라도 데이터가 두 번째 계층으로 보호되도록 하여 보안을 강화합니다. 이 추가 보안으로 인해 처리 오버헤드 및 AWS KMS API 직접 호출이 증가하며, 표준 SSE-KMS보다 비용이 높아지게 됩니다. 자세한 내용은 AWS Key Management Service 개발자 가이드의 [AWS KMS key 개념](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) 및 [AWS KMS 요금](https://aws.amazon.com/kms/pricing) 섹션을 참조하세요.

Amazon S3 버킷에 DSSE-KMS를 사용할 때 AWS KMS 키는 버킷과 동일한 리전에 있어야 합니다. 또한, 객체에 DSSE-KMS를 요청하면 객체 메타데이터의 일부인 S3 체크섬이 암호화된 형식으로 저장됩니다. 체크섬에 대한 자세한 내용은 [Amazon S3에서 객체 무결성 확인](checking-object-integrity.md) 섹션을 참조하십시오.

**참고**  
S3 버킷 키는 DSSE-KMS에서 지원되지 않습니다.

DSSE-KMS와 표준 SSE-KMS의 주요 차이점은 다음과 같습니다.
+ **암호화 계층:** DSSE-KMS는 AES-256 암호화의 독립 계층 2개를 적용하는 반면, 표준 SSE-KMS는 계층 1개를 적용
+ **보안:** DSSE-KMS는 잠재적 암호화 취약성에 대한 향상된 보호를 제공
+ **규정 준수:** DSSE-KMS는 다중 계층 암호화를 요구하는 규제 요구 사항을 충족하는 데 도움이 됨
+ **성능:** 추가 암호화 처리로 인해 DSSE-KMS의 지연 시간이 약간 더 김
+ **비용:** DSSE-KMS는 컴퓨팅 오버헤드 증가 및 추가 AWS KMS 작업으로 인해 더 많은 요금이 발생

**AWS KMS keys를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 요구**  
특정 Amazon S3 버킷의 모든 객체에 대한 이중 계층 서버 측 암호화를 요구하려면 버킷 정책을 사용하면 됩니다. 예를 들어, 다음 버킷 정책은 요청에 DSSE-KMS를 사용한 서버 측 암호화를 요청하는 `x-amz-server-side-encryption` 헤더가 포함되지 않을 경우 모든 사용자에게 객체 업로드(`s3:PutObject`) 권한을 거부합니다.

------
#### [ JSON ]

****  

```
{
             "Version":"2012-10-17",		 	 	 
             "Id": "PutObjectPolicy",
             "Statement": [{
                   "Sid": "DenyUnEncryptedObjectUploads",
                   "Effect": "Deny",
                   "Principal": {
                       "AWS": "arn:aws:iam::111122223333:root"
                   },
                   "Action": "s3:PutObject",
                   "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
                   "Condition": {
                      "StringNotEquals": {
                         "s3:x-amz-server-side-encryption": "aws:kms:dsse"
                      }
                   }
                }
             ]
          }
```

------

**Topics**
+ [

# AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 지정
](specifying-dsse-encryption.md)

# AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS) 지정
<a name="specifying-dsse-encryption"></a>

새 객체를 업로드하거나 기존 객체를 복사할 때 암호화를 적용할 수 있습니다.

Amazon S3 콘솔, Amazon S3 REST API, AWS Command Line Interface(AWS CLI)를 사용하여 DSSE-KMS를 지정할 수 있습니다. 자세한 내용은 다음 항목을 참조하세요.

**참고**  
Amazon S3에서 다중 리전 AWS KMS keys를 사용할 수 있습니다. 그러나 Amazon S3는 현재 다중 리전 키를 단일 리전 키인 것처럼 취급하며, 키의 다중 리전 기능을 사용하지 않습니다. 자세한 내용은 **AWS Key Management Service 개발자 안내서에서 [다중 리전 키 사용](https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html)을 참조하세요.

**참고**  
다른 계정에서 소유한 KMS 키를 사용하려면 먼저 해당 키에 대한 사용 권한이 있어야 합니다. KMS 키의 크로스 계정 권한에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서에서 [다른 계정에서 사용할 수 있는 KMS 키 만들기](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)를 참조하십시오.

## S3 콘솔 사용
<a name="add-object-encryption-dsse"></a>

이 섹션에서는 Amazon S3 콘솔을 사용하여 AWS Key Management Service(AWS KMS) 키를 통한 이중 계층 서버 측 암호화(DSSE-KMS)를 사용하도록 객체 암호화 유형을 설정하거나 변경하는 방법을 설명합니다.

**참고**  
객체의 용량이 5GB 미만인 경우 객체의 암호화를 변경할 수 있습니다. 객체가 5GB보다 큰 경우, 객체의 암호화를 변경하려면 [AWS CLI](mpu-upload-object.md#UsingCLImpUpload) 또는 [AWS SDK](CopyingObjectsMPUapi.md)를 사용해야 합니다.
객체의 암호화를 변경하는 데 필요한 추가 권한 목록은 [Amazon S3 API 작업에 필요한 권한](using-with-s3-policy-actions.md) 섹션을 참조하세요. 이 권한을 부여하는 정책의 예시는 [Amazon S3의 ID 기반 정책 예시](example-policies-s3.md) 단원을 참조하세요.
객체 암호화를 변경하면 새 객체가 생성되어 이전 객체를 대체합니다. S3 버전 관리가 사용 설정된 경우 객체의 새 버전이 생성되고 기존 객체는 이전 버전이 됩니다. 또한 속성을 변경하는 역할도 새 객체(또는 객체 버전)의 소유자가 됩니다.

**객체에 대한 암호화 추가 또는 변경**

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

1. 탐색 창에서 **버킷**을 선택하고 **범용 버킷** 탭을 선택합니다. 변경할 객체가 포함된 Amazon S3 버킷 또는 폴더로 이동합니다.

1. 변경하려는 객체의 확인란을 선택합니다.

1. **작업** 메뉴에 표시되는 옵션 목록에서 **서버 측 암호화 편집**을 선택합니다.

1. **서버 측 암호화** 섹션으로 스크롤합니다.

1. **암호화 설정**에서 **버킷 기본 암호화 설정 사용** 또는 **기본 암호화에 버킷 설정 재정의**를 선택합니다.

1. **기본 암호화에 버킷 설정 재정의**를 선택한 경우 다음과 같은 암호화 설정을 구성해야 합니다.

   1. **암호화 유형**에서 **AWS Key Management Service  키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)**를 선택합니다.

   1. **AWS KMS 키**에서 다음 중 하나를 수행하여 KMS 키를 선택합니다.
      + 사용 가능한 KMS 키 목록에서 **AWS KMS keys 중에서 선택**을 선택한 다음, 사용 가능한 키 목록에서 **KMS 키**를 선택합니다.

        AWS 관리형 키(`aws/s3`)와 고객 관리형 키가 모두 목록에 표시됩니다. 고객 관리형 키에 대한 자세한 내용은 *AWS Key Management Service* 개발자 안내서의 [ 고객 키 및 AWS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)를 참조하세요.
      + KMS 키 ARN을 입력하려면 **AWS KMS key ARN 입력**을 선택한 다음 나타나는 필드에 KMS 키 ARN을 입력합니다.
      + AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 **KMS 키 생성**을 선택합니다.

        AWS KMS key 생성에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 생성](https://docs.aws.amazon.com//kms/latest/developerguide/create-keys.html)을 참조하십시오.
**중요**  
버킷과 동일한 AWS 리전에서 사용할 수 있는 KMS 키만 사용 가능합니다. Amazon S3 콘솔은 버킷과 동일한 리전에 있는 처음 100개의 KMS 키만 나열합니다. 목록에 없는 KMS 키를 사용하려면 KMS 키 ARN을 입력해야 합니다. 다른 계정에서 소유한 KMS 키를 사용하려면 먼저 해당 키에 대한 사용 권한이 있어야 하고, 다음 단계로 KMS 키 ARN을 입력해야 합니다.  
Amazon S3는 대칭 암호화 KMS 키만 지원하며 비대칭 KMS 키는 지원하지 않습니다. 자세한 내용은 **AWS Key Management Service 개발자 안내서에서 [비대칭 KMS 키 식별](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html)을 참조하십시오.

1. **버킷 키**에서 **비활성화**를 선택합니다. S3 버킷 키는 DSSE-KMS에서 지원되지 않습니다.

1. **추가 복사 설정**에서 **소스 설정 복사**, **설정 지정 안 함** 또는 **설정 지정** 중 원하는 것을 선택합니다. **소스 설정 복사**가 기본 옵션입니다. 소스 설정 속성 없이 객체만 복사하려면 **설정 지정 안 함**을 선택합니다. 스토리지 클래스, ACL, 객체 태그, 메타데이터, 서버 측 암호화 및 추가 체크섬에 대한 설정을 지정하려면 **설정 지정**을 선택합니다.

1. [**변경 사항 저장(Save changes)**]을 선택합니다.

**참고**  
이 작업은 지정된 모든 객체에 암호화를 적용합니다. 폴더를 암호화할 때 폴더에 새 객체를 추가하기 전에 저장 작업이 완료될 때까지 기다립니다.

## REST API 사용
<a name="DSSEUsingRESTAPI"></a>

객체를 만들 때, 즉 새 객체를 업로드하거나 기존 객체를 복사할 때 AWS KMS keys를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)를 사용하여 데이터를 암호화하도록 지정할 수 있습니다. 이렇게 하려면 요청에 `x-amz-server-side-encryption` 헤더를 추가합니다. 암호화 알고리즘 `aws:kms:dsse`로 헤더의 값을 설정합니다. Amazon S3는 `x-amz-server-side-encryption` 응답 헤더를 반환하여 객체가 DSSE-KMS 암호화를 사용하여 저장되었는지 확인합니다.

`x-amz-server-side-encryption`의 값을 사용하여 `aws:kms:dsse` 헤더를 지정하는 경우 다음 요청 헤더를 사용할 수도 있습니다.
+ `x-amz-server-side-encryption-aws-kms-key-id: SSEKMSKeyId`
+ `x-amz-server-side-encryption-context: SSEKMSEncryptionContext`

**Topics**
+ [

### DSSE-KMS를 지원하는 Amazon S3 REST API 작업
](#dsse-request-headers-kms)
+ [

### 암호화 컨텍스트(`x-amz-server-side-encryption-context`)
](#s3-dsse-encryption-context)
+ [

### AWS KMS 키 ID(`x-amz-server-side-encryption-aws-kms-key-id`)
](#s3-dsse-key-id-api)

### DSSE-KMS를 지원하는 Amazon S3 REST API 작업
<a name="dsse-request-headers-kms"></a>

다음 REST API 작업은 `x-amz-server-side-encryption`, `x-amz-server-side-encryption-aws-kms-key-id` 및 `x-amz-server-side-encryption-context` 요청 헤더를 수락합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) - `PUT` API 작업을 사용하여 데이터를 업로드할 때 이러한 요청 헤더를 지정할 수 있습니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) - 객체를 복사할 때 소스 객체 및 대상 객체가 모두 있어야 합니다. `CopyObject` 작업을 사용하여 DSSE-KMS 헤더를 전달할 경우 헤더가 대상 객체에만 적용됩니다. 기존 객체를 복사할 때 소스 객체의 암호화 여부에 관계없이 명시적으로 서버 측 암호화를 요청하지 않는 한 대상 객체는 암호화되지 않습니다.
+ [POST 객체](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) - `POST` 작업을 사용하여 객체를 업로드할 경우에는 요청 헤더 대신 양식 필드에 동일한 정보를 제공합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) - 멀티파트 업로드를 사용하여 대형 객체를 업로드할 때 `CreateMultipartUpload` 요청에 이러한 헤더를 지정할 수 있습니다.

객체가 서버 측 암호화를 사용하여 저장될 경우 다음 REST API 작업의 응답 헤더는 `x-amz-server-side-encryption` 헤더를 반환합니다.
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)
+ [POST 객체](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)

**중요**  
보안 소켓 계층(SSL), 전송 계층 보안(TLS) 또는 서명 버전 4를 사용하여 요청을 수행하지 않으면 AWS KMS로 보호되는 객체에 대한 모든 `GET` 및 `PUT` 요청이 실패합니다.
객체가 DSSE-KMS를 사용하는 경우 `GET` 요청 및 `HEAD` 요청에 대해 암호화 요청 헤더를 전송하지 마십시오. 전송하면 HTTP 400 (Bad Request) 오류가 발생합니다.

### 암호화 컨텍스트(`x-amz-server-side-encryption-context`)
<a name="s3-dsse-encryption-context"></a>

`x-amz-server-side-encryption:aws:kms:dsse`를 지정하면 Amazon S3 API는 `x-amz-server-side-encryption-context` 헤더가 있는 암호화 컨텍스트를 지원합니다. 암호화 컨텍스트는 데이터에 대한 추가 컨텍스트 정보를 포함하는 키-값 페어 집합입니다.

Amazon S3는 자동으로 객체의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다(예: `arn:aws:s3:::object_ARN`).

필요한 경우 `x-amz-server-side-encryption-context` 헤더를 사용하여 추가 암호화 컨텍스트 쌍을 제공할 수 있습니다. 그러나 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 합니다. Amazon S3는 기본 암호화 컨텍스트와 함께 이 추가 키 페어를 저장합니다.

Amazon S3의 암호화 컨텍스트에 대한 자세한 내용은 [암호화 컨텍스트](UsingKMSEncryption.md#encryption-context) 단원을 참조하십시오. 암호화 컨텍스트에 대한 일반 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS Key Management Service 개념 - 암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)를 참조하십시오.

### AWS KMS 키 ID(`x-amz-server-side-encryption-aws-kms-key-id`)
<a name="s3-dsse-key-id-api"></a>

`x-amz-server-side-encryption-aws-kms-key-id` 헤더를 사용하여 데이터를 보호하는 데 사용되는 고객 관리형 키의 ID를 지정할 수 있습니다. `x-amz-server-side-encryption:aws:kms:dsse` 헤더를 지정하지만 `x-amz-server-side-encryption-aws-kms-key-id` 헤더를 제공하지 않는 경우 Amazon S3는 AWS 관리형 키(`aws/s3`)를 사용하여 데이터를 보호합니다. 고객 관리형 키를 사용하려면 고객 관리형 키의 `x-amz-server-side-encryption-aws-kms-key-id` 헤더를 제공해야 합니다.

**중요**  
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)를 참조하십시오.

## AWS CLI 사용
<a name="DSSEUsingCLI"></a>

새 객체를 업로드하거나 기존 객체를 복사할 때 DSSE-KMS를 사용하여 데이터를 암호화하도록 지정할 수 있습니다. 이렇게 하려면 요청에 `--server-side-encryption aws:kms:dsse` 파라미터를 추가합니다. `--ssekms-key-id example-key-id` 파라미터를 사용하여, 생성해둔 [고객 관리형 AWS KMS 키](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#customer-cmk)를 추가합니다. `--server-side-encryption aws:kms:dsse`를 지정하고 AWS KMS 키 ID를 제공하지 않으면 Amazon S3가 AWS 관리형 키(`aws/s3`)를 사용합니다.

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key example-object-key --server-side-encryption aws:kms:dsse --ssekms-key-id example-key-id --body filepath
```

객체를 제자리에 복사하여 암호화되지 않은 객체가 DSSE-KMS를 사용하도록 암호화할 수 있습니다.

```
aws s3api copy-object --bucket amzn-s3-demo-bucket --key example-object-key --copy-source amzn-s3-demo-bucket/example-object-key --server-side-encryption aws:kms:dsse --ssekms-key-id example-key-id
```