AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定 - Amazon Simple Storage Service

AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定

重要

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

すべての 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 を使用できます。

暗号化は、新しいオブジェクトをアップロードしたり、既存のオブジェクトをコピーしたりするときに適用できます。

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 デベロッパーガイド」の「マルチリージョンキーを使用する」を参照してください。

注記

別のアカウントが所有している KMS キーを使用する場合は、そのキーを使用するアクセス許可が必要です。KMS キーのクロスアカウント権限の詳細については、「AWS Key Management Service デベロッパーガイド」の「他のアカウントで使用できる KMS キーを作成する」を参照してください。

このトピックでは、Amazon S3 コンソールを使用して、AWS Key Management Service (AWS KMS) キーによるサーバー側の暗号化 (SSE-KMS) を使用するようにオブジェクトの暗号化のタイプを設定または変更する方法について説明します。

注記

オブジェクトの暗号化を変更すると、新しいオブジェクトが作成され、古いオブジェクトが置き換えられます。S3 バージョニングが有効になっている場合は、オブジェクトの新しいバージョンが作成され、既存のオブジェクトが古いバージョンになります。また、プロパティを変更するロールは、新しいオブジェクト (またはオブジェクトのバージョン) の所有者になります。

オブジェクトの暗号化を追加または変更するには
  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

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

  3. [Buckets] (バケット) リストで、オブジェクトが含まれるバケットの名前を選択します。

  4. [Objects] (オブジェクト) リストで、暗号化を追加または変更するオブジェクトの名前を選択します。

    オブジェクトの詳細ページが開き、オブジェクトのプロパティを表示するいくつかのセクションが表示されます。

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

  6. サーバー側の暗号化設定」セクションまでスクロールして、[編集]を選択します。

    [Edit server−side encryption (サーバー側の暗号化を編集する)] ページが開きます。

  7. [サーバー側の暗号化][暗号化設定] で、[デフォルトの暗号化バケット設定を上書きする] を選択します。

  8. [暗号化タイプ] で、[AWS Key Management Service キーによるサーバー側の暗号化 (SSE-KMS)] を選択します。

    重要

    デフォルト暗号化設定に SSE-KMS オプションを使用する場合、AWS KMS の 1 秒あたりのリクエスト (RPS) 制限が適用されます。AWS KMS クォータの詳細およびクォータの引き上げをリクエストする方法については、「AWS Key Management Service デベロッパーガイド」の「クォータ」を参照してください。

  9. [AWS KMS キー] で、次のいずれかを実行して KMS キーを選択します。

    • 使用可能な KMS キーのリストから選択するには、[AWS KMS keys から選択する] を選択し、使用可能なキーのリストから自分の KMS キーを選択します。

      AWS マネージドキー (aws/s3) とカスタマーマネージドキーの両方がこのリストに表示されます。カスタマーマネージドキーの詳細については、AWS Key Management Serviceデベロッパーガイドの「カスタマーキーと AWS キー」を参照してください。

    • KMS キー ARN を入力するには、[AWS KMS key ARN を入力] を選択し、表示されるフィールドに KMS キー ARN を入力します。

    • AWS KMS コンソールで新しいカスタマーマネージドキーを作成するには、[KMS キーを作成] を選択します。

      AWS KMS key の作成の詳細については、「AWS Key Management Service デベロッパーガイド」の「キーの作成」を参照してください。

    重要

    バケットと同じ 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」(対称および非対称 KMS キーの識別) を参照してください。

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

注記

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

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

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

  • x-amz-server-side-encryption-aws-kms-key-id

  • x-amz-server-side-encryption-context

  • x-amz-server-side-encryption-bucket-key-enabled

SSE-KMS をサポートする Amazon S3 REST API オペレーション

次の REST API オペレーションでは x-amz-server-side-encryptionx-amz-server-side-encryption-aws-kms-key-id、および x-amz-server-side-encryption-context リクエストヘッダーを受け入れます。

  • PutObjectPUT API オペレーションを使用してデータをアップロードする場合、これらのリクエストヘッダーを指定できます。

  • CopyObject — オブジェクトをコピーする場合、ソースオブジェクトとターゲットオブジェクトがあります。CopyObject オペレーションで SSE−KMS ヘッダーを渡す場合は、ターゲットオブジェクトにのみ適用されます。既存のオブジェクトをコピーする際は、コピー元オブジェクトが暗号化されているかどうかに関係なく、明示的にサーバー側の暗号化を要求しない限り、コピー先オブジェクトは暗号化されません。

  • POST オブジェクトPOST オペレーションを使用してオブジェクトをアップロードする場合は、リクエストヘッダーの代わりに、フォームフィールドで同じ情報を指定します。

  • CreateMultipartUpload — マルチパートアップロード API オペレーションを使用して大きいオブジェクトをアップロードする場合、これらのヘッダーを指定できます。これらのヘッダーは、Initiate Multipart Upload リクエストで指定します。

次の REST API オペレーションのレスポンスヘッダーは、オブジェクトがサーバー側の暗号化を使用して保存されているときに x-amz-server-side-encryption ヘッダーを返します。

重要
  • 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)

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

AWS KMS キー ID (x−amz−server−side−encryption−aws−kms−key−id)

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 キー」を参照してください。

S3 バケットキー (x−amz−server−side−encryption−aws−bucket−key−enabled)

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

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

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

aws s3api put-object --bucket DOC-EXAMPLE-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 のコストの削減」を参照してください。

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key example-object-key --server-side-encryption aws:kms --bucket-key-enabled --body filepath

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

aws s3api copy-object --bucket DOC-EXAMPLE-BUCKET --key example-object-key --body filepath --bucket DOC-EXAMPLE-BUCKET --key example-object-key --sse aws:kms --sse-kms-key-id example-key-id --body filepath

AWS SDK を使用する場合、サーバー側の暗号化に AWS KMS keys を使用するよう Amazon S3 にリクエストできます。このセクションでは、AWS SDK for Java と .NET を使用する例を示します。他の SDK については、「サンプルコードとライブラリ」を参照してください。

重要

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

Copy オペレーション

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

PUT オペレーション

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) の使用 を参照)。オプションで、対称暗号化 KMS キーを作成し、それをリクエストで指定できます。

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

カスタマーマネージドキーの作成の詳細については、「AWS Key Management Service デベロッパーガイド」の「AWS KMS API のプログラミング」を参照してください。

オブジェクトをアップロードするためのコード例については、以下のトピックを参照してください。これらの例を使用するには、コード例を更新し、前出のコード例に示されているように暗号化情報を提供する必要があります。

.NET

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

PutObjectRequest putRequest = new PutObjectRequest { BucketName = DOC-EXAMPLE-BUCKET, Key = keyName, // other properties. ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS };

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

PutObjectRequest putRequest1 = new PutObjectRequest { BucketName = DOC-EXAMPLE-BUCKET, Key = keyName, // other properties. ServerSideEncryptionMethod = ServerSideEncryptionMethod.AWSKMS, ServerSideEncryptionKeyManagementServiceKeyId = keyId };

カスタマーマネージドキーの作成の詳細については、「AWS Key Management Service デベロッパーガイド」の「AWS KMS API のプログラミング」を参照してください。

オブジェクトをアップロードするためのコード例については、以下のトピックを参照してください。これらの例を使用するには、コード例を更新し、前出のコード例に示されているように暗号化情報を提供する必要があります。

署名付き URL

Java

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

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

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

.NET

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

AWSConfigs.S3Config.UseSignatureVersion4 = true;

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