

# AWS KMS キーによる二層式サーバー側の暗号化 (DSSE-KMS) の使用
<a name="UsingDSSEncryption"></a>

AWS Key Management Service (AWS KMS) キーによる二層式サーバー側の暗号化 (DSSE-KMS) を使用すると、オブジェクトが Amazon S3 にアップロードされるときに 2 つの暗号化レイヤーが適用されます。DSSE-KMS を使用すると、データに多層暗号化を適用し、暗号化キーを完全に制御する必要があるコンプライアンス基準をより簡単に満たすことができます。

DSSE-KMS の「デュアル」とは、データに適用される 2 つの独立した AES-256 暗号化レイヤーを指します。
+ *1 番目のレイヤー:* データは、AWS KMS によって生成された一意のデータ暗号化キー (DEK) を使用して暗号化されます。
+ *2 番目のレイヤー:* 既に暗号化されたデータは、Amazon S3 によって管理される別の AES-256 暗号化キーを使用して再度暗号化されます。

これは、単一の暗号化レイヤーのみを適用する標準の SSE-KMS とは異なります。デュアルレイヤーアプローチは、1 番目の暗号化レイヤーが侵害された場合でも、データが 2 番目のレイヤーによって保護され続けるようにすることで、セキュリティを強化します。この追加のセキュリティでは、処理オーバーヘッドと AWS KMS API コールが増加し、標準 SSE-KMS と比較してコストが高くなります。DSSE-KMS 料金の詳細については、「AWS Key Management Service デベロッパーガイド」の「[AWS KMS key concepts](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)」と「[AWS KMS の料金](https://aws.amazon.com/kms/pricing)」を参照してください。

S3 バケットで DSSE−KMS を使用する場合、AWS KMS キーはバケットと同じリージョンに存在する必要があります。また、オブジェクトに対して DSSE-KMS がリクエストされると、オブジェクトのメタデータの一部である S3 チェックサムが暗号化された形式で保存されます。チェックサムの詳細については、「[Amazon S3 でのオブジェクトの整合性のチェック](checking-object-integrity.md)」を参照してください。

**注記**  
S3 バケットキーは DSSE-KMS ではサポートされていません。

DSSE-KMS と標準 SSE-KMS の主な違いは次のとおりです。
+ **暗号化レイヤー:** DSSE-KMS は 2 つの独立した AES-256 暗号化レイヤーを適用し、標準の 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 デベロッパーガイド」の「[Using multi-Region keys](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) を使用するようにオブジェクトの暗号化のタイプを設定または変更する方法について説明します。

**注記**  
オブジェクトが 5 GB 未満の場合は、オブジェクトの暗号化を変更できます。オブジェクトが 5 GB を超える場合は、[AWS CLI](mpu-upload-object.md#UsingCLImpUpload) または [AWS SDK](CopyingObjectsMPUapi.md) を使用してオブジェクトの暗号化を変更する必要があります。
オブジェクトの暗号化の変更に必要な追加のアクセス許可のリストについては、「[Amazon S3 API オペレーションに必要なアクセス許可](using-with-s3-policy-actions.md)」を参照してください。このアクセス許可を付与するポリシーの例については、「[Amazon S3 のアイデンティティベースのポリシー例](example-policies-s3.md)」を参照してください。
オブジェクトの暗号化を変更すると、新しいオブジェクトが作成され、古いオブジェクトが置き換えられます。S3 バージョニングが有効になっている場合は、オブジェクトの新しいバージョンが作成され、既存のオブジェクトが古いバージョンになります。また、プロパティを変更するロールは、新しいオブジェクト (またはオブジェクトのバージョン) の所有者になります。

**オブジェクトの暗号化を追加または変更するには**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/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` オペレーションを使用してデータをアップロードするとき、これらのリクエストヘッダーを指定できます。
+ [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)

**重要**  
AWS KMS で保護されたオブジェクトに対する `GET` および `PUT` リクエストはすべて、Secure Sockets Layer (SSL)、Transport Layer Security (TLS)、または署名バージョン 4 を使用していない場合、失敗します。
オブジェクトで 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 Concepts - Encryption context](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)を追加します。AWS KMS キー ID を指定せずに `--server-side-encryption aws:kms:dsse` を指定した場合、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
```