

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

# IAM 教學課程
<a name="tutorials"></a>

下列教學課程會針對 AWS Identity and Access Management (IAM) 的一般工作，提供完整的端對端程序。它們適用於實驗室類型的環境，包括虛構公司名稱、使用者名稱等。他們的目的是提供一般指導。他們不能直接用於您的生產環境，需要仔細審查更動以符合組織環境的獨特需求。

**Topics**
+ [AWS 帳戶 使用角色委派跨 的存取權](tutorial_cross-account-with-roles.md)
+ [建立客戶受管政策](tutorial_managed-policies.md)
+ [使用以屬性為基礎的存取控制 (ABAC)](tutorial_attribute-based-access-control.md)
+ [允許使用者管理其憑證和 MFA 設定](tutorial_users-self-manage-mfa-and-creds.md)
+ [使用 建立 SAML IdP CloudFormation](tutorial_saml-idp.md)
+ [使用 建立 SAML 聯合角色 CloudFormation](tutorial_saml-federated-role.md)
+ [使用 建立 SAML IdP 和聯合角色 CloudFormation](tutorial_saml-idp-and-federated-role.md)

# IAM 教學課程：使用 IAM 角色在 AWS 帳戶之間委派存取權
<a name="tutorial_cross-account-with-roles"></a>

**重要**  
 IAM [最佳實務](best-practices.md)建議您要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取 ，而不是使用具有長期憑證的 IAM 使用者。建議您僅將 IAM 使用者用於聯合身分使用者不支援的[特定使用案例](gs-identities-iam-users.md)。

此教學課程教導您如何使用角色將存取權委派給不同 AWS 帳戶 (稱為**目的地**和**來源**) 中的資源。您與不同帳戶中的使用者分享一個帳戶中的資源。透過以這種方式設定跨帳戶存取，您不需要在每個帳戶中建立個別的 IAM 使用者。此外，使用者不需要為了存取不同 AWS 帳戶中的資源，登出一個帳戶然後登入另一個帳戶。設定角色之後，您會看到如何從 AWS 管理主控台 AWS CLI、 和 API 使用角色。

在本教學課程中，**目的地**帳戶會管理不同應用程式和團隊存取的應用程式資料。在每個帳戶中，應用程式資訊存放在 Amazon S3 儲存貯體中。可以在**來源**帳戶中管理 IAM 使用者，您在其中擁有兩個 IAM 使用者角色：**開發人員**和**分析師**。開發人員和分析師使用**來源**帳戶來產生多個微服務共用的資料。兩個角色都有權在來源帳戶中工作並存取資源。開發人員必須經常更新**目的地**帳戶中的共用資料。開發人員將此資料存放在稱為 `amzn-s3-demo-bucket-shared-container` 的 Amazon S3 儲存貯體中。

在本教學的結尾，您會擁有：
+ 允許**來源**帳戶 (受信任帳戶) 中的使用者在**目的地**帳戶中擔任特定角色。
+ 允許**目的地**帳戶 (信任帳戶) 中的角色存取特定 Amazon S3 儲存貯體。
+ **目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。

開發人員可以使用 中的 角色 AWS 管理主控台 來存取**目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container`儲存貯體。他們也可以透過使用 API 呼叫來存取儲存貯體，而該呼叫是由角色提供的暫時性憑證進行身分驗證。分析師進行類似嘗試來使用角色會失敗。

此工作流程有三個基本步驟：

**[在目的地帳戶中建立角色](#tutorial_cross-account-with-roles-1)**  
首先，您可以使用 AWS 管理主控台 建立**目的地**帳戶 (ID 號碼 999999999999) 與**原始**帳戶 (ID 號碼 111111111111) 之間的信任。透過建立一個名為 *UpdateData* 的 IAM 角色開始。建立角色後，您可以將**來源**帳戶定義為受信任的實體並指定許可政策，該政策允許受信任的使用者更新 `amzn-s3-demo-bucket-shared-container` 儲存貯體。

**[授予角色存取權](#tutorial_cross-account-with-roles-2)**  
在本節中，您修改角色政策，以拒絕分析師存取 `UpdateData` 角色。由於分析師在此案例中具有 PowerUser 存取權，您必須明確*拒絕*使用角色的能力。

**[透過切換角色測試存取](#tutorial_cross-account-with-roles-3)**  
最後，作為開發人員，使用 `UpdateData` 角色來更新**目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。您會了解如何透過 AWS 主控台 AWS CLI、 和 API 存取角色。

## 考量事項
<a name="tutorial_cross-account-with-roles-considerations"></a>

在您使用 IAM 角色委派資源存取權之前 AWS 帳戶，請務必考慮下列事項：
+ 以 AWS 帳戶根使用者身分登入時無法切換到特定角色。
+ IAM 角色和資源型政策只會在單一分割內跨帳戶委派存取許可。例如，假設您在標準 `aws` 分割區的美國西部 (加利佛尼亞北部) 中有一個帳戶。您在 `aws-cn` 分割區的中國 (北京) 中也有一個帳戶。您不能使用中國 (北京) 中帳戶的 Amazon S3 資源型政策，對標準 `aws` 帳戶中的使用者允許存取許可。
+ 您可以使用 AWS IAM Identity Center 來使用安全性聲明標記語言 (SAML) 促進外部 AWS 帳戶 （您 外部的帳戶 AWS Organizations) 的單一登入 (SSO)。如需詳細資訊，請參閱[使用 SAML 2.0 將外部整合 AWS 帳戶 到具有獨立帳單 AWS IAM Identity Center 的中央存取管理](https://community.aws/content/2dIMI8N7w7tGxbE0KQMrkSBfae4/aws-iam-identity-center-integration-with-external-aws-accounts-for-independent-billing?lang=en) 
+ 您可以將角色與 Amazon EC2 執行個體或 AWS Lambda 函數等 AWS 資源建立關聯。如需詳細資訊，請參閱[建立角色以將許可委派給 AWS 服務](id_roles_create_for-service.md)。
+ 如果您想要讓應用程式在另一個 中擔任角色 AWS 帳戶，您可以使用 AWS SDK 來擔任跨帳戶角色。如需詳細資訊，請參閱 *AWS SDKs and Tools Reference Guide* 中的 [Authentication and access](https://docs.aws.amazon.com//sdkref/latest/guide/access.html)。
+ 使用 切換角色 AWS 管理主控台 僅適用於不需要 的帳戶`ExternalId`。例如，假設您將您帳戶的存取權授與第三方，並在許可政策的 `Condition` 元素中需要 `ExternalId`。在這種情況下，第三方只能使用 AWS API 或命令列工具存取您的帳戶。第三方無法使用主控台，因為它必須提供 `ExternalId` 的值。如需此案例的詳細資訊，請參閱 [存取第三方 AWS 帳戶 擁有的](id_roles_common-scenarios_third-party.md)和 AWS 安全部落格中的[如何啟用跨帳戶存取 AWS 管理主控台](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console) 。

## 先決條件
<a name="tutorial_cross-account-with-roles-prereqs"></a>

此教學課程假設您已備妥下列項目：
+ 您可以使用**兩個**不同的 AWS 帳戶 ，一個代表**原始**帳戶，另一個代表**目的地**帳戶。
+ **來源**帳戶中使用者和角色的建立和設定，如下所示：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)
+ 不需要在**目的地**帳戶中建立任何使用者。
+ 在**目的地**帳戶中建立的 Amazon S3 儲存貯體。您可在此教學課程中將其稱為 `amzn-s3-demo-bucket-shared-container`，但因為 S3 儲存貯體名稱必須是全域唯一，所以您必須使用不同名稱的儲存貯體。

## 在目的地帳戶中建立角色
<a name="tutorial_cross-account-with-roles-1"></a>

您可以允許某個使用者 AWS 帳戶 存取另一個資源 AWS 帳戶。在本教學課程中，我們將透過建立一個角色來完成操作，該角色定義誰可以存取它，以及它會將哪些許可授予給切換到它的使用者。

在教學課程的此步驟中，您在**目的地**帳戶中建立角色，並指定**來源**帳戶作為受信任的實體。您也限制角色的許可為僅擁有讀取和寫入 `amzn-s3-demo-bucket-shared-container` 儲存貯體的存取許可。被授予許可以使用角色的任何人都可以讀取和寫入 `shared-container` 儲存貯體。

在建立角色之前，您需要**原始** AWS 帳戶*伺服器的帳戶 ID*。每個 AWS 帳戶 都有指派的唯一帳戶 ID 識別符。

**若要取得來源 AWS 帳戶 ID**

1. 以**原始**帳戶的管理員 AWS 管理主控台 身分登入 ，然後開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在 IAM 主控台中，在右上角的導覽列中選擇您的使用者名稱。它通常如下：***username*@*account\$1ID\$1number\$1or\$1alias***。

   在此案例中，您可以使用帳戶 ID 111111111111 表示**來源**帳戶。不過，如果您在測試環境中使用此案例，則應該使用有效的帳戶 ID。

**若要在目的地帳戶中建立來源帳戶可以使用的角色**

1. 以**目的地**帳戶的管理員 AWS 管理主控台 身分登入 ，然後開啟 IAM 主控台。

1. 建立角色之前，請準備定義角色所需許可的受管政策。您可以在稍後的步驟將此政策連接至角色。

   您想要設定 `amzn-s3-demo-bucket-shared-container` 儲存貯體的讀取和寫入存取許可。雖然 AWS 提供一些 Amazon S3 受管政策，但沒有提供單一 Amazon S3 儲存貯體的讀取和寫入存取權。您可以改為建立自己的政策。

   在導覽窗格中，選擇 **Policies (政策)**，然後選擇 **Create policy (建立政策)**。

1. 選擇 **JSON** 標籤並從下列 JSON 政策文件複製文字。將此文字貼到 ** JSON ** 文字方塊中，以您 Amazon S3 儲存貯體的真實 ARN 替換資源 ARN (`arn:aws:s3:::shared-container`)。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "s3:ListAllMyBuckets",
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-shared-container"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           "s3:PutObject",
           "s3:DeleteObject"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-shared-container/*"
       }
     ]
   }
   ```

------

   `ListAllMyBuckets` 動作授予許可，可列出已經過身分驗證的請求發送者擁有的所有儲存貯體 `ListBucket` 許可允許使用者檢視 `amzn-s3-demo-bucket-shared-container` 儲存貯體中的物件。`GetObject`、`PutObject`、`DeleteObject` 許可允許使用者檢視、更新和刪除 `amzn-s3-demo-bucket-shared-container` 儲存貯體中的內容。
**注意**  
您可以隨時切換**視覺化**與 **JSON** 編輯器選項。不過，如果您進行變更或在**視覺化**編輯器中選擇**下一步**，IAM 就可能會調整您的政策結構，以便針對視覺化編輯器進行最佳化。如需詳細資訊，請參閱[政策結構調整](troubleshoot_policies.md#troubleshoot_viseditor-restructure)。

1. 在**檢視與建立**頁面上，針對政策名稱輸入 **read-write-app-bucket**。檢視政策授與的許可，然後選擇**建立政策**來儲存您的工作。

   新的政策會出現在受管政策清單中。

1. 在導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。

1. 選擇 ** AWS 帳戶** 角色類型。

1. 針對**帳戶 ID**，輸入**來源**帳戶 ID。

   此教學課程將範例帳戶 ID **111111111111** 用於**來源**帳戶。您應該使用有效的帳戶 ID。如果您使用無效的帳戶 ID (例如 **111111111111**)，IAM 不會讓您建立新的角色。

   現在您不需要要求外部 ID，或要求使用者要有多重要素驗證 (MFA) 才能擔任角色。請保持不選取這些選項。如需更多詳細資訊，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

1. 選擇 **Next: Permissions (下一步：許可)**，以設定與角色建立關聯的許可。

1. 選擇您之前建立的政策旁的核取方塊。
**秘訣**  
針對 **Filter (篩選條件)**，選擇 **Customer managed (客戶受管)** 以篩選清單，使其僅包含建立的政策。這會隱藏 AWS 建立的政策並讓找出所需項目更容易。

   然後選擇**下一步**。

1. (選用) 藉由連接標籤作為鍵值對，將中繼資料新增至角色。如需有關在 IAM 中使用標籤的詳細資訊，請參閱 [AWS Identity and Access Management 資源的標籤](id_tags.md)。

1. (選用) 在 **Description** (說明) 中，輸入新角色的說明。

1. 檢閱角色之後，選擇 **Create role (建立角色)**。

    

   `UpdateData` 角色會顯示在角色清單中。

現在，您必須取得角色的 Amazon Resource Name (ARN)，這是該角色的唯一識別碼。當您在來源帳戶中修改開發人員的角色時，可以從目的地帳戶指定角色 ARN，以授予或拒絕許可。

**若要取得 UpdateData 的 ARN**

1. 在 IAM 主控台的導覽窗格中，選擇 **Roles** (角色)。

1. 在角色清單中，選擇 `UpdateData` 角色。

1. 在詳細資訊窗格的 **Summary (摘要)** 區段中，複製 **Role ARN (角色 ARN)** 值。

   目的地帳戶的帳戶 ID 為 999999999999，所以角色 ARN 為 `arn:aws:iam::999999999999:role/UpdateData`。請確定您提供目的地帳戶的真實 AWS 帳戶 ID。

此時，您已在**目的地**和**來源**帳戶之間建立信任。完成上述作業的方法是在**目的地**帳戶中建立角色，它可將**來源**帳戶識別為受信任主體。您也定義切換到 `UpdateData` 角色的使用者可以執行什麼動作。

接下來，修改開發人員角色的許可。

## 授予角色存取權
<a name="tutorial_cross-account-with-roles-2"></a>

此時，分析師和開發人員都擁有許可，允許他們管理**來源**帳戶中的資料。使用以下所需的步驟以新增各種許可允許切換到該角色。

**若要修改開發人員角色，以允許他們切換到 UpdateData 角色**

1. 在**來源**帳戶中以管理員身分登入，並開啟 IAM 主控台。

1. 選擇**角色**，然後選擇**開發人員**。

1. 選擇 **Permissions (許可)** 標籤，選擇 **Add permissions (新增許可)**，然後選擇 **Attach policy (連接政策)**。

1. 請選擇 **JSON** 標籤。

1. 新增以下政策陳述式，以允許針對目的地帳戶中的 `UpdateData` 角色進行 `AssumeRole` 動作。請務必將 `Resource`元素中的 *DESTINATION-ACCOUNT-ID* 變更為目的地帳戶的實際 AWS 帳戶 ID。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::111122223333:role/UpdateData"
       }
   }
   ```

------

   `Allow` 效果明確地允許開發人員群組存取目的地帳戶中的 `UpdateData` 角色。任何嘗試存取角色的開發人員都會成功。

1. 選擇 **Review policy (檢閱政策)**。

1. 輸入**名稱**，例如 **allow-assume-S3-role-in-destination**。

1. 選擇**建立政策**。

在大多數環境中，可能不需要以下程序。不過，如果您使用 PowerUserAccess 許可，則一些群組可能已經能夠切換角色。下列程序顯示如何將 `"Deny"` 許可新增到分析師群組，以確保他們無法擔任角色。如果在您的環境中並不需要此程序，我們建議您不要新增。`"Deny"` 許可會讓整體許可情況變得更複雜，不易管理和了解。只在沒有更好的選項時使用 `"Deny"` 許可。

**若要修改分析師角色以拒絕擔任 `UpdateData` 角色的許可**

1. 選擇**角色**，然後選擇**分析師**。

1. 選擇 **Permissions (許可)** 標籤，選擇 **Add permissions (新增許可)**，然後選擇 **Attach policy (連接政策)**。

1. 請選擇 **JSON** 標籤。

1. 新增以下政策陳述式以拒絕 `UpdateData` 角色的 `AssumeRole` 動作。請務必將 `Resource`元素中的 *DESTINATION-ACCOUNT-ID* 變更為目的地帳戶的實際 AWS 帳戶 ID。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Deny",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::111122223333:role/UpdateData"
       }
   }
   ```

------

   `Deny` 效果明確拒絕分析師群組存取目的地帳戶中的 `UpdateData` 角色。任何嘗試存取角色的分析師都會收到存取遭拒的訊息。

1. 選擇**檢閱政策**。

