

# AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用
<a name="UsingKMSEncryption"></a>

**重要**  
Amazon S3 では、Amazon S3 内のすべてのバケットの基本レベルの暗号化として、Amazon S3 が管理するキー (SSE-S3) によるサーバー側の暗号化が適用されるようになりました。2023 年 1 月 5 日以降、Amazon S3 にアップロードされるすべての新しいオブジェクトは、追加費用なしで、パフォーマンスに影響を与えずに自動的に暗号化されます。S3 バケットのデフォルト暗号化設定と新しいオブジェクトのアップロードのための自動暗号化ステータスは、CloudTrail ログ、S3 インベントリ、S3 ストレージレンズ、Amazon S3 コンソール、および AWS CLI と AWS SDK の追加の Amazon S3 API レスポンスヘッダーとして利用できるようになりました。詳細については、「[デフォルトの暗号化のよくある質問](https://docs.aws.amazon.com/AmazonS3/latest/userguide/default-encryption-faq.html)」を参照してください。

サーバー側の暗号化とは、データを受信するアプリケーションまたはサービスによって、送信先でデータを暗号化することです。

Amazon S3 は、新しいオブジェクトをアップロードするときに、Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) を自動的に有効にします。

特に指定しない限り、バケットはデフォルトで SSE-S3 を使用してオブジェクトを暗号化します。ただし、代わりにAWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-KMS) を使用するようにバケットを設定することもできます。詳細については、「[AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定](specifying-kms-encryption.md)」を参照してください。

AWS KMS は、安全で可用性の高いハードウェアおよびソフトウェアを結合するサービスであり、クラウド向けに拡張されたキー管理システムを提供します。Amazon S3 は、AWS KMS (SSE-KMS) によるサーバー側の暗号化を使用して、S3 オブジェクトデータを暗号化します。また、オブジェクトに対して SSE-KMS をリクエストすると、オブジェクトのメタデータの一部としての S3 チェックサムが暗号化された形式で保存されます。チェックサムの詳細については、「[Amazon S3 でのオブジェクトの整合性のチェック](checking-object-integrity.md)」を参照してください。

