

のバージョン 4 (V4) AWS SDK for .NET がリリースされました。

重要な変更とアプリケーションの移行については、[「移行トピック](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)」を参照してください。

 [https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html)

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

# S3 暗号化クライアントの移行 (V2 から V4)
<a name="s3-encryption-migration-v2-v4"></a>

**注記**  
V1 を使用していて V4 に移行する場合は、まず V2 に移行する必要があります。「[S3 暗号化クライアントの移行 (V1 から V2)](s3-encryption-migration-v1-v2.md)」を参照してください。

このトピックでは、Amazon Simple Storage Service (S3) 暗号化クライアントのバージョン 2 (V2) からバージョン 4 (V4) にアプリケーションを移行し、移行プロセス全体でアプリケーションの可用性を確保する方法について説明します。V4 は、AES-GCM をコンテンツ暗号化のキーコミットメントとして使用し、コミットメントポリシーを導入して、キー置換攻撃に対するセキュリティを強化します。

V4 クライアントは、[Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet パッケージで使用できます。

**重要**  
**重大な変更: **`RequireEncryptRequireDecrypt`ポリシーで設定された V4 クライアントはV1 または V2 クライアントで暗号化されたオブジェクトを復号できません。キーコミットメントを使用して VV4-encrypted V2 クライアントのみです。`RequireEncryptRequireDecrypt` ポリシーに移行する前に、キーコミットメントが有効になっている V4 クライアントを使用して既存のデータをすべて再暗号化する必要があります。

## V4 の概念について
<a name="s3-encryption-migration-v2-v4-concepts"></a>

V4 は、AES-GCM をコンテンツ暗号化のキーコミットメントとして使用し、暗号化されたデータの保護を強化する主要なセキュリティ概念を紹介します。

### コミットメントポリシー
<a name="s3-encryption-migration-v2-v4-concepts-policy"></a>

コミットメントポリシーは、暗号化および復号オペレーション中に暗号化クライアントがキーコミットメントを処理する方法を制御します。V4 は 3 つのコミットメントポリシーをサポートしています。

`ForbidEncryptAllowDecrypt`  
*暗号化:* コミットメントなし  
*復号:* コミットされていないオブジェクトを許可する  
*セキュリティ:* コミットメントを強制せず、改ざんを許可する場合があります  
*互換性:* すべての V2 および V4 実装は、このポリシーで暗号化されたオブジェクトを読み取ることができます

`RequireEncryptAllowDecrypt`  
*暗号化:* キーコミットメントあり  
*復号:* コミットするオブジェクトとコミットしないオブジェクトの両方を許可する  
*セキュリティ:* 新しいオブジェクトはキー置換攻撃から保護され、古いオブジェクトは引き続き読み取り可能  
*互換性:* V4 のみがこのポリシーをサポート

`RequireEncryptRequireDecrypt`(V4 のデフォルト)  
*暗号化:* キーコミットメントあり  
*復号:* オブジェクトのみをコミットする  
*セキュリティ:* セキュリティを最大化するための完全コミットメントの適用  
*互換性:* V4 のみがこのポリシーをサポート

### キーコミットメントを持つ AES GCM
<a name="s3-encryption-migration-v2-v4-concepts-aesgcm"></a>

V4 は、AES-GCM をコンテンツ暗号化のキーコミットメントとして使用し、セキュリティを強化します。
+ *改ざん保護:* 暗号化されたデータにキーを暗号化バインドすることで、キー置換攻撃から保護します。
+ *バージョンの互換性: *キーコミットメントで暗号化されたオブジェクトは、V4 クライアント以降のバージョンでのみ復号できます。

**警告**  
本番環境でキーコミットメント暗号化を有効にする前に、オブジェクトを復号する必要があるすべてのアプリケーションが、V2 クライアントが非推奨になったときに V4 以降にアップグレードされていることを確認してください。 V2 

## 既存のクライアントを更新して V4 形式を読み取る
<a name="s3-encryption-migration-v2-v4-update-clients"></a>

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

### NuGet パッケージの依存関係を更新する
<a name="s3-encryption-migration-v2-v4-update-nuget"></a>

V4 サポートを含む最新バージョンの [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet パッケージを使用するようにアプリケーションを更新します。各アプリケーションで次の手順を実行します。

1. 最新の [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) パッケージに更新します。プロジェクトが **AWSSDK.S3** または **AWSSDK.KeyManagementService** パッケージに直接依存している場合は、これらの依存関係を更新または削除して、更新されたバージョンがこの新しいパッケージに取り込まれるようにする必要があります。

1. `using` ステートメントが正しい名前空間を参照していることを確認します。

   ```
   using Amazon.Extensions.S3.Encryption;
   using Amazon.Extensions.S3.Encryption.Primitives;
   ```

1. アプリケーションを再構築して再デプロイします。

既存の V2 クライアントは、更新されたパッケージで引き続き動作し、（使用されるコミットメントポリシーに応じて) V4 クライアントによって暗号化されたオブジェクトを復号できます。

### アプリケーションの構築とデプロイ
<a name="s3-encryption-migration-v2-v4-build-deploy"></a>

NuGet パッケージの依存関係を更新した後:

1. すべての依存関係が正しく解決されるようにアプリケーションを構築します。

1. 開発環境でアプリケーションをテストして、既存の機能が引き続き機能することを確認します。

1. 更新されたアプリケーションを本番環境にデプロイします。

この更新により、既存の V2 クライアントは V4 クライアントによって暗号化されるオブジェクトを復号できるため、移行プロセス中の互換性が確保されます。

## V4 クライアントへの移行
<a name="s3-encryption-migration-v2-v4-migrate"></a>

新しい暗号化形式を読み取るように既存のクライアントを更新した後、V4 暗号化および復号クライアントを使用するようにアプリケーションを安全に更新できます。V4 クライアントは、既存の暗号化されたオブジェクトとの互換性を維持しながら、キーコミットメントを通じてセキュリティを強化します。

### 4-Step移行プロセス
<a name="s3-encryption-migration-v2-v4-migrate-steps"></a>

V2 から V4 への移行は、互換性とセキュリティを確保するための構造化された 4 ステップのプロセスに従います。各ステップは、次のステップに進む前にすべてのアプリケーションにデプロイする必要がある特定の設定を表します。

1. **ステップ 0: V2 クライアント (開始点)** - 既存の V2 実装

1. **ステップ 1: V2 互換の V4 - V2 ** V2-compatible 互換の暗号化動作を維持しながら V4 クライアントに移行する

1. **ステップ 2: キーコミットメント書き込み付き V4 ** - レガシーオブジェクトの復号化を許可しながら、キーコミットメントによる暗号化を開始する

1. **ステップ 3: フルエンフォースメントを使用する V4 ** - 暗号化と復号の両方にキーコミットメントが必要です

### ステップ 0: V2 クライアント (開始点)
<a name="s3-encryption-migration-v2-v4-step0"></a>

これは、既存の 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
<a name="s3-encryption-migration-v2-v4-step1"></a>

V2 と同じ動作を維持しながらV2V4 クライアントに移行します。このステップでは、`ForbidEncryptAllowDecrypt`ポリシーを使用してコミットメントなしで暗号化し、すべてのオブジェクトの復号化を許可します。

```
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.ForbidEncryptAllowDecrypt, 
    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
<a name="s3-encryption-migration-v2-v4-step2"></a>

復号の下位互換性を維持しながら、キーコミットメントによる暗号化を開始します。このステップでは、 `RequireEncryptAllowDecrypt`ポリシーを使用します。

**警告**  
ステップ 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.RequireEncryptAllowDecrypt, 
    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
<a name="s3-encryption-migration-v2-v4-step3"></a>

暗号化と復号の両方にキーコミットメントが必要です。このステップでは、セキュリティを最大化するために `RequireEncryptRequireDecrypt`ポリシーを使用します。

**警告**  
ステップ 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.RequireEncryptRequireDecrypt, 
    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
});
```

**動作:** コミットメントで暗号化し、コミットメントで暗号化されたオブジェクトのみを復号します。キー置換攻撃に対する最大セキュリティ。

## その他の設定例
<a name="s3-encryption-migration-v2-v4-examples"></a>

このセクションでは、移行中にさまざまなオプションを使用して V4 クライアントを設定するための追加の例を示します。

### レガシーサポートの有効化
<a name="s3-encryption-migration-v2-v4-examples-legacy"></a>

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(SecurityProfile.V4AndLegacy, CommitmentPolicy.RequireEncryptAllowDecrypt)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};