1. 輸入**名稱**，例如 **deny-assume-S3-role-in-destination**。

1. 選擇**建立政策**。

開發人員角色現在擁有許可，可使用目的地帳戶中的 `UpdateData` 角色。會防止分析師角色使用 `UpdateData` 角色。

接下來，您可以了解開發人員 David 如何存取目的地帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。David 可以從 AWS 管理主控台 AWS CLI、 或 AWS API 存取儲存貯體。

## 透過切換角色測試存取
<a name="tutorial_cross-account-with-roles-3"></a>

完成此教學課程的前兩個步驟後，您會有一個角色可授予存取**目的地**帳戶中的資源。您在**來源**帳戶中也有一個角色，允許使用者使用該角色。此步驟討論如何測試從 AWS 管理主控台、 AWS CLI和 AWS API 切換到該角色。

若要取得您在使用 IAM 角色時可能遇到的常見問題說明，請參閱 [IAM 角色疑難排解](troubleshoot_roles.md)。

### 切換角色 (主控台)
<a name="switch-tutorial_cross-account-with-roles"></a>

如果 David 需要更新 **中目的地**帳戶中的資料 AWS 管理主控台，他可以使用**切換角色**來執行此操作。他會指定帳戶 ID 或別名和角色名稱，而其許可會立即切換到角色所允許的項目。然後他可以利用主控台來使用 `amzn-s3-demo-bucket-shared-container` 儲存貯體，但無法使用**目的地**中的任何其他資源。當 David 使用角色時，他也無法運用他在**來源**帳戶中的進階使用者權限。那是因為一次只有一組許可有效。

David 可以使用 IAM 提供的兩種方式來進入 **Switch Role (切換角色)** 頁面：
+ David 從他們的管理員那裡收到指向預先定義的 Switch Role (切換角色) 組態的連結。該連結是在 **Create Role (建立角色)** 精靈的最終頁面上，或在跨帳戶角色的 **Role Summary (角色摘要)** 頁面上，提供給管理員。選擇此連結會帶領 David 前往已填寫 **Account ID (帳戶 ID)** 和 **Role name (角色名稱)** 欄位的 **Switch Role (切換角色)** 頁面。David 需要做的只有選擇**切換角色**。
+ 管理員不會在電子郵件中傳送連結，但會改為傳送 **Account ID (帳戶 ID)** 號碼和 **Role Name (角色名稱)** 的值。若要切換角色，大衛必須手動輸入該值。下列程序中會以圖表說明：

**擔任角色**

1. David AWS 管理主控台 使用原始****帳戶的一般使用者登入 。

1. 他們選擇管理員電郵給他們的連結。這會將 David 導航到 **Switch Role** (切換角色) 頁面，其中帳戶 ID 或別名以及角色名稱資訊已填寫。

   —或—

   David 在導覽列上選擇他們的名稱 (Identity (身分) 選單)，然後選擇 **Switch Roles** (切換角色)。

   如果這是 David 第一次以這種方式嘗試存取 Switch Role (切換角色) 頁面，他首先停留在初次執行的 **Switch Role (切換角色)** 頁面。此頁面提供有關切換角色如何讓使用者跨 AWS 帳戶管理資源的額外資訊。David 必須在此頁面上選擇 **Switch Role (切換角色)**，以完成此程序的剩餘部分。

1. 接下來，為了存取角色，David 必須手動輸入目的地帳戶 ID 號碼 (`999999999999`) 和角色名稱 (`UpdateData`)。

   此外，David 想要監控 IAM 中目前作用中的角色 (以及相關聯的許可)。為了追蹤此資訊，他在 **Display Name (顯示名稱)** 文字方塊中輸入 `Destination`、選擇紅色選項，然後選擇 **Switch Role (切換角色)**。

1. David 現在可以使用 Amazon S3 主控台來使用 `UpdateData` 角色所具有許可的 Amazon S3 儲存貯體或任何其他資源。

1. 完成後，David 可以回到他們的原始許可。為了執行此作業，他們在導覽列上選擇**目的地**角色顯示名稱，然後選擇**返回到 David @ 111111111111**。

1. 下次 David 想要切換角色和在導覽列中選擇**身分**選單時，他會看到上次的目的地項目仍在那裡。他可以只要選擇該項目即可立即切換角色，而無需重新輸入帳戶 ID 和角色名稱。