KMS キーを使用すると、[AWS マネジメントコンソール](https://console.aws.amazon.com/kms) または [AWS KMS API](https://docs.aws.amazon.com/kms/latest/APIReference/) から AWS KMS を使用して、以下の操作を実行できます。
+ KMS キーの作成、表示、編集、監視、有効化または無効化、更新、削除のスケジュールを一元的に行う。
+ KMS キーの使用方法および使用者を制御するポリシーを定義する。
+ KMS キーの正しい使用状況を監査します。監査は [AWS KMS API](https://docs.aws.amazon.com/kms/latest/APIReference/) ではサポートされていますが、[AWS KMS コンソール](https://console.aws.amazon.com/kms)ではサポートされていません。



AWS KMS のセキュリティ制御は、暗号化関連のコンプライアンス要件を満たすのに役立ちます。これらの KMS キーを使用して、Amazon S3 バケットのデータを保護できます。S3 バケットで SSE−KMS 暗号化を使用する場合、AWS KMS keys はバケットと同じリージョンに存在する必要があります。

AWS KMS keysを使用するための追加料金はかかります。詳細については、*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)を参照してください。

IAM ユーザーが KMS で暗号化されたバケットにアクセスできるようにする手順については、「[私の Amazon S3 バケットにはカスタムの AWS KMS キーを使用したデフォルト暗号化が設定されています」を参照してください。ユーザーがそのバケットでダウンロードやアップロードを行えるようにするにはどうすればいいですか](https://repost.aws/knowledge-center/s3-bucket-access-default-encryption)」を AWS re:Post 情報センターで参照してください。

**アクセス許可**  
AWS KMS キーを使用して、オブジェクトを Amazon S3 に暗号化する `PutObject` リクエストを正常に実行するには、キーに対する `kms:GenerateDataKey` アクセス許可が必要です。AWS KMS key を使用して暗号化されたオブジェクトをダウンロードするには、キーに対して `kms:Decrypt` の許可が必要です。[マルチパートアップロードを実行](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions)して AWS KMS key でオブジェクトを暗号化するには、キーの `kms:GenerateDataKey` および `kms:Decrypt` アクセス許可が必要です。

**重要**  
KMS キーポリシーで付与されているアクセス権限を慎重に確認します。カスタマーマネージド AWS KMS キーのポリシーのアクセス許可は常に、関連するキーアクションにアクセスする必要がある IAM プリンシパルと AWS サービスのみに限定する必要があります。詳細については、「[AWS KMS のキーポリシー](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)」を参照してください。

**Topics**
+ [AWS KMS keys](#aws-managed-customer-managed-keys)
+ [Amazon S3 バケットキー](#sse-kms-bucket-keys)
+ [サーバー側の暗号化の要求](#require-sse-kms)
+ [暗号化コンテキスト](#encryption-context)
+ [AWS KMS 暗号化されたオブジェクトへのリクエストの送信](#aws-signature-version-4-sse-kms)
+ [AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定](specifying-kms-encryption.md)
+ [Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md)

## AWS KMS keys
<a name="aws-managed-customer-managed-keys"></a>

AWS KMS によるサーバー側暗号化 (SSE-KMS) を使用すると、デフォルトの [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)を使用するか、または、作成済みの[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)を指定できます。AWS KMS は*エンベロープ暗号化*をサポートします。S3 は、*エンベロープ暗号化*の AWS KMS 機能を使用してデータを保護します。エンベロープ暗号化は、データキーでプレーンテキストデータを暗号化してから、そのデータキーを KMS キーで暗号化する手法です。エンベロープ暗号化の仕組みの詳細については、*AWS Key Management Service デベロッパーガイド*の「[エンベロープ暗号化](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#enveloping)」を参照してください。

カスタマーマネージドキーを指定しない場合、SSE−KMS で暗号化されたオブジェクトをバケットに初めて追加するとき、Amazon S3 によって自動的に AWS アカウント に AWS マネージドキー が作成されます。デフォルトでは、Amazon S3 はこの KMS キーを SSE−KMS に使用します。

**注記**  
SSE-KMS を [AWS マネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) で使用して暗号化されたオブジェクトは、クロスアカウントで共有できません。SSE-KMS データをアカウント間で共有する必要がある場合は、AWS KMS の[カスタマーマネージドキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)を使用する必要があります。

SSE−KMS にカスタマーマネージドキーを使用する場合は、SSE−KMS を設定する前に対称暗号化カスタマーマネージドキーを作成します。次に、バケット用に SSE−KMS を設定するときに、既存のカスタマーマネージドキーを指定します。対象暗号化キーの詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[対称暗号化 KMS キー](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#symmetric-cmks)」を参照してください。

カスタマーマネージドキーを独自に作成することで、より柔軟に制御を行えます。例えば、カスタマーマネージドキーを作成、ローテーション、無効化することができます。また、アクセスコントロールを定義し、データを保護するために使用するカスタマーマネージドキーを監査することもできます。カスタマーマネージドキーおよび AWS マネージドキーの詳細については、「*AWS Key Management Service デベロッパーガイド*」の「[カスタマーキーおよび AWS キー](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#key-mgmt)」を参照してください。

**注記**  
標準の KMS キーとは異なり、外部のキーストアに保存されているカスタマーマネージドキーによるサーバー側の暗号化を使用する場合は、キーマテリアルの可用性と耐久性を確保する責任があります。外部キーストアと、それらによって責任分担モデルがどのように変化するかについての詳細は、「*AWS Key Management Service デベロッパーガイド*」の「[外部キーストア](https://docs.aws.amazon.com//kms/latest/developerguide/keystore-external.html)」を参照してください。

### クロスアカウント操作での SSE-KMS 暗号化の使用
<a name="sse-kms-cross-account-operations"></a>

クロスアカウント操作で暗号化を使用する場合は、次の点に注意してください。
+ リクエスト時またはバケットのデフォルトの暗号化設定を通じて、AWS KMS key Amazon リソースネーム (ARN) またはエイリアスが提供されない場合は、アップロードアカウントの AWS マネージドキー (`aws/s3`) が暗号化に使用され、復号化に必要になります。
+ AWS マネージドキー (`aws/s3`) は、アップロードとアクセス AWS Identity and Access Management (IAM) プリンシパルが同じ AWS アカウントである場合、クロスアカウントオペレーションの KMS キーとして使用できます。
+ S3 オブジェクトにクロスアカウントアクセスを許可する場合は、カスタマーマネージドキーを使用します。カスタマーマネージドキーのポリシーを設定して、別のアカウントからのアクセスを許可することができます。
+ カスタマーマネージド KMS キーを指定している場合、完全修飾 KMS キー ARN を使用することをお勧めします。代わりに KMS キーエイリアスを使用する場合、AWS KMS はリクエスタのアカウント内でキーを解決します。この動作により、バケット所有者ではなく、リクエスタに属する KMS キーでデータが暗号化される可能性があります。
+ お客様 (リクエスタ) が `Encrypt` アクセス許可を付与されているキーを指定する必要があります。詳細については、*AWS Key Management Service デベロッパーガイド*の「[キーユーザーが暗号化オペレーションに KMS キーを使用することを許可する](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-users-crypto)」を参照してください。

カスタマーマネージドキーと AWS マネージド KMS キーをどのような場合に使用するかの詳細については、「[Amazon S3 にあるオブジェクトの暗号化に AWS マネージドキー、またはカスタマーマネージドキーを使うべきですか](https://aws.amazon.com/premiumsupport/knowledge-center/s3-object-encryption-keys/)」を参照してください。

### SSE-KMS 暗号化ワークフロー
<a name="sse-kms-encryption-workflow"></a>

AWS マネージドキー またはカスタマーマネージドキーを使用してデータの暗号化を選択する場合は、AWS KMS および Amazon S3 は次のエンベロープ暗号化アクションを実行します。

1. Amazon S3 は、プレーンテキストの[データキー](https://docs.aws.amazon.com//kms/latest/developerguide/concepts.html#data-keys)および指定された KMS キーで暗号化されたキーのコピーをリクエストします。

1. AWS KMS は、データキーを生成し、KMS キーで暗号化して、プレーンテキストデータキーと暗号化されたデータキーの両方を Amazon S3 に送信します。

1. Amazon S3 は、データキーを使用してデータを暗号化し、使用後はメモリからプレーンテキストのキーをできる限り迅速に削除します。

1. Amazon S3 は、暗号化されたデータキーを、暗号化されたデータのメタデータとして保存します。

データの復号をリクエストすると、Amazon S3 と AWS KMS は次のアクションを実行します。

1. `Decrypt` リクエストがあると、Amazon S3 は暗号化されたデータキーを AWS KMS に送信します。

1. AWS KMS は、同じ KMS キーを使用して暗号化データキーを復号し、プレーンテキストのデータキーを Amazon S3 に返します。

1. Amazon S3 は、プレーンテキストデータキーを使用して暗号化されたデータを復号し、できるだけ早くプレーンテキストデータキーをメモリから削除します。

**重要**  
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)」を参照してください。

### SSE-KMS 暗号化の監査
<a name="sse-kms-encryption-audit"></a>

SSE-KMS を指定するリクエストを識別するには、Amazon S3 ストレージレンズメトリクスの「**すべての SSE-KMS リクエスト**」と「**すべての SSE-KMS リクエストの割合 (%)**」メトリクスを使用できます。S3 ストレージレンズは、オブジェクトストレージの使用状況とアクティビティを組織全体で可視化するために使用できるクラウドストレージ分析機能です。SSE-KMS 対応バケット数と % SSE-KMS 対応バケットを使用して、[デフォルトのバケット暗号化](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html) のバケット数 (SSE-KMS) を把握することもできます。詳細については、「[S3 Storage Lens を使用したストレージのアクティビティと使用状況の評価](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html?icmpid=docs_s3_user_guide_UsingKMSEncryption.html)」を参照してください。メトリクスの完全なリストについては、「[S3 ストレージレンズメトリクスに関する用語集](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html?icmpid=docs_s3_user_guide_UsingKMSEncryption.html)」を参照してください。

SSE-KMS で暗号化されたデータの AWS KMS キーの使用状況を監査するには、AWS CloudTrail ログを使用します。[https://docs.aws.amazon.com/kms/latest/developerguide/ct-generatedatakey.html](https://docs.aws.amazon.com/kms/latest/developerguide/ct-generatedatakey.html) や [https://docs.aws.amazon.com/kms/latest/developerguide/ct-decrypt.html](https://docs.aws.amazon.com/kms/latest/developerguide/ct-decrypt.html) などの[暗号化オペレーション](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations)に関するインサイトを得ることができます。CloudTrail は、イベント名、ユーザー名、イベントソースなど、検索をフィルタリングするための多数の[属性値](https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_LookupEvents.html)をサポートしています。

## Amazon S3 バケットキー
<a name="sse-kms-bucket-keys"></a>

AWS KMS (SSE−KMS) を使用してサーバー側の暗号化を設定する場合、SSE−KMS で S3 バケットキーを使用するようにバケットを設定できます。SSE-KMS でこのバケットレベルのキーを使用すると、Amazon S3 から AWS KMS へのリクエストトラフィックを減らすことにより、AWS KMS のリクエストコストを最大 99% 削減できます。

新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定すると、AWS KMS によりバケットレベルのキーが生成されます。このキーは、バケット内のオブジェクトの一意の[データキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)を作成するために使用されます。この S3 バケットキーは Amazon S3 内で期間限定で使用されるため、Amazon S3 で AWS KMS にリクエストを実行し、暗号化オペレーションを完了する必要性が軽減されます。S3 バケットキーの使用の詳細については、[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md) を参照してください。

## サーバー側の暗号化の要求
<a name="require-sse-kms"></a>

特定の Amazon S3 バケット内のすべてのオブジェクトのサーバー側の暗号化を要求するには、バケットポリシーを使用できます。例えば、SSE-KMS を使用したサーバー側の暗号化を要求する `x-amz-server-side-encryption-aws-kms-key-id` ヘッダーがリクエストに含まれていない場合、次のバケットポリシーはすべてのユーザーに対し、オブジェクト (`s3:PutObject`) をアップロードするアクセス許可を拒否します。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Id":"PutObjectPolicy",
   "Statement":[{
         "Sid":"DenyObjectsThatAreNotSSEKMS",
         "Effect":"Deny",
         "Principal":"*",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/*",
         "Condition":{
            "Null":{
               "s3:x-amz-server-side-encryption-aws-kms-key-id":"true"
            }
         }
      }
   ]
}
```

------

特定の AWS KMS key を使用してバケット内のオブジェクトを暗号化することを要求するには、`s3:x-amz-server-side-encryption-aws-kms-key-id` 条件キーを使用できます。KMS キーを指定するには、キーの Amazon リソースネーム (ARN) を `arn:aws:kms:region:acct-id:key/key-id` 形式で使用する必要があります。AWS Identity and Access Management は、`s3:x-amz-server-side-encryption-aws-kms-key-id` の文字列が存在するかどうかを検証しません。

**注記**  
オブジェクトをアップロードするときは、`x-amz-server-side-encryption-aws-kms-key-id` ヘッダーを使用して KMS キーを指定するか、[デフォルトのバケット暗号化設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html)を使用できます。PutObject リクエストで `x-amz-server-side-encryption` ヘッダーに `aws:kms` を指定し、`x-amz-server-side-encryption-aws-kms-key-id` ヘッダーを指定しないと、AWS マネージドキーを使用するものと仮定されます。その場合でも、Amazon S3 がオブジェクトの暗号化に使用する AWS KMS キー ID とポリシーの AWS KMS キー ID は一致する必要があります。一致しない場合、Amazon S3 はリクエストを拒否します。

Amazon S3 固有の条件キーの完全なリストについては、「サービス認可リファレンス」の「[Condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html#amazons3-policy-keys)」を参照してください。**

## 暗号化コンテキスト
<a name="encryption-context"></a>

*暗号化コンテキスト*は、データに関する追加のコンテキスト情報が含まれたキーと値のペアのセットです。この暗号化コンテキストは暗号化されていません。暗号化オペレーションで暗号化コンテキストを指定すると、Amazon S3 では同じ暗号化コンテキストを復号オペレーションに指定する必要があります。そうでない場合は、復号に失敗します。AWS KMS は、暗号化コンテキストを[追加の認証データ](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/concepts.html#digital-sigs) (AAD) として使用し、[認証された暗号化](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#cryptographic-operations#digital-sigs)をサポートします。暗号化コンテキストの詳細については、「*AWS Key Management Service デベロッパーガイド*」の[「暗号化コンテキスト」](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)を参照してください。

デフォルトでは、Amazon S3 は、オブジェクトまたはバケットの Amazon リソースネーム (ARN) を暗号化コンテキストペアとして使用します。
+ **S3 バケットキーを有効にせずに SSE-KMS を使用する場合は**、オブジェクト ARN を暗号化コンテキストとして使用します。

  ```
  arn:aws:s3:::object_ARN
  ```
+ **S3 バケットキーを有効にして SSE-KMS を使用する場合は**、暗号化コンテキストとしてバケット ARN を使用します。S3 バケットキーの詳細については、[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md) を参照してください。

  ```
  arn:aws:s3:::bucket_ARN
  ```

[s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html#API_PutObject_RequestSyntax) リクエストの `x-amz-server-side-encryption-context` のヘッダーを使って、オプションで追加の暗号化コンテキストペアを指定することができます。しかし、暗号化コンテキストは暗号化されないため、機密情報を含めないでください。Amazon S3 は、この追加のキーペアをデフォルトの暗号化コンテキストとともに保存します。`PUT` リクエストを処理すると、Amazon S3 は `aws:s3:arn` のデフォルトの暗号化コンテキストを、指定するものに追加します。

暗号化コンテキストを使用して、暗号化オペレーションを識別および分類できます。デフォルトの暗号化コンテキスト ARN 値を使用して、どの Amazon S3 ARN がどの暗号化キーで使用されたかを確認することで、AWS CloudTrail の関連するリクエストを追跡することもできます。

CloudTrail ログファイルの `requestParameters` フィールドでは、暗号化コンテキストは次のようになります。

```
"encryptionContext": {
    "aws:s3:arn": "arn:aws:s3:::amzn-s3-demo-bucket1/file_name"
}
```

SSE−KMS をオプションの S3 バケットキー機能とともに使用すると、暗号化コンテキストの値はバケットの ARN になります。

```
"encryptionContext": {
    "aws:s3:arn": "arn:aws:s3:::amzn-s3-demo-bucket1"
}
```

## AWS KMS 暗号化されたオブジェクトへのリクエストの送信
<a name="aws-signature-version-4-sse-kms"></a>

**重要**  
AWS KMS により暗号化されたオブジェクトに対するすべての `GET` および `PUT` リクエストは、Secure Sockets Layer (SSL) または Transport Layer Security (TLS) を使用して生成する必要があります。また、各リクエストは、AWS 署名バージョン 4 (または AWS 署名バージョン 2) のような有効な認証情報を使用して署名する必要もあります。

AWS Signature Version 4 は、HTTP で送信される AWS リクエストに認証情報を追加するプロセスです。セキュリティ対策として、AWS へのほとんどのリクエストは、アクセスキーを使用して署名する必要があります。アクセスキーは、アクセスキー ID とシークレットアクセスキーで構成されます。これらの 2 つのキーは、一般的にセキュリティ認証情報と呼ばれます。詳細については、「[リクエストの認証 (AWS 署名バージョン 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)」および「[署名バージョン 4 の署名プロセス](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)」を参照してください。

**重要**  
オブジェクトで SSE−KMS を使用している場合、`GET` リクエストおよび `HEAD` リクエストに対して暗号化リクエストヘッダーを送信しないでください。そうしないと、HTTP 400 Bad Request エラーが表示されます。

**Topics**
+ [AWS KMS keys](#aws-managed-customer-managed-keys)
+ [Amazon S3 バケットキー](#sse-kms-bucket-keys)
+ [サーバー側の暗号化の要求](#require-sse-kms)
+ [暗号化コンテキスト](#encryption-context)
+ [AWS KMS 暗号化されたオブジェクトへのリクエストの送信](#aws-signature-version-4-sse-kms)
+ [AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定](specifying-kms-encryption.md)
+ [Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md)

# AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定
<a name="specifying-kms-encryption"></a>

すべての Amazon S3 バケットにはデフォルトで暗号化が設定されており、S3 バケットにアップロードされたすべての新しいオブジェクトは保存時に自動的に暗号化されます。Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) は、Amazon S3 のすべてのバケットでのデフォルトの暗号化設定です。別のタイプの暗号化を使用するには、S3 `PUT` リクエストで使用するサーバー側の暗号化のタイプを指定するか、宛先バケットにデフォルトの暗号化設定を更新できます。

`PUT` リクエストで別の暗号化タイプを指定する場合は、AWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-KMS)、AWS KMS キーによる二層式サーバー側の暗号化 (DSSE-KMS)、または顧客提供のキーによるサーバー側の暗号化 (SSE-C) を使用できます。宛先バケットに別のデフォルト暗号化設定を設定する場合は、SSE-KMS または DSSE-KMS を使用できます。

汎用バケットのデフォルトの暗号化設定を変更する方法の詳細については、「[デフォルトの暗号化の設定](default-bucket-encryption.md)」を参照してください。

バケットのデフォルトの暗号化設定を SSE-KMS に変更しても、バケット内の既存の Amazon S3 オブジェクトの暗号化タイプは変更されません。デフォルトの暗号化設定を SSE-KMS に更新した後に既存のオブジェクトの暗号化タイプを変更するには、Amazon S3 バッチオペレーションを使用できます。S3 バッチオペレーションにオブジェクトのリストを指定すると、バッチオペレーションが対応する API オペレーションを呼び出します。[オブジェクトのコピー](batch-ops-copy-object.md) アクションを使用して既存のオブジェクトをコピーし、SSE-KMS で暗号化されたオブジェクトと同じバケットに書き戻すことができます。1 つのバッチオペレーションジョブで、数十億ものオブジェクトに対して、指定されたオペレーションを実行できます。詳細については、「[バッチオペレーションでオブジェクトオペレーションを一括で実行する](batch-ops.md)」および *AWS Storage Blog* の投稿「[How to retroactively encrypt existing objects in Amazon S3 using S3 Inventory, Amazon Athena, and S3 Batch Operations](https://aws.amazon.com/blogs/security/how-to-retroactively-encrypt-existing-objects-in-amazon-s3-using-s3-inventory-amazon-athena-and-s3-batch-operations/)」を参照してください。

Amazon S3 コンソール、REST API オペレーション、AWS SDK、および AWS Command Line Interface (AWS CLI) を使用して SSE-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-kms"></a>

このトピックでは、Amazon S3 コンソールを使用して、AWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-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. **[暗号化設定]** で、**[デフォルトの暗号化にバケット設定を使用する]** または **[デフォルトの暗号化にバケット設定を上書きする]** を選択します。
**重要**  
デフォルト暗号化設定に SSE-KMS オプションを使用する場合、AWS KMS の 1 秒あたりのリクエスト (RPS) 制限が適用されます。AWS KMS クォータの詳細およびクォータの引き上げをリクエストする方法については、*AWS Key Management Service デベロッパーガイド*の「[クォータ](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)」を参照してください。

1. **[デフォルトの暗号化にバケット設定を上書きする]** を選択した場合は、次の暗号化設定を設定します。

   1. **[暗号化タイプ]** で、**[AWS Key Management Service キーによるサーバー側の暗号化 (SSE-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 デベロッパーガイド*の「[Identifying symmetric and asymmetric KMS keys](https://docs.aws.amazon.com//kms/latest/developerguide/find-symm-asymm.html)」(対称および非対称 KMS キーの識別) を参照してください。

1. **[追加のコピー設定]** で、**[ソース設定をコピー]** するか、**[設定を指定しない]** か、**[設定を指定]** するかを選択します。**[ソース設定をコピー]** がデフォルトのオプションです。ソース設定の属性なしでオブジェクトのみをコピーする場合は、**[設定を指定しない]** を選択します。ストレージクラス、ACL、オブジェクトタグ、メタデータ、サーバー側の暗号化、その他のチェックサムの設定を指定するには、**[設定を指定]** を選択します。

1. **[Save changes]** (変更の保存) をクリックします。

**注記**  
このアクションは、指定されたすべてのオブジェクトに暗号化を適用します。フォルダを暗号化する場合は、保存オペレーションが完了するのを待ってから、フォルダに新しいオブジェクトを追加します。

## REST API の使用
<a name="KMSUsingRESTAPI"></a>

オブジェクトを作成するとき (新しいオブジェクトをアップロードするか、既存のオブジェクトをコピーするとき) に、AWS KMS keys (SSE-KMS) を使用したサーバー側の暗号化の使用を指定してデータを暗号化できます。これを行うには、リクエストに `x-amz-server-side-encryption` ヘッダーを追加します。ヘッダーの値を、暗号化アルゴリズム `aws:kms` に設定します。Amazon S3 によりレスポンスヘッダー `x-amz-server-side-encryption` が返されるため、SSE−KMS を使用してオブジェクトが保存されたことを確認できます。

`x-amz-server-side-encryption` の値で `aws:kms` ヘッダーを指定する場合は、次のリクエストヘッダーも使用できます。
+ `x-amz-server-side-encryption-aws-kms-key-id`
+ `x-amz-server-side-encryption-context`
+ `x-amz-server-side-encryption-bucket-key-enabled`

**Topics**
+ [SSE-KMS をサポートする Amazon S3 REST API オペレーション](#sse-request-headers-kms)
+ [暗号化コンテキスト (`x-amz-server-side-encryption-context`)](#s3-kms-encryption-context)
+ [AWS KMS キー ID (`x-amz-server-side-encryption-aws-kms-key-id`)](#s3-kms-key-id-api)
+ [S3 バケットキー (`x-amz-server-side-encryption-aws-bucket-key-enabled`)](#bucket-key-api)

### SSE-KMS をサポートする Amazon S3 REST API オペレーション
<a name="sse-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` オペレーションで SSE−KMS ヘッダーを渡す場合は、ターゲットオブジェクトにのみ適用されます。既存のオブジェクトをコピーする際は、コピー元オブジェクトが暗号化されているかどうかに関係なく、明示的にサーバー側の暗号化を要求しない限り、コピー先オブジェクトは暗号化されません。
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](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) — マルチパートアップロード API オペレーションを使用して大きいオブジェクトをアップロードする場合、これらのヘッダーを指定できます。これらのヘッダーを `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)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html](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 を使用していない場合、失敗します。
オブジェクトで SSE−KMS を使用している場合、`GET` リクエストおよび `HEAD` リクエストに対して暗号化リクエストヘッダーを送信しないでください。送信すると、HTTP 400 BadRequest エラーが発生します。

### 暗号化コンテキスト (`x-amz-server-side-encryption-context`)
<a name="s3-kms-encryption-context"></a>

`x-amz-server-side-encryption:aws:kms` を指定した場合、Amazon S3 API は `x-amz-server-side-encryption-context` ヘッダーの暗号化コンテキストをサポートします。暗号化コンテキストは、データに関する追加のコンテキスト情報が含まれたキーバリューペアのセットです。

Amazon S3 は、オブジェクトまたはバケットの Amazon リソースネーム (ARN) を暗号化コンテキストペアとして自動的に使用します。S3 バケットキーを有効にせずに SSE−KMS を使用する場合は、オブジェクト ARN を暗号化コンテキストとして使用します。例えば、`arn:aws:s3:::object_ARN` です。ただし、S3 バケットキーを有効にして SSE−KMS を使用する場合は、バケット ARN を暗号化コンテキストに使用します。例えば、`arn:aws:s3:::bucket_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-kms-key-id-api"></a>

`x-amz-server-side-encryption-aws-kms-key-id` ヘッダーを使用して、データの保護に使用するカスタマーマネージドキーの ID を指定できます。`x-amz-server-side-encryption:aws:kms` ヘッダーを指定しても `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)」を参照してください。

### S3 バケットキー (`x-amz-server-side-encryption-aws-bucket-key-enabled`)
<a name="bucket-key-api"></a>

`x-amz-server-side-encryption-aws-bucket-key-enabled` リクエストヘッダーを使用して、オブジェクトレベルで S3 バケットキーを有効または無効にできます。S3 バケットキーで、Amazon S3 から AWS KMS へのリクエストトラフィックを減らすことにより、AWS KMS リクエストコストを削減できます。詳細については、「[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md)」を参照してください。

`x-amz-server-side-encryption:aws:kms` ヘッダーを指定しても、`x-amz-server-side-encryption-aws-bucket-key-enabled` は指定しない場合、オブジェクトは送信先バケットの S3 バケットキーの設定を使用して、オブジェクトを暗号化します。詳細については、「[オブジェクトレベルで S3 バケットキーを設定する](configuring-bucket-key-object.md)」を参照してください。

## AWS CLI の使用
<a name="KMSUsingCLI"></a>

次の AWS CLI コマンド例を使用する際は、`user input placeholders` をユーザー自身の情報に置き換えます。

新しいオブジェクトをアップロードするか、既存のオブジェクトをコピーするときに、AWS KMS キーを使用したサーバー側の暗号化の使用を指定してデータを暗号化できます。これを行うには、リクエストに `--server-side-encryption aws:kms` ヘッダーを追加します。`--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` を指定した場合、Amazon S3 は AWS マネージドキーを使用します。

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

さらに、`--bucket-key-enabled` または `--no-bucket-key-enabled` を追加することで、PUT または COPY オペレーションで Amazon S3 バケットキーを有効または無効にできます。S3 バケットキーで、Amazon S3 から AWS KMS へのリクエストトラフィックを減らすことにより、AWS KMS リクエストコストを削減できます。詳細については、「[Amazon S3 バケットキーを使用した SSE-KMS のコストの削減](https://docs.aws.amazon.com//AmazonS3/latest/userguide/bucket-key.html)」を参照してください。

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

暗号化されていないオブジェクトを元の場所にコピーすることで、SSE-KMS を使用するように暗号化できます。

```
aws s3api copy-object --bucket amzn-s3-demo-bucket --key example-object-key --body filepath --bucket amzn-s3-demo-bucket --key example-object-key --sse aws:kms --sse-kms-key-id example-key-id --body filepath
```

## AWS SDK の使用
<a name="kms-using-sdks"></a>

AWS SDK を使用する場合、サーバー側の暗号化に AWS KMS keys を使用するよう Amazon S3 にリクエストできます。次の例は、AWS SDK for Java および .NET で SSE-KMS を使用する方法を示しています。他の 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)」を参照してください。

### `CopyObject` オペレーション
<a name="kms-copy-operation"></a>

オブジェクトをコピーする場合は、同じリクエストプロパティ (`ServerSideEncryptionMethod` および `ServerSideEncryptionKeyManagementServiceKeyId`) を追加して、AWS KMS key を使用するように Amazon S3 に対してリクエストします。オブジェクトのコピーの詳細については、[オブジェクトのコピー、移動、名前の変更](copy-object.md) を参照してください。

### `PUT` オペレーション
<a name="kms-put-operation"></a>

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

AWS SDK for Java を使用してオブジェクトをアップロードする場合、次のリクエストのように `SSEAwsKeyManagementParams` プロパティを追加することによって、AWS KMS key を使用するように Amazon S3 に対してリクエストできます。

```
PutObjectRequest putRequest = new PutObjectRequest(bucketName,
   keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams());
```

この場合、Amazon S3 は AWS マネージドキー (`aws/s3`) を使用します。詳細については、「[AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用](UsingKMSEncryption.md)」を参照してください。次の例に示すように、オプションで、対称暗号化 KMS キーを作成し、それをリクエストで指定できます。

```
PutObjectRequest putRequest = new PutObjectRequest(bucketName,
   keyName, file).withSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(keyID));
```

カスタマーマネージドキーの作成の詳細については、**「AWS Key Management Service デベロッパーガイド」の「[AWS KMS API のプログラミング](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)」を参照してください。

オブジェクトをアップロードするためのコード例については、以下のトピックを参照してください。これらの例を使用するには、コード例を更新し、前出のコード例に示されているように暗号化情報を提供する必要があります。
+ 1 つのオペレーションでオブジェクトをアップロードする場合は、[オブジェクトのアップロード](upload-objects.md) を参照してください。
+ 高レベルまたは低レベルのマルチパートアップロード API オペレーションを使用するマルチパートアップロードについては、「[マルチパートアップロードを使用したオブジェクトのアップロード](mpu-upload-object.md)」を参照してください。

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

AWS SDK for .NET を使用してオブジェクトをアップロードする場合、次のリクエストのように `ServerSideEncryptionMethod` プロパティを追加することによって、AWS KMS key を使用するように Amazon S3 に対してリクエストできます。

```
PutObjectRequest putRequest = new PutObjectRequest
 {
     BucketName = amzn-s3-demo-bucket,
     Key = keyName,
     // other properties
     ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS
 };
```

この場合、Amazon S3 は AWS マネージドキー を使用します。詳細については、「[AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用](UsingKMSEncryption.md)」を参照してください。次の例に示すように、オプションで、独自の対称暗号化カスタマーマネージドキーを作成し、それをリクエストで指定できます。

```
PutObjectRequest putRequest1 = new PutObjectRequest
{
  BucketName = amzn-s3-demo-bucket,
  Key = keyName,
  // other properties
  ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS,
  ServerSideEncryptionKeyManagementServiceKeyId = keyId
};
```

カスタマーマネージドキーの作成の詳細については、**「AWS Key Management Service デベロッパーガイド」の「[AWS KMS API のプログラミング](https://docs.aws.amazon.com/kms/latest/developerguide/programming-top.html)」を参照してください。

オブジェクトをアップロードするためのコード例については、以下のトピックを参照してください。これらの例を使用するには、コード例を更新し、前出のコード例に示されているように暗号化情報を提供する必要があります。
+ 1 つのオペレーションでオブジェクトをアップロードする場合は、[オブジェクトのアップロード](upload-objects.md) を参照してください。
+ 高レベルまたは低レベルのマルチパートアップロード API オペレーションを使用するマルチパートアップロードについては、「[マルチパートアップロードを使用したオブジェクトのアップロード](mpu-upload-object.md)」を参照してください。

------

### 署名付き URL
<a name="kms-presigned-urls"></a>

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

次の例に示すように、AWS KMS key で暗号化されたオブジェクトの署名付き URL を作成する際には、署名バージョン 4 を明示的に指定する必要があります。

```
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setSignerOverride("AWSS3V4SignerType");
AmazonS3Client s3client = new AmazonS3Client(
        new ProfileCredentialsProvider(), clientConfiguration);
...
```

コード例については、[署名付き URL を使用したオブジェクトの共有](ShareObjectPreSignedURL.md) を参照してください。

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

次の例に示すように、AWS KMS key で暗号化されたオブジェクトの署名付き URL を作成する際には、署名バージョン 4 を明示的に指定する必要があります。

```
AWSConfigs.S3Config.UseSignatureVersion4 = true;
```

コード例については、[署名付き URL を使用したオブジェクトの共有](ShareObjectPreSignedURL.md) を参照してください。

------

# Amazon S3 バケットキーを使用した SSE−KMS のコストの削減
<a name="bucket-key"></a>

Amazon S3 バケットキーは、AWS Key Management Service (AWS KMS) を使用した Amazon S3 サーバー側の暗号化のコストを削減します。SSE-KMS でこのバケットレベルのキーを使用すると、Amazon S3 から AWS KMS へのリクエストトラフィックを減らすことにより、AWS KMS のリクエストコストを最大 99% 削減できます。AWS マネジメントコンソール を数回クリックするだけで、クライアントアプリケーションの変更はせずにバケットを設定し、新しいオブジェクトで SSE-KMS の暗号化に S3 バケットキーを使用することができます。

**注記**  
S3 バケットキーは、AWS Key Management Service (AWS KMS) キーによる二層式サーバー側の暗号化  (DSSE-KMS) ではサポートされていません。

## SSE−KMS の S3 バケットキー
<a name="bucket-key-overview"></a>

SSE−KMS で暗号化された数百万、数十億のオブジェクトにアクセスするワークロードは、AWS KMS に大量のリクエストを生成します。S3 バケットキーなしで SSE−KMS を使用してデータを保護する場合、Amazon S3 はすべてのオブジェクトに対して個々の AWS KMS [データキー](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)を使用します。この場合、KMS で暗号化されたオブジェクトに対してリクエストが実行されるたびに、Amazon S3 は AWS KMS を呼び出します。SSE−KMS の仕組みについては、[AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) の使用](UsingKMSEncryption.md) を参照してください。

SSE-KMS の S3 バケットキーを使用するようにバケットを設定すると、AWS は AWS KMS から有効期限の短いバケットレベルのキーを生成し、S3 に一時的に保存します。このバケットレベルのキーは、ライフサイクル中に新しいオブジェクトのデータキーを作成します。S3 バケットキーは Amazon S3 内で期間限定で使用されるため、S3 で AWS KMS にリクエストを実行し、暗号化オペレーションを完了する必要性が軽減されます。これにより S3 から AWS KMS へのトラフィックが減少し、これまでと比較してわずかなコストで、Amazon S3 の AWS KMS で暗号化されたオブジェクトにアクセスできるようになります。

固有のバケットレベルのキーはリクエスタごとに少なくとも 1 回フェッチされ、キーへのリクエスターのアクセスが AWS KMS CloudTrail イベントで確実にキャプチャされます。Amazon S3 は、呼び出し元が異なるロールまたはアカウントを使用する場合、または同じロールを異なるスコープポリシーで使用する場合、呼び出し元を異なるリクエスタとして扱います。AWS KMS リクエスト削減数は、リクエスタ数、リクエストパターン、リクエストされたオブジェクトの相対的な経過時間を反映しています。例えば、リクエスタの数が少なく、限られた時間枠で複数のオブジェクトをリクエストして、同じバケットレベルのキーで暗号化した場合、大幅な削減につながります。

**注記**  
S3 バケットキーを使用すると、バケットレベルのキーを使って `Encrypt`、`GenerateDataKey`、`Decrypt` オペレーションの AWS KMS リクエスト数を減らし、AWS KMS リクエストのコストを節約できます。設計上、このバケットレベルのキーを利用する後続のリクエストが AWS KMS API リクエストになったり、AWS KMS キーポリシーに照らしてアクセスが検証されたりすることはありません。

S3 バケットキーを設定する場合、バケット内に既に存在するオブジェクトは S3 バケットキーを使用しません。既存のオブジェクトの S3 バケットキーを設定するには、`CopyObject` オペレーションを使用できます。詳細については、「[オブジェクトレベルで S3 バケットキーを設定する](configuring-bucket-key-object.md)」を参照してください。

Amazon S3 は、同じ AWS KMS key で暗号化されるオブジェクトの S3 バケットキーのみを共有します。S3 バケットキーは、AWS KMS によって作成された KMS キー、[インポートされたキーマテリアル](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)、および[カスタムキーストア によってバックアップされたキーマテリアル](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)と互換性があります。

![\[バケット内のオブジェクトのデータキーを作成するバケットキーを生成する AWS KMS を説明する図\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/S3-Bucket-Keys.png)


## S3 バケットキーの設定
<a name="configure-bucket-key"></a>

Amazon S3 コンソール、AWS SDK、AWS CLI、または REST API を使用して、新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定できます。バケットで S3 バケットキーを有効にすると、別の指定した SSE-KMS キーでアップロードされたオブジェクトは、独自の S3 バケットキーを使用します。S3 バケットキーの設定にかかわらず、リクエストに `true` または `false` の値の付いた `x-amz-server-side-encryption-bucket-key-enabled` ヘッダーを含めると、バケット設定を上書きできます。

S3 バケットキーを使用するようにバケットを設定する前に、「[S3 バケットキーを有効にする前に注意するべき変更点](#bucket-key-changes)」を確認してください。

### Amazon S3 コンソールを使用した S3 バケットキーの設定
<a name="configure-bucket-key-console"></a>

新しいバケットを作成する際、新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定できます。また、バケットプロパティを更新して、新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するように既存のバケットを設定することもできます。 

詳細については、[新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定する](configuring-bucket-key.md) を参照してください。

### S3 バケットキーに対する REST API、AWS CLI、および AWS SDK のサポート
<a name="configure-bucket-key-programmatic"></a>

REST API、AWS CLI、または AWS SDK を使用して、新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定できます。オブジェクトレベルで S3 バケットキーを有効にすることもできます。

詳細については次を参照してください: 
+ [オブジェクトレベルで S3 バケットキーを設定する](configuring-bucket-key-object.md)
+ [新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定する](configuring-bucket-key.md)

次の API オペレーションは、SSE−KMS の S3 バケットキーをサポートしています。
+ [PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)
  + `ServerSideEncryptionRule` は、S3 バケットキーを有効または無効にする `BucketKeyEnabled` パラメータを受け入れます。
+ [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)
  + `ServerSideEncryptionRule` は の設定を返します。`BucketKeyEnabled`
+ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)、[CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)、[CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html)、および [POST Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html)
  + `x-amz-server-side-encryption-bucket-key-enabled` リクエストヘッダーは、オブジェクトレベルで S3 バケットキーを有効または無効にします。
+ [HeadObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)、[GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)、[UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html)、[UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html)、[CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html)
  + `x-amz-server-side-encryption-bucket-key-enabled` レスポンスヘッダーは、オブジェクトに対して S3 バケットキーが有効か無効かを示します。

### CloudFormation の使用
<a name="configure-bucket-key-cfn"></a>

CloudFormation では、`AWS::S3::Bucket` のリソースに S3 バケットキーを有効または無効にするために使用できる `BucketKeyEnabled` と呼ばれる暗号化プロパティが含まれています。

詳細については、[CloudFormation の使用](configuring-bucket-key.md#enable-bucket-key-cloudformation) を参照してください。

## S3 バケットキーを有効にする前に注意するべき変更点
<a name="bucket-key-changes"></a>

S3 バケットキーを有効にする前に、次の関連する変更点に注意してください。

### IAM または AWS KMS キーポリシー
<a name="bucket-key-policies"></a>

既存の AWS Identity and Access Management (IAM) ポリシーまたは AWS KMS キーポリシーで、オブジェクトの Amazon リソースネーム (ARN) を暗号化コンテキストとして使用し、KMS キーへのアクセスを絞り込んだり制限したりする場合、S3 バケットキーではこれらのポリシーは機能しません。S3 バケットキーは、バケット ARN を暗号化コンテキストとして使用します。S3 バケットキーを有効にする前に、バケット ARN を暗号化コンテキストとして使用するため、IAM ポリシーまたは AWS KMS キーポリシーを更新してください。

暗号化コンテキストと S3 バケットキーの詳細については、「[暗号化コンテキスト](UsingKMSEncryption.md#encryption-context)」を参照してください。

### AWS KMS の CloudTrail イベント
<a name="bucket-key-cloudtrail"></a>

S3 バケットキーを有効にすると、オブジェクト ARN の代わりに、AWS KMS CloudTrail イベントがバケット ARN をログに記録します。さらに、ログに表示される SSE−KMS オブジェクトの KMS CloudTrail イベントが少なくなります。これは、Amazon S3 ではキーマテリアルに時間制限があり、これにより AWS KMS に対するリクエストが減るためです。

## レプリケーションでの S3 バケットキーの使用
<a name="bucket-key-replication"></a>

S3 バケットキーは、同一リージョンレプリケーション (SRR) およびクロスリージョンレプリケーション (CRR) で使用できます。

Amazon S3 では、暗号化されたオブジェクトをレプリケートする場合、通常、レプリケート先バケット内のレプリカオブジェクトの暗号化設定が保持されます。ただし、ソースオブジェクトが暗号化されておらず、レプリケート先バケットがデフォルトの暗号化または S3 バケットキーを使用している場合、Amazon S3 はレプリケート先のバケットの設定でオブジェクトを暗号化します。

以下の例では、S3 バケットキーがレプリケーションでどのように機能するかを示しています。詳細については、「[暗号化されたオブジェクトのレプリケート (SSE-S3、SSE-KMS、DSSE-KMS、SSE-C)](replication-config-for-kms-objects.md)」を参照してください。 

**Example 例 1 – ソースオブジェクトで S3 バケットキーを使用し、レプリケート先バケットでデフォルトの暗号化を使用する**  
ソースオブジェクトでは S3 バケットキーを使用しているが、レプリケート先バケットでは SSE−KMS によるデフォルトの暗号化を使用している場合、レプリカオブジェクトは S3 バケットキーの暗号化設定をレプリケート先バケットに保持します。レプリケート先バケットでは、SSE−KMS によるデフォルトの暗号化が使用されます。  


**Example 例 2 – ソースオブジェクトが暗号化されておらず、レプリケート先バケットで SSE−KMS の S3 バケットキーを使用する**  
ソースオブジェクトが暗号化されておらず、レプリケート先のバケットで SSE−KMS の S3 バケットキーを使用する場合、レプリカオブジェクトはレプリケート先バケットで SSE−KMS を使用して、S3 バケットキーで暗号化されます。この結果、ソースオブジェクトの `ETag` はレプリカオブジェクトの `ETag` と異なることになります。この違いに対応するには、`ETag` を使用するアプリケーションを更新する必要があります。

## S3 バケットキーの使用
<a name="using-bucket-key"></a>

S3 バケットキーの有効化と使用の詳細については、以下のセクションを参照してください。
+ [新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定する](configuring-bucket-key.md)
+ [オブジェクトレベルで S3 バケットキーを設定する](configuring-bucket-key-object.md)
+ [S3 バケットキーの設定の表示](viewing-bucket-key-settings.md)

# 新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定する
<a name="configuring-bucket-key"></a>

AWS Key Management Service (AWS KMS) キー (SSE-KMS) を使用してサーバー側の暗号化を設定する場合、新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定できます。S3 バケットキーは、Amazon S3 から AWS KMS へのリクエストトラフィックを減らし、SSE−KMS におけるコストを削減します。詳細については、「[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md)」を参照してください。

Amazon S3 コンソール、REST API、AWS SDK、AWS Command Line Interface (AWS CLI)、または CloudFormation を使用して、新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定できます。既存のオブジェクトの S3 バケットキーを有効または無効にするには、`CopyObject` オペレーションを使用できます。詳細については、([オブジェクトレベルで S3 バケットキーを設定する](configuring-bucket-key-object.md)) および ([バッチオペレーションを使用して SSE-KMS の S3 バケットキーを有効にする](batch-ops-copy-example-bucket-key.md)) を参照してください。

レプリケート元バケットまたはレプリケート先バケットで S3 バケットキーを有効にすると、暗号化コンテキストはバケットの Amazon リソースネーム (ARN) になり、オブジェクト ARN にはなりません (例えば、`arn:aws:s3:::bucket_ARN`)。IAM ポリシーを更新して、暗号化コンテキストにバケット ARN を使用する必要があります。詳細については、「[S3 バケットキーとレプリケーション](replication-config-for-kms-objects.md#bk-replication)」を参照してください。

以下の例では、S3 バケットキーがレプリケーションでどのように機能するかを示しています。詳細については、「[暗号化されたオブジェクトのレプリケート (SSE-S3、SSE-KMS、DSSE-KMS、SSE-C)](replication-config-for-kms-objects.md)」を参照してください。 

**前提条件**  
S3 バケットキーを使用するようにバケットを設定する前に、「[S3 バケットキーを有効にする前に注意するべき変更点](bucket-key.md#bucket-key-changes)」を確認してください。

**Topics**

## S3 コンソールの使用
<a name="enable-bucket-key"></a>

S3 コンソールでは、新しいバケットまたは既存のバケットに対して S3 バケットキーを有効または無効にできます。S3 コンソールのオブジェクトは、バケット設定からそれらの S3 バケットキーの設定を継承します。バケットで S3 バケットキーを有効にすると、バケットにアップロードする新しいオブジェクトでは、SSE-KMS に S3 バケット キーが使用されます。

**S3 バケットキーが有効になっているバケット内のオブジェクトをアップロード、コピー、または変更する**  
S3 バケットキーが有効になっているバケットでオブジェクトをアップロード、変更、またはコピーすると、そのオブジェクトの S3 バケットキーの設定がバケット設定に合わせて更新されることがあります。

オブジェクトで既に S3 バケットキーが有効になっている場合、オブジェクトをコピーまたは変更しても、そのオブジェクトの S3 バケットキーの設定は変更されません。ただし、レプリケート先バケットに S3 バケットキーの設定がある状態で S3 バケットキーが有効になっていないオブジェクトを変更またはコピーした場合、オブジェクトはレプリケート先バケットの S3 バケットキーの設定を継承します。例えば、ソースオブジェクトで S3 バケットキーが有効になっていないが、レプリケート先バケットで S3 バケットキーが有効になっている場合、S3 バケットキーは有効になります。

**新しいバケットの作成時に S3 バケットキーを有効にするには**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. 左側のナビゲーションペインで、[**バケット**] を選択します。

1. [**Create bucket (バケットの作成)**] を選択します。

1. バケット名を入力し、AWS リージョンを選択します。

1. **[デフォルトの暗号化]** の **[暗号化キーの種類]** で、**[AWS Key Management Service キー (SSE-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)」を参照してください。

1. **[バケットキー]** で **[有効化]** を選択します。

1. [**Create bucket**] (バケットの作成) をクリックします。

   Amazon S3 は、S3 バケットキーを有効にしてバケットを作成します。バケットにアップロードする新しいオブジェクトには、S3 バケットキーを使用します。 

   S3 バケットキーを無効にするには、前の手順に従い、**[無効化]** を選択します。

**既存のバケットに対して S3 バケットキーを有効にするには**

1. Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. 左側のナビゲーションペインで、**[バケット]** を選択します。

1. **[バケット]** リストで、S3 バケットキーを有効にするバケットを選択します。

1. **[プロパティ]** タブを選択します。

1. **[デフォルトの暗号化]** で、**[編集]** を選択します。

1. **[デフォルトの暗号化]** の **[暗号化キーの種類]** で、**[AWS Key Management Service キー (SSE-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)」を参照してください。

1. **[バケットキー]** で **[有効化]** を選択します。

1. [**Save changes**] (変更を保存) をクリックします。

   Amazon S3 では、バケットに追加された新しいオブジェクトに対して S3 バケットキーが有効になります。既存のオブジェクトでは S3 バケットキーは使用しません。既存のオブジェクトの S3 バケットキーを設定するには、`CopyObject` オペレーションを使用できます。詳細については、「[オブジェクトレベルで S3 バケットキーを設定する](configuring-bucket-key-object.md)」を参照してください。

   S3 バケットキーを無効にするには、前の手順に従い、[**Disable (無効化)**] を選択します。

## REST API の使用
<a name="enable-bucket-key-rest"></a>

[PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) を使用してバケットの S3 バケットキーを有効または無効にできます。`PutBucketEncryption` で S3 バケットキーを設定するには、[ServerSideEncryptionRule](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ServerSideEncryptionRule.html) を使用します。これには、SSE-KMS を使用したデフォルトの暗号化が含まれます。また、オプションで、カスタマーマネージドキーの KMS キー ID を指定して、カスタマーマネージドキーを使用することもできます。  

詳細と構文の例については、[PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html) を参照してください。

## AWS SDK for Java の使用
<a name="enable-bucket-key-sdk"></a>

次の例では、AWS SDK for Java を使用して、S3 バケットキーと SSE−KMS によるデフォルトのバケット暗号化を有効にします。

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

```
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.DEFAULT_REGION)
    .build();
    
ServerSideEncryptionByDefault serverSideEncryptionByDefault = new ServerSideEncryptionByDefault()
    .withSSEAlgorithm(SSEAlgorithm.KMS);
ServerSideEncryptionRule rule = new ServerSideEncryptionRule()
    .withApplyServerSideEncryptionByDefault(serverSideEncryptionByDefault)
    .withBucketKeyEnabled(true);
ServerSideEncryptionConfiguration serverSideEncryptionConfiguration =
    new ServerSideEncryptionConfiguration().withRules(Collections.singleton(rule));

SetBucketEncryptionRequest setBucketEncryptionRequest = new SetBucketEncryptionRequest()
    .withServerSideEncryptionConfiguration(serverSideEncryptionConfiguration)
    .withBucketName(bucketName);
            
s3client.setBucketEncryption(setBucketEncryptionRequest);
```

------

## の使用AWS CLI
<a name="enable-bucket-key-cli"></a>

次の例では、AWS CLI を使用して、S3 バケットキーと SSE−KMS によるデフォルトのバケット暗号化を有効にします。`user input placeholders` を、ユーザー自身の情報に置き換えます。

```
aws s3api put-bucket-encryption --bucket amzn-s3-demo-bucket --server-side-encryption-configuration '{
        "Rules": [
            {
                "ApplyServerSideEncryptionByDefault": {
                    "SSEAlgorithm": "aws:kms",
                    "KMSMasterKeyID": "KMS-Key-ARN"
                },
                "BucketKeyEnabled": true
            }
        ]
    }'
```

## CloudFormation の使用
<a name="enable-bucket-key-cloudformation"></a>

CloudFormation を使用して S3 バケットキーを設定する方法の詳細については、*AWS CloudFormation ユーザーガイド*の「[AWS::S3::Bucket ServerSideEncryptionRule](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-serversideencryptionrule.html)」を参照してください。

# オブジェクトレベルで S3 バケットキーを設定する
<a name="configuring-bucket-key-object"></a>

REST API、AWS SDK、または AWS CLI を使用して PUT オペレーションまたは COPY オペレーションを実行する際、`true` または `false` の値の付いた `x-amz-server-side-encryption-bucket-key-enabled` リスエストヘッダーを追加して、オブジェクトレベルで S3 バケットキーを有効または無効にできます。S3 バケットキーは、Amazon S3 から AWS KMS へのリクエストトラフィックを減らすことにより、AWS Key Management Service (AWS KMS) (SSE−KMS) を使用したサーバー側の暗号化のコストを削減します。詳細については、[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md) を参照してください。

PUT オペレーションまたは COPY オペレーションを使用してオブジェクトの S3 バケットキーを設定すると、Amazon S3 では、そのオブジェクトの設定のみが更新されます。レプリケート先バケットの S3 バケットキーの設定は変更されません。KMS で暗号化されたオブジェクトの PUT または COPY リクエストを S3 バケットキーが有効になっているバケットに送信すると、リクエストヘッダーのキーを無効にしない限り、オブジェクトレベルのオペレーションでは自動的に S3 バケットキーが使用されます。オブジェクトに S3 バケットキーを指定しない場合、Amazon S3 ではレプリケート先バケットの S3 バケットキーの設定がオブジェクトに適用されます。

**前提条件:**  
S3 バケットキーを使用するようにオブジェクトを設定する前に、「[S3 バケットキーを有効にする前に注意するべき変更点](bucket-key.md#bucket-key-changes)」を確認してください。

**Topics**
+ [Amazon S3 バッチオペレーション](#bucket-key-object-bops)
+ [REST API の使用](#bucket-key-object-rest)
+ [AWS SDK Java (PutObject) の使用](#bucket-key-object-sdk)
+ [AWS CLI (PutObject) の使用](#bucket-key-object-cli)

## Amazon S3 バッチオペレーション
<a name="bucket-key-object-bops"></a>

既存の Amazon S3 オブジェクトを暗号化するには、Amazon S3 バッチオペレーションを使用します。S3 バッチオペレーションは、操作するオブジェクトのリストとともに提供します。バッチオペレーションは各 API を呼び出して、指定されたオペレーションを実行します。

[S3 バッチオペレーションのコピーオペレーション](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-copy-object.html)を使用して、既存の暗号化されていないオブジェクトをコピーし、同じバケットに新しい暗号化されたオブジェクトを書き込めます。1 つのバッチオペレーションジョブで、数十億ものオブジェクトに対して、指定されたオペレーションを実行できます。詳細については、[バッチオペレーションでオブジェクトオペレーションを一括で実行する](batch-ops.md) および [Amazon S3 バッチオペレーションによるオブジェクトの暗号化](https://aws.amazon.com/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)を参照してください。

## REST API の使用
<a name="bucket-key-object-rest"></a>

SSE−KMS を使用すると、次の API を使用して、オブジェクトの S3 バケットキーを有効にできます。
+ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) – オブジェクトをアップロードするときに、`x-amz-server-side-encryption-bucket-key-enabled` リクエストヘッダーを指定して、オブジェクトレベルで S3 バケットキーを有効または無効にできます。
+ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) – オブジェクトをコピーして SSE−KMS を設定するときに、`x-amz-server-side-encryption-bucket-key-enabled` リクエストヘッダーを指定して、オブジェクトの S3 バケットキーを有効または無効にできます。
+ [PostObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) – `POST` オペレーションを使用してオブジェクトをアップロードし、SSE−KMS を設定するとき、`x-amz-server-side-encryption-bucket-key-enabled` フォームフィールドを使用してオブジェクトの S3 バケットキーを有効または無効にできます。
+ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) – `CreateMultipartUpload` API オペレーションを使用して大きなオブジェクトをアップロードし、SSE−KMS を設定する場合、`x-amz-server-side-encryption-bucket-key-enabled` リクエストヘッダーを使用してオブジェクトの S3 バケットキーを有効または無効にできます。

オブジェクトレベルで S3 バケットキーを有効にするには、`x-amz-server-side-encryption-bucket-key-enabled` リクエストヘッダーを含めます。SSE−KMS および REST API の詳細については、[REST API の使用](specifying-kms-encryption.md#KMSUsingRESTAPI) を参照してください。

## AWS SDK Java (PutObject) の使用
<a name="bucket-key-object-sdk"></a>

次の例を使用して、AWS SDK for Java を使ってオブジェクトレベルで S3 バケットキーを設定できます。

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

```
AmazonS3 s3client = AmazonS3ClientBuilder.standard()
    .withRegion(Regions.DEFAULT_REGION)
    .build();

String bucketName = "amzn-s3-demo-bucket1";
String keyName = "key name for object";
String contents = "file contents";

PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, keyName, contents)
    .withBucketKeyEnabled(true);
    
s3client.putObject(putObjectRequest);
```

------

## AWS CLI (PutObject) の使用
<a name="bucket-key-object-cli"></a>

次の AWS CLI の例を使用して、`PutObject` リクエストの一部としてオブジェクトレベルで S3 バケットキーを設定できます。

```
aws s3api put-object --bucket amzn-s3-demo-bucket --key object key name --server-side-encryption aws:kms --bucket-key-enabled --body filepath
```

# S3 バケットキーの設定の表示
<a name="viewing-bucket-key-settings"></a>

Amazon S3 コンソール、REST API、AWS Command Line Interface (AWS CLI)、または AWS SDK を使用して、バケットまたはオブジェクトレベルで S3 バケットキーの設定を表示できます。

S3 バケットキーは、Amazon S3 から AWS KMS へのリクエストトラフィックを減らし、AWS Key Management Service (SSE−KMS) を使用したサーバー側の暗号化のコストを削減します。詳細については、「[Amazon S3 バケットキーを使用した SSE−KMS のコストの削減](bucket-key.md)」を参照してください。

バケット設定から S3 バケット キー設定を継承したバケットまたはオブジェクトの S3 バケット キー設定を表示するには、`s3:GetEncryptionConfiguration` アクションを実行するアクセス許可が必要です。詳細については、*Amazon Simple Storage Service API リファレンス*の [GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html) を参照してください。

## S3 コンソールの使用
<a name="bucket-key-settings"></a>

S3 コンソールでは、バケットまたはオブジェクトの S3 バケットキーの設定を表示できます。ソースオブジェクトにすでに S3 バケットキーが設定されていない限り、S3 バケットキーの設定はバケット設定から継承されます。

同じバケット内のオブジェクトとフォルダは、異なる S3 バケットキーの設定を行えます。例えば、REST API を使用してオブジェクトをアップロードし、そのオブジェクトの S3 バケットキーを有効にした場合、レプリケート先バケットで S3 バケットキーが無効になっている場合でも、S3 バケットキーの設定は保持されます。別の例として、既存のバケットに対して S3 バケットキーを有効にした場合、バケット内に既に存在するオブジェクトには S3 バケットキーを使用できません。ただし、新しいオブジェクトでは S3 バケットキーが有効になります。

**バケットの S3 バケットキーの設定を表示するには**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) を開きます。

1. 左側のナビゲーションペインで、**[バケット]** を選択します。

1. **[バケット]** リストで、S3 バケットキーを有効にするバケットを選択します。

1. [**プロパティ**] を選択します。

1. [**Default encryption (デフォルトの暗号化)**] セクションの [**バケットキー**] に、バケットの S3 バケットキーの設定が表示されます。

   S3 バケットキーの設定が表示されない場合は、`s3:GetEncryptionConfiguration` アクションを実行するアクセス許可がない可能性があります。詳細については、**「Amazon Simple Storage Service API リファレンス」の「[GetBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)」を参照してください。

**オブジェクトの S3 バケットキーの設定を表示するには**

1. AWS マネジメントコンソール にサインインし、Amazon S3 コンソール ([https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)) を開きます。

1. [**バケット**] リストで、S3 バケットキーを有効にするバケットを選択します。

1. [**オブジェクト**] リストで、オブジェクト名を選択します。

1. [**詳細**] タブの [**Server−side encryption settings (サーバー側の暗号化設定)**] で、[**Edit (編集)**] を選択します。

   **[バケットキー]** の下に、オブジェクトの S3 バケットキーの設定が表示されます。この設定を編集することはできません。

## の使用AWS CLI
<a name="bucket-key-settings-cli"></a>

**バケットレベルの S3 バケットキーの設定を返すには**  
この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。

```
aws s3api get-bucket-encryption --bucket amzn-s3-demo-bucket1
```

詳細については、「*AWS CLI コマンドリファレンス*」の「[get-bucket-encryption](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-encryption.html)」を参照してください。

**S3 バケットキーのオブジェクトレベルの設定を返すには**  
この例を実行するには、それぞれの `user input placeholder` をユーザー自身の情報に置き換えます。

```
aws s3api head-object --bucket amzn-s3-demo-bucket1 --key my_images.tar.bz2
```

詳細については、「*AWS CLI コマンドリファレンス*」の「[head-object](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/head-object.html)」を参照してください。

## REST API の使用
<a name="bucket-key-settings-rest"></a>

**バケットレベルの S3 バケットキーの設定を返すには**  
S3 バケットキーの設定を含むバケットの暗号化情報を返すには、`GetBucketEncryption` オペレーションを使用します。S3 バケットキーの設定は、`BucketKeyEnabled` の設定と共に `ServerSideEncryptionConfiguration` 要素のレスポンス本文に返されます。詳細については、[Amazon S3 API リファレンス](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html)の *GetBucketEncryption* を参照してください。

**S3 バケットキーのオブジェクトレベルの設定を返すには**  
オブジェクトの S3 バケットキーのステータスを返すには、`HeadObject` オペレーションを使用します。`HeadObject` は、オブジェクトに対して S3 バケットキーが有効か無効かを示す `x-amz-server-side-encryption-bucket-key-enabled` レスポンスヘッダーを返します。詳細については、[Amazon S3 API リファレンス](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) の *HeadObject* を参照してください。

次の API オペレーションは、オブジェクトに対して S3 バケットキーが設定されている場合、`x-amz-server-side-encryption-bucket-key-enabled` レスポンスヘッダーも返します。
+ [PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 
+ [PostObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html) 
+ [CopyObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 
+ [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) 
+ [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) 
+ [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) 
+ [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) 
+ [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 