AWS Key Management Service (SSE-KMS) に保存されている KMS キーでサーバー側の暗号化を使用してデータを保護する - Amazon Simple Storage Service

AWS Key Management Service (SSE-KMS) に保存されている 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 を使用することで、MS キーを一元的に作成し、MS キーの使用方法を制御するポリシーを定義し、正しく使用されていることを証明するために使用状況を監査します。これらの 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:Decrypt および kms:GenerateDataKey の許可が必要です。AWS KMS key を使用して暗号化されたオブジェクトをダウンロードするには、kms:Decrypt の許可が必要です。AWS KMS のアクセス権限とマルチパートアップロードの詳細については、マルチパートアップロード API とアクセス許可 を参照してください。

AWS KMS keys およびカスタマーマネージドキー

AWS KMS (SSE-KMS) でサーバー側暗号化を使用する場合は、デフォルトの AWS 管理キー を使用するか、または、作成済みの カスタマー管理キー を指定できます。

カスタマーマネージドキーを指定しない場合、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 の概念」を参照してください。

重要

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

Amazon S3 バケットキー

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

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

AWS 署名バージョン 4

SSE-KMS で暗号化されたオブジェクトをアップロードしたり、それらへアクセスしたりする場合、セキュリティを強化するために AWS 署名バージョン 4 を使用する必要があります。AWS SDK を使用してこれを行う方法の詳細については、「リクエスト認証での署名バージョンの指定」を参照してください。

重要

AWS KMS によって保護されているオブジェクトに対するすべての GET および PUT リクエストは、SSL や TLS を介して行われる場合、または SigV4 を使用して行われる場合を除いて失敗します。

SSE-KMS のハイライト

SSE-KMS のハイライトは次のとおりです。

  • 自分で作成および管理するカスタマーマネージドキーを選択するか、Amazon S3 がユーザーに代わって AWS アカウント に作成して管理する AWS マネージドキーを選択することができます。カスタマーマネージドキーと同様に、AWS マネージドキーは AWS アカウント およびリージョンに固有です。Amazon S3 のみが、お客様に代わってこの KMS キーを使用する許可を持っています。Amazon S3 は、対称 KMS キーのみをサポートしています。

  • AWS KMS コンソールから監査可能なカスタマーマネージドキーを作成、ローテーション、および無効化できます。

  • レスポンスの ETag はオブジェクトデータの MD5 ではありません。

  • データの暗号化に使用されるデータキーも、保護対象のデータとともに暗号化され、保管されます。

  • AWS KMS のセキュリティ制御は、暗号化関連のコンプライアンス要件を満たすのに役立ちます。

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

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

{ "Version":"2012-10-17", "Id":"PutObjectPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::awsexamplebucket1/*", "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 KMS キー ID とポリシーの AWS KMS KMS キー ID は一致する必要があります。一致しない場合、Amazon S3 はリクエストを拒否します。

Amazon S3 固有の条件キーの完全なリストと条件キーの指定の詳細については、「Amazon S3 条件キーの例」を参照してください。

暗号化コンテキスト

Amazon S3 は、x-amz-server-side-encryption-context ヘッダーによる暗号化コンテキストをサポートしています。暗号化コンテキストは、データに関する追加のコンテキスト情報を含めることができるキーと値のペアのオプションのセットです。

Amazon S3 の暗号化コンテキストの詳細については、「暗号化コンテキスト」を参照してください。暗号化コンテキストの一般的な情報については、AWS Key Management Service デベロッパーガイドAWS Key Management Service の概念 - 暗号化コンテキストを参照してください。

暗号化コンテキストは、ヘッダーが Base64 でエンコードされた JSON 形式であるかぎり、お好みの値にすることができます。ただし、暗号化コンテキストは暗号化されず、AWS CloudTrail ログが有効になっている場合はログに記録されるので、これには機密情報を含めないでください。さらに、暗号化または復号されるデータをコンテキストで説明し、AWS KMS で生成される CloudTrail イベントについてよく理解できるようにすることをお勧めします。

Amazon S3 では、オブジェクトまたはバケットの Amazon リソースネーム (ARN) が暗号化コンテキストとして一般的に使用されます。S3 バケットキーを有効にせずに SSE-KMS を使用する場合は、オブジェクト ARN を暗号化コンテキストとして使用します。たとえば、arn:aws:s3:::object_ARN です。ただし、S3 バケットキーを有効にして SSE-KMS を使用する場合は、バケット ARN を暗号化コンテキストに使用します。たとえば、arn:aws:s3:::bucket_ARN です。S3 バケットキーの詳細については、「Amazon S3 バケットキーを使用した SSE-KMS のコストの削減」を参照してください。

暗号化コンテキストに aws:s3:arn キーがまだ存在しない場合、Amazon S3 は、指定した暗号化コンテキストに aws:s3:arn の定義済みのキーを追加できます。Amazon S3 は、リクエストを処理するときに、この定義済みのキーを追加します。S3 バケットキーなしで SSE-KMS を使用する場合、値はオブジェクト ARN と等しくなります。S3 バケットキーを有効にして SSE-KMS を使用する場合、値はバケット ARN と等しくなります。

この定義済みのキーを使用して、CloudTrail で関連するリクエストを追跡できます。したがって、どの Amazon S3 ARN がどの暗号化キーで使用されたかをいつでも確認できます。CloudTrail ログを使用して、異なる Amazon S3 オブジェクトとバケット間で暗号化コンテキストが同一でないことを確認できます。これにより、セキュリティがさらに強化されます。暗号化コンテキスト全体を対象に、オブジェクトあるいはバケット ARN と同じ値があるかが検証されます。