

のバージョン 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)

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

# この AWS 製品またはサービスのセキュリティ
<a name="security"></a>

クラウドセキュリティは Amazon Web Services (AWS) の最優先事項です。 AWS のお客様は、セキュリティを非常に重視する組織の要件を満たせるように構築されたデータセンターとネットワークアーキテクチャーから利点を得ます。セキュリティは、 AWS とお客様の間の責任共有です。[責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)では、これをクラウドのセキュリティおよびクラウド内のセキュリティとして説明しています。

**クラウドのセキュリティ** – AWS クラウドで提供されるすべてのサービスを実行するインフラストラクチャ AWS を保護し、安全に使用できるサービスを提供します。における当社のセキュリティ責任は最優先事項であり AWS、当社のセキュリティの有効性は、[AWS コンプライアンスプログラムの一環としてサードパーティーの監査者によって定期的にテストおよび検証されます](https://aws.amazon.com/compliance/programs/)。

**クラウド内のセキュリティ** – お客様の責任は、使用している AWS サービス、データの機密性、組織の要件、適用される法律や規制などのその他の要因によって決まります。

この AWS 製品またはサービスは、サポートする特定の Amazon Web Services (AWS) サービスを通じて[責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)に従います。 AWS サービスセキュリティ情報については、[AWS 「サービスセキュリティドキュメント」ページ](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)と[AWS 、コンプライアンスプログラムによる AWS コンプライアンスの取り組みの対象となるサービス](https://aws.amazon.com/compliance/services-in-scope/)を参照してください。

**Topics**
+ [データ保護](data-protection.md)
+ [Identity and Access Management](security-iam.md)
+ [コンプライアンス検証](compliance-validation.md)
+ [耐障害性](disaster-recovery-resiliency.md)
+ [インフラストラクチャセキュリティ](infrastructure-security.md)
+ [最小 TLS バージョンの適用](enforcing-tls.md)
+ [S3 暗号化クライアントの移行 (V1 から V2)](s3-encryption-migration-v1-v2.md)
+ [S3 暗号化クライアントの移行 (V2 から V4)](s3-encryption-migration-v2-v4.md)

# この AWS 製品またはサービスのデータ保護
<a name="data-protection"></a>

責任 AWS [共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)、この AWS 製品またはサービスのデータ保護に適用されます。このモデルで説明されているように、 AWS はすべての を実行するグローバルインフラストラクチャを保護する責任があります AWS クラウド。ユーザーは、このインフラストラクチャでホストされるコンテンツに対する管理を維持する責任があります。また、使用する「 AWS のサービス 」のセキュリティ設定と管理タスクもユーザーの責任となります。データプライバシーの詳細については、[データプライバシーに関するよくある質問](https://aws.amazon.com/compliance/data-privacy-faq/)を参照してください。欧州でのデータ保護の詳細については、*AWS セキュリティブログ*に投稿された「[AWS 責任共有モデルおよび GDPR](https://aws.amazon.com/blogs/security/the-aws-shared-responsibility-model-and-gdpr/)」のブログ記事を参照してください。

データ保護の目的で、認証情報を保護し AWS アカウント 、 AWS IAM アイデンティティセンター または AWS Identity and Access Management (IAM) を使用して個々のユーザーを設定することをお勧めします。この方法により、それぞれのジョブを遂行するために必要な権限のみが各ユーザーに付与されます。また、次の方法でデータを保護することもお勧めします:
+ 各アカウントで多要素認証 (MFA) を使用します。
+ SSL/TLS を使用して AWS リソースと通信します。TLS 1.2 は必須ですが、TLS 1.3 を推奨します。
+ で API とユーザーアクティビティのログ記録を設定します AWS CloudTrail。CloudTrail 証跡を使用して AWS アクティビティをキャプチャする方法については、「 *AWS CloudTrail ユーザーガイド*」の[CloudTrail 証跡の使用](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-trails.html)」を参照してください。
+  AWS 暗号化ソリューションと、その中のすべてのデフォルトのセキュリティコントロールを使用します AWS のサービス。
+ Amazon Macie などの高度な管理されたセキュリティサービスを使用します。これらは、Amazon S3 に保存されている機密データの検出と保護を支援します。
+ コマンドラインインターフェイスまたは API AWS を介して にアクセスするときに FIPS 140-3 検証済み暗号化モジュールが必要な場合は、FIPS エンドポイントを使用します。利用可能な FIPS エンドポイントの詳細については、「[連邦情報処理規格 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)」を参照してください。

お客様の E メールアドレスなどの極秘または機密情報を、タグ、または **[名前]** フィールドなどの自由形式のテキストフィールドに含めないことを強くお勧めします。これは、コンソール、API、 AWS CLIまたは SDK を使用して、この AWS 製品またはサービスまたは他の AWS のサービス を使用する場合も同様です。 AWS SDKs タグ、または名前に使用される自由記述のテキストフィールドに入力したデータは、請求または診断ログに使用される場合があります。外部サーバーに URL を提供する場合、そのサーバーへのリクエストを検証できるように、認証情報を URL に含めないことを強くお勧めします。

# Identity and Access Management
<a name="security-iam"></a>

AWS Identity and Access Management (IAM) は、管理者が AWS リソースへのアクセスを安全に制御 AWS のサービス するのに役立つ です。IAM 管理者は、誰を*認証* (サインイン) し、誰に AWS リソースの使用*を許可する* (アクセス許可を付与する) かを制御します。IAM は、追加料金なしで使用できる AWS のサービス です。

**Topics**
+ [オーディエンス](#security_iam_audience)
+ [アイデンティティを使用した認証](#security_iam_authentication)
+ [ポリシーを使用したアクセスの管理](#security_iam_access-manage)
+ [IAM AWS のサービス の操作方法](#security_iam_service-with-iam)
+ [AWS ID とアクセスのトラブルシューティング](#security_iam_troubleshoot)

## オーディエンス
<a name="security_iam_audience"></a>

 AWS Identity and Access Management (IAM) の使用方法は、 で行う作業によって異なります AWS。

**サービスユーザー** – AWS のサービス を使用してジョブを実行する場合、管理者から必要な認証情報とアクセス許可が提供されます。さらに多くの AWS 機能を使用して作業を行う場合は、追加のアクセス許可が必要になる場合があります。アクセスの管理方法を理解すると、管理者に適切なアクセス許可をリクエストするのに役に立ちます。の機能にアクセスできない場合は AWS、 AWS のサービス [AWS ID とアクセスのトラブルシューティング](#security_iam_troubleshoot)「」または使用している のユーザーガイドを参照してください。

**サービス管理者** – 社内の AWS リソースを担当している場合は、通常、 へのフルアクセスがあります AWS。サービスユーザーがどの AWS 機能やリソースにアクセスするかを決めるのは管理者の仕事です。その後、IAM 管理者にリクエストを送信して、サービスユーザーの権限を変更する必要があります。このページの情報を点検して、IAM の基本概念を理解してください。会社で IAM を使用する方法の詳細については AWS、使用している AWS のサービス のユーザーガイドを参照してください。

**IAM 管理者** - 管理者は、 AWSへのアクセスを管理するポリシーの書き込み方法の詳細について確認する場合があります。IAM で使用できる AWS アイデンティティベースのポリシーの例を表示するには、 AWS のサービス 使用している のユーザーガイドを参照してください。

## アイデンティティを使用した認証
<a name="security_iam_authentication"></a>

認証とは、ID 認証情報 AWS を使用して にサインインする方法です。、IAM ユーザー AWS アカウントのルートユーザー、または IAM ロールを引き受けることで認証される必要があります。

 AWS IAM アイデンティティセンター (IAM Identity Center)、シングルサインオン認証、Google/Facebook 認証情報などの ID ソースからの認証情報を使用して、フェデレーティッド ID としてサインインできます。サインインの詳細については、「*AWS サインイン ユーザーガイド*」の「[AWS アカウントにサインインする方法](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)」を参照してください。

プログラムによるアクセスの場合、 は SDK と CLI AWS を提供してリクエストを暗号化して署名します。詳細については、「*IAM ユーザーガイド*」の「[API リクエストに対するAWS 署名バージョン 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)」を参照してください。

### AWS アカウント ルートユーザー
<a name="security_iam_authentication-rootuser"></a>

 を作成するときは AWS アカウント、すべての AWS のサービス および リソースへの完全なアクセス権を持つ AWS アカウント *ルートユーザー*と呼ばれる 1 つのサインインアイデンティティから始めます。日常的なタスクには、ルートユーザーを使用しないことを強くお勧めします。ルートユーザー認証情報を必要とするタスクについては、「*IAM ユーザーガイド*」の「[ルートユーザー認証情報が必要なタスク](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)」を参照してください。

### フェデレーテッドアイデンティティ
<a name="security_iam_authentication-federated"></a>

ベストプラクティスとして、人間のユーザーが一時的な認証情報 AWS のサービス を使用して にアクセスするには、ID プロバイダーとのフェデレーションを使用する必要があります。

*フェデレーティッド ID* は、エンタープライズディレクトリ、ウェブ ID プロバイダー、または ID Directory Service ソースの認証情報 AWS のサービス を使用して にアクセスするユーザーです。フェデレーテッドアイデンティティは、一時的な認証情報を提供するロールを引き受けます。

アクセスを一元管理する場合は、 AWS IAM アイデンティティセンターをお勧めします。詳細については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[IAM アイデンティティセンターとは](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)」を参照してください。

### IAM ユーザーとグループ
<a name="security_iam_authentication-iamuser"></a>

*[IAM ユーザー](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*は、特定の個人やアプリケーションに対する特定のアクセス許可を持つアイデンティティです。長期認証情報を持つ IAM ユーザーの代わりに一時的な認証情報を使用することをお勧めします。詳細については、*IAM ユーザーガイド*の[「ID プロバイダーとのフェデレーションを使用して にアクセスする必要がある AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)」を参照してください。

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)は、IAM ユーザーの集合を指定し、大量のユーザーに対するアクセス許可の管理を容易にします。詳細については、「*IAM ユーザーガイド*」の「[IAM ユーザーに関するユースケース](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html)」を参照してください。

### IAM ロール
<a name="security_iam_authentication-iamrole"></a>

*[IAM ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*は、特定のアクセス許可を持つアイデンティであり、一時的な認証情報を提供します。ユーザー[から IAM ロール (コンソール) に切り替えるか、 または API オペレーションを呼び出すことで、ロール](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)を引き受けることができます。 AWS CLI AWS 詳細については、「*IAM ユーザーガイド*」の「[ロールを引き受けるための各種方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)」を参照してください。

IAM ロールは、フェデレーションユーザーアクセス、一時的な IAM ユーザーのアクセス許可、クロスアカウントアクセス、クロスサービスアクセス、および Amazon EC2 で実行するアプリケーションに役立ちます。詳細については、*IAM ユーザーガイド* の [IAM でのクロスアカウントリソースアクセス](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html) を参照してください。

## ポリシーを使用したアクセスの管理
<a name="security_iam_access-manage"></a>

でアクセスを制御する AWS には、ポリシーを作成し、ID AWS またはリソースにアタッチします。ポリシーは、アイデンティティまたはリソースに関連付けられている場合のアクセス許可を定義します。 は、プリンシパルがリクエストを行うときにこれらのポリシー AWS を評価します。ほとんどのポリシーは JSON ドキュメント AWS として に保存されます。JSON ポリシードキュメントの詳細については、「*IAM ユーザーガイド*」の「[JSON ポリシー概要](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json)」を参照してください。

管理者は、ポリシーを使用して、どの**プリンシパル**がどの**リソース**に対して、どのような**条件**で**アクション**を実行できるかを定義することで、誰が何にアクセスできるかを指定します。

デフォルトでは、ユーザーやロールにアクセス許可はありません。IAM 管理者は IAM ポリシーを作成してロールに追加し、このロールをユーザーが引き受けられるようにします。IAM ポリシーは、オペレーションの実行方法を問わず、アクセス許可を定義します。

### アイデンティティベースのポリシー
<a name="security_iam_access-manage-id-based-policies"></a>

アイデンティティベースのポリシーは、アイデンティティ (ユーザー、グループ、またはロール) にアタッチできる JSON アクセス許可ポリシードキュメントです。これらのポリシーは、アイデンティティがどのリソースに対してどのような条件下でどのようなアクションを実行できるかを制御します。アイデンティティベースポリシーの作成方法については、*IAM ユーザーガイド* の [カスタマー管理ポリシーでカスタム IAM アクセス許可を定義する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html) を参照してください。

アイデンティティベースのポリシーは、*インラインポリシー* (単一の ID に直接埋め込む) または*管理ポリシー* (複数の ID にアタッチされたスタンドアロンポリシー) にすることができます。管理ポリシーとインラインポリシーのいずれかを選択する方法については、「*IAM ユーザーガイド*」の「[管理ポリシーとインラインポリシーのいずれかを選択する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)」を参照してください。

### リソースベースのポリシー
<a name="security_iam_access-manage-resource-based-policies"></a>

リソースベースのポリシーは、リソースに添付する JSON ポリシードキュメントです。例としては、IAM *ロール信頼ポリシー*や Amazon S3 *バケットポリシー*などがあります。リソースベースのポリシーをサポートするサービスでは、サービス管理者はポリシーを使用して特定のリソースへのアクセスを制御できます。リソースベースのポリシーでは、[プリンシパルを指定する](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)必要があります。

リソースベースのポリシーは、そのサービス内にあるインラインポリシーです。リソースベースのポリシーでは、IAM の AWS マネージドポリシーを使用できません。

### アクセスコントロールリスト (ACL)
<a name="security_iam_access-manage-acl"></a>

アクセスコントロールリスト (ACL) は、どのプリンシパル (アカウントメンバー、ユーザー、またはロール) がリソースにアクセスするためのアクセス許可を持つかを制御します。ACL はリソースベースのポリシーに似ていますが、JSON ポリシードキュメント形式は使用しません。

Amazon S3、および Amazon VPC は AWS WAF、ACLs。ACL の詳細については、*Amazon Simple Storage Service デベロッパーガイド* の [アクセスコントロールリスト (ACL) の概要](https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html) を参照してください。

### その他のポリシータイプ
<a name="security_iam_access-manage-other-policies"></a>

AWS は、より一般的なポリシータイプによって付与されるアクセス許可の上限を設定できる追加のポリシータイプをサポートしています。
+ **アクセス許可の境界** – アイデンティティベースのポリシーで IAM エンティティに付与することのできるアクセス許可の数の上限を設定します。詳細については、「*IAM ユーザーガイド*」の「[IAM エンティティのアクセス許可境界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)」を参照してください。
+ **サービスコントロールポリシー (SCP)** - AWS Organizations内の組織または組織単位の最大のアクセス許可を指定します。詳細については、「*AWS Organizations ユーザーガイド*」の「[サービスコントロールポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)」を参照してください。
+ **リソースコントロールポリシー (RCP)** – は、アカウント内のリソースで利用できる最大数のアクセス許可を定義します。詳細については、「*AWS Organizations ユーザーガイド*」の「[リソースコントロールポリシー (RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)」を参照してください。
+ **セッションポリシー** – ロールまたはフェデレーションユーザーの一時セッションを作成する際にパラメータとして渡される高度なポリシーです。詳細については、「*IAM ユーザーガイド*」の「[セッションポリシー](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)」を参照してください。

### 複数のポリシータイプ
<a name="security_iam_access-manage-multiple-policies."></a>

1 つのリクエストに複数のタイプのポリシーが適用されると、結果として作成されるアクセス許可を理解するのがさらに難しくなります。が複数のポリシータイプが関与する場合にリクエストを許可するかどうか AWS を決定する方法については、*「IAM ユーザーガイド*」の[「ポリシー評価ロジック](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)」を参照してください。

## IAM AWS のサービス の操作方法
<a name="security_iam_service-with-iam"></a>

ほとんどの IAM 機能と AWS のサービス の連携方法の概要については、「IAM *ユーザーガイド*」の[AWS 「IAM と連携する のサービス](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)」を参照してください。

IAM AWS のサービス で特定の を使用する方法については、関連するサービスのユーザーガイドのセキュリティセクションを参照してください。

## AWS ID とアクセスのトラブルシューティング
<a name="security_iam_troubleshoot"></a>

次の情報は、 および IAM の使用時に発生する可能性がある一般的な問題の診断 AWS と修復に役立ちます。

**Topics**
+ [でアクションを実行する権限がありません AWS](#security_iam_troubleshoot-no-permissions)
+ [iam:PassRole を実行する権限がありません](#security_iam_troubleshoot-passrole)
+ [自分の 以外のユーザーに自分の AWS リソース AWS アカウント へのアクセスを許可したい](#security_iam_troubleshoot-cross-account-access)

### でアクションを実行する権限がありません AWS
<a name="security_iam_troubleshoot-no-permissions"></a>

アクションを実行する権限がないというエラーが表示された場合は、そのアクションを実行できるようにポリシーを更新する必要があります。

次のエラー例は、`mateojackson` IAM ユーザーがコンソールを使用して、ある `my-example-widget` リソースに関する詳細情報を表示しようとしたことを想定して、その際に必要な `awes:GetWidget` アクセス許可を持っていない場合に発生するものです。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: awes:GetWidget on resource: my-example-widget
```

この場合、`awes:GetWidget` アクションを使用して `my-example-widget` リソースへのアクセスを許可するように、`mateojackson` ユーザーのポリシーを更新する必要があります。

サポートが必要な場合は、 AWS 管理者にお問い合わせください。サインイン認証情報を提供した担当者が管理者です。

### iam:PassRole を実行する権限がありません
<a name="security_iam_troubleshoot-passrole"></a>

`iam:PassRole` アクションを実行する権限がないというエラーが表示された場合は、ポリシーを更新して AWSにロールを渡すことができるようにする必要があります。

一部の AWS のサービス では、新しいサービスロールまたはサービスにリンクされたロールを作成する代わりに、そのサービスに既存のロールを渡すことができます。そのためには、サービスにロールを渡す権限が必要です。

以下の例のエラーは、`marymajor` という IAM ユーザーがコンソールを使用して AWSでアクションを実行しようとする場合に発生します。ただし、このアクションをサービスが実行するには、サービスロールから付与された権限が必要です。Mary には、ロールをサービスに渡すアクセス許可がありません。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

この場合、Mary のポリシーを更新してメアリーに `iam:PassRole` アクションの実行を許可する必要があります。

サポートが必要な場合は、 AWS 管理者にお問い合わせください。サインイン資格情報を提供した担当者が管理者です。

### 自分の 以外のユーザーに自分の AWS リソース AWS アカウント へのアクセスを許可したい
<a name="security_iam_troubleshoot-cross-account-access"></a>

他のアカウントのユーザーや組織外の人が、リソースにアクセスするために使用できるロールを作成できます。ロールの引き受けを委託するユーザーを指定できます。リソースベースのポリシーまたはアクセスコントロールリスト (ACL) をサポートするサービスの場合、それらのポリシーを使用して、リソースへのアクセスを付与できます。

詳細については、以下を参照してください:
+ がこれらの機能 AWS をサポートしているかどうかを確認するには、「」を参照してください[IAM AWS のサービス の操作方法](#security_iam_service-with-iam)。
+ 所有 AWS アカウント している のリソースへのアクセスを提供する方法については、[「IAM ユーザーガイド」の「所有 AWS アカウント している別の の IAM ユーザーへのアクセスを提供する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)」を参照してください。 **
+ リソースへのアクセスをサードパーティーに提供する方法については AWS アカウント、*IAM ユーザーガイド*の[「サードパーティー AWS アカウント が所有する へのアクセスを提供する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)」を参照してください。
+ ID フェデレーションを介してアクセスを提供する方法については、*IAM ユーザーガイド* の [外部で認証されたユーザー (ID フェデレーション) へのアクセスの許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html) を参照してください。
+ クロスアカウントアクセスにおけるロールとリソースベースのポリシーの使用方法の違いについては、*IAM ユーザーガイド* の [IAM でのクロスアカウントのリソースへのアクセス](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html) を参照してください。

# この AWS 製品またはサービスのコンプライアンス検証
<a name="compliance-validation"></a>

 AWS のサービス が特定のコンプライアンスプログラムの範囲内にあるかどうかを確認するには、「コンプライアンス[AWS のサービス プログラムによるスコープ](https://aws.amazon.com/compliance/services-in-scope/)」の「コンプライアンス」を参照して、関心のあるコンプライアンスプログラムを選択します。一般的な情報については、[AWS 「コンプライアンスプログラム](https://aws.amazon.com/compliance/programs/)」を参照してください。

を使用して、サードパーティーの監査レポートをダウンロードできます AWS Artifact。詳細については、[「Downloading Reports in AWS Artifact](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)」を参照してください。

を使用する際のお客様のコンプライアンス責任 AWS のサービス は、お客様のデータの機密性、貴社のコンプライアンス目的、適用される法律および規制によって決まります。を使用する際のコンプライアンス責任の詳細については AWS のサービス、[AWS 「 セキュリティドキュメント](https://docs.aws.amazon.com/security/)」を参照してください。

この AWS 製品またはサービスは、サポートする特定の Amazon Web Services (AWS) サービスを通じて[責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)に従います。 AWS サービスセキュリティ情報については、[AWS 「サービスセキュリティドキュメント」ページ](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)と[AWS 、コンプライアンスプログラムによる AWS コンプライアンスの取り組みの対象となるサービス](https://aws.amazon.com/compliance/services-in-scope/)を参照してください。

# この AWS 製品またはサービスの耐障害性
<a name="disaster-recovery-resiliency"></a>

 AWS グローバルインフラストラクチャは、 AWS リージョン およびアベイラビリティーゾーンを中心に構築されています。

AWS リージョン は、複数の物理的に分離および分離されたアベイラビリティーゾーンを提供し、低レイテンシー、高スループット、および高度に冗長なネットワークで接続されます。

アベイラビリティーゾーンでは、ゾーン間で中断することなく自動的にフェールオーバーするアプリケーションとデータベースを設計および運用することができます。アベイラビリティーゾーンは、従来の単一または複数のデータセンターインフラストラクチャよりも可用性、フォールトトレランス、および拡張性が優れています。

 AWS リージョンとアベイラビリティーゾーンの詳細については、[AWS 「 グローバルインフラストラクチャ](https://aws.amazon.com/about-aws/global-infrastructure/)」を参照してください。

この AWS 製品またはサービスは、サポートする特定の Amazon Web Services (AWS) サービスを通じて[責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)に従います。 AWS サービスセキュリティ情報については、[AWS 「サービスセキュリティドキュメント」ページ](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)と[AWS 、コンプライアンスプログラムによる AWS コンプライアンスの取り組みの対象となるサービス](https://aws.amazon.com/compliance/services-in-scope/)を参照してください。

# この AWS 製品またはサービスのインフラストラクチャセキュリティ
<a name="infrastructure-security"></a>

この AWS 製品またはサービスはマネージドサービスを使用するため、 グローバルネットワークセキュリティによって AWS 保護されています。 AWS セキュリティサービスと がインフラストラクチャ AWS を保護する方法については、[AWS 「 クラウドセキュリティ](https://aws.amazon.com/security/)」を参照してください。インフラストラクチャセキュリティのベストプラクティスを使用して AWS 環境を設計するには、*「Security Pillar AWS Well‐Architected Framework*」の[「Infrastructure Protection](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)」を参照してください。

 AWS 公開された API コールを使用して、ネットワーク経由でこの AWS 製品またはサービスにアクセスします。クライアントは次をサポートする必要があります。
+ Transport Layer Security (TLS)。TLS 1.2 が必須で、TLS 1.3 をお勧めします。
+ DHE (楕円ディフィー・ヘルマン鍵共有) や ECDHE (楕円曲線ディフィー・ヘルマン鍵共有) などの完全前方秘匿性 (PFS) による暗号スイート。これらのモードは Java 7 以降など、ほとんどの最新システムでサポートされています。

また、リクエストにはアクセスキー ID と、IAM プリンシパルに関連付けられているシークレットアクセスキーを使用して署名する必要があります。または、[AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html) (AWS STS) を使用して、一時的なセキュリティ認証情報を生成し、リクエストに署名することもできます。

この AWS 製品またはサービスは、サポートする特定の Amazon Web Services (AWS) サービスを通じて[責任共有モデル](https://aws.amazon.com/compliance/shared-responsibility-model/)に従います。 AWS サービスセキュリティ情報については、[AWS 「サービスセキュリティドキュメント」ページ](https://docs.aws.amazon.com/security/?id=docs_gateway#aws-security)と[AWS 、コンプライアンスプログラムによる AWS コンプライアンスの取り組みの対象となるサービス](https://aws.amazon.com/compliance/services-in-scope/)を参照してください。

# で最小 TLS バージョンを適用する AWS SDK for .NET
<a name="enforcing-tls"></a>

 AWS サービスと通信する際のセキュリティを強化するには、TLS 1.2 以降を使用する AWS SDK for .NET ように を設定する必要があります。

 AWS SDK for .NET は、基盤となる .NET ランタイムを使用して、使用するセキュリティプロトコルを決定します。現行バージョンの .NET は、デフォルトでオペレーティングシステムがサポートする最新の設定済みプロトコルを使用します。この SDK の動作はアプリケーションで上書きできますが、上書きは*推奨されません*。

## .NET Core
<a name="enforcing-tls-dotnet-core"></a>

.NET Core は、デフォルトでオペレーティングシステムがサポートする最新の設定済みプロトコルを使用します。 AWS SDK for .NET は、この動作を上書きする機構を提供していません。

バージョン 2.1 より前の .NET Core を使用している場合は、.NET Core バージョンをアップグレードすることを*強く*お勧めします。

オペレーティングシステムごとの固有の情報については、以下を参照してください。

**Windows**

Windows の最新のディストリビューションでは、TLS 1.2 のサポートが [デフォルトで有効](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-)になっています。Windows 7 SP1 または Windows Server 2008 R2 SP1 上で実行している場合は、レジストリで TLS 1.2 のサポートが有効になっていることを確認する必要があります。詳細については、[https://learn.microsoft.com/ja-jp/windows-server/security/tls/tls-registry-settings\$1tls-12](https://learn.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12) を参照してください。以前のディストリビューションを実行している場合は、オペレーティングシステムをアップグレードする必要があります。WindowsのTLS 1.3サポートについては、必要最小限のクライアントまたはサーバーのバージョンについて、最新のMicrosoftドキュメントを確認してください。

**macOS**

.NET Core 2.1 以降を実行している場合、TLS 1.2 はデフォルトで有効になっています。TLS 1.2 は [OS X Mavericks v10.9 以降](https://support.apple.com/en-us/103373)でサポートされています。.NET Core バージョン 2.1 以降では、より新しいバージョンの macOS が必要です。詳細については、[https://learn.microsoft.com/ja-jp/dotnet/core/install/windows?tabs=net80&pivots=os-macos](https://learn.microsoft.com/en-us/dotnet/core/install/windows?tabs=net80&pivots=os-macos) を参照してください。

.NET Core 1.0 を使用している場合、.NET Core は [OpenSSL を macOS で使用](https://github.com/dotnet/announcements/issues/21)します。この OpenSSL は別個にインストールする必要がある依存関係です。OpenSSL は、バージョン 1.0.1 で TLS 1.2 のサポートを追加し、バージョン 1.1.1 で TLS 1.3 のサポートを追加しました。。

**Linux**

Linux 上の .NET コアには OpenSSL が必要です。OpenSSL は、多くの Linux ディストリビューションにバンドルされていますが、別個にインストールすることもできます。OpenSSL は、バージョン 1.0.1 で TLS 1.2 のサポートを追加し、バージョン 1.1.1 で TLS 1.3 のサポートを追加しました。最新バージョンの .NET Core (2.1 以降) を使用していて、パッケージマネージャーをインストールしている場合は、通常、最新バージョンの OpenSSL がインストール済みです。

これを調べるには、ターミナルで **`openssl version`** を実行し、バージョンが 1.0.1 より新しいことを確認します。

## 特定のランタイムライブラリまたは .NET Framework の最小バージョンが必要です。
<a name="enforcing-tls-dotnet-framework"></a>

新しいバージョンの .NET Framework (4.7 以降) と新しいバージョンの Windows (クライアントの場合は Windows 8 以上、サーバーの場合は Windows Server 2012 以降) を実行している場合、TLS 1.2 はデフォルトで有効化され、使用されています。

オペレーティングシステム設定 (.NET Framework 3.5～4.5.2) を使用しない .NET Framework ランタイムを使用している場合、 AWS SDK for .NET はサポートされているプロトコルに [TLS 1.1 および TLS 1.2 のサポートを追加](https://github.com/aws/aws-sdk-net/blob/main/sdk/src/Core/Amazon.Runtime/Pipeline/HttpHandler/AmazonSecurityProtocolManager.cs)しようとします。.NET Framework 3.5 を使用している場合、これが成功するのは、次のように適切なホットパッチがインストールされている場合のみです。
+ Windows 10 バージョン 1511 および Windows Server 2016 – [KB3156421](https://support.microsoft.com/kb/3156421)
+ Windows 8.1 および Windows Server 2012 R2 – [KB3154520](https://support.microsoft.com/kb/3154520)
+ Windows Server 2012 – [KB3154519](https://support.microsoft.com/kb/3154519)
+ Windows 7 SP1 および Server 2008 R2 SP1 – [KB3154518](https://support.microsoft.com/kb/3154518)

**警告**  
2024 年 8 月 15 日、 AWS SDK for .NET は .NET Framework 3.5 のサポートを終了し、最小 .NET Framework バージョンを 4.7.2 に変更しました。詳細については、ブログ記事「[Important changes coming for .NET Framework 3.5 and 4.5 targets of the AWS SDK for .NET](https://aws.amazon.com/blogs/developer/important-changes-coming-for-net-framework-3-5-and-4-5-targets-of-the-aws-sdk-for-net/)」を参照してください。

アプリケーションを Windows 7 SP1 または Windows Server 2008 R2 SP1 上の新しい .NET Framework で実行している場合は、レジストリで TLS 1.2 のサポートが有効になっていることを確認する必要があります。詳細については、[https://learn.microsoft.com/ja-jp/windows-server/security/tls/tls-registry-settings\$1tls-12](https://learn.microsoft.com/en-us/windows-server/security/tls/tls-registry-settings#tls-12) を参照してください。新しいバージョンの Windows の場合、これは[デフォルトで有効](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-)になっています。

.NET Framework で TLS を使用するための詳細なベストプラクティスについては、Microsoft の記事 ([https://learn.microsoft.com/ja-jp/dotnet/framework/network-programming/tls](https://learn.microsoft.com/en-us/dotnet/framework/network-programming/tls)) を参照してください。

## AWS Tools for PowerShell
<a name="enforcing-tls-ps"></a>

[AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/) AWS サービスへのすべての呼び出し AWS SDK for .NET に を使用します。環境の動作は、次のように、実行している Windows PowerShell のバージョンによって異なります。

**Windows PowerShell 2.0～5.x**

Windows PowerShell 2.0～5.x は .NET Framework で実行します。どの .NET ランタイム (2.0 または 4.0) が PowerShell で使用されているかは、次のコマンドで確認できます。

```
$PSVersionTable.CLRVersion
```
+ .NET ランタイム 2.0 を使用している場合は、 AWS SDK for .NET および .NET Framework 3.5 に関する前述の手順に従います。
**警告**  
2024 年 8 月 15 日、 AWS SDK for .NET は .NET Framework 3.5 のサポートを終了し、最小 .NET Framework バージョンを 4.7.2 に変更しました。詳細については、ブログ記事「[Important changes coming for .NET Framework 3.5 and 4.5 targets of the AWS SDK for .NET](https://aws.amazon.com/blogs/developer/important-changes-coming-for-net-framework-3-5-and-4-5-targets-of-the-aws-sdk-for-net/)」を参照してください。
+ .NET ランタイム 4.0 を使用している場合は、 AWS SDK for .NET および .NET Framework 4\$1 に関する前述の手順に従います。

**Windows PowerShell 6.0**

Windows PowerShell 6.0 以降は、.NET Core で実行します。どのバージョンの .NET Core が使用されているかは、次のコマンドで確認できます。

```
[System.Reflection.Assembly]::GetEntryAssembly().GetCustomAttributes([System.Runtime.Versioning.TargetFrameworkAttribute], $true).FrameworkName
```

 AWS SDK for .NET および .NET Core の関連バージョンについては、前述の手順に従ってください。

## Xamarin
<a name="enforcing-tls-xamarin"></a>

Xamarin については、[https://learn.microsoft.com/ja-jp/xamarin/cross-platform/app-fundamentals/transport-layer-security](https://learn.microsoft.com/en-us/xamarin/cross-platform/app-fundamentals/transport-layer-security) の手順を参照してください。要約は、以下のとおりです。

**Android の場合**
+ Android 5.0 以降が必要です。
+ [**プロジェクトのプロパティ**]、[**Android のオプション**]: [HttpClient 実装] を [**Android**] に設定し、[SSL/TLS 実装] を [**Native TLS 1.2\$1**] に設定する必要があります。

**iOS の場合**
+ iOS 7 以降が必要です。
+ [**プロジェクトのプロパティ**]、[**iOS ビルド**]: [HttpClient 実装] を [**NSUrlSession**] に設定する必要があります。

**macOS の場合**
+ macOS 10.9 以降が必要です。
+ [**プロジェクトのオプション**]、[**ビルド**]、[**Mac ビルド**]: [HttpClient 実装] を [**NSUrlSession**] に設定する必要があります。

## Unity
<a name="enforcing-tls-unity"></a>

Unity 2018.2 以降を使用し、.NET 4.x Equivalent スクリプティングランタイムを使用する必要があります。これを設定するには、[**Project Settings**]、[**Configuration**]、[**Player**] の順に選択します。詳細については、[https://docs.unity3d.com/2019.1/Documentation/Manual/ScriptingRuntimeUpgrade.html](https://docs.unity3d.com/2019.1/Documentation/Manual/ScriptingRuntimeUpgrade.html) を参照してください。.NET 4.x Equivalent スクリプティングランタイムは、Mono または IL2CPP を実行するすべての Unity プラットフォームで TLS 1.2 のサポートを有効にします。

## ブラウザ (Blazor WebAssembly 用)
<a name="enforcing-tls-browser"></a>

WebAssembly は、サーバー上ではなくブラウザで実行され、ブラウザを使用して HTTP トラフィックを処理します。したがって、TLS のサポートはブラウザのサポートによって決まります。

Blazor WebAssembly は、ASP.NET Core 3.1 のプレビューで、[https://learn.microsoft.com/en-us/aspnet/core/blazor/supported-platforms](https://learn.microsoft.com/en-us/aspnet/core/blazor/supported-platforms) で説明されているように、WebAssembly をサポートするブラウザでのみサポートされています。すべてのメインストリームブラウザは、WebAssembly をサポートする前に TLS 1.2 をサポートしていました。これに該当するブラウザの場合、アプリを実行すると、アプリは TLS 1.2 経由で通信できます。

詳細と検証については、ブラウザのドキュメントを参照してください。

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

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

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

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

## 移行の概要
<a name="s3-encryption-migration-v1-v2-overview"></a>

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

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

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

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

## 既存のクライアントを V1 移行用クライアントに更新して、新しい形式を読み取るようにする
<a name="s3-encryption-migration-v1-v2-to-v1n"></a>

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

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

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

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

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

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

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

## V1 移行用クライアントを V2 クライアントに移行して、新しい形式を書き込むようにする
<a name="s3-encryption-migration-v1-v2-v1n-to-v2"></a>

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

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

1. `EncryptionMaterials` を `EncryptionMaterialsV2` に変更します。

   1. KMS を使用する場合:

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

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

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

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

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

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

1. `AmazonS3CryptoConfiguration` を `AmazonS3CryptoConfigurationV2` に変更し、`SecurityProfile` プロパティを `SecurityProfile.V2AndLegacy` に設定します。

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

### 例: KMS から KMS\$1コンテキスト
<a name="s3-encryption-migration-v1-v2-ex-kms"></a>

**移行前**

```
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 キーラップ)
<a name="s3-encryption-migration-v1-v2-ex-aes"></a>

`StorageMode` は `ObjectMetadata` または `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 キーラップ)
<a name="s3-encryption-migration-v1-v2-ex-rsa"></a>

`StorageMode` は `ObjectMetadata` または `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 形式を読み取らないようにする
<a name="s3-encryption-migration-v1-v2-v2-cleanup"></a>

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

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

# 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`ときに を使用します。