

# 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)