既存データのサーバー側の暗号化の更新 - Amazon Simple Storage Service

既存データのサーバー側の暗号化の更新

すべての Amazon S3 バケットにはデフォルトで暗号化が設定されており、オブジェクトは Amazon S3 マネージドキー (SSE-S3) を使用してサーバー側の暗号化により自動的に暗号化されます。このデフォルトの暗号化設定は Amazon S3 バケット内のすべての新しいオブジェクトに適用されます。

UpdateObjectEncryption API オペレーションを使用すると、汎用バケット内の既存の暗号化されたオブジェクトのサーバー側の暗号化タイプを、Amazon S3 マネージド暗号化 (SSE-S3) によるサーバー側の暗号化から AWS Key Management Service (AWS KMS) 暗号化キーによるサーバー側の暗号化 (SSE-KMS) にアトミックに更新できます。UpdateObjectEncryption API オペレーションでは、エンベロープ暗号化を使用して、新しく指定したサーバー側の暗号化タイプでオブジェクトの暗号化と復号に使用されたデータキーを再暗号化します。

Amazon S3 は、データ移動なしでこの暗号化タイプの更新を実行します。つまり、UpdateObjectEncryption オペレーションを使用すると、データはコピーされず、S3 Glacier Flexible Retrieval または S3 Glacier Deep Archive にアーカイブされたオブジェクトは復元されず、S3 Intelligent-Tiering ストレージクラスのオブジェクトは階層間で移動されません。さらに、UpdateObjectEncryption オペレーションでは、ストレージクラス、作成日、最終更新日、ETag、チェックサムプロパティなど、すべてのオブジェクトメタデータプロパティを保持します。

UpdateObjectEncryption オペレーションは、汎用バケットでサポートされているすべての S3 ストレージクラスでサポートされています。UpdateObjectEncryption オペレーションを使用して、次の操作を実行できます。

  • 暗号化されたオブジェクトを Amazon S3 マネージド暗号化 (SSE-S3) によるサーバー側の暗号化から AWS Key Management Service (AWS KMS) 暗号化キーによるサーバー側の暗号化 (SSE-KMS) に変更します。

  • オブジェクトレベルの SSE-KMS 暗号化オブジェクトを更新して S3 バケットキーを使用するようにすると、Amazon S3 から AWS KMS への AWS KMS リクエストトラフィックが減少します。詳細については、「Amazon S3 バケットキーを使用した SSE−KMS のコストの削減」を参照してください。

  • カスタムキーローテーション標準に準拠できるように、データの暗号化に使用されるカスタマーマネージド KMS キーを変更します。

注記

暗号化されていないソースオブジェクトや、AWS KMS keys による二層式サーバー側の暗号化 (DSSE-KMS)、またはお客様が用意した暗号化キー (SSE-C) のいずれかで暗号化されたソースオブジェクトは、このオペレーションではサポートされていません。

通常、UpdateObjectEncryption オペレーションは、S3 Glacier Flexible Retrieval や S3 Glacier Deep Archive などのオブジェクトのサイズやストレージクラスに関係なく、ミリ秒単位で完了します。このオペレーションは S3 Intelligent-Tiering のアクセスとしてカウントされないため、オブジェクトのサーバー側の暗号化タイプを変更しても、低頻度アクセス階層またはアーカイブインスタントアクセス階層のオブジェクトは高頻度アクセス階層に自動的に戻されません。

UpdateObjectEncryption は、Amazon S3 サーバーアクセスログと AWS CloudTrail データイベントに記録されるオブジェクトレベル (データプレーン) API オペレーションです。詳細については、「Amazon S3 のログ記録オプション」を参照してください。

UpdateObjectEncryption オペレーションの料金は、PUTCOPYPOSTLIST リクエスト (1,000 リクエストあたり) と同じで、基になるオブジェクトのストレージクラスに関係なく、常に S3 Standard ストレージクラスリクエストとして課金されます。詳細については、「Amazon S3 の料金」を参照してください。

制限と考慮事項

