AWS Key Management Service (SSE-KMS) でサーバー側の暗号を使ってデータを保護します。 - Amazon Simple Storage Service

AWS Key Management Service (SSE-KMS) でサーバー側の暗号を使ってデータを保護します。

サーバー側の暗号化は、それを受信するアプリケーションまたはサービスによる送信先でのデータの暗号化です。AWS Key Management Service (AWS KMS) は、安全で可用性の高いハードウェアおよびソフトウェアを結合するサービスであり、クラウド向けに拡張されたキー管理システムを提供します。Amazon S3 は Amazon S3 オブジェクトを暗号化する AWS KMS keys を使用します。AWS KMS はオブジェクトデータのみを暗号化します。オブジェクトメタデータは暗号化 されません 。

KMS キーを使用すると、AWS Management Console または AWS KMS API から AWS KMS を使用して、以下の操作を実行できます。

  • KMS キーを一元的に作成する

  • KMS キーの使用方法を制御するポリシーを定義します

  • 使用状況を監査して、正しく使用されていることを証明する

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

AWS KMS keysを使用するための追加料金はかかります。詳細については、AWS Key Management Service デベロッパーガイドAWS KMS key の概念およびAWS KMS の料金を参照してください。

許可

AWS KMS key を使用して暗号化されたオブジェクトを Amazon S3 にアップロードするには、キーに対する kms:GenerateDataKey の許可が必要です。AWS KMS keyを使用して暗号化されたオブジェクトをダウンロードするには、kms:Decrypt の許可が必要です。マルチパートアップロードの AWS KMS アクセス許可に関する詳細については、「マルチパートアップロード API とアクセス許可」を参照してください。

AWS KMS keys

AWS KMS によるサーバー側暗号化 (SSE-KMS) を使用すると、デフォルトの AWS マネージドキーを使用するか、または、作成済みのカスタマーマネージドキーを指定でき、AWS KMS はエンベロープ暗号化を使用して、データをさらに保護します。エンベロープ暗号化は、データキーでプレーンテキストデータを暗号化してから、そのデータキーをルートキーで暗号化する手法です。

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

SSE−KMS にカスタマーマネージドキーを使用する場合は、SSE−KMS を設定する前にカスタマーマネージドキーを作成します。次に、バケット用に SSE−KMS を設定するときに、既存のカスタマーマネージドキーを指定します。

カスタマーマネージドキーを独自に作成することで、より柔軟に制御を行えます。例えば、カスタマーマネージドキーを作成、ローテーション、無効化することができます。また、アクセスコントロールを定義し、データを保護するために使用するカスタマーマネージドキーを監査することもできます。カスタマーマネージドキーと AWS マネージドキーの詳細については、AWS Key Management Service デベロッパーガイドAWS KMS の概念を参照してください。

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

  • Amazon S3 は、プレーンテキストのデータキーおよび指定された KMS キーで暗号化されたキーのコピーをリクエストします。

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

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

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

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

  • Amazon S3 は暗号化されたデータキーを AWS KMS に送信します。

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

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

重要

Amazon S3 でサーバー側の暗号化に AWS KMS key を使用する場合は、対称暗号化 KMS キーを選択する必要があります。Amazon S3 では、対称暗号化 KMS キーのみがサポートされ、非対称キーはサポートされません。詳細については、AWS Key Management Service デベロッパーガイド対称キーと非対称キーの使用を参照してください。

Amazon S3 バケットキー

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

新しいオブジェクトで SSE−KMS の S3 バケットキーを使用するようにバケットを設定すると、AWS KMS によりバケットレベルのキーが生成されます。このキーは、バケット内のオブジェクトの一意のデータキーを作成するために使用されます。このバケットキーは Amazon S3 内で期間限定で使用されるため、Amazon S3 で AWS KMS にリクエストを実行し、暗号化オペレーションを完了する必要性が軽減されます。S3 バケットキーの使用の詳細については、Amazon S3 バケットキーを使用した SSE−KMS のコストの削減 を参照してください。

サーバー側の暗号化の要求

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

{ "Version":"2012-10-17", "Id":"PutObjectPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition":{ "StringNotEquals":{ "s3:x-amz-server-side-encryption":"aws:kms" } } } ] }

特定の AWS KMS key を使用してバケット内のオブジェクトを暗号化することを要求するには、s3:x-amz-server-side-encryption-aws-kms-key-id 条件キーを使用できます。KMS キーを指定するには、「arn:aws:kms:region:acct-id:key/key-id" 形式」のキー Amazon リソースネーム (ARN) を使用する必要があります。

注記

オブジェクトをアップロードするときに、x-amz-server-side-encryption-aws-kms-key-id ヘッダーを使用して KMS キーを指定できます。ヘッダーがリクエストにない場合、Amazon S3 は AWS マネージドキを使用するーと見なします。その場合でも、Amazon S3 がオブジェクトの暗号化に使用する AWS KMS キー ID とポリシーの AWS KMS キー ID は一致する必要があります。一致しない場合、Amazon S3 はリクエストを拒否します。

Amazon S3 固有の条件キーの一覧については、Amazon S3 の条件キーを参照してください。

暗号化コンテキスト

暗号化コンテキストは、データに関する追加のコンテキスト情報が含まれたキーバリューペアのセットです。この暗号化コンテキストは暗号化されていません。暗号化オペレーションで暗号化コンテキストを指定すると、Amazon S3 では同じ暗号化コンテキストを復号オペレーションに指定する必要があります。そうでない場合は、暗号化に失敗します。AWS KMS は、暗号化コンテキストを追加の認証データ (AAD) として使用し、認証された暗号化をサポートします。暗号化コンテキストの詳細については、「AWS Key Management Service デベロッパーガイド」の「暗号化コンテキスト」を参照してください。

Amazon S3 は、オブジェクトまたはバケットの Amazon リソースネーム (ARN) を暗号化コンテキストペアとして自動的に使用します。

  • S3 バケットキーを有効にせずに SSE-KMS を使用する場合は、オブジェクト ARN を暗号化コンテキストとして使用します。

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

    arn:aws:s3:::bucket_ARN

s3:PutObject リクエストの 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:::DOC-EXAMPLE-BUCKET1/file_name" }

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

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1" }

AWS 署名バージョン 4

署名バージョン 4 は、HTTP で送信される AWS リクエストに認証情報を追加するプロセスです。セキュリティ対策として、ほとんどの AWS へのリクエストでは、アクセスキーを使用して署名する必要があります。アクセスキーは、アクセスキー ID とシークレットアクセスキーで構成されます。これらの 2 つのキーは、一般的にセキュリティ認証情報と呼ばれます。詳細については、「リクエストの認証 (AWS 署名バージョン 4)」および「署名バージョン 4 の署名プロセス」を参照してください。

重要
  • AWS KMS で保護されたオブジェクトに対する GET リクエストと PUT リクエストはすべて、Secure Sockets Layer (SSL)、Transport Layer Security (TLS)、または署名バージョン 4 を使用してしない場合、失敗します。

  • オブジェクトで SSE−KMS を使用している場合、GET リクエストおよび HEAD リクエストに対して暗号化リクエストヘッダーを送信しないでください。送信すると、HTTP 400 BadRequest エラーが発生します。