のバージョン 4 (V4) AWS SDK for .NET がリリースされました。
SDK の新しいバージョンの使用を開始するには、「AWS SDK for .NET (V4) デベロッパーガイド」、特に「バージョン 4 への移行」に関するトピックを参照してください。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon S3 暗号化クライアントの移行 (V2 から V4)
注記
V1 を使用していて V4 に移行する場合は、まず V2 に移行する必要があります。「Amazon S3 暗号化クライアントの移行 (V1 から V2)」を参照してください。
このトピックでは、Amazon Simple Storage Service (Amazon S3) 暗号化クライアントのバージョン 2 (V2) からバージョン 4 (V4) にアプリケーションを移行し、移行プロセス全体でアプリケーションの可用性を確保する方法について説明します。V4 は、AES-GCM をコンテンツ暗号化のキーコミットメントとして使用し、コミットメントポリシーを導入して、キー置換攻撃に対するセキュリティを強化します。
V4 クライアントは、Amazon.Extensions.S3.Encryption
重要
重大な変更: REQUIRE_ENCRYPT_REQUIRE_DECRYPTポリシーで設定された V4 クライアントは、V1 または V2 クライアントで暗号化されたオブジェクトを復号できません。キーコミットメントを使用して VV4-encrypted V2 クライアントのみです。REQUIRE_ENCRYPT_REQUIRE_DECRYPT ポリシーに移行する前に、キーコミットメントが有効になっている V4 クライアントを使用して既存のデータをすべて再暗号化する必要があります。
V4 の概念について
V4 は、AES-GCM をコンテンツ暗号化のキーコミットメントとして使用し、暗号化されたデータの保護を強化する主要なセキュリティ概念を導入します。
コミットメントポリシー
コミットメントポリシーは、暗号化および復号オペレーション中に暗号化クライアントがキーコミットメントを処理する方法を制御します。V4 は 3 つのコミットメントポリシーをサポートしています。
FORBID_ENCRYPT_ALLOW_DECRYPT-
暗号化: コミットメントなし
復号: コミットされていないオブジェクトを許可する
セキュリティ: コミットメントを強制せず、改ざんを許可する場合があります
互換性: すべての V2 および V4 実装は、このポリシーで暗号化されたオブジェクトを読み取ることができます
REQUIRE_ENCRYPT_ALLOW_DECRYPT-
暗号化: キーコミットメントあり
復号: コミットするオブジェクトとコミットしないオブジェクトの両方を許可します
セキュリティ: 新しいオブジェクトはキー置換攻撃から保護され、古いオブジェクトは引き続き読み取り可能
互換性: V4 のみがこのポリシーをサポート
REQUIRE_ENCRYPT_REQUIRE_DECRYPT(V4 のデフォルト)-
暗号化: キーコミットメントあり
復号: オブジェクトのみをコミットする
セキュリティ: セキュリティを最大化するための完全コミットメントの適用
互換性: V4 のみがこのポリシーをサポート
キーコミットメントを持つ AES GCM
V4 は、AES-GCM をコンテンツ暗号化のキーコミットメントとして使用し、セキュリティを強化します。
-
改ざん保護: 暗号化されたデータにキーをバインドすることで、キー置換攻撃から保護します。
-
バージョンの互換性: キーコミットメントで暗号化されたオブジェクトは、V4 クライアント以降のバージョンでのみ復号できます。
警告
本番環境でキーコミットメント暗号化を有効にする前に、オブジェクトを復号する必要があるすべてのアプリケーションが、V2 クライアントが非推奨になったときに V4 以降にアップグレードされていることを確認してください。 V2
既存のクライアントを更新して V4 形式を読み取る
V4 暗号化クライアントは、古いバージョンのクライアントがサポートしていない暗号化アルゴリズムを使用します。移行の最初のステップは、新しい V4 形式を読み取れるように V2 クライアントを更新することです。 V4
NuGet パッケージの依存関係を更新する
V4 サポートを含む最新バージョンの Amazon.Extensions.S3.Encryption
-
最新の Amazon.Extensions.S3.Encryption
パッケージに更新します。プロジェクトが AWSSDK.S3 または AWSSDK.KeyManagementService パッケージに直接依存している場合は、これらの依存関係を更新または削除して、更新されたバージョンがこの新しいパッケージに取り込まれるようにする必要があります。 -
usingステートメントが正しい名前空間を参照していることを確認します。using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; -
アプリケーションを再構築して再デプロイします。
既存の V2 クライアントは、更新されたパッケージで引き続き動作し、(使用されるコミットメントポリシーに応じて) V4 クライアントによって暗号化されたオブジェクトを復号できます。
アプリケーションの構築とデプロイ
NuGet パッケージの依存関係を更新した後:
-
すべての依存関係が正しく解決されるようにアプリケーションを構築します。
-
開発環境でアプリケーションをテストして、既存の機能が引き続き機能することを確認します。
-
更新されたアプリケーションを本番環境にデプロイします。
この更新により、既存の V2 クライアントは V4 クライアントによって暗号化されるオブジェクトを復号し、移行プロセス中の互換性を確保できます。
V4 クライアントへの移行
新しい暗号化形式を読み取るように既存のクライアントを更新した後、V4 暗号化および復号クライアントを使用するようにアプリケーションを安全に更新できます。V4 クライアントは、既存の暗号化されたオブジェクトとの互換性を維持しながら、キーコミットメントを通じてセキュリティを強化します。
4-Step移行プロセス
V2 から V4 への移行は、互換性とセキュリティを確保するための構造化された 4 ステップのプロセスに従います。各ステップは、次のステップに進む前にすべてのアプリケーションにデプロイする必要がある特定の設定を表します。
-
ステップ 0: V2 クライアント (開始点) - 既存の V2 実装
-
ステップ 1: V2 互換の V4 V2 - V2 互換の暗号化動作を維持しながら V4 クライアントに移行する V2-compatible
-
ステップ 2: キーコミットメント書き込み付き V4 - レガシーオブジェクトの復号化を許可しながら、キーコミットメントによる暗号化を開始する
-
ステップ 3: フルエンフォースメントを使用する V4 - 暗号化と復号の両方にキーコミットメントが必要
ステップ 0: V2 クライアント (開始ポイント)
これは、既存の V2 クライアント設定を表します。このステップでは、移行前の開始状態を示します。
using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 0: V2 Client - Starting configuration var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV2(kmsKeyId, KmsType.KmsContext, encryptionContext); #pragma warning disable 0618 var configuration = new AmazonS3CryptoConfigurationV2(SecurityProfile.V2); #pragma warning enable 0618 var encryptionClient = new AmazonS3EncryptionClientV2(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });
ステップ 1: V2 互換の V4 V2
V2 と同じ動作を維持しながらV2V4 クライアントに移行します。このステップでは、FORBID_ENCRYPT_ALLOW_DECRYPTポリシーを使用してコミットメントなしで暗号化し、すべてのオブジェクトの復号化を許可します。
using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 1: V4 Client with V2 compatibility var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT, ContentEncryptionAlgorithm.AesGcm); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });
動作: コミットメントなしで暗号化し、コミットしているオブジェクトとコミットしていないオブジェクトの両方を復号できます。V2 の動作と同じです。
ステップ 2: キーコミットメント書き込みを含む V4
復号の下位互換性を維持しながら、キーコミットメントによる暗号化を開始します。このステップでは、 REQUIRE_ENCRYPT_ALLOW_DECRYPTポリシーを使用します。
警告
ステップ 2 をデプロイする前に、キーコミットメントの暗号化を処理するために、すべてのリーダーがステップ 1 以降に更新されていることを確認します。
using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 2: V4 Client with key commitment writes var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT, ContentEncryptionAlgorithm.AesGcmWithCommitment); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });
動作: コミットメントで暗号化し、コミットしているオブジェクトとコミットしていないオブジェクトの両方を復号できます。新しいオブジェクトは、キー置換攻撃から保護されます。
ステップ 3: フルエンフォースメントを使用する V4
暗号化と復号の両方にキーコミットメントが必要です。このステップでは、セキュリティを最大化するために REQUIRE_ENCRYPT_REQUIRE_DECRYPT ポリシーを使用します。
警告
ステップ 3 をデプロイする前に、システム内のすべてのオブジェクトがキーコミットメントで再暗号化されていることを確認します (ステップ 2)。このステップでは、コミットメントなしで暗号化されたオブジェクトを復号化できません。
using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; using Amazon.S3.Model; // Step 3: V4 Client with full key commitment enforcement var encryptionContext = new Dictionary<string, string>(); var encryptionMaterial = new EncryptionMaterialsV4(kmsKeyId, KmsType.KmsContext, encryptionContext); var configuration = new AmazonS3CryptoConfigurationV4( SecurityProfile.V4, CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT, ContentEncryptionAlgorithm.AesGcmWithCommitment); var encryptionClient = new AmazonS3EncryptionClientV4(configuration, encryptionMaterial); // Use the client for PutObject and GetObject operations await encryptionClient.PutObjectAsync(new PutObjectRequest { BucketName = bucket, Key = objectKey, ContentBody = content });
動作: コミットメントで暗号化し、コミットメントで暗号化されたオブジェクトのみを復号します。キー置換攻撃に対する最大セキュリティ。
その他の設定例
このセクションでは、移行中にさまざまなオプションを使用して V4 クライアントを設定するための追加の例を示します。
レガシーサポートの有効化
V4 クライアントが V1 および V2 クライアントによって暗号化されたオブジェクトを読み取れるようにするには、レガシー復号を許可するコミットメントポリシーでクライアントを設定します。
using Amazon.Extensions.S3.Encryption; using Amazon.Extensions.S3.Encryption.Primitives; // Configure V4 client to read V1/V2 objects var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.ObjectMetadata }; // This configuration allows: // - Encryption: With commitment (secure) // - Decryption: Both V2 (non-committing) and V4 (committing) objects
移行中に、古いクライアントによって暗号化されたオブジェクトを復号し、新しいオブジェクトがセキュリティを強化して暗号化されるようにする必要がある場合は、この設定を使用します。
ストレージ方法の設定
V4 は、暗号化メタデータの 2 つのストレージ方法をサポートしています。ユースケースに最適な方法を選択します。
オブジェクトメタデータ (デフォルト)
var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.ObjectMetadata }; // Encryption metadata is stored in S3 object metadata
指示ファイル
var configuration = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT) { StorageMode = CryptoStorageMode.InstructionFile }; // Encryption metadata is stored in a separate S3 object (instruction file)
他の目的でオブジェクトメタデータを保持InstructionFileする必要がある場合や、メタデータサイズに制限があるオブジェクトを操作する場合は、 を使用します。
コミットメントポリシーの設定
セキュリティ要件と移行フェーズに基づいて、適切なコミットメントポリシーを選択します。
移行フェーズ (V2 互換性)
// For migration: encrypt without commitment, allow all decryption var migrationConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT);
移行フェーズ (推奨)
// For transition: encrypt with commitment, allow legacy decryption var transitionConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT);
完全なセキュリティフェーズ
// For maximum security: require commitment for both encryption and decryption var secureConfig = new AmazonS3CryptoConfigurationV4(CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT);
最初の移行FORBID_ENCRYPT_ALLOW_DECRYPT中に から開始し、移行フェーズREQUIRE_ENCRYPT_ALLOW_DECRYPTのために に移動し、最後にすべてのクライアントがアップグレードされ、すべてのオブジェクトがコミットメントで再暗号化されたREQUIRE_ENCRYPT_REQUIRE_DECRYPTときに を使用します。