UpdateObjectEncryption オペレーションを使用する場合、以下の制限と考慮事項が適用されます。

  • UpdateObjectEncryption オペレーションでは、暗号化されていないオブジェクトや、AWS KMS keys による二層式サーバー側の暗号化 (DSSE-KMS) またはお客様が用意した暗号化キー (SSE-C) のいずれかで暗号化されたオブジェクトはサポートされません。さらに、リクエストされた新しい暗号化タイプの UpdateObjectEncryption リクエストとして SSE-S3 を指定することはできません。

  • UpdateObjectEncryption オペレーションを使用して、S3 バージョニングが有効になっているバケット内のオブジェクトを更新できます。特定のバージョンの暗号化タイプを更新するには、UpdateObjectEncryption リクエストでバージョン ID を指定する必要があります。バージョン ID を指定しない場合、UpdateObjectEncryption リクエストはオブジェクトの現在のバージョンに対して実行されます。S3 バージョニングの詳細については、S3 バージョニングによる複数のバージョンのオブジェクトの保持 を参照してください。

  • UpdateObjectEncryption オペレーションは、S3 Object Lock の保持モードまたはリーガルホールドが適用されているオブジェクトで失敗します。オブジェクトにガバナンスモードの保持期間またはリーガルホールドがある場合は、UpdateObjectEncryption リクエストを発行する前に、まずオブジェクトの Object Lock ステータスを削除する必要があります。Object Lock コンプライアンスモードの保持期間が適用されているオブジェクトでは、UpdateObjectEncryption オペレーションを使用できません。S3 オブジェクトロックの詳細については、「S3 Object Lock を使用したオブジェクトのロック」を参照してください。

  • ライブレプリケーションが有効になっているソースバケットに対する UpdateObjectEncryption リクエストでは、レプリケート先バケットでレプリカイベントが開始されません。ソースバケットとレプリケート先バケットの両方のオブジェクトの暗号化タイプを変更する場合は、ソースバケットとレプリケート先バケットのオブジェクトに対して個別の UpdateObjectEncryption リクエストを開始する必要があります。

  • デフォルトでは、カスタマー管理の KMS キーを指定するすべての UpdateObjectEncryption リクエストは、バケット所有者の AWS アカウントが所有する KMS キーに制限されます。AWS Organizations を使用している場合は、AWS サポート に連絡して、組織内の他のメンバーアカウントが所有する AWS KMS keys を使用する機能をリクエストできます。

  • S3 バッチレプリケーションを使用してデータセットをリージョン間でレプリケートし、オブジェクトのサーバー側の暗号化タイプを SSE-S3 から SSE-KMS に更新したことがある場合は、追加のアクセス許可が必要になる場合があります。ソースリージョンバケットでは、kms:decrypt アクセス許可が必要です。次に、レプリケート先リージョンのバケットの kms:decrypt および kms:encrypt アクセス許可が必要です。

  • UpdateObjectEncryption リクエストで完全な KMS キー ARN を指定する必要があります。エイリアス名またはエイリアス ARN を使用することはできません。完全な KMS キー ARN は、AWS KMS コンソールまたは AWS KMS DescribeKey API を使用して判断できます。

必要なアクセス許可

UpdateObjectEncryption オペレーションを実行するには、次のアクセス許可が必要です。

  • s3:PutObject

  • s3:UpdateObjectEncryption

  • kms:Encrypt

  • kms:Decrypt

  • kms:GenerateDataKey

  • kms:ReEncrypt*

AWS Organizations を使用している場合は、組織内の他の AWS アカウントのカスタマーマネージド KMS キーでこのオペレーションを使用するには、organizations:DescribeAccount アクセス許可が必要です。また、AWS サポート に連絡して、組織内の他のメンバーアカウントが所有する AWS KMS keys を使用する機能をリクエストする必要があります。

UpdateObjectEncryption オペレーションを実行するには、IAM ロールに次の AWS Identity and Access Management (IAM) ポリシーを追加します。このポリシーを使用するには、amzn-s3-demo-bucket を汎用バケットの名前に置き換え、もう一方の user input placeholders を独自の情報に置き換えます。

{ "Version": "2012-10-17", "Statement": [{ "Sid": "AllowUpdateObjectEncryption", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:UpdateObjectEncryption", "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:ReEncrypt*", "organizations:DescribeAccount" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*", "arn:aws:kms:us-east-1:111122223333:key/01234567-89ab-cdef-0123-456789abcdef" ] } ] }

暗号化を一括更新する

1 回のリクエストで複数の Amazon S3 オブジェクトのサーバー側の暗号化タイプを更新するには、S3 バッチオペレーションを使用できます。S3 バッチオペレーションに操作対象のオブジェクトのリストを提供するか、プレフィックス、ストレージクラス、作成日、暗号化タイプ、KMS キー ARN、S3 バケットキーのステータスなどのオブジェクトメタデータに基づいてオブジェクトリストを生成するようにバッチオペレーションに指示することもできます。S3 バッチオペレーションは、各 API オペレーションを呼び出して、指定されたオペレーションを実行します。1 つのバッチオペレーションジョブで、ペタバイト単位のデータを含むバケット内の数十億のオブジェクトに対して、指定されたオペレーションを実行できます。バッチオペレーションの詳細については、「バッチオペレーションでオブジェクトオペレーションを一括で実行する」を参照してください。

