Amazon S3 暗号化クライアントの移行 - AWS SDK for .NET

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon S3 暗号化クライアントの移行

このトピックでは、アプリケーションで使用している Amazon Simple Storage Service (Amazon S3) 暗号化クライアントをバージョン 1 (V1) からバージョン 2 (V2) に移行し、移行プロセス全体でアプリケーションの可用性を確保する方法について説明します。

V2 クライアントで暗号化されたオブジェクトは、V1 クライアントでは復号化できません。すべてのオブジェクトを一度に再暗号化する必要をなくして、新しいクライアントへの移行を容易にするために、「V1 移行用の」クライアントが提供されています。このクライアントは、V1 と V2 のどちらで暗号化されたオブジェクトでも復号化できますが、オブジェクトを暗号化する際には V1 互換形式のみを使用します。V2 クライアントは、(V1 オブジェクトのサポートが有効になっていれば) V1 と V2 のどちらで暗号化されたオブジェクトでも復号化できますが、オブジェクトの暗号化には V2 互換形式のみを使用します。

移行の概要

この移行は 3 つのフェーズを通じて行われます。各フェーズについては、後ほど詳しく説明します。次のフェーズを開始する前に、共有オブジェクトを使用するすべてのクライアントで各フェーズを完了させる必要があります。

  1. 既存のクライアントを V1 移行用クライアントに更新して、新しい形式を読み取るようにします。最初にアプリケーションを更新して、V1 クライアントではなく V1 移行用クライアントに依存するようにします。V1 移行用クライアントを使用すると、新しい V2 クライアントで記述されたオブジェクトと V1 互換形式で記述されたオブジェクトを既存のコードで復号化できます。

    注記

    V1 移行用クライアントは、移行のみを目的として提供されています。V1 移行用クライアントに移行した後は、V2 クライアントへのアップグレードに進んでください。

  2. V1 移行用クライアントを V2 クライアントに移行して、新しい形式を書き込むようにします。次に、アプリケーション内のすべての V1 移行用クライアントを V2 クライアントに置き換え、セキュリティプロファイルを V2AndLegacy に設定します。V2 クライアントでこのセキュリティプロファイルを設定すると、クライアントは V1 互換形式で暗号化されたオブジェクトを復号化できるようになります。

  3. V2 クライアントを更新して V1 形式を読み取らないようにします。最後に、すべてのクライアントの V2 への移行が完了し、すべてのオブジェクトが V2 互換フォーマットで暗号化または再暗号化されたら、V2 セキュリティプロファイルを V2AndLegacy の代わりに V2 に設定します。こうすることで、V1 互換形式のオブジェクトが復号化されなくなります。

既存のクライアントを V1 移行用クライアントに更新して、新しい形式を読み取るようにする

V2 暗号化クライアントは、古いバージョンのクライアントではサポートされていない暗号化アルゴリズムを使用します。移行の最初のステップは、V1 復号化クライアントを更新して、新しい形式を読み取れるようにすることです。

V1 移行用クライアントを使用すると、V1 と V2 のどちらで暗号化されたオブジェクトでもアプリケーションで復号化できるようになります。このクライアントは Amazon.Extensions.S3.Encryption NuGet パッケージの一部です。V1 移行用クライアントを使用するには、各アプリケーションで次の手順を実行します。

  1. Amazon.Extensions.S3.Encryption パッケージへの新しい依存関係を構築します。プロジェクトが AWSSDK.S3 または AWSSDKKeyManagementServiceパッケージに直接依存している場合は、これらの依存関係を更新するか、更新したバージョンがこの新しいパッケージで取り込まれるように削除する必要があります。

  2. 該当する using ステートメントを、以下のように Amazon.S3.Encryption から Amazon.Extensions.S3.Encryption に変更します。

    // using Amazon.S3.Encryption; using Amazon.Extensions.S3.Encryption;
  3. アプリケーションを再構築して再デプロイします。

V1 移行用クライアントは V1 クライアントと完全に API 互換であるため、他のコード変更は必要ありません。

V1 移行用クライアントを V2 クライアントに移行して、新しい形式を書き込むようにする