// This configuration allows:
// - Encryption: With commitment (secure)
// - Decryption: Both V2 (non-committing) and V4 (committing) objects
```

新しいオブジェクトのセキュリティを強化して暗号化しながら、古いクライアントによって暗号化されたオブジェクトを復号する必要がある場合は、移行時にこの設定を使用します。

### ストレージ方法の設定
<a name="s3-encryption-migration-v2-v4-examples-storage"></a>

V4 は、暗号化メタデータの 2 つのストレージ方法をサポートしています。ユースケースに最適な方法を選択します。

**オブジェクトメタデータ (デフォルト)**

```
var configuration = new AmazonS3CryptoConfigurationV4(SecurityProfile.V4, CommitmentPolicy.RequireEncryptAllowDecrypt)
{
    StorageMode = CryptoStorageMode.ObjectMetadata
};
// Encryption metadata is stored in S3 object metadata
```

**指示ファイル**

```
var configuration = new AmazonS3CryptoConfigurationV4(SecurityProfile.V4, CommitmentPolicy.RequireEncryptAllowDecrypt)
{
    StorageMode = CryptoStorageMode.InstructionFile
};
// Encryption metadata is stored in a separate S3 object (instruction file)
```

他の目的でオブジェクトメタデータを保持`InstructionFile`する必要がある場合や、メタデータサイズに制限があるオブジェクトを操作する場合は、 を使用します。

### コミットメントポリシーの設定
<a name="s3-encryption-migration-v2-v4-examples-policy"></a>

セキュリティ要件と移行フェーズに基づいて、適切なコミットメントポリシーを選択します。

**移行フェーズ (V2 互換性)**

```
// For migration: encrypt without commitment, allow all decryption
var migrationConfig = new AmazonS3CryptoConfigurationV4(SecurityProfile.V4, CommitmentPolicy.ForbidEncryptAllowDecrypt);
```

**移行フェーズ (推奨)**

```
// For transition: encrypt with commitment, allow legacy decryption
var transitionConfig = new AmazonS3CryptoConfigurationV4(SecurityProfile.V4, CommitmentPolicy.RequireEncryptAllowDecrypt);
```

**完全なセキュリティフェーズ**

```
// For maximum security: require commitment for both encryption and decryption
var secureConfig = new AmazonS3CryptoConfigurationV4(SecurityProfile.V4, CommitmentPolicy.RequireEncryptRequireDecrypt);
```

最初の移行`ForbidEncryptAllowDecrypt`中に から開始し、移行フェーズ`RequireEncryptAllowDecrypt`のために に移動し、最後にすべてのクライアントがアップグレードされ、すべてのオブジェクトがコミットメントで再暗号化された`RequireEncryptRequireDecrypt`ときに を使用します。