S3 バッチオペレーション機能は、進捗状況の追跡、通知の送信、すべてのアクションの詳細な完了レポートの保存を行い、フルマネージドの監査可能なサーバーレスエクスペリエンスを提供します。S3 バッチオペレーションは、Amazon S3 コンソール、AWS Command Line Interface (AWS CLI)、AWS SDK、または Amazon S3 REST API を通じて使用できます。詳細については、「オブジェクトの暗号化を更新する」を参照してください。

オブジェクトの暗号化の更新

オブジェクトのサーバー側の暗号化タイプは、AWS Command Line Interface (AWS CLI) AWS SDK または Amazon S3 REST API を使用して更新できます。

オブジェクトの暗号化を更新する

次のコマンドを実行するには、AWS CLI をインストールして設定する必要があります。AWS CLI をまだインストールしていない場合は、「AWS Command Line Interface ユーザーガイド」の「AWS CLI の最新バージョンのインストールまたは更新」を参照してください。

別の方法として、AWS CloudShell を使用してコンソールから AWS CLI コマンドを実行することもできます。AWS CloudShell は、AWS マネジメントコンソールから直接起動できる、ブラウザベースの事前認証済みシェルです。詳細については、「AWS CloudShell ユーザーガイド」の「CloudShell とは」と「AWS CloudShell の使用開始」を参照してください。

AWS CLI を使用してオブジェクトの暗号化を更新するには

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

  1. 次のコマンドを使用して、汎用バケット (amzn-s3-demo-bucket など) 内の 1 つのオブジェクト (index.html) の暗号化を更新し、S3 バケットキーで SSE-KMS を使用します。

    aws s3api update-object-encryption \ --bucket amzn-s3-demo-bucket \ --key index.html \ --object-encryption '{"SSEKMS": { "KMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/f12a345a-678e-9bbb-1025-62e317037583", "BucketKeyEnabled": true }}'
    注記

    完全な AWS KMS key Amazon リソースネーム (ARN) を指定する必要があります。KMS キー ID と KMS キーエイリアスはサポートされていません。

  2. head-object コマンドを実行して、オブジェクトの更新された暗号化タイプを表示します。

    aws s3api head-object --bucket amzn-s3-demo-bucket --key index.html

オブジェクトの暗号化を更新するには、REST リクエストを送信できます。詳細については、 を参照してください。UpdateObjectEncryption

AWS SDK を使用して、オブジェクトの暗号化を更新できます。詳細については、「サポートされる SDK のリスト」を参照してください。

Java

次の AWS SDK for Java 2.x の例では、汎用バケット内のオブジェクトの暗号化タイプを SSE-KMS に更新します。

public void updateObjectEncryption(String bucketName, String objectKey, String versionId, String kmsKeyArn, boolean bucketKeyEnabled) { // Create the target object encryption type. ObjectEncryption objectEncryption = ObjectEncryption.builder() .ssekms(SSEKMSEncryption.builder() .kmsKeyArn(kmsKeyArn) .bucketKeyEnabled(bucketKeyEnabled) .build()) .build(); // Create the UpdateObjectEncryption request. UpdateObjectEncryptionRequest request = UpdateObjectEncryptionRequest.builder() .bucket(bucketName) .key(objectKey) .versionId(versionId) .objectEncryption(objectEncryption) .build(); // Update the object encryption. try { getS3Client().updateObjectEncryption(request); logger.info("Object encryption updated to SSE-KMS for {} in bucket {}", objectKey, bucketName); } catch (S3Exception e) { logger.error("Failed to update to object encryption: {} - Error code: {}", e.awsErrorDetails().errorMessage(), e.awsErrorDetails().errorCode()); throw e; } }
Python

次の AWS SDK for Python (Boto3) の例は、汎用バケット内のオブジェクトの暗号化タイプを SSE-KMS に更新する方法を示しています。

response = client.update_object_encryption( Bucket='string', Key='string', VersionId='string', ObjectEncryption={ 'SSEKMS': { 'KMSKeyArn': 'string', 'BucketKeyEnabled': True|False } } )