

 適用於 .NET 的 AWS SDK V3 已進入維護模式。

我們建議您遷移至 [適用於 .NET 的 AWS SDK V4](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/welcome.html)。如需如何遷移的其他詳細資訊和資訊，請參閱我們的[維護模式公告](https://aws.amazon.com/blogs/developer/aws-sdk-for-net-v3-maintenance-mode-announcement/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 此 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)
+ [身分和存取權管理](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 Identity Center 或 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 的敏感資料。
+ 如果您在 AWS 透過命令列界面或 API 存取 時需要 FIPS 140-3 驗證的密碼編譯模組，請使用 FIPS 端點。如需有關 FIPS 和 FIPS 端點的更多相關資訊，請參閱[聯邦資訊處理標準 (FIPS) 140-3](https://aws.amazon.com/compliance/fips/)。

我們強烈建議您絕對不要將客戶的電子郵件地址等機密或敏感資訊，放在標籤或自由格式的文字欄位中，例如**名稱**欄位。這包括當您使用此 AWS 產品或服務，或使用主控台、API AWS CLI或 AWS SDKs的其他 AWS 服務 時。您在標籤或自由格式文字欄位中輸入的任何資料都可能用於計費或診斷日誌。如果您提供外部伺服器的 URL，我們強烈建議請勿在驗證您對該伺服器請求的 URL 中包含憑證資訊。

# 身分和存取權管理
<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)
+ [AWS 服務 如何使用 IAM](#security_iam_service-with-iam)
+ [對 AWS 身分和存取進行故障診斷](#security_iam_troubleshoot)

## 目標對象
<a name="security_iam_audience"></a>

您使用 AWS Identity and Access Management (IAM) 的方式會有所不同，取決於您在 中執行的工作 AWS。

**服務使用者** – 如果您使用 AWS 服務 執行任務，管理員會為您提供所需的登入資料和許可。當您使用更多 AWS 功能來執行工作時，您可能需要額外的許可。了解存取許可的管理方式可協助您向管理員請求正確的許可。如果您無法存取 中的功能 AWS，請參閱 [對 AWS 身分和存取進行故障診斷](#security_iam_troubleshoot)或 AWS 服務 您正在使用的 使用者指南。

**服務管理員** – 如果您負責公司 AWS 的資源，您可能擁有 的完整存取權 AWS。您的任務是判斷服務使用者應存取哪些 AWS 功能和資源。接著，您必須將請求提交給您的 IAM 管理員，來變更您服務使用者的許可。檢閱此頁面上的資訊，了解 IAM 的基本概念。若要進一步了解貴公司如何使用 IAM AWS，請參閱您正在使用的 使用者指南 AWS 服務 。

**IAM 管理員**：如果您是 IAM 管理員，建議您掌握如何撰寫政策以管理 AWS存取權的詳細資訊。若要檢視您可以在 IAM 中使用的以 AWS 身分為基礎的政策範例，請參閱 AWS 服務 您正在使用的 使用者指南。

## 使用身分驗證
<a name="security_iam_authentication"></a>

身分驗證是您 AWS 使用身分憑證登入 的方式。您必須以 AWS 帳戶根使用者、IAM 使用者或擔任 IAM 角色身分進行身分驗證。

您可以使用身分來源的登入資料，例如 AWS IAM Identity Center (IAM Identity Center)、單一登入身分驗證或 Google/Facebook 登入資料，以聯合身分的形式登入。如需有關登入的詳細資訊，請參閱《AWS 登入 使用者指南》**中的[如何登入您的 AWS 帳戶](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

對於程式設計存取， AWS 提供 SDK 和 CLI 以密碼編譯方式簽署請求。如需詳細資訊，請參閱《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 帳戶 *theroot 使用者的*登入身分開始，該身分具有對所有 AWS 服務 和 資源的完整存取權。強烈建議不要使用根使用者來執行日常任務。有關需要根使用者憑證的任務，請參閱《IAM 使用者指南》**中的[需要根使用者憑證的任務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 聯合身分
<a name="security_iam_authentication-federated"></a>

最佳實務是要求人類使用者使用聯合身分提供者，以 AWS 服務 使用臨時憑證存取 。

*聯合身分*是您企業目錄、Web 身分提供者的使用者，或使用來自身分來源的 AWS 服務 憑證存取 Directory Service 。聯合身分會擔任角色，而該角色會提供臨時憑證。

若需集中化管理存取權限，建議使用 AWS IAM Identity Center。如需詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[什麼是 IAM Identity Center？](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](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)是一種身分具備單人或應用程式的特定許可權。建議以臨時憑證取代具備長期憑證的 IAM 使用者。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp) 。

[IAM 群組](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](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)的身分具有特定許可權，其可以提供臨時憑證。您可以透過[從使用者切換到 IAM 角色 （主控台） ](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或呼叫 AWS CLI 或 AWS API 操作來擔任角色。如需詳細資訊，請參閱《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 來控制 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)。

身分型政策可分為*內嵌政策* (直接內嵌於單一身分) 與*受管政策* (可附加至多個身分的獨立政策)。如需了解如何在受管政策及內嵌政策之間做選擇，請參閱《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 AWS WAF和 Amazon VPC 是支援 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>

當多種類型的政策適用於請求時，產生的許可會更複雜而無法理解。若要了解如何 AWS 在涉及多種政策類型時決定是否允許請求，請參閱《*IAM 使用者指南*》中的[政策評估邏輯](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

## AWS 服務 如何使用 IAM
<a name="security_iam_service-with-iam"></a>

若要深入了解 如何使用 AWS 服務 大多數 IAM 功能，請參閱《IAM *使用者指南*》中的[AWS 使用 IAM 的 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

若要了解如何 AWS 服務 搭配 IAM 使用特定 ，請參閱相關服務使用者指南的安全章節。

## 對 AWS 身分和存取進行故障診斷
<a name="security_iam_troubleshoot"></a>

使用以下資訊來協助您診斷和修正使用 AWS 和 IAM 時可能遇到的常見問題。

**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
```

在此情況下，必須更新 `mateojackson` 使用者的政策，允許使用 `awes:GetWidget` 動作存取 `my-example-widget` 資源。

如果您需要協助，請聯絡您的 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 支援這些功能，請參閱 [AWS 服務 如何使用 IAM](#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)。
+ 如需了解如何透過聯合身分提供存取權，請參閱《*IAM 使用者指南*》中的[將存取權提供給在外部進行身分驗證的使用者 (聯合身分)](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。如需詳細資訊，請參閱[下載報告 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 環境，請參閱*安全支柱 AWS Well-Architected Framework* 中的[基礎設施保護](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。
+ 具備完美轉送私密(PFS)的密碼套件，例如 DHE (Ephemeral Diffie-Hellman)或 ECDHE (Elliptic Curve Ephemeral Diffie-Hellman)。現代系統(如 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 版本 適用於 .NET 的 AWS SDK
<a name="enforcing-tls"></a>

若要在與 AWS 服務通訊時提高安全性，您應該 適用於 .NET 的 AWS SDK 將 設定為使用 TLS 1.2 或更新版本。

 適用於 .NET 的 AWS SDK 使用基礎 .NET 執行時間來決定要使用的安全通訊協定。根據預設，.NET 的目前版本會使用作業系統支援之最新設定的通訊協定。應用程式可覆寫此開發套件行為，但「不建議」**這麼做。

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

根據預設，.NET Core 會使用作業系統支援之最新設定的通訊協定。 適用於 .NET 的 AWS SDK 未提供覆寫此行為的機制。

如果您是使用比 2.1 更舊的 .NET Core 版本，「強烈」**建議您升級 .NET Core 版本。

請參閱下列各個作業系統的特定資訊。

**Windows**

Windows 的現代化分發會[依預設啟用](https://learn.microsoft.com/en-us/windows/win32/secauthn/protocols-in-tls-ssl--schannel-ssp-) TLS 1.2 支援。如果您在 Windows 7 SP1 或 Windows Server 2008 R2 SP1 上執行 ，則需要確保已在登錄檔中啟用 TLS 1.2 支援，如 https：//[https://learn.microsoft.com/en-us/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。[OS X Mavericks v10.9 或更新版本支援 TLS 1.2。](https://support.apple.com/en-us/103373).NET Core 2.1 版和更新版本需要更新版本的 macOS，如 [https://learn.microsoft.com/en-us/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 會[在 macOS 上使用 OpenSSL](https://github.com/dotnet/announcements/issues/21)，這是必須另外安裝的相依項目。OpenSSL 在 1.0.1 版中新增了對 TLS 1.2 的支援，並在 1.1.1 版中新增了對 TLS 1.3 的支援。

**Linux**

Linux 上的 .NET Core 需要使用許多 Linux 分發隨附綁定的 OpenSSL，但也可以另外個別安裝。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 執行期 (.NET Framework 3.5 到 4.5.2)， 適用於 .NET 的 AWS SDK 會嘗試將 [TLS 1.1 和 TLS 1.2 的支援新增至](https://github.com/aws/aws-sdk-net/blob/aws-sdk-net-v3.7/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 日開始， 適用於 .NET 的 AWS SDK 將結束對 .NET Framework 3.5 的支援，並將最低 .NET Framework 版本變更為 4.7.2。如需詳細資訊，請參閱部落格文章 [.NET Framework 3.5 和 4.5 目標的重要變更 適用於 .NET 的 AWS SDK](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：//[https://learn.microsoft.com/en-us/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：//[https://learn.microsoft.com/en-us/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/) 使用 適用於 .NET 的 AWS SDK 進行對 AWS 服務的所有呼叫。環境的行為取決於執行的 Windows PowerShell 版本，如下所示。

**經由 5.x 的 Windows PowerShell 2.0**

經由 5.x 的 Windows PowerShell 2.0 可在 .NET Framework 上執行。您可以使用下列命令，驗證 PowerShell 使用的是哪個 .NET 執行時間 (2.0 或 4.0)。

```
$PSVersionTable.CLRVersion
```
+ 若使用 .NET 執行時間 2.0，請按照上述有關 適用於 .NET 的 AWS SDK 和 .NET Framework 3.5 的指示進行。
**警告**  
從 2024 年 8 月 15 日開始， 適用於 .NET 的 AWS SDK 將結束對 .NET Framework 3.5 的支援，並將最低 .NET Framework 版本變更為 4.7.2。如需詳細資訊，請參閱部落格文章 [.NET Framework 3.5 和 4.5 目標的重要變更 適用於 .NET 的 AWS SDK](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，請按照上述有關 適用於 .NET 的 AWS SDK 和 .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
```

請遵循先前提供的有關 適用於 .NET 的 AWS SDK 和相關 .NET Core 版本的指示。

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

如需 Xamarin，請參閱 https：//[https://learn.microsoft.com/en-us/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 或更新版本。
+ **Project Properties (專案屬性)**、**Android Options (Android 選項)**：HttpClient 實作必須設為 **Android** 且 SSL/TLS 實作必須設為 **Native TLS 1.2\$1 (原生 TLS 1.2\$1)**。

**適用於 iOS**
+ 需要 iOS 7 或更新版本。
+ **Project Properties (專案屬性)**、**iOS Build (iOS 組建)**：HttpClient 實作必須設為 **NSUrlSession**。

**適用於 macOS**
+ 需要 macOS 10.9 或更新版本。
+ **Project Options (專案選項)**、**Build (組建)**、**Mac Build (Mac 組建)**：HttpClient 實作必須設為 **NSUrlSession**。

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

您必須使用 Unity 2018.2 或更新版本，並使用等同於 .NET 4.x 的指令碼編寫執行時間。您可以在 **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 的指令碼編寫執行時間會對執行 Mono or IL2CPP 的所有 Unity 平台啟用 TLS 1.2 支援。

## 瀏覽器 (適用於 Blazor WebAssembly)
<a name="enforcing-tls-browser"></a>

WebAssembly 會在瀏覽器 (而不是伺服器) 中執行，並使用瀏覽器來處理 HTTP 流量。因此，TLS 支援是取決於瀏覽器支援。

Blazor WebAssembly 在 ASP.NET Core 3.1 預覽版中僅支援支援 WebAssembly 的瀏覽器，如 https：//[https://learn.microsoft.com/en-us/aspnet/core/blazor/supported-platforms](https://learn.microsoft.com/en-us/aspnet/core/blazor/supported-platforms) 所述。所有主流瀏覽器在支援 WebAssembly 之前均已支援 TLS 1.2。如果您瀏覽器的情況是像這樣，則在應用程式執行時，該應用程式就能透過 TLS 1.2 進行通訊。

若要取得詳細資訊並進行確認，請參閱瀏覽器的文件。

# Amazon S3 加密用戶端遷移 (V1 至 V2)
<a name="s3-encryption-migration-v1-v2"></a>

**注意**  
如果您使用 V2 且想要遷移至 V4，請參閱 [Amazon S3 加密用戶端遷移 (V2 到 V4)](s3-encryption-migration-v2-v4.md)。

本主題說明如何將應用程式從 Amazon Simple Storage Service (Amazon S3) 加密用戶端的第 1 版 (V1) 遷移到第 2 版 (V2)，並確保在整個遷移過程中的應用程式可用性。

使用 V2 用戶端加密的物件無法使用 V1 用戶端解密。為了簡化遷移至新用戶端，而不必一次重新加密所有物件，已提供「V1-transitional」用戶端。此用戶端可以*解密* V1 和 V2-encrypted物件，但只會以 V1-compatible格式*加密*物件。V2 用戶端可以*解密* V1 和 V2-encrypted物件 （啟用 V1 物件時），但只會以 V2-compatible格式*加密*物件。

## 遷移概觀
<a name="s3-encryption-migration-v1-v2-overview"></a>

此遷移分三個階段進行。此處會介紹這些階段，稍後會詳細說明。在下一個階段開始之前，*所有*使用共用物件的用戶端都必須完成每個階段。

1. **將現有用戶端更新為 V1-transitional用戶端，以讀取新格式。**首先，更新您的應用程式以對 V1-transitional用戶端取代 V1 用戶端取得相依性。V1-transitional用戶端可讓您現有的程式碼解密由新的 V2 用戶端寫入的物件，以及V1-compatible格式寫入的物件。
**注意**  
V1-transitional 用戶端僅供遷移之用。移至 V1 轉換用戶端後，繼續升級至 V2 用戶端。 V1-transitional 

1. **將 V1-transitional用戶端遷移至 V2 用戶端以寫入新格式。**接著，使用 V1-transitional用戶端，並將安全性設定檔設定為 `V2AndLegacy`。 V2 在 V2 用戶端上設定此安全性設定檔可讓這些用戶端解密以 V1-compatible格式加密的物件。

1. **更新 V2 用戶端以不再讀取 V1 格式。**最後，在所有用戶端遷移至 V2 且所有物件都已以 V2-compatible格式加密或重新加密後，請將 V2 安全設定檔設定為 ，`V2`而非 `V2AndLegacy`。這可防止解密 V1-compatible格式的物件。

## 將現有用戶端更新為 V1-transitional用戶端以讀取新格式
<a name="s3-encryption-migration-v1-v2-to-v1n"></a>

V2 加密用戶端使用舊版用戶端不支援的加密演算法。遷移的第一步是更新您的 V1 解密用戶端，以便他們可以讀取新格式。

V1-transitional用戶端可讓您的應用程式解密 V1 和 V2-encrypted物件。此用戶端是 [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet 套件的一部分。在每個應用程式上執行下列步驟，以使用 V1-transitional 用戶端。

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-transitional 用戶端與 V1 用戶端完全 API 相容，因此不需要其他程式碼變更。

## 將 V1-transitional用戶端遷移至 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-encrypted的物件 （如果設定為這樣做），但只會以 V2-compatible格式加密物件。

更新現有用戶端以讀取新的加密格式後，您可以繼續將應用程式安全地更新為 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` 將 `SecurityProfile` 屬性設為 `AmazonS3CryptoConfigurationV2`時，將 變更為 `SecurityProfile.V2AndLegacy`。

1. 將 `AmazonS3EncryptionClient` 變更為 `AmazonS3EncryptionClientV2`。此用戶端會採用先前步驟中新轉換的 `AmazonS3CryptoConfigurationV2`和 `EncryptionMaterialsV2` 物件。

### 範例：KMS 到 KMS\$1Context
<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` 屬性設定為 來停用 V2 用戶端中的 V1 相容性`SecurityProfile.V2`，如下列程式碼片段所示。 V2 

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

# Amazon S3 加密用戶端遷移 (V2 到 V4)
<a name="s3-encryption-migration-v2-v4"></a>

**注意**  
如果您使用 V1 且想要遷移至 V4，您必須先遷移至 V2。請參閱 [Amazon S3 加密用戶端遷移 (V1 至 V2)](s3-encryption-migration-v1-v2.md)。

本主題說明如何將應用程式從 Amazon Simple Storage Service (Amazon S3) 加密用戶端的第 2 版 (V2) 遷移到第 4 版 (V4)，並確保在整個遷移過程中的應用程式可用性。V4 使用 AES-GCM 與內容加密的金鑰承諾，並引進承諾政策來增強對金鑰替代攻擊的安全性。

V4 用戶端可在 [Amazon.Extensions.S3.Encryption](https://www.nuget.org/packages/Amazon.Extensions.S3.Encryption) NuGet 套件中使用。

**重要**  
**重大變更：**使用`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`政策設定的 V4 用戶端無法解密使用 V1 或 V2 用戶端加密的物件。只有最新的 V2 用戶端可以使用金鑰承諾解密 V4-encrypted物件。移至`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`政策之前，您必須使用已啟用金鑰承諾的 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 支援三種承諾政策：

`FORBID_ENCRYPT_ALLOW_DECRYPT`  
*加密：*沒有承諾  
*解密：*允許非遞交物件  
*安全性：*不強制執行承諾，並可能允許竄改  
*相容性：*所有 V2 和 V4 實作都可以讀取使用此政策加密的物件

`REQUIRE_ENCRYPT_ALLOW_DECRYPT`  
*加密：*使用金鑰承諾  
*解密：*允許遞交和非遞交物件  
*安全性：*新物件受到金鑰替代攻擊的保護，舊物件仍然可讀取  
*相容性：*只有 V4 支援此政策

`REQUIRE_ENCRYPT_REQUIRE_DECRYPT`(V4 的預設）  
*加密：*使用金鑰承諾  
*解密：*僅遞交物件  
*安全：*執行完整承諾以獲得最大的安全性  
*相容性：*只有 V4 支援此政策

### 具有金鑰承諾的 AES GCM
<a name="s3-encryption-migration-v2-v4-concepts-aesgcm"></a>

V4 使用 AES-GCM 與內容加密的金鑰承諾，可提供增強的安全性：
+ *竄改保護：*它會以密碼編譯方式將金鑰繫結至加密的資料，以防止金鑰替代攻擊。
+ *版本相容性：*使用金鑰承諾加密的物件只能由 V4 用戶端和更新版本解密。

**警告**  
在生產環境中啟用金鑰承諾加密之前，請確保需要解密物件的所有應用程式都已升級至 V4 或更新版本，因為 V2 用戶端已棄用。

## 更新現有用戶端以讀取 V4 格式
<a name="s3-encryption-migration-v2-v4-update-clients"></a>

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 ** - 遷移至 V4 用戶端，同時維護 V2-compatible加密行為

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>

遷移至 V4 用戶端，同時維持與 V2 相同的行為。此步驟使用`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
<a name="s3-encryption-migration-v2-v4-step2"></a>

使用金鑰承諾開始加密，同時保持解密的回溯相容性。此步驟使用 `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
<a name="s3-encryption-migration-v2-v4-step3"></a>

加密和解密都需要金鑰承諾。此步驟使用`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
});
```

**行為：**使用承諾加密，僅解密使用承諾加密的物件。針對金鑰替換攻擊的最大安全性。

## 其他組態範例
<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(CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT)
{
    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 支援兩種加密中繼資料的儲存方法。選擇最適合您的使用案例的方法：

**物件中繼資料 （預設）**

```
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` 當您需要保留物件中繼資料用於其他用途，或使用具有中繼資料大小限制的物件時，請使用 。

### 設定承諾政策
<a name="s3-encryption-migration-v2-v4-examples-policy"></a>

根據您的安全需求和遷移階段選擇適當的承諾政策：

**遷移階段 (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`時使用。