### 切換角色 (AWS CLI)
<a name="switch-cli-tutorial_cross-account-with-roles"></a>

 如果 David 需要在命令列的**目的地**環境中工作，則可以使用 [AWS CLI](https://aws.amazon.com/cli/)。他執行 `aws sts assume-role` 命令，並傳遞角色 ARN 以取得該角色的暫時性安全憑證。然後，他會在環境變數中設定這些登入資料，以便後續 AWS CLI 命令使用角色的許可運作。雖然 David 使用該角色，但他無法在**來源**帳戶中使用他的進階使用者許可，因為一次只能有一組許可有效。

請注意，所有存取金鑰和權杖僅為範例，不能如下所示般使用。以您實際環境中的適當值取代。

**擔任角色**

1. David 會開啟命令提示視窗，並透過執行 命令來確認 AWS CLI 用戶端是否正常運作：

   ```
   aws help
   ```
**注意**  
David 的預設環境使用其預設設定檔的 `David` 使用者憑證，這是使用 `aws configure` 命令建立的。如需詳細資訊，請參閱 *AWS Command Line Interface 使用者指南*中的[設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration)。

1. 他透過執行以下命令開始切換角色程序，以切換到**目的地**帳戶中的 `UpdateData` 角色。他從建立角色的管理員角色收到角色 ARN。該命令也會要求您提供工作階段名稱，您可以選擇您想要的任何文字。

   ```
   aws sts assume-role --role-arn "arn:aws:iam::999999999999:role/UpdateData" --role-session-name "David-ProdUpdate"
   ```

   David 然後會在輸出中看到以下：

   ```
   {
       "Credentials": {
           "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
           "SessionToken": "AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLE
   CvSRyh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDy
   EXAMPLE9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3Uuysg
   sKdEXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLEsnf87e
   NhyDHq6ikBQ==",
           "Expiration": "2014-12-11T23:08:07Z",
           "AccessKeyId": "AKIAIOSFODNN7EXAMPLE"
       }
   }
   ```

1. David 在輸出的 Credentials (憑證) 區段看到他們需要的三個部分。
   + `AccessKeyId`
   + `SecretAccessKey`
   + `SessionToken`

   David 需要將 AWS CLI 環境設定為在後續呼叫中使用這些參數。如需設定憑證各種方式的資訊，請參閱[設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#config-settings-and-precedence)。您不能使用 `aws configure` 命令，因為它不支援擷取工作階段權杖。不過，您可以將資訊手動輸入到組態檔案中。由於這些是暫時性憑證，其過期時間相對較短，最簡單的方式是將它們新增至您目前命令列工作階段的環境。

1. 為新增三個值到環境，David 剪下並貼上前一個步驟的輸出到以下命令中。建議您剪下並貼上到簡單的文字編輯器，來處理工作階段權杖輸出中的換行問題。它必須新增為單一長字串，即使在這裡為清楚起見以換行方式顯示。

   以下範例顯示 Windows 環境中指定命令，其中 "set" 是用來建立環境變數的命令。在 Linux 或 macOS 電腦上，請改為使用命令 "export"。範例的所有其他部分在所有三個環境中均為有效。

   如需使用 Windows Powershell 工具的詳細資訊，請參閱[切換至 IAM 角色 (Tools for Windows PowerShell)](id_roles_use_switch-role-twp.md)

   ```
   set AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
   set AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   set AWS_SESSION_TOKEN=AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLECvS
   Ryh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDyEXA
   MPLEKEY9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3UusKd
   EXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLENhykxiHen
   DHq6ikBQ==
   ```

   此時，任何下列命令在這些憑證所識別角色的許可下執行。在 David 的案例中，為 `UpdateData` 角色。
**重要**  
您可以將常用的組態設定和憑證儲存在 AWS CLI維護的檔案中。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》中的[使用現有組態與憑證檔案](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-quickstart.html#getting-started-quickstart-existing)。**

1. 執行命令來存取目的地帳戶中的資源。在這個範例中，David 只需要使用下列命令列出他們的 S3 儲存貯體的內容。

   ```
   aws s3 ls s3://shared-container
   ```

   由於 Amazon S3 儲存貯體名稱是全域唯一，所以不需要指定擁有該儲存貯體的帳戶 ID。若要存取其他 AWS 服務的資源，請參閱該服務 AWS CLI 的文件，以取得參考其資源所需的命令和語法。

### 使用 AssumeRole (AWS API)
<a name="api-tutorial_cross-account-with-roles"></a>

當 David 需要從程式碼進行**目的地**帳戶的更新時，他可進行 `AssumeRole` 呼叫以擔任 `UpdateData` 角色。此呼叫會傳回他可用來存取**目的地**帳戶中 `amzn-s3-demo-bucket-shared-container` 儲存貯體的臨時憑證。David 可以使用這些憑證，來進行 API 呼叫以更新 `amzn-s3-demo-bucket-shared-container` 儲存貯體。不過，他無法進行 API 呼叫以存取**目的地**帳戶中任何其他資源，即使他在**來源**帳戶中具有進階使用者許可。

**擔任角色**

1. David 呼叫 `AssumeRole` 作為應用程式的一部分。他們必須指定 `UpdateData` ARN：`arn:aws:iam::999999999999:role/UpdateData`。

   來自 `AssumeRole` 呼叫的回應包含具有 `AccessKeyId` 和 `SecretAccessKey` 的暫時性憑證。也包含 `Expiration` 時間，指出憑證何時過期以及必須請求新憑證的時間。當您使用 AWS SDK 設定角色鏈結時，許多登入資料提供者會在登入資料過期之前自動重新整理登入資料。

1. David 使用暫時性憑證，進行 `s3:PutObject` 呼叫以更新 `amzn-s3-demo-bucket-shared-container` 儲存貯體。他們會將憑證作為 `AuthParams` 參數傳遞到 API 呼叫。由於臨時角色憑證只有 `amzn-s3-demo-bucket-shared-container` 儲存貯體的讀取和寫入存取權，因此目的地帳戶中的任何其他動作會被拒絕。

如需程式碼範例 (使用 Python)，請參閱 [切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)。

## 其他資源
<a name="tutorial_cross-account-with-roles-related"></a>

下列資源可協助您進一步了解本教學課程中的主題：
+ 如需有關 IAM 使用者的詳細資訊，請參閱 [IAM 身分](id.md)。
+ 如需使用 Amazon S3 儲存貯體的詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。
+  若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

## 摘要
<a name="tutorial_cross-account-with-roles-summary"></a>

您已完成跨帳戶 API 存取教學課程。您建立了一個角色，以建立與另一個帳戶的信任，並定義了受信任實體可採取的動作。然後，修改角色政策，以控制哪些 IAM 使用者可存取角色。因此，**來源**帳戶的開發人員可以透過使用臨時憑證，來更新**目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。

# IAM 教程：建立並連接您的第一個客戶受管政策
<a name="tutorial_managed-policies"></a>

在本教學課程中，您會使用 AWS 管理主控台 來建立[客戶受管政策](access_policies_managed-vs-inline.md#customer-managed-policies)，然後將該政策連接至您 中的 IAM 使用者 AWS 帳戶。您建立的政策允許 IAM 測試使用者 AWS 管理主控台 使用唯讀許可直接登入 。

此工作流程有三個基本步驟：

**[步驟 1：建立政策](#step1-create-policy)**  
根據預設，IAM 使用者沒有執行任何動作的許可。它們無法存取 AWS 管理主控台或管理其中的資料，除非您允許。在此步驟中，您建立客戶受管政策，其允許任何連接的使用者登入主控台。

**[步驟 2：連接政策](#step2-attach-policy)**  
當您將政策連接到使用者時，使用者會繼承與該政策相關聯的所有存取許可。在此步驟中，您會將新的政策連接到測試使用者。

**[步驟 3：測試使用者存取許可](#step3-test-access)**  
一旦連接政策，便可以使用者身分登入並測試政策。

## 先決條件
<a name="tutorial-managed-policies-prereqs"></a>

若要執行此教學課程中的步驟，您需具備以下內容：
+ 您可以具有管理許可的 IAM 使用者身分 AWS 帳戶 登入 。
+ 未擁有指派許可或群組成員資格的測試 IAM 使用者，如下所示：  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_managed-policies.html)

## 步驟 1：建立政策
<a name="step1-create-policy"></a>

在此步驟中，您會建立客戶受管政策，允許任何連接的使用者以唯讀存取 IAM 資料 AWS 管理主控台 的方式登入 。

**為您的測試使用者建立政策**

1. 以具有管理員許可的使用者身分登入 IAM 主控台 ([https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/))。

1. 在導覽窗格上選擇 **Policies (政策)**。

1. 在內容窗格中，選擇 **Create policy (建立政策)**。

1. 選擇 **JSON** 選項，並從下列 JSON 政策文件中複製文字。將此文字貼上至 **JSON** 文字方框中。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [ {
           "Effect": "Allow",
           "Action": [
               "iam:GenerateCredentialReport",
               "iam:Get*",
               "iam:List*"
           ],
           "Resource": "*"
       } ]
   }
   ```

------

1.  解決[政策驗證](access_policies_policy-validator.md)期間產生的任何安全性警告、錯誤或一般性警告，然後選擇 **Next** (下一步)。
**注意**  
您可以隨時切換**視覺化**與 **JSON** 編輯器選項。不過，如果您進行更改或在 **Visual editor** (視覺編輯工具) 索引標籤中選擇 **Review policy** (檢閱政策)，IAM 可能會調整您的政策結構以針對視覺編輯工具進行最佳化。如需詳細資訊，請參閱[政策結構調整](troubleshoot_policies.md#troubleshoot_viseditor-restructure)。

1. 在**檢視與建立**頁面上，針對政策名稱輸入 **UsersReadOnlyAccessToIAMConsole**。檢視政策授與的許可，然後選擇**建立政策**來儲存您的工作。

   新的政策會出現在受管政策清單中，並且已準備好連接。

## 步驟 2：連接政策
<a name="step2-attach-policy"></a>

接下來，將您剛建立的政策連接到測試 IAM 使用者。

**連接政策到您的測試使用者**

1. 在 IAM 主控台的導覽窗格中，選擇 **Policies (政策)**。

1. 在政策清單頂端的搜尋方塊中，開始輸入 **UsersReadOnlyAccesstoIAMConsole** 直到您可以看到您的政策。然後選擇清單中 **UsersReadOnlyAccessToIAMConsole** 旁的選項按鈕。

1. 選擇 **Actions** (動作) 按鈕，然後選擇 **Attach** (連接)。

1. 在 IAM 實體中，選擇篩選**使用者**的選項。

1. 在搜尋方塊中，開始輸入 **PolicyUser** 直到該使用者顯示在清單上。然後勾選清單中該使用者旁的方塊。

1. 選擇**連接政策**。

您可以連接政策到 IAM 測試使用者，這表示使用者現在擁有唯讀存取 IAM 主控台的許可。

## 步驟 3：測試使用者存取許可
<a name="step3-test-access"></a>

對於本教學，建議您以測試使用者身分登入來測試存取許可，如此才能了解使用者可能經歷的情況。

**以測試使用者登入來測試存取許可**

1. 以 `PolicyUser` 測試使用者身分登入位於 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 瀏覽主控台頁面並嘗試建立新的使用者或群組。請注意，`PolicyUser` 可以顯示資料，但無法建立或修改現有 IAM 資料。

## 相關資源
<a name="tutorial-managed-policies-addl-resources"></a>

如需相關資訊，請參閱下列資源：
+ [受管政策與內嵌政策](access_policies_managed-vs-inline.md)
+ [控制 IAM 使用者對 的存取 AWS 管理主控台](console_controlling-access.md)

## 摘要
<a name="tutorial-managed-policies-summary"></a>

現在您已成功完成所有建立和連接客戶受管政策的必要步驟。因此，您可以利用您的測試帳戶登入 IAM 主控台，以查看使用者的體驗。

# IAM 教學課程：定義根據標籤存取 AWS 資源的許可
<a name="tutorial_attribute-based-access-control"></a>

屬性型存取控制 (ABAC) 是一種授權策略，可根據屬性來定義許可。在 中 AWS，這些屬性稱為*標籤*。您可以將標籤連接至 IAM 資源，包括 IAM 實體 （使用者或角色） 和 AWS 資源。您可以定義使用標籤條件金鑰的政策，以根據主體的標籤來授與許可。當您使用標籤來控制對 AWS 資源的存取時，您可以允許您的團隊和資源以較少的政策變更 AWS 來成長。ABAC 政策比傳統 AWS 政策更靈活，需要您列出每個個別資源。如需 ABAC 及其優於傳統政策的詳細資訊，請參閱 [使用 ABAC 授權根據屬性定義許可](introduction_attribute-based-access-control.md)。

**注意**  
您必須傳遞每個工作階段標籤的單一值。 AWS Security Token Service 不支援多值工作階段標籤。

**Topics**
+ [

## 教學課程概觀
](#tutorial_attribute-based-access-control-overview)
+ [

## 先決條件
](#tutorial_abac_prereqs)
+ [

## 步驟 1：建立測試使用者
](#tutorial_abac_step1)
+ [

## 步驟 2：建立 ABAC 政策
](#tutorial_abac_step2)
+ [

## 步驟 3：建立角色
](#tutorial_abac_step3)
+ [

## 步驟 4：測試建立秘密
](#tutorial_abac_step4)
+ [

## 步驟 5：測試檢視秘密
](#tutorial_abac_step5)
+ [

## 步驟 6：測試可擴展性
](#tutorial_abac_step6)
+ [

## 步驟 7：測試更新和刪除秘密
](#tutorial_abac_step7)
+ [

## 摘要
](#tutorial-abac-summary)
+ [

## 相關資源
](#tutorial_abac_related)
+ [

# IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記
](tutorial_abac-saml.md)

## 教學課程概觀
<a name="tutorial_attribute-based-access-control-overview"></a>

本教學說明如何建立和測試政策，以允許具有主體標籤的 IAM 角色存取具有相符標籤的資源。當主體向 AWS發出請求時，會根據主體和資源標籤是否相符來授與其許可。此策略允許個人僅檢視或編輯其任務所需的 AWS 資源。

**案例**  
假設您是 Example Corporation 這間大型公司的首席開發人員，也是經驗豐富的 IAM 管理員。您很熟悉如何建立及管理 IAM 使用者、角色和政策。您想要確保您的開發工程師和品質保證團隊成員可以存取所需資源。您也需要可隨著公司成長而擴展的策略。

您可以選擇使用 AWS 資源標籤和 IAM 角色主體標籤，為支援它的服務實作 ABAC 策略，以 開頭 AWS Secrets Manager。若要了解哪些服務支援以標籤為基礎的授權，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。若要了解您可以在政策中搭配每個服務的動作和資源使用哪些標記條件金鑰，請參閱 [AWS 服務的動作、資源和條件金鑰](reference_policies_actions-resources-contextkeys.html)。您可以設定您的 SAML 類型或 Web 身分提供者，將[工作階段標籤](id_session-tags.md)傳遞至 AWS。當您的員工聯合到 時 AWS，其屬性會套用至其產生的委託人 AWS。您接著可以使用 ABAC 來根據這些屬性允許或拒絕許可。若要了解搭配 SAML 聯合身分使用工作階段標籤與本教學的不同，請參閱 [IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](tutorial_abac-saml.md)。

您的工程和品質保證團隊成員負責 **Pegasus** 或 **Unicorn** 專案。您可以選擇下列 3 個字元的專案和團隊標籤值：
+ `access-project` = `peg` 適用於 **Pegasus** 專案
+ `access-project` = `uni` 適用於 **Unicorn** 專案
+ `access-team` = `eng` 適用於工程團隊
+ `access-team` = `qas` 適用於品質保證團隊

此外，您選擇要求`cost-center`成本分配標籤來啟用自訂 AWS 帳單報告。如需詳細資訊，請參閱 *AWS 帳單與成本管理 使用者指南*中的[使用成本分配標籤](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。

**重要決策摘要**
+ 員工使用 IAM 使用者憑證登入，然後擔任其團隊和專案的 IAM 角色。如果您的公司有專屬身分系統，您可以設定聯合以允許員工在沒有 IAM 使用者的情況下擔任角色。如需更多詳細資訊，請參閱 [IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](tutorial_abac-saml.md)。
+ 相同的政策會連接至所有角色。動作會根據標籤而受允許或拒絕。
+ 員工可以建立新的資源，但僅限於將相同的標籤連接至套用到其角色的資源時。這可確保員工在建立資源之後能夠檢視資源。管理員不再需要使用新資源的 ARN 來更新政策。
+ 員工可以讀取其團隊所擁有的資源，不論專案為何。
+ 員工可以更新及刪除自己團隊和專案所擁有的資源。
+ IAM 管理員可以新增新專案的角色。他們可以建立並標記新的 IAM 使用者，以允許存取適當的角色。管理員不需要編輯政策來支援新的專案或團隊成員。

在此教學中，您將為每個資源加上標籤、為您的專案角色加上標籤並將政策新增至角色，以允許前述的行為。產生的政策允許角色 `Create`、`Read`、`Update` 和 `Delete` 存取以相同專案和團隊標籤所標記的資源。政策也允許跨專案 `Read` 存取以相同團隊標記的資源。

![\[圖表顯示兩個專案，其中角色僅限於在其專案外部唯讀存取，同時擁有在其自己的專案中建立、讀取、更新和刪除資源的許可。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/tutorial-abac-cross-project.png)


## 先決條件
<a name="tutorial_abac_prereqs"></a>

若要執行此教學課程中的步驟，您必須具備以下內容：
+ 您可以具有管理許可的使用者身分 AWS 帳戶 登入 。
+ 您的 12 位數帳戶 ID，用於在步驟 3 中建立角色。

  若要使用 尋找 AWS 您的帳戶 ID 號碼 AWS 管理主控台，請選擇右上角導覽列上的**支援**，然後選擇**支援中心**。帳戶號碼 (ID) 會顯示在左側導覽窗格。  
![\[支援 顯示帳戶號碼的中心頁面。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/account-id-support-center.console.png)
+ 體驗在 AWS 管理主控台中建立並編輯 IAM 使用者、角色和政策。不過，如果您需要記住 IAM 管理程序的協助，此教學提供的連結可讓您檢視逐步說明。

## 步驟 1：建立測試使用者
<a name="tutorial_abac_step1"></a>

針對測試，請建立四個 IAM 使用者，並授與其許可擔任具有相同標籤的角色。這可讓您更輕鬆地新增更多使用者到您的團隊。當您標記使用者時，使用者會自動取得擔任正確角色的存取權。如果使用者只在一個專案和團隊中工作，則您不必將使用者新增至角色的信任政策。

1. 建立下列名為 `access-assume-role` 的客戶受管政策。如需如何建立 JSON 政策的詳細資訊，請參閱 [建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。

**ABAC 政策：擔任任何 ABAC 角色，但僅限使用者和角色標籤相符時**  
下列政策允許使用者擔任您帳戶中名稱字首為 `access-` 的任何角色。角色也必須以與使用者相同的專案、團隊和成本中心標籤來標記。

   若要使用此政策，請將*斜體預留位置文字*取代為您的帳戶資訊。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "TutorialAssumeRole",
               "Effect": "Allow",
               "Action": "sts:AssumeRole",
               "Resource": "arn:aws:iam::111122223333:role/access-*",
               "Condition": {
                   "StringEquals": {
                       "iam:ResourceTag/access-project": "${aws:PrincipalTag/access-project}",
                       "iam:ResourceTag/access-team": "${aws:PrincipalTag/access-team}",
                       "iam:ResourceTag/cost-center": "${aws:PrincipalTag/cost-center}"
                   }
               }
           }
       ]
   }
   ```

------

   若要將本教學擴展為大量使用者，您可以將政策連接至群組，並將每個使用者新增至群組。如需詳細資訊，請參閱[建立 IAM 群組](id_groups_create.md)及[編輯 IAM 群組中的使用者](id_groups_manage_add-remove-users.md)。

1. 建立下列 IAM 使用者、連接 `access-assume-role` 許可政策。務必選取**為使用者提供 AWS 管理主控台的存取權限**，然後新增下列標籤。

       
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)

## 步驟 2：建立 ABAC 政策
<a name="tutorial_abac_step2"></a>

建立下列名為 **access-same-project-team** 的政策。您會在後續步驟將此政策新增至角色。如需如何建立 JSON 政策的詳細資訊，請參閱 [建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。

如需您可以針對本教學進行調整的其他政策，請參閱下列頁面：
+ [控制 IAM 主體的存取權限](access_iam-tags.md#access_iam-tags_control-principals)
+ [Amazon EC2：允許以程式設計方式和在主控台中開始或停止使用者已標記的 EC2 執行個體](reference_policies_examples_ec2_tag-owner.md)
+ [EC2：依據比對主體和資源的標籤啟動或停止執行個體](reference_policies_examples_ec2-start-stop-match-tags.md)
+ [EC2：依據標籤啟動或停止執行個體](reference_policies_examples_ec2-start-stop-tags.md)
+ [IAM：擔任具有特定標籤的角色](reference_policies_examples_iam-assume-tagged-role.md)

**ABAC 政策：僅在主體與資源標籤相符時，才存取 Secrets Manager 資源**  
下列政策允許主體建立、讀取、編輯及刪除資源，但僅限資源受標記為與主體相同的鍵值對時。當主體建立資源時，必須新增 `access-project`、`access-team`、和 `cost-center` 標籤，其值符合主體的標籤。此政策也允許新增選用的 `Name` 或 `OwnedBy` 標籤。

------
#### [ JSON ]

****  

```
{
 "Version":"2012-10-17",		 	 	 
 "Statement": [
     {
         "Sid": "AllActionsSecretsManagerSameProjectSameTeam",
         "Effect": "Allow",
         "Action": "secretsmanager:*",
         "Resource": "*",
         "Condition": {
             "StringEquals": {
                 "aws:ResourceTag/access-project": "${aws:PrincipalTag/access-project}",
                 "aws:ResourceTag/access-team": "${aws:PrincipalTag/access-team}",
                 "aws:ResourceTag/cost-center": "${aws:PrincipalTag/cost-center}"
             },
             "ForAllValues:StringEquals": {
                 "aws:TagKeys": [
                     "access-project",
                     "access-team",
                     "cost-center",
                     "Name",
                     "OwnedBy"
                 ]
             },
             "StringEqualsIfExists": {
                 "aws:RequestTag/access-project": "${aws:PrincipalTag/access-project}",
                 "aws:RequestTag/access-team": "${aws:PrincipalTag/access-team}",
                 "aws:RequestTag/cost-center": "${aws:PrincipalTag/cost-center}"
             }
         }
     },
     {
         "Sid": "AllResourcesSecretsManagerNoTags",
         "Effect": "Allow",
         "Action": [
             "secretsmanager:GetRandomPassword",
             "secretsmanager:ListSecrets"
         ],
         "Resource": "*"
     },
     {
         "Sid": "ReadSecretsManagerSameTeam",
         "Effect": "Allow",
         "Action": [
             "secretsmanager:Describe*",
             "secretsmanager:Get*",
             "secretsmanager:List*"
         ],
         "Resource": "*",
         "Condition": {
             "StringEquals": {
                 "aws:ResourceTag/access-team": "${aws:PrincipalTag/access-team}"
             }
         }
     },
     {
         "Sid": "DenyUntagSecretsManagerReservedTags",
         "Effect": "Deny",
         "Action": "secretsmanager:UntagResource",
         "Resource": "*",
         "Condition": {
             "ForAnyValue:StringLike": {
                 "aws:TagKeys": "access-*"
             }
         }
     },
     {
         "Sid": "DenyPermissionsManagement",
         "Effect": "Deny",
         "Action": "secretsmanager:*Policy",
         "Resource": "*"
     }
 ]
}
```

------

**此政策的功能為何？**
+ `AllActionsSecretsManagerSameProjectSameTeam` 陳述式允許在所有相關資源上執行此服務的所有動作，但僅限於資源標籤符合主體標籤時。透過將 `"Action": "secretsmanager:*"` 新增至政策，政策會隨著 Secrets Manager 成長而成長。如果 Secrets Manager 新增新的 API 操作，您不需要將該動作新增至陳述式。陳述式使用三個條件區塊來實作 ABAC。只有在三個區塊全部傳回 true 時，才會允許此請求。
  + 如果資源上有指定的標籤鍵，而且其值符合主體的標籤，則此陳述式的第一個條件區塊會傳回 true。此區塊會為不相符的標籤或不支援資源標記的動作傳回 false。若要了解此區塊不允許哪些動作，請參閱 [動作、資源和條件金鑰 AWS Secrets Manager](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awssecretsmanager.html)。該頁面顯示對 [**Secret** (秘密) 資源類型](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awssecretsmanager.html#awssecretsmanager-resources-for-iam-policies)執行的動作支援 `secretsmanager:ResourceTag/tag-key` 條件索引鍵。部分 [Secrets Manager 動作](https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awssecretsmanager.html#awssecretsmanager-actions-as-permissions)不支援該資源類型，包括 `GetRandomPassword` 和 `ListSecrets`。您必須建立額外的陳述式以允許這些動作。
  + 如果請求中傳遞的每個標籤鍵都包含在指定清單中，則第二個條件區塊會傳回 true。此動作是使用 `ForAllValues` 搭配 `StringEquals` 條件運算子來完成。如果未傳遞金鑰或金鑰集的子集，則條件會傳回 true。這允許了不允許在請求中傳遞標籤的 `Get*` 操作。如果申請者包含了不在清單中的標籤鍵，則條件會傳回 false。在請求中傳遞的每個標籤鍵，都必須符合此清單的成員。如需詳細資訊，請參閱[用於多值內容索引鍵的集運算子](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)。
  + 如果請求支援傳遞標籤 (如果這三個標籤都存在)，且符合主體標籤值，則第三個條件區塊會傳回 true。如果請求不支援傳遞標籤，此區塊也會傳回 true。這要歸功於條件運算子中的 [`...IfExists`](reference_policies_elements_condition_operators.md#Conditions_IfExists)。如果在支援該標籤的動作期間沒有傳遞任何標籤，或標籤鍵和值不相符，則區塊會傳回 false。
+ `AllResourcesSecretsManagerNoTags` 陳述式允許第一個陳述式不允許的 `GetRandomPassword` 和 `ListSecrets` 動作。
+ 如果主體所標記的存取團隊標籤與資源相同，則 `ReadSecretsManagerSameTeam` 陳述式允許唯讀操作。無論專案或成本中心標籤為何，都允許此操作。
+ `DenyUntagSecretsManagerReservedTags` 陳述式拒絕從 Secrets Manager 移除鍵開頭為 "access-" 之標籤的請求。這些標籤用於控制對資源的存取，因此移除標籤可能會移除許可。
+ `DenyPermissionsManagement` 陳述式拒絕建立、編輯或刪除 Secrets Manager 以資源為基礎的政策的存取。這些政策可用來變更秘密的許可。

**重要**  
此政策使用策略來允許服務的所有動作，但會明確拒絕更改許可的動作。拒絕動作會覆寫任何其他允許主體執行該動作的政策。這可能會產生意外的結果。根據最佳實務，只有在該動作無論何種情況都不應允許的情況下，才使用明確拒絕。否則，請允許包含個別動作的清單，且將不需要的動作預設拒絕。

## 步驟 3：建立角色
<a name="tutorial_abac_step3"></a>

建立下列 IAM 角色，並連接您在先前步驟中建立的 **access-same-project-team** 政策。如需建立 IAM 角色的詳細資訊，請參閱 [建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)。如果您選擇使用聯合，而非 IAM 使用者和角色，請參閱 [IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](tutorial_abac-saml.md)。


| 任務職能 | 角色名稱 | 角色標籤 | 角色描述 | 
| --- | --- | --- | --- | 
|  Pegasus 工程專案  |  access-peg-engineering  |  access-project = `peg` access-team = `eng` cost-center = `987654`   | 允許工程師讀取所有工程資源，並建立和管理 Pegasus 工程資源。 | 
|  Pegasus 品質保證專案  |  access-peg-quality-assurance  |  access-project = `peg` access-team = `qas` cost-center = `987654`  |  允許 QA 團隊讀取所有 QA 資源，並建立和管理所有 Pegasus QA 資源。  | 
|  Unicorn 工程專案  |  access-uni-engineering  |  access-project= `uni` access-team = `eng` cost-center = `123456`  | 允許工程師讀取所有工程資源，並建立和管理 Unicorn 工程資源。 | 
|  Unicorn Quality Assurance 專案  |  access-uni-quality-assurance  |  access-project = `uni` access-team = `qas` cost-center = `123456`   |  允許 QA 團隊讀取所有 QA 資源，並建立和管理所有 Unicorn QA 資源。  | 

## 步驟 4：測試建立秘密
<a name="tutorial_abac_step4"></a>

連接至角色的許可政策允許員工建立秘密。只有在秘密以其專案、團隊和成本中心來標記時，才允許此操作。以使用者身分登入來確認您的許可如預期般運作且擔任正確角色，並測試 Secrets Manager 中的活動。

**測試使用和不使用必要的標籤來建立秘密**

1. 在您的主要瀏覽器視窗中，保持以管理員使用者的身分登入，讓您可以檢閱 IAM 中的使用者、角色和政策。使用瀏覽器無痕式視窗或個別的瀏覽器進行測試。前往以下位置以 `access-Arnav-peg-eng` IAM 使用者身分登入 Secrets Manager 主控台：[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 嘗試切換到 `access-uni-engineering` 角色。

   此操作會失敗，因為 `access-project` 和 `cost-center` 標籤值與 `access-Arnav-peg-eng` 使用者和 `access-uni-engineering` 角色不相符。

   如需在 中切換角色的詳細資訊 AWS 管理主控台，請參閱 [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)

1. 切換到 `access-peg-engineering` 角色。

1. 使用下列資訊存放新的秘密。若要了解如何存放秘密，請參閱 *AWS Secrets Manager 使用者指南*中的[建立基本秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)。
**重要**  
Secrets Manager 會顯示警示，指出您沒有與 Secrets Manager 搭配使用之其他 AWS 服務的許可。例如，若要建立 Amazon RDS 資料庫的憑證，您必須擁有描述 RDS 執行個體、RDS 叢集和 Amazon Redshift 叢集的許可。您可以忽略這些提醒，因為您未在本教學課程中使用這些特定 AWS 服務。

   1. 在 **Select secret type (選取秘密類型)** 區段中，選擇 **Other type of secrets (其他類型的秘密)**。在兩個文字方塊中，輸入 `test-access-key` 和 `test-access-secret`。

   1. 針對 **Secret name (秘密名稱)** 欄位輸入 `test-access-peg-eng`。

   1. 從下表新增不同的標籤組合，並檢視預期的行為。

   1. 選擇 **Store (存放)** 以嘗試建立秘密。在儲存失敗時，返回先前的 Secrets Manager 主控台頁面，並使用下表中的下一個標籤集。最後一個標籤集會受到允許，且將成功建立秘密。

   下表顯示 `test-access-peg-eng` 角色的 ABAC 標籤組合。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)

1. 登出並針對每個下列角色和標籤值來重複此程序的前三個步驟。在此程序的第四個步驟中，測試任何遺漏的標籤、選用標籤、不允許的標籤，和您選擇的無效標籤值。然後，使用必要標籤來建立具有下列標籤和名稱的秘密。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)

## 步驟 5：測試檢視秘密
<a name="tutorial_abac_step5"></a>

您連接到每個角色的政策允許員工檢視以其團隊名稱標記的任何秘密，不論他們的專案為何。在 Secrets Manager 中測試您的角色，確認您的許可如預期般運作。

**測試檢視包含和不含必要標籤的秘密**

1. 使用下列其中一個 IAM 使用者身分登入:
   + `access-Arnav-peg-eng`
   + `access-Mary-peg-qas`
   + `access-Saanvi-uni-eng`
   + `access-Carlos-uni-qas`

1. 切換至相符的角色：
   + `access-peg-engineering`
   + `access-peg-quality-assurance`
   + `access-uni-engineering`
   + `access-uni-quality-assurance`

   如需在 中切換角色的詳細資訊 AWS 管理主控台，請參閱 [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)。

1. 在左側的導覽窗格中，選擇選單圖示以展開選單，然後選擇 **Secrets (秘密)**。

1. 無論您目前的角色為何，您應該都會看到資料表中的全部四個秘密。這是預期的結果，因為名為 `access-same-project-team` 的政策允許對所有資源執行 `secretsmanager:ListSecrets` 動作。

1. 選擇其中一個秘密的名稱。

1. 在秘密的詳細資訊頁面上，角色的標籤將決定您是否可以檢視頁面內容。將您的角色名稱與秘密名稱進行比較。如果這兩個名稱具有相同團隊名稱，則 `access-team` 標籤會相符。如果不相符，則會拒絕存取。

   下表顯示每個角色的 ABAC 秘密檢視行為。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)

1. 從頁面頂端的頁面導覽路徑中，選擇 **Secrets (秘密)** 以返回秘密清單。使用不同角色重複此程序中的步驟，以測試您是否可以檢視每個秘密。

## 步驟 6：測試可擴展性
<a name="tutorial_abac_step6"></a>

偏好以屬性為基礎的存取控制 (ABAC) 多過以角色為基礎的存取控制 (RBAC) 的重要原因是可擴展性。當您的公司新增專案、團隊或人員時 AWS，您不需要更新 ABAC 驅動的政策。例如，假設 Example Company 為名為 **Centaur** 的新專案提供資金。一位名為 Saanvi Sarkar 的工程師將擔任 **Centaur** 的主要工程師，同時繼續進行 **Unicorn** 專案。Sanvi 還將檢閱 **Peg** 專案的工作。另外還有幾位新聘的工程師，包括 Nikhil Jayashankar，只負責 **Centaur** 專案。

**將新專案新增至 AWS**

1. 以 IAM 管理原使用者身分登入，並開啟位於 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在左側的導覽窗格中，選擇 **Roles (角色)**，然後新增名為 `access-cen-engineering` 的 IAM 角色 將 **access-same-project-team** 許可政策連接至角色，並新增下列角色標籤：
   + `access-project` = `cen`
   + `access-team` = `eng`
   + `cost-center` = `101010`

1. 在左側導覽窗格中，選擇 **Users (使用者)**。

1. 新增名為 `access-Nikhil-cen-eng` 的新使用者、連接名為 `access-assume-role` 的政策，並新增以下使用者標籤。
   + `access-project` = `cen`
   + `access-team` = `eng`
   + `cost-center` = `101010`

1. 使用 [步驟 4：測試建立秘密](#tutorial_abac_step4) 和 [步驟 5：測試檢視秘密](#tutorial_abac_step5) 中的程序。在另一個瀏覽器視窗中測試 Nikhil 是否只能建立 **Centaur** 工程秘密，並且可以檢視所有工程秘密。

1. 在您以管理員身分登入的主要瀏覽器視窗中，選擇使用者 `access-Saanvi-uni-eng`。

1. 在 **Permissions (許可)** 標籤上，移除 **access-assume-role** 許可政策。

1. 新增下列名為 `access-assume-specific-roles` 的內嵌政策 。如需將內嵌政策新增至使用者的詳細資訊，請參閱 [為使用者或角色嵌入內嵌政策 (主控台)](access_policies_manage-attach-detach.md#embed-inline-policy-console)。

**ABAC 政策：僅擔任特定角色**  
此政策允許 Saanvi 擔任 **Pegasus** 和 **Centaur** 專案的工程角色。您必須建立此自訂政策，因為 IAM 不支援多值標籤。您無法以 `access-project` = `peg` 和 `access-project` = `cen` 來標記 Saanvi 的使用者。此外， AWS 授權模型不能同時符合這兩個值。如需詳細資訊，請參閱[在 IAM 和 中標記的規則 AWS STS](id_tags.md#id_tags_rules)。您必須改為手動指定她可以擔任的兩個角色。

   若要使用此政策，請將*斜體預留位置文字*取代為您的帳戶資訊。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "TutorialAssumeSpecificRoles",
               "Effect": "Allow",
               "Action": "sts:AssumeRole",
               "Resource": [
                   "arn:aws:iam::111122223333:role/access-peg-engineering",
                   "arn:aws:iam::111122223333:role/access-cen-engineering"
               ]
           }
       ]
   }
   ```

------

1. 使用 [步驟 4：測試建立秘密](#tutorial_abac_step4) 和 [步驟 5：測試檢視秘密](#tutorial_abac_step5) 中的程序。在另一個瀏覽器視窗中，確認 Saanvi 可以擔任這兩個角色。根據角色的標籤，檢查她是否只能為她的專案、團隊和成本中心建立秘密。同時確認她可以檢視工程團隊所擁有之任何秘密的詳細資訊，包括她剛建立的秘密。

## 步驟 7：測試更新和刪除秘密
<a name="tutorial_abac_step7"></a>

連接至角色的 `access-same-project-team` 政策允許員工更新和刪除任何以其專案、團隊和成本中心加上標籤的秘密。在 Secrets Manager 中測試您的角色，確認您的許可如預期般運作。

**測試更新和刪除含有與不含必要標籤的秘密**

1. 使用下列其中一個 IAM 使用者身分登入:
   + `access-Arnav-peg-eng`
   + `access-Mary-peg-qas`
   + `access-Saanvi-uni-eng`
   + `access-Carlos-uni-qas`
   + `access-Nikhil-cen-eng`

1. 切換至相符的角色：
   + `access-peg-engineering`
   + `access-peg-quality-assurance`
   + `access-uni-engineering`
   + `access-peg-quality-assurance`
   + `access-cen-engineering`

   如需在 中切換角色的詳細資訊 AWS 管理主控台，請參閱 [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)。

1. 針對每個角色嘗試更新秘密描述，然後嘗試刪除下列秘密。如需詳細資訊，請參閱*AWS Secrets Manager 使用者指南*中的[修改秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_update-secret.html)以及[刪除與還原秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_delete-restore-secret.html)。

   下表顯示每個角色的 ABAC 秘密更新和刪除行為。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)

## 摘要
<a name="tutorial-abac-summary"></a>

您現在已成功完成使用標籤進行以屬性為基礎的存取控制 (ABAC) 所需的所有步驟。您已學會如何定義標記策略。您已將該策略套用到主體和資源。您已建立並套用了實施 Secrets Manager 策略的政策。您也已了解當您新增專案和團隊成員時，ABAC 可以輕鬆擴展。因此，您可以使用測試角色登入 IAM 主控台，並體驗如何在 AWS中使用 ABAC 標籤。

**注意**  
您已新增僅在特定條件下允許執行動作的政策。如果您將不同的政策套用至具有更廣泛許可的使用者或角色，則動作可能不會受限為需要標記。例如，如果您使用 `AdministratorAccess` AWS 受管政策為使用者提供完整的管理許可，則這些政策不會限制該存取。更多涉及多個政策時如何決定許可的詳細資訊，請參閱 [AWS 強制執行程式碼邏輯如何評估允許或拒絕存取的請求](reference_policies_evaluation-logic_policy-eval-denyallow.md)。

## 相關資源
<a name="tutorial_abac_related"></a>

如需相關資訊，請參閱下列資源：
+ [使用 ABAC 授權根據屬性定義許可](introduction_attribute-based-access-control.md)
+ [AWS 全域條件內容索引鍵](reference_policies_condition-keys.md)
+ [建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)
+ [AWS Identity and Access Management 資源的標籤](id_tags.md)
+ [使用標籤控制對 AWS 資源的存取](access_tags.md)
+ [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)
+ [IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](tutorial_abac-saml.md)

若要了解如何監控帳戶中的標籤，請參閱[使用無伺服器工作流程和 Amazon CloudWatch Events 監控 AWS 資源上的標籤變更](https://aws.amazon.com/blogs/mt/monitor-tag-changes-on-aws-resources-with-serverless-workflows-and-amazon-cloudwatch-events/)。

# IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記
<a name="tutorial_abac-saml"></a>

屬性為基礎的存取控制 (ABAC) 是一種授權策略，可根據屬性來定義許可。在 中 AWS，這些屬性稱為標籤。您可以將標籤連接至 IAM 資源，包括 IAM 實體 （使用者或角色） 和 AWS 資源。當實體用於向 提出請求時 AWS，它們會成為委託人，而這些委託人包含標籤。

您也可以在擔任角色或與使用者聯合身分時傳遞[工作階段標籤](id_session-tags.md)。然後您可以定義使用標籤條件索引鍵的政策，以根據主體的標籤來授與許可。當您使用標籤來控制對 AWS 資源的存取 ，您就是允許團隊和資源能夠用更少的 AWS 政策變更來增長。ABAC 政策比傳統 AWS 政策更靈活，需要您列出每個個別資源。如需 ABAC 及其優於傳統政策的詳細資訊，請參閱 [使用 ABAC 授權根據屬性定義許可](introduction_attribute-based-access-control.md)。

如果您的公司使用 SAML 類型的身分提供者 (IdP) 來管理企業使用者身分，您可以將 SAML 屬性用於 AWS中精細的存取控制。屬性可包含成本中心識別符、使用者電子郵件地址、部門分類和專案指派。當您將這些屬性做為工作階段標籤傳遞時，您接著便可以根據這些工作階段標籤來控制對 AWS 的存取。

如要將 SAML 屬性傳遞到您的工作階段主體來完成 [ABAC 教學](tutorial_attribute-based-access-control.md)，請使用本主題中包含的變更，完成 [IAM 教學課程：定義根據標籤存取 AWS 資源的許可](tutorial_attribute-based-access-control.md) 中的任務。

## 先決條件
<a name="tutorial_abac-saml-prerequisites"></a>

如要執行步驟以使用 ABAC 的 SAML 工作階段標籤，您必須已具備以下項目：
+ 對 SAML 類型 IdP 的存取，可讓您使用特定屬性建立測試使用者。
+ 以具有管理許可的使用者身分登入的能力。
+ 體驗在 AWS 管理主控台中建立並編輯 IAM 使用者、角色和政策。不過，如果您需要記住 IAM 管理程序的協助，ABAC 教學課程提供的連結可讓您檢視逐步說明。
+ 在 IAM 中體驗設定 SAML 類型的 IdP。如要檢視更多詳細資訊及更詳細 IAM 文件的連結，請參閱 [使用 AssumeRoleWithSAML 傳遞工作階段標籤](id_session-tags.md#id_session-tags_adding-assume-role-saml)。

## 步驟 1：建立測試使用者
<a name="tutorial_abac-saml-step1"></a>

請跳過 [步驟 1：建立測試使用者](tutorial_attribute-based-access-control.md#tutorial_abac_step1) 中的說明。由於您的身分是定義在您的供應商中，您不需要為您的員工新增 IAM 使用者。

## 步驟 2：建立 ABAC 政策
<a name="tutorial_abac-saml-step2"></a>

遵循 [步驟 2：建立 ABAC 政策](tutorial_attribute-based-access-control.md#tutorial_abac_step2) 中的說明，在 IAM 中建立指定受管政策。

## 步驟 3：建立和設定 SAML 角色
<a name="tutorial_abac-saml-step3"></a>

當您使用 SAML 的 ABAC 教學課程時，您必須執行其他步驟來建立角色、設定 SAML IdP，以及啟用 AWS 管理主控台 存取。如需詳細資訊，請參閱[步驟 3：建立角色](tutorial_attribute-based-access-control.md#tutorial_abac_step3)。

### 步驟 3A：建立 SAML 角色
<a name="tutorial_abac-saml-step3a"></a>

建立單一角色，該角色信任您的 SAML 身分提供者，以及您在步驟 1 中建立的 `test-session-tags` 使用者。ABAC 教學會使用具備不同角色標籤的不同角色。因為您是從您的 SAML IdP 傳遞工作階段標籤，您只需要一個角色。若要了解如何建立 SAML 類型的角色，請參閱 [為 SAML 2.0 聯合身分建立角色 (主控台)](id_roles_create_for-idp_saml.md)。

將角色命名為 `access-session-tags`。將 `access-same-project-team` 許可政策連接到角色。編輯角色信任政策，以使用以下政策。如需如何編輯角色信任關係的詳細說明，請參閱 [更新角色信任政策](id_roles_update-role-trust-policy.md)。

以下角色信任政策會允許您的 SAML 身分提供者和 `test-session-tags` 使用者擔任角色。當 SAML 身分提供者和該使用者擔任角色時，必須傳遞三個指定工作階段標籤。`sts:TagSession` 動作是允許傳遞工作階段標籤的必要項目。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowSamlIdentityAssumeRole",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:TagSession"
            ],
            "Principal": {"Federated":"arn:aws:iam::123456789012:saml-provider/ExampleCorpProvider"},
            "Condition": {
                "StringLike": {
                    "aws:RequestTag/cost-center": "*",
                    "aws:RequestTag/access-project": "*",
                    "aws:RequestTag/access-team": [
                        "eng",
                        "qas"
                    ]
                },
                "StringEquals": {"SAML:aud": "https://signin.aws.amazon.com/saml"}
            }
        }
    ]
}
```

------

`AllowSamlIdentityAssumeRole` 陳述式允許工程和品質保證團隊的成員在 AWS 從 Example Corporation IdP 聯合到 時擔任此角色。`ExampleCorpProvider` SAML 供應商是在 IAM 中定義。管理員已設定 SAML 聲明，傳遞三個必要的工作階段標籤。聲明可以傳遞其他標籤，但必須要有這三個標籤。身分的屬性可針對 `cost-center` 和 `access-project` 標籤具備任何值。但是，`access-team` 屬性值必須與 `eng` 或 `qas` 相符，才能指出身分是位於 Engineering 或 Quality Assurance 團隊。

### 步驟 3B：設定 SAML IdP
<a name="tutorial_abac-saml-step3b"></a>

設定您的 SAML IdP，將 `cost-center`、`access-project` 和 `access-team` 屬性做為工作階段標籤傳遞。如需更多詳細資訊，請參閱 [使用 AssumeRoleWithSAML 傳遞工作階段標籤](id_session-tags.md#id_session-tags_adding-assume-role-saml)。

若要將這些屬性做為工作階段標籤傳遞，請在您的 SAML 聲明中包含下列元素。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:cost-center">
  <AttributeValue>987654</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:access-project">
  <AttributeValue>peg</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:access-team">
  <AttributeValue>eng</AttributeValue>
</Attribute>
```

### 步驟 3C：啟用主控台存取
<a name="tutorial_abac-saml-step3b"></a>

為您的聯合 SAML 使用者啟用主控台存取。如需更多詳細資訊，請參閱 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。

## 步驟 4：測試建立秘密
<a name="tutorial_abac-saml-step4"></a>

 AWS 管理主控台 使用 `access-session-tags`角色聯合到 。如需詳細資訊，請參閱[啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。然後遵循 [步驟 4：測試建立秘密](tutorial_attribute-based-access-control.md#tutorial_abac_step4) 中的說明來建立秘密。搭配屬性使用不同的 SAML 身分，來匹配 ABAC 教學中指出的標籤。如需更多詳細資訊，請參閱 [步驟 4：測試建立秘密](tutorial_attribute-based-access-control.md#tutorial_abac_step4)。

## 步驟 5：測試檢視秘密
<a name="tutorial_abac-saml-step5"></a>

遵循 [步驟 5：測試檢視秘密](tutorial_attribute-based-access-control.md#tutorial_abac_step5) 中的說明來檢視您在上一個步驟中建立的秘密。搭配屬性使用不同的 SAML 身分，來匹配 ABAC 教學中指出的標籤。

## 步驟 6：測試可擴展性
<a name="tutorial_abac-saml-step6"></a>

遵循 [步驟 6：測試可擴展性](tutorial_attribute-based-access-control.md#tutorial_abac_step6) 中的說明來測試可擴展性。請使用下列屬性在您的 SAML 類型 IdP 中新增新的身分，來執行此作業：
+ `cost-center = 101010`
+ `access-project = cen`
+ `access-team = eng`

## 步驟 7：測試更新和刪除秘密
<a name="tutorial_abac-saml-step7"></a>

遵循 [步驟 7：測試更新和刪除秘密](tutorial_attribute-based-access-control.md#tutorial_abac_step7) 中的說明來更新和刪除秘密。搭配屬性使用不同的 SAML 身分，來匹配 ABAC 教學中指出的標籤。

**重要**  
刪除您建立的所有秘密來避免產生費用。如需關於 Secrets Manager 定價的詳細資訊，請參閱 [AWS Secrets Manager 定價](https://aws.amazon.com/secrets-manager/pricing/)。

## 摘要
<a name="tutorial-abac-saml-summary"></a>

您現在已成功完成使用 SAML 工作階段標籤和資源標籤進行許可管理必要的所有步驟。

**注意**  
您已新增僅在特定條件下允許執行動作的政策。如果您將不同的政策套用至具有更廣泛許可的使用者或角色，則動作可能不會受限為需要標記。例如，如果您使用 `AdministratorAccess` AWS 受管政策為使用者提供完整的管理許可，則這些政策不會限制該存取。更多涉及多個政策時如何決定許可的詳細資訊，請參閱 [AWS 強制執行程式碼邏輯如何評估允許或拒絕存取的請求](reference_policies_evaluation-logic_policy-eval-denyallow.md)。

# IAM 教學課程：允許使用者管理其憑證和 MFA 設定
<a name="tutorial_users-self-manage-mfa-and-creds"></a>

您可以允許使用者在**安全憑證**頁面上自行管理其多重要素驗證 (MFA) 裝置和憑證。您可以使用 AWS 管理主控台 來設定登入資料 （存取金鑰、密碼、簽署憑證和 SSH 公有金鑰）、刪除或停用不需要的登入資料，並為使用者啟用 MFA 裝置。當使用者人數較少時，它十分好用。但隨著使用者人數增加，這個任務很快會變得非常耗時。本教程是為您介紹如何實現這些最佳實務，而不給您的管理員帶來負擔。

本教學課程示範如何允許使用者存取 AWS 服務，但**僅限於**使用者使用 MFA 登入時。如果未使用 MFA 裝置登入，則使用者無法存取其他服務。

此工作流程有三個基本步驟。

**[步驟 1：建立政策以實施 MFA 登入](#tutorial_mfa_step1)**  
建立一個客戶受管政策，其禁止***除***少數 IAM 動作之外的所有動作。這些例外狀況允許使用者變更自己的憑證，並在**安全憑證**頁面上管理 MFA 裝置。如需存取該頁面的詳細資訊，請參閱 [IAM 使用者如何變更他們自己的密碼 (主控台)](id_credentials_passwords_user-change-own.md#ManagingUserPwdSelf-Console)。

**[步驟 2：將政策連接到您的測試使用者群組](#tutorial_mfa_step2)**  
建立一個使用者群組，其成員在使用 MFA 登入時擁有對所有 Amazon EC2 動作的完全存取權。若要建立這類使用者群組，請同時連接名為 的 AWS 受管政策，`AmazonEC2FullAccess`以及您在第一個步驟中建立的客戶受管政策。

**[步驟 3：測試您的使用者存取權限](#tutorial_mfa_step3)**  
以測試使用者身分登入，驗證在使用者建立 MFA 裝置*之前*對 Amazon EC2 的存取被封鎖。之後使用者可以使用該裝置登入。

## 先決條件
<a name="tutorial_mfa_prereqs"></a>

若要執行此教學課程中的步驟，您必須具備以下內容：
+ 您可以具有管理許可的 IAM 使用者身分 AWS 帳戶 登入 。
+ 您在步驟 1 中輸入政策的帳戶 ID 號碼。

  若要尋找您的帳戶 ID 編號，請在頁面頂部的導覽列上，選擇 **Support (支援)**，然後選擇 **Support Center (支援中心)**。您可以在此頁面的 **Support (支援)** 選單下尋找您的帳戶 ID。
+ [虛擬 (軟體式) MFA 裝置](id_credentials_mfa_enable_virtual.md)、[FIDO 安全性金鑰](id_credentials_mfa_enable_fido.md)，或[硬體式 MFA 裝置](id_credentials_mfa_enable_physical.md)。
+ 一個做為群組成員的測試 IAM 使用者，如下所示：


| 使用者名稱 | 使用者名稱說明 | 使用者群組名稱 | 新增使用者為成員 | 使用者群組說明 | 
| --- | --- | --- | --- | --- | 
| MFAUser | 僅選擇 啟用主控台存取 (選用) 選項，並指定一組密碼。 | EC2MFA | MFAUser | 請勿連接任何政策或者授與許可給此使用者群組。 | 

## 步驟 1：建立政策以實施 MFA 登入
<a name="tutorial_mfa_step1"></a>

首先建立一個 IAM 客戶受管政策，除 IAM 使用者對管理其自有憑證和 MFA 裝置所需的許可權外，該政策拒絕其他所有許可。

1. 以具有管理員登入資料的使用者身分登入 AWS 管理主控台。為了遵循 IAM 最佳實務，請勿使用您的 AWS 帳戶根使用者 登入資料登入。
**重要**  
 IAM [最佳實務](best-practices.md)建議您要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取 ，而不是使用具有長期憑證的 IAM 使用者。建議您僅將 IAM 使用者用於聯合身分使用者不支援的[特定使用案例](gs-identities-iam-users.md)。

1. 在 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 中開啟 IAM 主控台。

   

1. 在導覽窗格中，選擇 **Policies (政策)**，然後選擇 **Create policy (建立政策)**。

1. 選擇 **JSON** 標籤並從下列 JSON 政策文件複製文字：[AWS：允許經過 MFA 驗證的 IAM 使用者在「安全憑證」頁面中管理其憑證。](reference_policies_examples_aws_my-sec-creds-self-manage.md)。

1. 將此政策文字貼上至 **JSON** 文字方框中。解決政策驗證期間產生的任何安全性警告、錯誤或一般性警告，然後選擇**下一步**。
**注意**  
您可以隨時切換**視覺化編輯器**與 **JSON** 選項。但是，上方的政策會包含 `NotAction` 元素，其不受視覺化編輯器支援。針對此政策，您會在 **Visual editor (視覺化編輯器)** 標籤上看到一個通知。返回 **JSON** 以繼續處理此政策。  
本範例政策不允許使用者在首次登入 AWS 管理主控台 時重設密碼。在新使用者登入並重設密碼之前，建議您不要將許可授予給他們。

1. 在**檢視與建立**頁面上，針對政策名稱輸入 **Force\$1MFA**。針對政策說明，在**標籤**區域中輸入 **This policy allows users to manage their own passwords and MFA devices but nothing else unless they authenticate with MFA.**，您可以選擇性地新增標籤鍵值對至客戶管理政策。檢視政策授與的許可，然後選擇**建立政策**來儲存您的工作。

   新的政策會出現在受管政策清單中，並且已準備好連接。

## 步驟 2：將政策連接到您的測試使用者群組
<a name="tutorial_mfa_step2"></a>

接下來，您將兩個政策連接到 IAM 使用者 群組，將使用該群組授與以 MFA 提供保護的許可。

1. 在導覽窗格中，選擇 **User groups (使用者群組) **。

1. 在搜尋方塊中，輸入 **`EC2MFA`**，然後在清單中選擇群組名稱 (而非核取方塊)。

1. 選擇 **許可** 標籤、選擇 **新增許可**，然後選擇 **連接政策**。

1. 在 **Attach permission policies to EC2MFA group (將許可政策連接到 EC2MFA 群組)** 頁面上，在搜尋方塊中輸入 **EC2Full**。然後在清單中，選取 **AmazonEC2FullAccess** 旁的核取方塊。目前先不要儲存您的變更。

1. 在搜尋方塊中，輸入 **Force**，然後在清單中選擇 **Force\$1MFA** 旁的核取方塊。

1. 選擇**連接政策**。

## 步驟 3：測試您的使用者存取權限
<a name="tutorial_mfa_step3"></a>

在本教程的這一部分中，您以測試使用者身分登入並確認政策是否正常運作。

1. **MFAUser** 使用您在上一節中指派的密碼，以 AWS 帳戶 身分登入您的 。使用 URL：`https://<alias or account ID number>.signin.aws.amazon.com/console`

1. 選擇 **EC2** 來開啟 Amazon EC2 主控台，並確認使用者沒有許可執行任何操作。

1. 在右上方的導覽列中，選擇您的 `MFAUser` 使用者名稱，然後選擇 **安全憑證** 。  
![\[AWS 管理主控台安全登入資料連結。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/security-credentials-user.shared.console.png)

1. 現在新增一個 MFA 裝置。在 **Multi-Factor Authentication (MFA) (多重要素驗證 (MFA))** 區段，選擇 **Assign MFA device (指派 MFA 裝置)**。
**注意**  
您可能會收到錯誤，告知您未被授權執行 `iam:DeleteVirtualMFADevice`。如果有人先前開始將虛擬 MFA 裝置指派給這個使用者但取消程序，就可能發生此錯誤。若要繼續，您或其他管理員必須刪除該使用者未經指派的現有虛擬 MFA 裝置。如需詳細資訊，請參閱[我未獲得授權，不得執行：iam:DeleteVirtualMFADevice](troubleshoot.md#troubleshoot_general_access-denied-delete-mfa)。

1. 對於本教程，我們使用一個虛擬 (軟體式) MFA 裝置，例如，手機上的 Google Authenticator 應用程式。選擇 **Authenticator app** (驗證器應用程式)，然後按 **Next** (下一步)。

   IAM 將產生並顯示虛擬 MFA 裝置的配置資訊，包括 QR 碼圖形。此圖形是私密組態金鑰的表示形式，適用於不支援 QR 碼的裝置上的手動輸入。

1. 開啟您的虛擬 MFA 應用程式。(如需可以作為託管虛擬 MFA 裝置的應用程式清單，請查看[虛擬 MFA 應用程式](https://aws.amazon.com/iam/details/mfa/#Virtual_MFA_Applications)。) 如果虛擬 MFA 應用程式支援多個帳戶 (多個虛擬 MFA 裝置)，請選擇對應的選項以建立新帳戶 (新的虛擬 MFA 裝置)。

1. 判定 MFA 應用程式是否支援 QR 碼，然後執行以下操作之一：
   + 從精靈中，選擇 **Show QR code (顯示 QR 碼)**。然後使用應用程式來掃描 QR 碼。例如，您可選擇相機圖示或選擇與 **Scan code (掃描碼)** 類似的選項，然後使用裝置的相機掃描碼。
   + 在 **Set up device** (設定裝置) 精靈中，選擇 **Show secret key** (顯示私密金鑰)，然後在您的 MFA 應用程式中輸入私密金鑰。

   完成操作後，虛擬 MFA 裝置會開始產生一次性密碼。

1. 在 **Set up device** (設定裝置) 精靈中的 **Enter the code from your authenticator app.** (輸入來自您的驗證器應用程式的代碼。) 方塊中，輸入虛擬 MFA 裝置上目前顯示的一次性密碼。選擇 **Register MFA** (註冊 MFA)。
**重要**  
產生代碼之後立即提交您的請求。如果在產生代碼後等待太久才提交請求，MFA 裝置將成功與使用者建立關聯。但是，MFA 裝置並不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。這種情況下，您可以[重新同步裝置](id_credentials_mfa_sync.md)。

   虛擬 MFA 裝置現在可以與 搭配使用 AWS。

1. 登出主控台，然後再次以 **MFAUser** 身分登入。這次會 AWS 提示您從手機輸入 MFA 代碼。收到該代碼後，請將代碼輸入方塊中，然後選擇 **Submit (提交)**。

1. 選擇 **EC2** 來再次開啟 Amazon EC2 主控台。請注意，這次您可以看到所有資訊，並且可以執行所需的任何動作。如果您以此使用者身分前往任何其他主控台，您會看到存取遭拒訊息。原因在於此教學中的政策僅會將存取權授與 Amazon EC2。

## 相關資源
<a name="tutorial_mfa_related"></a>

如需其他資訊，請參閱以下主題：
+ [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)
+ [啟用 MFA 的登入](console_sign-in-mfa.md)

# IAM 教學課程：使用 CloudFormation 範本建立 SAML Identity Provider (IdP)
<a name="tutorial_saml-idp"></a>

若要為 AWS 您的帳戶設定 SAML 聯合，您需要建立 SAML 身分提供者 (IdP)。本教學課程說明如何使用 CloudFormation 範本建立 SAML IdP，在 AWS 和外部 IdP 之間建立信任。

該範本會建立使用 IdP 中繼資料文件設定的 SAML IdP。然後，聯合 IAM 角色可以參考此 IdP，以允許來自外部 IdP 的已驗證使用者存取 AWS 資源。

部署的資源包含使用 IdP 中繼資料文件和選用加密設定來設定的 SAML IdP。

## 先決條件
<a name="tutorial_saml-idp-prereqs"></a>

此教學課程假設您已備妥下列項目：
+ 在本機電腦上安裝的 Python 3.6 或更新版本，以便執行本教學課程中用於格式化 IdP SAML 中繼資料 XML 檔案的 Python 命令。
+ 外部 IdP 中儲存為 XML 檔案的 SAML 中繼資料文件。

## 使用 建立 SAML IdP CloudFormation
<a name="tutorial_saml-idp-create"></a>

若要建立 SAML IdP，需要建立 CloudFormation 範本，並使用它來建立包含 IdP 資源的堆疊。

### 建立範本
<a name="tutorial_saml-idp-file"></a>

首先，建立 CloudFormation 範本。

1. 在 [範本](#tutorial_saml-idp-template) 區段中，按一下 **JSON** 或 **YAML** 索引標籤上的複製圖示，以複製範本內容。

1. 在新檔案中貼上範本內容。

1. 在本機儲存檔案。

### 建立 堆疊。
<a name="tutorial_saml-idp-stack"></a>

接下來，使用剛儲存的範本來佈建 CloudFormation 堆疊。

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，從**建立堆疊**功能表中選擇**使用新資源 (標準)**。

1. 指定範本：

   1. 在**必要條件**下，選擇**選擇現有範本**。

   1. 在**指定範本**下，選擇**上傳範本檔案**。

   1. 選擇**選擇檔案**，導覽至範本檔案並選取它。

   1. 選擇**下一步**。

1. 指定下列堆疊詳細資訊：

   1. 輸入堆疊名稱。

   1. 對於 **IdentityProviderName**，您可以將其留空，以根據堆疊名稱自動產生名稱，或輸入 SAML IdP 的自訂名稱。自訂名稱只能包含字母數字字元、句號、底線和連字號。

   1. 對於 **IdentityProviderSAMLMetadataDocument**，您需要將 SAML 中繼資料 XML 檔案格式化為單行，然後才能將其貼入此欄位。這是必要的，因為 CloudFormation 主控台要求透過主控台參數傳遞的 XML 內容必須格式化為單行。

      使用下列 Python 命令來重新格式化 XML 檔案：

      ```
      python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))" saml-metadata.xml
      ```
**注意**  
IdP 的 SAML 中繼資料文件必須格式化為單行，才能用於主控台參數輸入。Python 命令會移除換行符號和多餘的空格，以建立所需的格式，同時保留所有原始內容和結構。

      從 Python 命令複製輸出，並將其貼至 **IdentityProviderSAMLMetadataDocument** 欄位。

      格式化的 SAML 中繼資料文件範例 (縮寫)：

      ```
      <?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor>
      ```

   1. 對於其他參數，請接受預設值或根據需求輸入自己的值：
      + **IdentityProviderAddPrivateKey**：用於解密 SAML 聲明的選用私有金鑰
      + **IdentityProviderAssertionEncryptionMode** – 選用，為 SAML 聲明設定加密模式 (「已允許」、「必要」或留空)

   1. 選擇**下一步**。

1. 設定堆疊選項：

   1. 在**堆疊失敗選項**下，選擇**刪除所有新建立的資源**。
**注意**  
選擇此選項可避免堆疊建立失敗時，因資源刪除政策指定為保留而可能產生的資源費用。

   1. 接受所有其他預設值。

   1. 在**功能**下，勾選方塊以確認 CloudFormation 可能會在帳戶中建立 IAM 資源。

   1. 選擇**下一步**。

1. 檢閱堆疊詳細資訊，然後選擇**提交**。

CloudFormation 會建立堆疊。堆疊建立完成後，堆疊資源即可使用。您可以使用堆疊詳細資訊頁面上的**資源**索引標籤，來檢視帳戶中佈建的資源。

堆疊將輸出下列值，您可以在**輸出**索引標籤上檢視：
+ **ProviderARN**：已建立 SAML IdP 的 ARN (例如 `arn:aws:iam::123456789012:saml-provider/CompanyIdP`)。建立信任此提供者的角色時，您將需要此 ARN。
+ **ProviderName**：已建立 SAML IdP 的名稱 (例如，如果指定了自訂名稱，則為 `CompanyIdP`；或者如果使用了預設命名，則為 `my-saml-stack-saml-provider`)。

這些輸出也會匯出，並允許其他 CloudFormation 堆疊使用 `Fn::ImportValue` 函數匯入。

## 驗證 SAML IdP
<a name="tutorial_saml-idp-using"></a>

SAML IdP 建立後，您可以驗證其組態，並記下其 ARN，以供聯合身分角色使用。

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，請選擇 **Identity providers** (身分提供者)。

   您應該會在清單中看到新建立的 SAML IdP。

1. 選擇 IdP 名稱以檢視其詳細資訊。

   在 IdP 詳細資訊頁面上，可以查看 SAML 中繼資料文件及其他組態詳細資訊。

1. 記下詳細資訊頁面上顯示的**提供者 ARN**。

   建立信任此 IdP 的聯合身分 IAM 角色時，您將需要此 ARN。

1. 檢閱中繼資料文件，確保其與您從外部 IdP 提供的內容相符。

SAML IdP 現已準備就緒，可供聯合身分 IAM 角色使用。您可以建立信任此 IdP 的角色，以允許來自外部 IdP 的已驗證使用者擔任這些角色和存取 AWS 資源。

## 清理：刪除資源
<a name="tutorial_saml-idp-delete"></a>

最後一個步驟是，刪除堆疊及其包含的資源。

1. 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，選擇從範本建立的堆疊，然後選擇**刪除**，接著確認**刪除**。

   CloudFormation 會啟動刪除堆疊及其包含的所有資源。

## CloudFormation 範本詳細資訊
<a name="tutorial_saml-idp-template-details"></a>

### Resources
<a name="tutorial_saml-idp-template-resources"></a>

本教學課程的 CloudFormation 範本會在您的帳戶中建立下列資源：

[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html)：在 AWS 和外部 IdP 之間建立信任的 SAML IdP。

### Configuration
<a name="tutorial_saml-idp-template-config"></a>

範本包含下列可設定的參數：
+ **IdentityProviderName** – SAML IdP 的名稱 (留空以自動產生名稱)

  範例：`CompanyIdP` 或 `EnterpriseSSO`
+ **IdentityProviderSAMLMetadataDocument** – 來自外部 IdP 的 SAML 中繼資料文件 (格式化為單行)
+ **IdentityProviderAddPrivateKey**：用於解密 SAML 聲明的選用私有金鑰
+ **IdentityProviderAssertionEncryptionMode** – 選用，為 SAML 聲明設定加密模式

## CloudFormation 範本
<a name="tutorial_saml-idp-template"></a>

將下列 JSON 或 YAML 程式碼儲存為個別檔案，以用作本教學課程的 CloudFormation 範本。

------
#### [ JSON ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "[AWSDocs] IAM: tutorial_saml-idp",
  "Parameters": {
    "IdentityProviderName": {
      "Type": "String",
      "Description": "Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[a-zA-Z0-9._-]+$",
      "ConstraintDescription": "Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens"
    },
    "IdentityProviderSAMLMetadataDocument": {
      "Type": "String",
      "Description": "SAML metadata document from identity provider"
    },
    "IdentityProviderAddPrivateKey": {
      "Type": "String",
      "Description": "Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.",
      "Default": ""
    },
    "IdentityProviderAssertionEncryptionMode": {
      "Type": "String",
      "Description": "Optional, sets encryption mode for SAML assertions",
      "Default": "",
      "AllowedValues": ["", "Allowed", "Required"]
    }
  },
  "Conditions": {
    "HasPrivateKey": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAddPrivateKey"}, ""]}]},
    "HasEncryptionMode": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAssertionEncryptionMode"}, ""]}]},
    "HasCustomName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderName"}, ""]}]}
  },
  "Resources": {
    "SAMLProvider": {
      "Type": "AWS::IAM::SAMLProvider",
      "Properties": {
        "Name": {"Fn::If": ["HasCustomName", {"Ref": "IdentityProviderName"}, {"Ref": "AWS::NoValue"}]},
        "SamlMetadataDocument": {"Ref": "IdentityProviderSAMLMetadataDocument"},
        "Tags": [
          {
            "Key": "Name",
            "Value": {"Fn::If": ["HasCustomName", {"Ref": "IdentityProviderName"}, {"Fn::Sub": "${AWS::StackName}-saml-provider"}]}
          }
        ],
        "AddPrivateKey": {"Fn::If": ["HasPrivateKey", {"Ref": "IdentityProviderAddPrivateKey"}, {"Ref": "AWS::NoValue"}]},
        "AssertionEncryptionMode": {"Fn::If": ["HasEncryptionMode", {"Ref": "IdentityProviderAssertionEncryptionMode"}, {"Ref": "AWS::NoValue"}]}
      }
    }
  },
  "Outputs": {
    "ProviderARN": {
      "Description": "ARN of the created SAML Identity Provider",
      "Value": {"Ref": "SAMLProvider"},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-ProviderARN"}
      }
    },
    "ProviderName": {
      "Description": "Name of the SAML Identity Provider",
      "Value": {"Fn::If": ["HasCustomName", {"Ref": "IdentityProviderName"}, {"Fn::Sub": "${AWS::StackName}-saml-provider"}]},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-ProviderName"}
      }
    }
  }
}
```

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] IAM: tutorial_saml-idp'

Parameters:
  IdentityProviderName:
    Type: String
    Description: Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[a-zA-Z0-9._-]+$'
    ConstraintDescription: 'Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens'

  IdentityProviderSAMLMetadataDocument:
    Type: String
    Description: SAML metadata document from identity provider

  IdentityProviderAddPrivateKey:
    Type: String
    Description: Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.
    Default: ""

  IdentityProviderAssertionEncryptionMode:
    Type: String
    Description: Optional, sets encryption mode for SAML assertions
    Default: ""
    AllowedValues:
      - ""
      - "Allowed"
      - "Required"

Conditions:
  HasPrivateKey: !Not [!Equals [!Ref IdentityProviderAddPrivateKey, ""]]
  HasEncryptionMode: !Not [!Equals [!Ref IdentityProviderAssertionEncryptionMode, ""]]
  HasCustomName: !Not [!Equals [!Ref IdentityProviderName, ""]]

Resources:
  SAMLProvider:
    Type: 'AWS::IAM::SAMLProvider'
    Properties:
      Name: !If
        - HasCustomName
        - !Ref IdentityProviderName
        - !Ref AWS::NoValue
      SamlMetadataDocument: !Ref IdentityProviderSAMLMetadataDocument
      Tags:
        - Key: Name
          Value: !If
            - HasCustomName
            - !Ref IdentityProviderName
            - !Sub '${AWS::StackName}-saml-provider'
      AddPrivateKey: !If
        - HasPrivateKey
        - !Ref IdentityProviderAddPrivateKey
        - !Ref AWS::NoValue
      AssertionEncryptionMode: !If
        - HasEncryptionMode
        - !Ref IdentityProviderAssertionEncryptionMode
        - !Ref AWS::NoValue

Outputs:
  ProviderARN:
    Description: 'ARN of the created SAML Identity Provider'
    Value: !Ref SAMLProvider
    Export:
      Name: !Sub '${AWS::StackName}-ProviderARN'
  
  ProviderName:
    Description: 'Name of the SAML Identity Provider'
    Value: !If
      - HasCustomName
      - !Ref IdentityProviderName
      - !Sub '${AWS::StackName}-saml-provider'
    Export:
      Name: !Sub '${AWS::StackName}-ProviderName'
```

------

# IAM 教學課程：使用 CloudFormation 範本建立 SAML 聯合 IAM 角色
<a name="tutorial_saml-federated-role"></a>

當您在 AWS 帳戶中設定現有的 SAML Identity Provider (IdP) 時，您可以建立信任該 IdP 的聯合 IAM 角色。本教學課程說明如何使用 CloudFormation 範本來建立 SAML 聯合 IAM 角色，該角色可由透過外部 IdP 驗證的使用者擔任。

該範本會建立具有信任政策的聯合身分 IAM 角色，允許 SAML IdP 擔任該角色。透過外部 IdP 進行身分驗證的使用者可以擔任此角色，以便根據連接至該角色的許可存取 AWS 資源。

部署的資源包含下列項目：
+ 信任現有 SAML IdP 的聯合身分 IAM 角色。
+ 可連接至角色以授予特定許可的可設定受管政策。
+ 許可界限和工作階段持續時間的選用設定。

## 先決條件
<a name="tutorial_saml-federated-role-prereqs"></a>

此教學課程假設您已備妥下列項目：
+ 您 AWS 帳戶中設定的現有 SAML IdP。如果沒有，可以使用 [IAM 教學課程：使用 CloudFormation 範本建立 SAML Identity Provider (IdP)](tutorial_saml-idp.md) 教學課程建立一個。
+ SAML IdP 的 ARN，您需要在建立堆疊時將其指定為參數。
+ 在本機電腦上安裝的 Python 3.6 或更新版本，以便執行本教學課程中用於格式化 IdP SAML 中繼資料 XML 檔案的 Python 命令。

## 使用 建立 SAML 聯合角色 CloudFormation
<a name="tutorial_saml-federated-role-create"></a>

若要建立 SAML 聯合身分角色，需要建立 CloudFormation 範本，並使用它來建立包含該角色的堆疊。

### 建立範本
<a name="tutorial_saml-federated-role-file"></a>

首先，建立 CloudFormation 範本。

1. 在 [範本](#tutorial_saml-federated-role-template) 區段中，按一下 **JSON** 或 **YAML** 索引標籤上的複製圖示，以複製範本內容。

1. 在新檔案中貼上範本內容。

1. 在本機儲存檔案。

### 建立 堆疊。
<a name="tutorial_saml-federated-role-stack"></a>

接下來，使用剛儲存的範本來佈建 CloudFormation 堆疊。

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，從**建立堆疊**功能表中選擇**使用新資源 (標準)**。

1. 指定範本：

   1. 在**必要條件**下，選擇**選擇現有範本**。

   1. 在**指定範本**下，選擇**上傳範本檔案**。

   1. 選擇**選擇檔案**，導覽至範本檔案並選取它。

   1. 選擇**下一步**。

1. 指定下列堆疊詳細資訊：

   1. 輸入堆疊名稱。

   1. 在 **SAMLProviderARN** 中，輸入現有 SAML IdP 的 ARN。其格式應為 `arn:aws:iam::123456789012:saml-provider/YourProviderName`。

      範例：`arn:aws:iam::123456789012:saml-provider/CompanyIdP`
**注意**  
如果使用 [IAM 教學課程：使用 CloudFormation 範本建立 SAML Identity Provider (IdP)](tutorial_saml-idp.md) 教學課程建立 SAML IdP，則可在該 CloudFormation 堆疊的「輸出」索引標籤中找到提供者 ARN。

   1. 對於 **RoleName**，可以將其留空，以根據堆疊名稱自動產生名稱，或輸入 IAM 角色的自訂名稱。

      範例：`SAML-Developer-Access` 或 `SAML-ReadOnly-Role`

   1. 對於其他參數，請接受預設值或根據需求輸入自己的值：
      + **RoleSessionDuration** – 工作階段持續時間上限 (以秒為單位，3600-43200，預設值 7200)

        範例：`14400` (4 小時)
      + **RolePermissionsBoundary** – 許可界限政策的選用 ARN

        範例：`arn:aws:iam::123456789012:policy/DeveloperBoundary`
      + **RolePath** – IAM 角色的路徑 (預設為 /)

        範例：`/saml-roles/`
      + **ManagedPolicy1-5** – 最多可連接 5 個受管政策的選用 ARN

        ManagedPolicy1 的範例：`arn:aws:iam::aws:policy/ReadOnlyAccess`

        ManagedPolicy2 的範例：`arn:aws:iam::123456789012:policy/CustomPolicy`

   1. 選擇**下一步**。

1. 設定堆疊選項：

   1. 在**堆疊失敗選項**下，選擇**刪除所有新建立的資源**。
**注意**  
選擇此選項可避免堆疊建立失敗時，因資源刪除政策指定為保留而可能產生的資源費用。

   1. 接受所有其他預設值。

   1. 在**功能**下，勾選方塊以確認 CloudFormation 可能會在帳戶中建立 IAM 資源。

   1. 選擇**下一步**。

1. 檢閱堆疊詳細資訊，然後選擇**提交**。

CloudFormation 會建立堆疊。堆疊建立完成後，堆疊資源即可使用。您可以使用堆疊詳細資訊頁面上的**資源**索引標籤，來檢視帳戶中佈建的資源。

堆疊將輸出下列值，您可以在**輸出**索引標籤上檢視該值：
+ **RoleARN**：已建立 IAM 角色的 ARN (例如 `arn:aws:iam::123456789012:role/SAML-Developer-Access`，或者如果使用自動產生的名稱，則為 `arn:aws:iam::123456789012:role/stack-name-a1b2c3d4`)。

在設定 IdP 以傳送用於擔任角色的相應 SAML 屬性時，您將需要此角色 ARN。

## 測試 SAML 聯合身分角色
<a name="tutorial_saml-federated-role-using"></a>

SAML 聯合身分角色建立後，您可以驗證其組態並測試聯合身分設定。

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**角色**。

1. 找到並選擇新建立的聯合身分角色。

   如果您提供了自訂角色名稱，請尋找該名稱。如果將 RoleName 參數留空，則該角色將根據堆疊名稱和唯一識別碼自動產生名稱。

1. 選擇**信任關係**索引標籤以檢閱信任政策。

   信任政策應該會顯示 SAML IdP 受信任可擔任此角色，條件是 SAML 對象 (`SAML:aud`) 與 `https://signin.aws.amazon.com/saml` 相符。

1. 選擇**許可**索引標籤以檢閱連接的政策。

   您可以看到在建立期間連接至角色的所有受管政策。

1. 記下角色摘要頁面上顯示的**角色 ARN**。

   您需要此 ARN 才能設定外部 IdP，以允許使用者擔任此角色。

SAML 聯合身分角色現已準備就緒，可供使用。將外部 IdP 設定為在 SAML 聲明中包含此角色的 ARN，經過驗證的使用者將能夠擔任此角色來存取 AWS 資源。

## 清理：刪除資源
<a name="tutorial_saml-federated-role-delete"></a>

最後一個步驟是，刪除堆疊及其包含的資源。

1. 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，選擇從範本建立的堆疊，然後選擇**刪除**，接著確認**刪除**。

   CloudFormation 會啟動刪除堆疊及其包含的所有資源。

## CloudFormation 範本詳細資訊
<a name="tutorial_saml-federated-role-template-details"></a>

### Resources
<a name="tutorial_saml-federated-role-template-resources"></a>

本教學課程的 CloudFormation 範本會在您的帳戶中建立下列資源：
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html)：可由透過 SAML IdP 進行身分驗證之使用者擔任的聯合身分 IAM 角色。

### Configuration
<a name="tutorial_saml-federated-role-configuration"></a>

範本包含下列可設定的參數：
+ **RoleName** – IAM 角色的名稱 (留空以自動產生名稱)
+ **SAMLProviderARN** – SAML IdP 的 ARN (必要)
+ **RoleSessionDuration** – 工作階段持續時間上限 (以秒為單位，3600-43200，預設值 7200)
+ **RolePermissionsBoundary** – 許可界限政策的選用 ARN
+ **RolePath** – IAM 角色的路徑 (預設值 /)
+ **ManagedPolicy1-5** – 最多可連接 5 個受管政策的選用 ARN

## CloudFormation 範本
<a name="tutorial_saml-federated-role-template"></a>

將下列 JSON 或 YAML 程式碼儲存為個別檔案，以用作本教學課程的 CloudFormation 範本。

------
#### [ JSON ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "[AWSDocs] IAM: tutorial_saml-federated-role",
  "Parameters": {
    "RoleName": {
      "Type": "String",
      "Description": "Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[\\w+=,.@-]{1,64}$",
      "ConstraintDescription": "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"
    },
    "SAMLProviderARN": {
      "Type": "String",
      "Description": "ARN of the SAML Identity Provider",
      "AllowedPattern": "^arn:aws:iam::\\d{12}:saml-provider/[a-zA-Z0-9._-]+$",
      "ConstraintDescription": "Must be a valid SAML provider ARN"
    },
    "RoleSessionDuration": {
      "Type": "Number",
      "Description": "The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)",
      "MinValue": 3600,
      "MaxValue": 43200,
      "Default": 7200
    },
    "RolePermissionsBoundary": {
      "Type": "String",
      "Description": "Optional ARN of the permissions boundary policy (leave empty for none)",
      "Default": ""
    },
    "RolePath": {
      "Type": "String",
      "Description": "Path for the IAM role (must start and end with /)",
      "Default": "/",
      "AllowedPattern": "^\/.*\/$|^\/$",
      "ConstraintDescription": "Role path must start and end with forward slash (/)"
    },
    "RoleManagedPolicy1": {
      "Type": "String",
      "Description": "Optional managed policy ARN 1",
      "Default": ""
    },
    "RoleManagedPolicy2": {
      "Type": "String",
      "Description": "Optional managed policy ARN 2",
      "Default": ""
    },
    "RoleManagedPolicy3": {
      "Type": "String",
      "Description": "Optional managed policy ARN 3",
      "Default": ""
    },
    "RoleManagedPolicy4": {
      "Type": "String",
      "Description": "Optional managed policy ARN 4",
      "Default": ""
    },
    "RoleManagedPolicy5": {
      "Type": "String",
      "Description": "Optional managed policy ARN 5",
      "Default": ""
    }
  },
  "Conditions": {
    "HasCustomRoleName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleName"}, ""]}]},
    "HasPermissionsBoundary": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RolePermissionsBoundary"}, ""]}]},
    "HasPolicy1": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy1"}, ""]}]},
    "HasPolicy2": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy2"}, ""]}]},
    "HasPolicy3": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy3"}, ""]}]},
    "HasPolicy4": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy4"}, ""]}]},
    "HasPolicy5": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy5"}, ""]}]}
  },
  "Resources": {
    "SAMLFederatedRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": {"Fn::If": ["HasCustomRoleName", {"Ref": "RoleName"}, {"Ref": "AWS::NoValue"}]},
        "Description": "IAM role with SAML provider trust",
        "MaxSessionDuration": {"Ref": "RoleSessionDuration"},
        "PermissionsBoundary": {"Fn::If": ["HasPermissionsBoundary", {"Ref": "RolePermissionsBoundary"}, {"Ref": "AWS::NoValue"}]},
        "Path": {"Ref": "RolePath"},
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": {"Ref": "SAMLProviderARN"}
              },
              "Action": "sts:AssumeRoleWithSAML",
              "Condition": {
                "StringEquals": {
                  "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
              }
            }
          ]
        },
        "ManagedPolicyArns": {
          "Fn::Split": [
            ",",
            {
              "Fn::Join": [
                ",",
                [
                  {"Fn::If": ["HasPolicy1", {"Ref": "RoleManagedPolicy1"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy2", {"Ref": "RoleManagedPolicy2"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy3", {"Ref": "RoleManagedPolicy3"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy4", {"Ref": "RoleManagedPolicy4"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy5", {"Ref": "RoleManagedPolicy5"}, {"Ref": "AWS::NoValue"}]}
                ]
              ]
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "RoleARN": {
      "Description": "ARN of the created IAM Role",
      "Value": {"Fn::GetAtt": ["SAMLFederatedRole", "Arn"]},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-RoleARN"}
      }
    }
  }
}
```

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] IAM: tutorial_saml-federated-role'

Parameters:
  RoleName:
    Type: String
    Description: 'Name of the IAM Role (leave empty for auto-generated name like ''{StackName}-{UniqueId}'')'
    Default: ""
    AllowedPattern: '^$|^[\w+=,.@-]{1,64}$'
    ConstraintDescription: 'Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-'
  
  SAMLProviderARN:
    Type: String
    Description: 'ARN of the SAML Identity Provider'
    AllowedPattern: '^arn:aws:iam::\d{12}:saml-provider/[a-zA-Z0-9._-]+$'
    ConstraintDescription: 'Must be a valid SAML provider ARN'
  
  RoleSessionDuration:
    Type: Number
    Description: 'The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)'
    MinValue: 3600
    MaxValue: 43200
    Default: 7200
    
  RolePermissionsBoundary:
    Type: String
    Description: Optional ARN of the permissions boundary policy (leave empty for none)
    Default: ""

  RolePath:
    Type: String
    Description: 'Path for the IAM role (must start and end with /)'
    Default: "/"
    AllowedPattern: '^\/.*\/$|^\/$'
    ConstraintDescription: 'Role path must start and end with forward slash (/)'
  
  RoleManagedPolicy1:
    Type: String
    Description: Optional managed policy ARN 1
    Default: ""
  RoleManagedPolicy2:
    Type: String
    Description: Optional managed policy ARN 2
    Default: ""
  RoleManagedPolicy3:
    Type: String
    Description: Optional managed policy ARN 3
    Default: ""
  RoleManagedPolicy4:
    Type: String
    Description: Optional managed policy ARN 4
    Default: ""
  RoleManagedPolicy5:
    Type: String
    Description: Optional managed policy ARN 5
    Default: ""

Conditions:
  HasCustomRoleName: !Not [!Equals [!Ref RoleName, ""]]
  HasPermissionsBoundary: !Not [!Equals [!Ref RolePermissionsBoundary, ""]]
  HasPolicy1: !Not [!Equals [!Ref RoleManagedPolicy1, ""]]
  HasPolicy2: !Not [!Equals [!Ref RoleManagedPolicy2, ""]]
  HasPolicy3: !Not [!Equals [!Ref RoleManagedPolicy3, ""]]
  HasPolicy4: !Not [!Equals [!Ref RoleManagedPolicy4, ""]]
  HasPolicy5: !Not [!Equals [!Ref RoleManagedPolicy5, ""]]

Resources:
  SAMLFederatedRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: !If
        - HasCustomRoleName
        - !Ref RoleName
        - !Ref AWS::NoValue
      Description: 'IAM role with SAML provider trust'
      MaxSessionDuration: !Ref RoleSessionDuration
      PermissionsBoundary: !If
        - HasPermissionsBoundary
        - !Ref RolePermissionsBoundary
        - !Ref AWS::NoValue
      Path: !Ref RolePath
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
          - Effect: Allow
            Principal:
              Federated: !Ref SAMLProviderARN
            Action: 'sts:AssumeRoleWithSAML'
            Condition:
              StringEquals:
                'SAML:aud': 'https://signin.aws.amazon.com/saml'
      ManagedPolicyArns:
        !Split
          - ','
          - !Join
            - ','
            - - !If [HasPolicy1, !Ref RoleManagedPolicy1, !Ref 'AWS::NoValue']
              - !If [HasPolicy2, !Ref RoleManagedPolicy2, !Ref 'AWS::NoValue']
              - !If [HasPolicy3, !Ref RoleManagedPolicy3, !Ref 'AWS::NoValue']
              - !If [HasPolicy4, !Ref RoleManagedPolicy4, !Ref 'AWS::NoValue']
              - !If [HasPolicy5, !Ref RoleManagedPolicy5, !Ref 'AWS::NoValue']

Outputs:
  RoleARN:
    Description: 'ARN of the created IAM Role'
    Value: !GetAtt SAMLFederatedRole.Arn
    Export:
      Name: !Sub '${AWS::StackName}-RoleARN'
```

------

# IAM 教學課程：使用 CloudFormation 範本建立 SAML 身分提供者 (IdP) 和 SAML 聯合 IAM 角色
<a name="tutorial_saml-idp-and-federated-role"></a>

若要熟悉 SAML 聯合及其功能，您將使用 CloudFormation 範本來設定 SAML 身分提供者 (IdP) 和相關聯的聯合 IAM 角色。本教學課程說明如何在單一堆疊中同時建立這兩個資源。

範本會建立 SAML IdP，可用於聯合存取 AWS 資源，以及信任 SAML 供應商的 IAM 角色。外部 IdP 驗證的使用者可以擔任此角色來存取 AWS 資源。

部署的資源包含下列項目：
+ 使用 IdP 中繼資料文件設定的 SAML IdP。
+ 信任 SAML IdP 且可由經過身分驗證之使用者擔任的聯合身分 IAM 角色。
+ 可連接至角色以授予特定許可的可設定受管政策。

## 先決條件
<a name="tutorial_saml-idp-and-federated-role-prereqs"></a>

此教學課程假設您已備妥下列項目：
+ 在本機電腦上安裝的 Python 3.6 或更新版本，以便執行本教學課程中用於格式化 IdP SAML 中繼資料 XML 檔案的 Python 命令。
+ 外部 IdP 中儲存為 XML 檔案的 SAML 中繼資料文件。

## 使用 建立 SAML IdP 和角色 CloudFormation
<a name="tutorial_saml-idp-and-federated-role-create"></a>

若要建立 SAML IdP 和聯合身分角色，需要建立 CloudFormation 範本，並使用它來建立包含這兩個資源的堆疊。

### 建立範本
<a name="tutorial_saml-idp-and-federated-role-file"></a>

首先，建立 CloudFormation 範本。

1. 在 [範本](#tutorial_saml-idp-and-federated-role-template) 區段中，按一下 **JSON** 或 **YAML** 索引標籤上的複製圖示，以複製範本內容。

1. 在新檔案中貼上範本內容。

1. 在本機儲存檔案。

### 建立 堆疊。
<a name="tutorial_saml-idp-and-federated-role-stack"></a>

接下來，使用剛儲存的範本來佈建 CloudFormation 堆疊。

1. 在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，從**建立堆疊**功能表中選擇**使用新資源 (標準)**。

1. 指定範本：

   1. 在**必要條件**下，選擇**選擇現有範本**。

   1. 在**指定範本**下，選擇**上傳範本檔案**。

   1. 選擇**選擇檔案**，導覽至範本檔案並選取它。

   1. 選擇**下一步**。

1. 指定下列堆疊詳細資訊：

   1. 輸入堆疊名稱。

   1. 對於 **IdentityProviderName**，您可以將其留空，以根據堆疊名稱自動產生名稱，或輸入 SAML IdP 的自訂名稱。

      範例：`CompanyIdP` 或 `EnterpriseSSO`

   1. 對於 **IdentityProviderSAMLMetadataDocument**，您需要將 SAML 中繼資料 XML 檔案格式化為單行，然後才能將其貼入此欄位。這是必要的，因為 CloudFormation 主控台要求透過主控台參數傳遞的 XML 內容必須格式化為單行。

      使用下列 Python 命令來重新格式化 XML 檔案：

      ```
      python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))" saml-metadata.xml
      ```
**注意**  
IdP 的 SAML 中繼資料文件必須格式化為單行，才能用於主控台參數輸入。Python 命令會移除換行符號和多餘的空格，以建立所需的格式，同時保留所有原始內容和結構。

      從 Python 命令複製輸出，並將其貼至 **IdentityProviderSAMLMetadataDocument** 欄位。

      格式化的 SAML 中繼資料文件範例 (縮寫)：

      ```
      <?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor>
      ```

   1. 對於 **RoleName**，可以將其留空，以根據堆疊名稱自動產生名稱，或輸入聯合身分 IAM 角色的自訂名稱。

      範例：`SAML-Developer-Access` 或 `SAML-ReadOnly-Role`

   1. 對於其他參數，請接受預設值或根據需求輸入自己的值：
      + **IdentityProviderAddPrivateKey**：用於解密 SAML 聲明的選用私有金鑰
      + **IdentityProviderAssertionEncryptionMode** – SAML 聲明的加密模式

        範例值：`Allowed`、`Required` 或留空表示不加密
      + **RoleSessionDuration** – 工作階段持續時間上限 (以秒為單位，3600-43200，預設值 7200)

        範例：`14400` (4 小時)
      + **RolePermissionsBoundary** – 許可界限政策的選用 ARN

        範例：`arn:aws:iam::123456789012:policy/DeveloperBoundary`
      + **RolePath** – IAM 角色的路徑 (預設為 /)

        範例：`/saml-roles/`
      + **RoleManagedPolicy1-5** – 最多可連接 5 個受管政策的選用 ARN

        RoleManagedPolicy1 的範例：`arn:aws:iam::aws:policy/ReadOnlyAccess`

        RoleManagedPolicy2 的範例：`arn:aws:iam::123456789012:policy/CustomPolicy`

   1. 選擇**下一步**。

1. 設定堆疊選項：

   1. 在**堆疊失敗選項**下，選擇**刪除所有新建立的資源**。
**注意**  
選擇此選項可避免堆疊建立失敗時，因資源刪除政策指定為保留而可能產生的資源費用。

   1. 接受所有其他預設值。

   1. 在**功能**下，勾選方塊以確認 CloudFormation 可能會在帳戶中建立 IAM 資源。

   1. 選擇**下一步**。

1. 檢閱堆疊詳細資訊，然後選擇**提交**。

CloudFormation 會建立堆疊。堆疊建立完成後，堆疊資源即可使用。您可以使用堆疊詳細資訊頁面上的**資源**索引標籤，來檢視帳戶中佈建的資源。

堆疊將輸出下列值，您可以在**輸出**索引標籤上檢視：
+ **RoleARN**：已建立 IAM 角色的 ARN (例如 `arn:aws:iam::123456789012:role/SAML-Developer-Access`，或者如果使用自動產生的名稱，則為 `arn:aws:iam::123456789012:role/stack-name-a1b2c3d4`)。
+ **IdentityProviderARN**：已建立 SAML IdP 的 ARN (例如 `arn:aws:iam::123456789012:saml-provider/CompanyIdP`)。

在設定 IdP 以傳送用於擔任角色的相應 SAML 屬性時，您將需要這兩個 ARN。

## 測試 SAML 聯合身分
<a name="tutorial_saml-idp-and-federated-role-using"></a>

SAML IdP 和聯合身分角色建立後，您可以測試聯合身分設定。

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，請選擇 **Identity providers** (身分提供者)。

   您應該會在清單中看到新建立的 SAML IdP。

1. 選擇 IdP 名稱以檢視其詳細資訊。

   在 IdP 詳細資訊頁面上，可以查看 SAML 中繼資料文件及其他組態詳細資訊。

1. 在導覽窗格中，選擇**角色**。

1. 找到並選擇新建立的聯合身分角色。

   在角色詳細資訊頁面上，可以查看允許 SAML IdP 擔任此角色的信任政策。

1. 選擇**信任關係**索引標籤以檢閱信任政策。

   信任政策應該會顯示 SAML IdP 受信任可擔任此角色，條件是 SAML 對象 (`SAML:aud`) 與 `https://signin.aws.amazon.com/saml` 相符。

## 清理：刪除資源
<a name="tutorial_saml-idp-and-federated-role-delete"></a>

最後一個步驟是，刪除堆疊及其包含的資源。

1. 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，選擇從範本建立的堆疊，然後選擇**刪除**，接著確認**刪除**。

   CloudFormation 會啟動刪除堆疊及其包含的所有資源。

## CloudFormation 範本詳細資訊
<a name="tutorial_saml-idp-and-federated-role-template-details"></a>

### Resources
<a name="tutorial_saml-idp-and-federated-role-template-resources"></a>

本教學課程的 CloudFormation 範本會在您的帳戶中建立下列資源：
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-samlprovider.html)：在 AWS 和外部 IdP 之間建立信任的 SAML IdP。
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html)：可由透過 SAML IdP 進行身分驗證之使用者擔任的聯合身分 IAM 角色。

### Configuration
<a name="tutorial_saml-idp-and-federated-role-configuration"></a>

範本包含下列可設定的參數：
+ **IdentityProviderName** – SAML IdP 的名稱 (留空以自動產生名稱)
+ **IdentityProviderSAMLMetadataDocument** – 來自 IdP 的 SAML 中繼資料文件 (必要)
+ **IdentityProviderAddPrivateKey**：用於解密 SAML 聲明的選用私有金鑰
+ **IdentityProviderAssertionEncryptionMode** – SAML 聲明的加密模式
+ **RoleName** – IAM 角色的名稱 (留空以自動產生名稱)
+ **RolePath** – IAM 角色的路徑 (預設值 /)
+ **RolePermissionsBoundary** – 許可界限政策的選用 ARN
+ **RoleSessionDuration** – 工作階段持續時間上限 (以秒為單位，3600-43200，預設值 7200)
+ **RoleManagedPolicy1-5** – 最多可連接 5 個受管政策的選用 ARN

## CloudFormation 範本
<a name="tutorial_saml-idp-and-federated-role-template"></a>

將下列 JSON 或 YAML 程式碼儲存為個別檔案，以用作本教學課程的 CloudFormation 範本。

------
#### [ JSON ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "[AWSDocs] IAM: tutorial_saml-idp-and-federated-role",
  "Parameters": {
    "IdentityProviderName": {
      "Type": "String",
      "Description": "Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[a-zA-Z0-9._-]+$",
      "ConstraintDescription": "Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens"
    },
    "IdentityProviderSAMLMetadataDocument": {
      "Type": "String",
      "Description": "SAML metadata document from identity provider"
    },
    "IdentityProviderAddPrivateKey": {
      "Type": "String",
      "Description": "Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.",
      "Default": ""
    },
    "IdentityProviderAssertionEncryptionMode": {
      "Type": "String",
      "Description": "Optional, sets encryption mode for SAML assertions",
      "Default": "",
      "AllowedValues": ["", "Allowed", "Required"]
    },
    "RoleName": {
      "Type": "String",
      "Description": "Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')",
      "Default": "",
      "AllowedPattern": "^$|^[\\w+=,.@-]{1,64}$",
      "ConstraintDescription": "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"
    },
    "RolePath": {
      "Type": "String",
      "Description": "Path for the IAM Role",
      "AllowedPattern": "(^\\/$)|(^\\/.*\\/$)",
      "Default": "/"
    },
    "RolePermissionsBoundary": {
      "Type": "String",
      "Description": "Optional ARN of the permissions boundary policy (leave empty for none)",
      "Default": ""
    },
    "RoleSessionDuration": {
      "Description": "The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)",
      "Type": "Number",
      "MinValue": 3600,
      "MaxValue": 43200,
      "Default": 7200
    },
    "RoleManagedPolicy1": {
      "Type": "String",
      "Description": "Optional managed policy ARN 1",
      "Default": ""
    },
    "RoleManagedPolicy2": {
      "Type": "String",
      "Description": "Optional managed policy ARN 2",
      "Default": ""
    },
    "RoleManagedPolicy3": {
      "Type": "String",
      "Description": "Optional managed policy ARN 3",
      "Default": ""
    },
    "RoleManagedPolicy4": {
      "Type": "String",
      "Description": "Optional managed policy ARN 4",
      "Default": ""
    },
    "RoleManagedPolicy5": {
      "Type": "String",
      "Description": "Optional managed policy ARN 5",
      "Default": ""
    }
  },
  "Conditions": {
    "HasCustomProviderName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderName"}, ""]}]},
    "HasCustomRoleName": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleName"}, ""]}]},
    "HasPermissionsBoundary": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RolePermissionsBoundary"}, ""]}]},
    "HasPolicy1": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy1"}, ""]}]},
    "HasPolicy2": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy2"}, ""]}]},
    "HasPolicy3": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy3"}, ""]}]},
    "HasPolicy4": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy4"}, ""]}]},
    "HasPolicy5": {"Fn::Not": [{"Fn::Equals": [{"Ref": "RoleManagedPolicy5"}, ""]}]},
    "HasPrivateKey": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAddPrivateKey"}, ""]}]},
    "HasAssertionEncryptionMode": {"Fn::Not": [{"Fn::Equals": [{"Ref": "IdentityProviderAssertionEncryptionMode"}, ""]}]}
  },
  "Resources": {
    "SAMLProvider": {
      "Type": "AWS::IAM::SAMLProvider",
      "Properties": {
        "Name": {"Fn::If": ["HasCustomProviderName", {"Ref": "IdentityProviderName"}, {"Ref": "AWS::NoValue"}]},
        "SamlMetadataDocument": {"Ref": "IdentityProviderSAMLMetadataDocument"},
        "AddPrivateKey": {"Fn::If": ["HasPrivateKey", {"Ref": "IdentityProviderAddPrivateKey"}, {"Ref": "AWS::NoValue"}]},
        "AssertionEncryptionMode": {"Fn::If": ["HasAssertionEncryptionMode", {"Ref": "IdentityProviderAssertionEncryptionMode"}, {"Ref": "AWS::NoValue"}]}
      }
    },
    "SAMLFederatedRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": {"Fn::If": ["HasCustomRoleName", {"Ref": "RoleName"}, {"Ref": "AWS::NoValue"}]},
        "Path": {"Ref": "RolePath"},
        "Description": "SAML federated IAM role for SSO access with specified permissions",
        "MaxSessionDuration": {"Ref": "RoleSessionDuration"},
        "PermissionsBoundary": {"Fn::If": ["HasPermissionsBoundary", {"Ref": "RolePermissionsBoundary"}, {"Ref": "AWS::NoValue"}]},
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": {"Ref": "SAMLProvider"}
              },
              "Action": [
                "sts:AssumeRole",
                "sts:SetSourceIdentity",
                "sts:TagSession"
              ],
              "Condition": {
                "StringEquals": {
                  "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
              }
            }
          ]
        },
        "ManagedPolicyArns": {
          "Fn::Split": [
            ",",
            {
              "Fn::Join": [
                ",",
                [
                  {"Fn::If": ["HasPolicy1", {"Ref": "RoleManagedPolicy1"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy2", {"Ref": "RoleManagedPolicy2"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy3", {"Ref": "RoleManagedPolicy3"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy4", {"Ref": "RoleManagedPolicy4"}, {"Ref": "AWS::NoValue"}]},
                  {"Fn::If": ["HasPolicy5", {"Ref": "RoleManagedPolicy5"}, {"Ref": "AWS::NoValue"}]}
                ]
              ]
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "RoleARN": {
      "Description": "ARN of the created IAM Role",
      "Value": {"Fn::GetAtt": ["SAMLFederatedRole", "Arn"]},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-RoleARN"}
      }
    },
    "IdentityProviderARN": {
      "Description": "ARN of the created SAML Identity Provider",
      "Value": {"Ref": "SAMLProvider"},
      "Export": {
        "Name": {"Fn::Sub": "${AWS::StackName}-IdentityProviderARN"}
      }
    }
  }
}
```

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] IAM: tutorial_saml-idp-and-federated-role'

Parameters:
  IdentityProviderName:
    Type: String
    Description: Name of the SAML Identity Provider (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[a-zA-Z0-9._-]+$'
    ConstraintDescription: Must be empty or contain only alphanumeric characters, periods, underscores, and hyphens

  IdentityProviderSAMLMetadataDocument:
    Type: String
    Description: SAML metadata document from identity provider

  IdentityProviderAddPrivateKey:
    Type: String
    Description: Optional private key for decrypting SAML assertions. The private key must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML assertions.
    Default: ""

  IdentityProviderAssertionEncryptionMode:
    Type: String
    Description: Optional, sets encryption mode for SAML assertions
    Default: ""
    AllowedValues:
      - ""
      - "Allowed"
      - "Required"

  RoleName:
    Type: String
    Description: Name of the IAM Role (leave empty for auto-generated name like '{StackName}-{UniqueId}')
    Default: ""
    AllowedPattern: '^$|^[\w+=,.@-]{1,64}$'
    ConstraintDescription: "Must be empty or 1-64 characters and can contain alphanumeric characters and +=,.@-"

  RolePath:
    Type: String
    Description: Path for the IAM Role
    AllowedPattern: (^\/$)|(^\/.*\/$)
    Default: "/"

  RolePermissionsBoundary:
    Type: String
    Description: Optional ARN of the permissions boundary policy (leave empty for none)
    Default: ""
    
  RoleSessionDuration:
    Description: The maximum session duration (in seconds) that you want to set for the specified role (3600-43200)
    Type: Number
    MinValue: 3600
    MaxValue: 43200
    Default: 7200

  RoleManagedPolicy1:
    Type: String
    Description: Optional managed policy ARN 1
    Default: ""
  RoleManagedPolicy2:
    Type: String
    Description: Optional managed policy ARN 2
    Default: ""
  RoleManagedPolicy3:
    Type: String
    Description: Optional managed policy ARN 3
    Default: ""
  RoleManagedPolicy4:
    Type: String
    Description: Optional managed policy ARN 4
    Default: ""
  RoleManagedPolicy5:
    Type: String
    Description: Optional managed policy ARN 5
    Default: ""

Conditions:
  HasCustomProviderName: !Not [!Equals [!Ref IdentityProviderName, ""]]
  HasCustomRoleName: !Not [!Equals [!Ref RoleName, ""]]
  HasPermissionsBoundary: !Not [!Equals [!Ref RolePermissionsBoundary, ""]]
  HasPolicy1: !Not [!Equals [!Ref RoleManagedPolicy1, ""]]
  HasPolicy2: !Not [!Equals [!Ref RoleManagedPolicy2, ""]]
  HasPolicy3: !Not [!Equals [!Ref RoleManagedPolicy3, ""]]
  HasPolicy4: !Not [!Equals [!Ref RoleManagedPolicy4, ""]]
  HasPolicy5: !Not [!Equals [!Ref RoleManagedPolicy5, ""]]
  HasPrivateKey: !Not [!Equals [!Ref IdentityProviderAddPrivateKey, ""]]
  HasAssertionEncryptionMode: !Not [!Equals [!Ref IdentityProviderAssertionEncryptionMode, ""]]

Resources:
  SAMLProvider:
    Type: AWS::IAM::SAMLProvider
    Properties:
      Name: !If
        - HasCustomProviderName
        - !Ref IdentityProviderName
        - !Ref AWS::NoValue
      SamlMetadataDocument: !Ref IdentityProviderSAMLMetadataDocument
      AddPrivateKey: !If
        - HasPrivateKey
        - !Ref IdentityProviderAddPrivateKey
        - !Ref AWS::NoValue
      AssertionEncryptionMode: !If
        - HasAssertionEncryptionMode
        - !Ref IdentityProviderAssertionEncryptionMode
        - !Ref AWS::NoValue

  SAMLFederatedRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !If
        - HasCustomRoleName
        - !Ref RoleName
        - !Ref AWS::NoValue
      Path: !Ref RolePath
      Description: "SAML federated IAM role for SSO access with specified permissions"
      MaxSessionDuration: !Ref RoleSessionDuration
      PermissionsBoundary: !If
        - HasPermissionsBoundary
        - !Ref RolePermissionsBoundary
        - !Ref AWS::NoValue
      AssumeRolePolicyDocument:
        Version: '2012-10-17		 	 	 '
        Statement:
          - Effect: Allow
            Principal:
              Federated: !Ref SAMLProvider
            Action:
              - 'sts:AssumeRole'
              - 'sts:SetSourceIdentity'
              - 'sts:TagSession'
            Condition:
              StringEquals:
                'SAML:aud': 'https://signin.aws.amazon.com/saml'
      ManagedPolicyArns: !Split
        - ','
        - !Join
          - ','
          - - !If [HasPolicy1, !Ref RoleManagedPolicy1, !Ref "AWS::NoValue"]
            - !If [HasPolicy2, !Ref RoleManagedPolicy2, !Ref "AWS::NoValue"]
            - !If [HasPolicy3, !Ref RoleManagedPolicy3, !Ref "AWS::NoValue"]
            - !If [HasPolicy4, !Ref RoleManagedPolicy4, !Ref "AWS::NoValue"]
            - !If [HasPolicy5, !Ref RoleManagedPolicy5, !Ref "AWS::NoValue"]

Outputs:
  RoleARN:
    Description: ARN of the created IAM Role
    Value: !GetAtt SAMLFederatedRole.Arn
    Export:
      Name: !Sub '${AWS::StackName}-RoleARN'

  IdentityProviderARN:
    Description: ARN of the created SAML Identity Provider
    Value: !Ref SAMLProvider
    Export:
      Name: !Sub '${AWS::StackName}-IdentityProviderARN'
```

------