V2 クライアントは Amazon.Extensions.S3.Encryption NuGet パッケージの一部です。このクライアントを使用すると、V1 と V2 のどちらで暗号化されたオブジェクトでもアプリケーションで復号化できるようになりますが (そのように設定された場合)、オブジェクトの暗号化には V2 互換形式のみを使用します。

既存のクライアントを更新して新しい暗号化形式を読み取るようにした後で、アプリケーションが V2 暗号化および復号化クライアントを使用するように安全に更新できます。V2 クライアントを使用するには、各アプリケーションで次の手順を実行します。

  1. EncryptionMaterialsEncryptionMaterialsV2 に変更します。

    1. KMS を使用する場合:

      1. KMS キー ID を指定します。

      2. 使用している暗号化方法、すなわち KmsType.KmsContext を宣言します。

      3. このデータキーに関連付ける暗号化コンテキストを KMS に対して指定します。空の辞書を送信することはできますが (Amazon 暗号化コンテキストは引き続きマージされます)、追加のコンテキストを指定することをお勧めします。

    2. ユーザー指定のキーラップ方式を使用する場合 (対称暗号化または非対称暗号化):

      1. 暗号化マテリアルを含む AES または RSA インスタンスを指定します。

      2. 使用する暗号化アルゴリズム、すなわち SymmetricAlgorithmType.AesGcm または AsymmetricAlgorithmType.RsaOaepSha1 を宣言します。

  2. AmazonS3CryptoConfigurationAmazonS3CryptoConfigurationV2 に変更し、SecurityProfile プロパティを SecurityProfile.V2AndLegacy に設定します。

  3. AmazonS3EncryptionClientAmazonS3EncryptionClientV2 に変更します。このクライアントは、前のステップで新たに変換された AmazonS3CryptoConfigurationV2 および EncryptionMaterialsV2 オブジェクトを受け取ります。

例: KMS から KMS+コンテキスト

移行前

using System.Security.Cryptography; using Amazon.S3.Encryption; var encryptionMaterial = new EncryptionMaterials("1234abcd-12ab-34cd-56ef-1234567890ab"); var configuration = new AmazonS3CryptoConfiguration() { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);

移行後

using System.Security.Cryptography; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV2("1234abcd-12ab-34cd-56ef-1234567890ab", KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);

例: 対称アルゴリズム (AES-CBC から AES-GCM キーラップ)

StorageModeObjectMetadata または InstructionFile のいずれかになります。

移行前

using System.Security.Cryptography; using Amazon.S3.Encryption; var symmetricAlgorithm = Aes.Create(); var encryptionMaterial = new EncryptionMaterials(symmetricAlgorithm); var configuration = new AmazonS3CryptoConfiguration() { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);

移行後

using System.Security.Cryptography; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; var symmetricAlgorithm = Aes.Create(); var encryptionMaterial = new EncryptionMaterialsV2(symmetricAlgorithm, SymmetricAlgorithmType.AesGcm); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);
注記

AES-GCM で復号化する場合は、復号化されたデータの使用を開始する前に、オブジェクト全体を最後まで読み取ってください。これは、オブジェクトが暗号化されていた時点から変更されていないことを確認するためのステップです。

例: 非対称アルゴリズム (RSA から RSA-OAEP-SHA1 キーラップ)

StorageModeObjectMetadata または InstructionFile のいずれかになります。

移行前

using System.Security.Cryptography; using Amazon.S3.Encryption; var asymmetricAlgorithm = RSA.Create(); var encryptionMaterial = new EncryptionMaterials(asymmetricAlgorithm); var configuration = new AmazonS3CryptoConfiguration() { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClient(configuration, encryptionMaterial);

移行後

using System.Security.Cryptography; using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; var asymmetricAlgorithm = RSA.Create(); var encryptionMaterial = new EncryptionMaterialsV2(asymmetricAlgorithm, AsymmetricAlgorithmType.RsaOaepSha1); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy) { StorageMode = CryptoStorageMode.ObjectMetadata }; var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial);

V2 クライアントを更新して V1 形式を読み取らないようにする

最終的に、すべてのオブジェクトが V2 クライアントを使用して暗号化または再暗号化されます。この変換が完了した後、次のスニペットに示すように SecurityProfile プロパティを SecurityProfile.V2 として、V2 クライアントの V1 互換性を無効にできます。

//var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2AndLegacy); var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2);