

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

# IAM 身分
<a name="id"></a>

IAM 身分可以與一或多個政策建立關聯，這些政策會決定身分獲授權執行的動作、 AWS 資源以及條件。IAM 身分包括 IAM 使用者、IAM 群組及 IAM 角色。IAM 實體是一種身分類型，代表可以進行身分驗證並授權在 AWS 帳戶中執行動作的人類使用者或程式設計式工作負載。IAM 實體包括 IAM 使用者和 IAM 角色。如需常用詞彙的定義，請參閱[條款](introduction_identity-management.md#intro-structure-terms)。

您可以從外部身分提供者聯合現有的身分。這些身分將擔任 IAM 角色來存取 AWS 資源。如需詳細資訊，請參閱[身分提供者和聯合身分 AWS](id_roles_providers.md)。

您也可以使用 AWS IAM Identity Center 來建立和管理身分和對 AWS 資源的存取。IAM Identity Center 許可集會自動建立提供對資源的存取權所需的 IAM 角色。如需詳細資訊，請參閱[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)

 AWS 帳戶根使用者 是在 AWS 帳戶 建立 時建立的 AWS 帳戶 委託人。根使用者可存取帳戶中的所有 AWS 服務和資源。如需詳細資訊，請參閱[IAM 根使用者](#id_root)。

**注意**  
使用 IAM 身分時，遵循 [IAM 中的安全最佳實務](https://docs.aws.amazon.com//IAM/latest/UserGuide/best-practices-use-cases.html)。
使用根使用者時，遵循 [AWS 帳戶的根使用者最佳實務](root-user-best-practices.md)。
如果您登入時遇到問題，請參閱[登入 AWS 管理主控台](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html)。

## IAM 根使用者
<a name="id_root"></a>

當您第一次建立 時 AWS 帳戶，您會從一個登入身分開始，該身分可完整存取帳戶中的所有 AWS 服務 和資源。此身分稱為 AWS 帳戶 *Theroot 使用者*。如需詳細資訊，請參閱 [AWS 帳戶根使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html)。

## IAM 使用者
<a name="id_iam-users"></a>

*IAM 使用者*是 中的身分 AWS 帳戶 ，具有單一人員或應用程式的特定許可。如需詳細資訊，請參閱 [IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)。

## IAM 使用者群組
<a name="id_iam-groups"></a>

*IAM 使用者群組*是一種指定 IAM 使用者集合的身分。如需詳細資訊，請參閱[使用者群組](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)。

## IAM 角色
<a name="id_iam-roles"></a>

*IAM 角色*是 中具有特定許可 AWS 帳戶 的身分。它類似 IAM 使用者，但未與特定的人員建立關聯。如需詳細資訊，請參閱 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)。

# AWS 帳戶根使用者
<a name="id_root-user"></a>

當您首次建立 Amazon Web Services (AWS) 帳戶時，您會從單一登入身分開始，該身分可完整存取帳戶中的所有 AWS 服務和資源。此身分稱為 AWS 帳戶*根使用者*。您用來建立 的電子郵件地址和密碼 AWS 帳戶 是您用來以根使用者身分登入的登入資料。
+ 僅使用根使用者來執行需要根層級許可的任務。如需檢視需要您以根使用者身分登入的任務完整清單，請參閱 [需要根使用者憑證的任務](#root-user-tasks)。
+ 遵循[適用於 AWS 帳戶的根使用者最佳實務](root-user-best-practices.md)。
+ 如果您登入時遇到問題，請參閱[登入 AWS 管理主控台](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html)。

**重要**  
強烈建議您不使用根使用者處理日常任務，並且遵循 [AWS 帳戶的根使用者最佳實務](root-user-best-practices.md)。保護您的根使用者憑證，並將其用來執行只能由根使用者執行的任務。如需檢視需要您以根使用者身分登入的任務完整清單，請參閱 [需要根使用者憑證的任務](#root-user-tasks)。

儘管依預設，根使用者會強制啟用 MFA，但這需要使用者在初始帳戶建立期間或登入期間依提示手動新增 MFA。如需有關使用 MFA 保護根使用者的詳細資訊，請參閱[的多重要素驗證 AWS 帳戶根使用者](enable-mfa-for-root.md)。

## 集中管理成員帳戶的根存取權
<a name="id_root-user-access-management"></a>

若要協助您大規模管理憑證，您可以集中安全地存取 AWS Organizations中成員帳戶的根使用者憑證。啟用 時 AWS Organizations，您可以將所有 AWS 帳戶合併為組織以進行集中管理。集中根存取權可讓您移除根使用者憑證，並對成員帳戶執行下列特權任務。

**移除成員帳戶根使用者憑證**  
[集中根存取成員帳戶](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-enable-root-access.html)後，您可以選擇從 Organizations 中的成員帳戶刪除根使用者憑證。您可以移除根使用者密碼、存取金鑰、簽署憑證，以及停用多重要素驗證 (MFA)。您在 Organizations 中建立的新帳戶預設沒有根使用者憑證。成員帳戶無法登入其根使用者，也無法為其根使用者執行密碼復原 (除非啟用帳戶復原)。

**執行需要根使用者憑證的特權任務**  
某些任務只有在您以帳戶的根使用者身分登入時才能執行。其中一些 [需要根使用者憑證的任務](#root-user-tasks) 可以由 IAM 的管理帳戶或委派管理員執行。若要進一步了解如何對成員帳戶採取特權動作，請參閱[執行特權任務](id_root-user-privileged-task.md)。

**啟用根使用者的帳戶復原**  
如果您需要復原成員帳戶的根使用者憑證，Organizations 管理帳戶或委派管理員可以執行**允許密碼復原**特權任務。有權存取成員帳戶根使用者電子郵件收件匣的人員可以[重設根使用者密碼](https://docs.aws.amazon.com/IAM/latest/UserGuide/reset-root-password.html)，以復原根使用者憑證。我們建議您在完成需要存取根使用者的任務後，刪除根使用者憑證。

# 集中成員帳戶的根存取權
<a name="id_root-enable-root-access"></a>

根使用者登入資料是指派給每個 AWS 帳戶 的初始登入資料，可完整存取帳戶中的所有 AWS 服務和資源。啟用 時 AWS Organizations，您可以將所有 AWS 帳戶合併為組織以進行集中管理。每個成員帳戶都有自己的根使用者，具有在成員帳戶中執行任何動作的預設許可。我們建議您集中保護使用 管理的 AWS 帳戶 根使用者憑證 AWS Organizations ，以防止根使用者憑證大規模復原和存取。

集中根存取權後，您可以選擇從組織的成員帳戶中刪除根使用者憑證。您可以移除根使用者密碼、存取金鑰、簽署憑證，以及停用多重要素驗證 (MFA)。依預設，您在 AWS Organizations 中建立的新帳戶沒有根使用者憑證。成員帳戶無法登入其根使用者，也無法為其根使用者執行密碼復原。

**注意**  
雖然某些[需要根使用者憑證的任務](id_root-user.md#root-user-tasks)可由管理帳戶或 IAM 的委派管理員執行，但某些任務只能以帳戶的根使用者身分登入才能執行。  
如果您需要復原成員帳戶的根使用者憑證才能執行這些任務之一，請遵循[執行特權任務](id_root-user-privileged-task.md)中的步驟，然後選取**允許密碼復原**。之後，有權存取成員帳戶根使用者電子郵件收件匣的人員可以遵循步驟[重設根使用者密碼](https://docs.aws.amazon.com/IAM/latest/UserGuide/reset-root-password.html)，並登入成員帳戶根使用者。  
 我們建議您在完成需要存取根使用者的任務後，刪除根使用者憑證。

## 先決條件
<a name="enable-root-access-management_prerequisite"></a>

在集中根存取權之前，您必須使用下列設定設定帳戶：
+ 您必須具備下列 IAM 許可：
  + `iam:GetAccessKeyLastUsed`
  + `iam:GetAccountSummary`
  + `iam:GetLoginProfile`
  + `iam:GetUser`
  + `iam:ListAccessKeys`
  + `iam:ListMFADevices`
  + `iam:ListSigningCertificates`
  + `sts:AssumeRoot`
**注意**  
若要稽核成員帳戶的根使用者登入資料狀態，您可以在 AWS Organizations 成員帳戶上執行特殊權限任務時，使用 [IAMAuditRootUserCredentials](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMAuditRootUserCredentials) AWS 受管政策來縮小許可範圍，或使用可存取 的任何政策`iam:GetAccountSummary`。  
若要產生根使用者憑證資訊報告，其他政策只需 `iam:GetAccountSummary` 動作即可產生相同的輸出。您也可以列出或取得個別根使用者憑證資訊，包括：  
根使用者密碼是否存在
根使用者存取金鑰是否存在以及上次使用時間
根使用者是否具有相關聯的簽署憑證
根使用者關聯的 MFA 裝置
合併的根使用者憑證狀態清單
+ 您必須在 AWS 帳戶 中管理 [AWS Organizations](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_introduction.html)。
+ 您必須具有下列許可，以在組織中啟用此功能：
  + `iam:EnableOrganizationsRootCredentialsManagement`
  + `iam:EnableOrganizationsRootSessions`
  + `iam:ListOrganizationsFeatures`
  + `organizations:EnableAwsServiceAccess`
  + `organizations:ListAccountsForParent`
  + `organizations:RegisterDelegatedAdministrator` 
+ 為確保最佳的主控台功能，建議啟用下列其他許可：
  + `organizations:DescribeAccount`
  + `organizations:DescribeOrganization`
  + `organizations:ListAWSServiceAccessForOrganization`
  + `organizations:ListDelegatedAdministrators`
  + `organizations:ListOrganizationalUnitsForParent`
  + `organizations:ListParents`
  + `organizations:ListTagsForResource`

## 啟用集中式根存取權 (主控台)
<a name="enable-root-access-console"></a>

**若要在 中為成員帳戶啟用此功能 AWS 管理主控台**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在主控台的導覽窗格中，選擇**根存取權管理**，然後選取**啟用**。
**注意**  
如果您看到**根存取管理已停用**，請啟用 AWS Identity and Access Management 中的受信任存取 AWS Organizations。如需詳細資訊，請參閱《AWS Organizations 使用者指南》**中的 [AWS IAM 和 AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-iam.html)。

1. 在「要啟用的功能」區段中，選擇要啟用的功能。
   + 選取**根憑證管理**，以允許管理帳戶和 IAM 的委派管理員刪除成員帳戶的根使用者憑證。您必須啟用「成員帳戶中的特權根動作」，以允許成員帳戶在根使用者憑證刪除後復原其根使用者憑證。
   + 選取**成員帳戶中的特權根動作**，以允許管理帳戶和 IAM 的委派管理員執行需要根使用者憑證的特定任務。

1. (選用) 輸入授權管理根使用者存取權並對成員帳戶採取特權動作的**委派管理員**的帳戶 ID。我們建議使用用於安全或管理目的的帳戶。

1. 選擇**啟用**。

## 啟用集中式根存取權 (AWS CLI)
<a name="enable-root-access-cli"></a>

**從 AWS Command Line Interface (AWS CLI) 啟用集中式根存取**

1. 如果您尚未在 AWS Identity and Access Management 中啟用 的信任存取 AWS Organizations，請使用下列命令：[aws organizations enable-aws-service-access](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/organizations/enable-aws-service-access.html)。

1. 使用下列命令，允許管理帳戶和委派管理員刪除成員帳戶的根使用者憑證：[aws iam enable-organizations-root-credentials-management](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/enable-organizations-root-credentials-management.html)。

1. 使用下列命令，允許管理帳戶和委派管理員執行需要根使用者憑證的特定任務：[aws iam enable-organizations-root-sessions](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/enable-organizations-root-sessions.html)。

1. (選用) 使用下列命令來註冊委派管理員：[aws organizations register-delegated-administrator](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/organizations/register-delegated-administrator.html)。

   下列範例會將帳戶 111111111111 指派為 IAM 服務的委派管理員。

   ```
   aws organizations register-delegated-administrator 
   --service-principal iam.amazonaws.com
   --account-id 111111111111
   ```

## 啟用集中式根存取 (AWS API)
<a name="enable-root-access-api"></a>

**從 AWS API 啟用集中式根存取**

1. 如果您尚未在 AWS Identity and Access Management 中啟用 的受信任存取 AWS Organizations，請使用下列命令：[EnableAWSServiceAccess](https://docs.aws.amazon.com/organizations/latest/APIReference/API_EnableAWSServiceAccess.html)。

1. 使用下列命令，允許管理帳戶和委派管理員刪除成員帳戶的根使用者憑證：[EnableOrganizationsRootCredentialsManagement](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableOrganizationsRootCredentialsManagement.html)。

1. 使用下列命令，允許管理帳戶和委派管理員執行需要根使用者憑證的特定任務：[EnableOrganizationsRootSessions](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableOrganizationsRootSessions.html)。

1. (選用) 使用下列命令來註冊委派管理員：[RegisterDelegatedAdministrator](https://docs.aws.amazon.com/organizations/latest/APIReference/API_RegisterDelegatedAdministrator.html)。

## 後續步驟
<a name="enable-root-access_next-steps"></a>

集中保護組織中成員帳戶的特權憑證後，請參閱[執行特權任務](id_root-user-privileged-task.md)以對成員帳戶採取特權動作。

# 在 AWS Organizations 成員帳戶上執行特權任務
<a name="id_root-user-privileged-task"></a>

IAM 的 AWS Organizations 管理帳戶或委派管理員帳戶可以對成員帳戶執行一些特殊權限任務，否則需要根使用者憑證。透過集中式根存取，這些任務會透過短期特權工作階段執行。這些工作階段提供範圍限定於特定特殊權限動作的臨時憑證，而不需要成員帳戶的根使用者登入。

啟動特權工作階段後，您可以刪除設定錯誤的 Amazon S3 儲存貯體政策、刪除設定錯誤的 Amazon SQS 佇列政策、刪除成員帳戶的根使用者憑證，以及為成員帳戶重新啟用根使用者憑證。

**注意**  
若要使用集中式根存取，您必須透過管理帳戶或委派管理員帳戶以明確授予`sts:AssumeRoot`許可的 IAM 使用者或角色身分登入。您無法使用根使用者登入資料來呼叫 `sts:AssumeRoot`。

## 先決條件
<a name="root-user-privileged-task_prerequisite"></a>

您必須先具有下列設定，然後才能啟動特權工作階段：
+ 您已在組織中啟用集中式根存取權。如需啟用此功能的步驟，請參閱[集中成員帳戶的根存取權](id_root-enable-root-access.md)。
+ 您的管理帳戶或委派管理員帳戶具有下列許可：`sts:AssumeRoot`

## 對成員帳戶執行特權動作 (主控台)
<a name="root-user-privileged-task_action-console"></a>

**在 中為成員帳戶中的特權動作啟動工作階段 AWS 管理主控台**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在主控台的導覽窗格中，選擇**根存取權管理**。

1. 從成員帳戶清單中選取名稱，然後選擇**執行特權動作**。

1. 選擇您要在成員帳戶中執行的特權動作。
   + 選取**刪除 Amazon S3 儲存貯體政策**，以移除設定錯誤的儲存貯體政策，此政策拒絕所有主體存取 Amazon S3 儲存貯體。

     1. 選擇**瀏覽 S3** 以從成員帳戶擁有的儲存貯體中選取名稱，然後選取**選擇**。

     1. 選擇**刪除儲存貯體政策**。

     1. 刪除設定錯誤的政策後，使用 Amazon S3 主控台來更正儲存貯體政策。如需詳細資訊，請參閱 *Amazon S3 User Guide* 中的 [Adding a bucket policy by using the Amazon S3 console](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)。
   + 選取**刪除 Amazon SQS 政策**，以刪除拒絕所有主體存取 Amazon SQS 佇列的 Amazon Simple Queue Service 資源型政策。

     1. 在 **SQS 佇列名稱**中輸入佇列名稱，然後選取**刪除 SQS 政策**。

     1. 刪除設定錯誤的政策後，使用 Amazon SQS 主控台來更正佇列政策。如需詳細資訊，請參閱《Amazon SQS 開發人員指南》**中的[在 Amazon SQS 中設定存取政策](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-add-permissions.html)。
   + 選取**刪除根憑證**，以從成員帳戶移除根存取權。刪除根使用者憑證會移除成員帳戶的根使用者密碼、存取金鑰、簽署憑證和停用多重要素驗證 (MFA)。

     1. 選擇**刪除根憑證**。
   + 選取**允許密碼復原**，以復原成員帳戶的根使用者憑證。

     只有在成員帳戶沒有根使用者憑證時，才能使用此選項。

     1. 選擇**允許密碼復原**。

     1. 執行此特權動作後，有權存取成員帳戶根使用者電子郵件收件匣的人員可以[重設根使用者密碼](https://docs.aws.amazon.com/IAM/latest/UserGuide/reset-root-password.html)，並登入成員帳戶根使用者。

## 對成員帳戶執行特權動作 (AWS CLI)
<a name="root-user-privileged-task_action-cli"></a>

**從 為成員帳戶中的特權動作啟動工作階段 AWS Command Line Interface**

1. 使用下列命令來擔任根使用者工作階段：[aws sts assume-root](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-root.html)。
**注意**  
`sts:AssumeRoot` 不支援全域端點。您必須將此請求傳送至區域 AWS STS 端點。如需詳細資訊，請參閱[在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

   為成員帳戶啟動特權根使用者工作階段時，您必須定義 `task-policy-arn`，以將工作階段範圍限制為工作階段期間要執行的特權動作。您可以使用下列其中一個 AWS 受管政策，來限制特權工作階段動作的範圍。
   + [IAMAuditRootUserCredentials](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMAuditRootUserCredentials)
   + [IAMCreateRootUserPassword](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMCreateRootUserPassword)
   + [IAMDeleteRootUserCredentials](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMDeleteRootUserCredentials)
   + [S3UnlockBucketPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-S3UnlockBucketPolicy)
   + [SQSUnlockQueuePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-SQSUnlockQueuePolicy)

   若要限制管理帳戶或委派管理員在特權根使用者工作階段期間可執行的動作，您可以使用 AWS STS 條件金鑰 [sts：TaskPolicyArn](reference_policies_iam-condition-keys.md#ck_taskpolicyarn)。

    在下列範例中，委派管理員假設以根使用者身分刪除成員帳戶 ID *111122223333* 的根使用者憑證。

   ```
   aws sts assume-root \
     --target-principal 111122223333 \
     --task-policy-arn arn=arn:aws:iam::aws:policy/root-task/IAMDeleteRootUserCredentials \
     --duration-seconds 900
   ```

1. 使用回應中的 `AccessKeyId`、`SessionToken` 和 `SecretAccessKey`，在成員帳戶中執行特權動作。您可以省略請求中的使用者名稱和密碼，以預設為成員帳戶。
   + **檢查根使用者憑證的狀態**。使用下列命令，來檢查成員帳戶的根使用者憑證狀態。
     + [get-user](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/get-user.html)
     + [get-login-profile](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/get-login-profile.html)
     + [list-access-keys](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-access-keys.html)
     + [list-signing-certificates](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-signing-certificates.html)
     + [list-mfa-devices](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-mfa-devices.html)
     + [get-access-key-last-used](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/get-access-key-last-used.html)
   + **刪除根使用者憑證**。使用下列命令刪除根存取權。您可以移除根使用者密碼、存取金鑰、簽署憑證，以及停用多重要素驗證 (MFA)，以移除對根使用者的所有存取和復原。
     + [delete-login-profile](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/delete-login-profile.html)
     + [delete-access-key](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/delete-access-key.html)
     + [delete-signing-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/delete-signing-certificate.html)
     + [deactivate-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/deactivate-mfa-device.html)
   + **刪除 Amazon S3 儲存貯體政策**。使用下列命令來讀取、編輯和刪除設定錯誤的儲存貯體政策，此政策拒絕所有主體存取 Amazon S3 儲存貯體。
     + [list-buckets](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/list-buckets.html)
     + [get-bucket-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-policy.html)
     + [put-bucket-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-policy.html)
     + [delete-bucket-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-bucket-policy.html)
   + **刪除 Amazon SQS 政策**。使用下列命令，來檢視和刪除拒絕所有主體存取 Amazon SQS 佇列的 Amazon Simple Queue Service 資源型政策。
     + [list-queues](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/list-queues.html)
     + [get-queue-url](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-url.html)
     + [get-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/get-queue-attributes.html)
     + [set-queue-attributes](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/set-queue-attributes.html)
   + **允許密碼復原**。使用下列命令來檢視使用者名稱，並復原成員帳戶的根使用者憑證。
     + [get-login-profile](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/get-login-profile.html)
     + [create-login-profile](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-login-profile.html)

## 對成員帳戶 (AWS API) 採取特權動作
<a name="root-user-privileged-task_action-api"></a>

**從 AWS API 為成員帳戶中的特權動作啟動工作階段**

1. 使用下列命令來擔任根使用者工作階段：[AssumeRoot](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html)。
**注意**  
AssumeRoot 不支援全域端點。您必須將此請求傳送至區域 AWS STS 端點。如需詳細資訊，請參閱[在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

   為成員帳戶啟動特權根使用者工作階段時，您必須定義 `TaskPolicyArn`，以將工作階段範圍限制為工作階段期間要執行的特權動作。您可以使用下列其中一個 AWS 受管政策來限制特權工作階段動作的範圍。
   + [IAMAuditRootUserCredentials](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMAuditRootUserCredentials)
   + [IAMCreateRootUserPassword](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMCreateRootUserPassword)
   + [IAMDeleteRootUserCredentials](security-iam-awsmanpol.md#security-iam-awsmanpol-IAMDeleteRootUserCredentials)
   + [S3UnlockBucketPolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-S3UnlockBucketPolicy)
   + [SQSUnlockQueuePolicy](security-iam-awsmanpol.md#security-iam-awsmanpol-SQSUnlockQueuePolicy)

   若要限制管理帳戶或委派管理員在特權根使用者工作階段期間可執行的動作，您可以使用 AWS STS 條件金鑰 [sts：TaskPolicyArn](reference_policies_iam-condition-keys.md#ck_taskpolicyarn)。

   在下列範例中，委派管理員擔任根使用者身分，以讀取、編輯和刪除成員帳號 ID *111122223333* 的 Amazon S3 儲存貯體之設定錯誤的資源型政策。

   ```
   https://sts.us-east-2.amazonaws.com/
     ?Version=2011-06-15
     &Action=AssumeRoot
     &TargetPrincipal=111122223333
     &PolicyArns.arn=arn:aws:iam::aws:policy/root-task/S3UnlockBucketPolicy 
     &DurationSeconds 900
   ```

1. 使用回應中的 `AccessKeyId`、`SessionToken` 和 `SecretAccessKey`，在成員帳戶中執行特權動作。您可以省略請求中的使用者名稱和密碼，以預設為成員帳戶。
   + **檢查根使用者憑證的狀態**。使用下列命令，來檢查成員帳戶的根使用者憑證狀態。
     + [GetUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html)
     + [GetLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html)
     + [ListAccessKeys](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html)
     + [ListSigningCertificates](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSigningCertificates.html)
     + [ListMFADevices](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADevices.html)
     + [GetAccessKeyLastUsed](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html)
   + **刪除根使用者憑證**。使用下列命令刪除根存取權。您可以移除根使用者密碼、存取金鑰、簽署憑證，以及停用多重要素驗證 (MFA)，以移除對根使用者的所有存取和復原。
     + [DeleteLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteLoginProfile.html)
     + [DeleteAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html)
     + [DeleteSigningCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteSigningCertificate.html)
     + [DeactivateMfaDevice](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html)
   + **刪除 Amazon S3 儲存貯體政策**。使用下列命令來讀取、編輯和刪除設定錯誤的儲存貯體政策，此政策拒絕所有主體存取 Amazon S3 儲存貯體。
     + [ListBuckets](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html)
     + [GetBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicy.html)
     + [PutBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketPolicy.html)
     + [DeleteBucketPolicy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketPolicy.html)
   + **刪除 Amazon SQS 政策**。使用下列命令，來檢視和刪除拒絕所有主體存取 Amazon SQS 佇列的 Amazon Simple Queue Service 資源型政策。
     + [ListQueues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ListQueues.html)
     + [GetQueueUrl](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueUrl.html)
     + [GetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_GetQueueAttributes.html)
     + [SetQueueAttributes](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)
   + **允許密碼復原**。使用下列命令來檢視使用者名稱，並復原成員帳戶的根使用者憑證。
     + [GetLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html)
     + [CreateLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateLoginProfile.html)

# 的多重要素驗證 AWS 帳戶根使用者
<a name="enable-mfa-for-root"></a>

**重要**  
AWS 建議您盡可能使用 MFA 的通行金鑰或安全金鑰 AWS，因為它們更能抵禦網路釣魚等攻擊。如需詳細資訊，請參閱[通行密鑰和安全金鑰](#passkeys-security-keys-for-root)。

多重要素驗證 (MFA) 是一種簡單且有效的機制，可增強您的安全性。第一個因素：您的密碼，是您記住的秘密，也稱為知識因素。其他因素可以是擁有因素 (您擁有的事物，例如安全金鑰) 或繼承因素 (您自身的事物，例如生物特徵掃描)。為了提高安全性，強烈建議您設定多重要素驗證 (MFA)，以協助保護您的 AWS 資源。

**注意**  
所有 AWS 帳戶 類型 （獨立、管理和成員帳戶） 都需要為其根使用者設定 MFA。 AWS 管理主控台 如果尚未啟用 MFA，使用者必須在第一次登入嘗試存取 的 35 天內註冊 MFA。

您可以為 AWS 帳戶根使用者 和 IAM 使用者啟用 MFA。當您為根使用者啟用 MFA 時，它僅影響根使用者憑證。如需如何針對 IAM 使用者啟用 MFA 的詳細資訊，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

**注意**  
AWS 帳戶 使用 受管 AWS Organizations 可以選擇[集中管理成員帳戶的根存取權](id_root-user.md#id_root-user-access-management)，以防止憑證復原和大規模存取。如果啟用了此選項，您可以從成員帳戶中刪除根使用者憑證，包括密碼和 MFA，從而有效地防止以根使用者身分登入、密碼復原或設定 MFA。或者，如果您偏好使用基於密碼的登入方式，請註冊 MFA 以增強帳戶保護來確保帳戶安全。

啟用根使用者的 MFA 之前，請檢閱並[更新您的帳戶設定和聯絡資訊](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-root-user.html)，以確保您有權存取電子郵件和電話號碼。如果您的 MFA 裝置遺失、遭竊或無法運作，您仍然可以使用該電子郵件和電話號碼驗證身分，以根使用者身分登入。如需了解如何使用其他身分驗證方法登入的詳細資訊，請參閱[在 IAM 中復原受 MFA 保護的身分](id_credentials_mfa_lost-or-broken.md)。若要停用這項功能，請聯絡 [AWS 支援](https://console.aws.amazon.com/support/home#/)。

AWS 支援根使用者的下列 MFA 類型：
+ [通行密鑰和安全金鑰](#passkeys-security-keys-for-root)
+ [虛擬驗證器應用程式](#virtual-auth-apps-for-root)
+ [硬體 TOTP 權杖](#hardware-totp-token-for-root)

## 通行密鑰和安全金鑰
<a name="passkeys-security-keys-for-root"></a>

AWS Identity and Access Management 支援 MFA 的通行金鑰和安全金鑰。根據 FIDO 標準，通行金鑰使用公有金鑰密碼編譯來提供比密碼更安全的強大、網路釣魚防護身分驗證。 AWS 支援兩種類型的通行金鑰：裝置繫結的通行金鑰 （安全金鑰） 和同步的通行金鑰。
+ **安全金鑰**：這些是用作身分驗證的第二個因素的實體裝置，例如 YubiKey。單一安全金鑰可以支援多個根使用者帳戶和 IAM 使用者。
+ **同步通行密鑰**：這些使用來自提供者 (例如 Google、Apple、Microsoft 帳戶等) 和第三方服務 (例如 1Password、Dashlane 和 Bitwarden 等) 的憑證管理工具作為第二個因素。

您可以使用內建的生物識別驗證器，例如 Apple MacBooks 上的 Touch ID，解鎖您的憑證管理工具並登入 AWS。通行密鑰是透過您選擇的提供者，使用指紋、面部或裝置 PIN 碼建立的。您也可以使用一台裝置 (例如行動裝置或硬體安全金鑰) 中的跨帳戶身分驗證 (CDA) 通行密鑰，在筆記型電腦等其他裝置上登入。如需詳細資訊，請參閱 [cross-device authentication](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda) (CDA)。

您可以跨裝置同步通行金鑰，以便使用 登入 AWS，增強可用性和可復原性。如需啟用通行密鑰和安全金鑰的詳細資訊，請參閱[為根使用者啟用通行密鑰或安全金鑰 (主控台)](enable-fido-mfa-for-root.md)。

FIDO Alliance 維護與 FIDO 規範相容的所有[經 FIDO 認證的產品](https://fidoalliance.org/certification/fido-certified-products/)的清單。

## 虛擬驗證器應用程式
<a name="virtual-auth-apps-for-root"></a>

在手機或其他裝置上執行並模擬實體裝置的虛擬驗證器應用程式。虛擬驗證器應用程式實作[以時間為基礎的一次性密碼](https://datatracker.ietf.org/doc/html/rfc6238) (TOTP) 算法，並且支援在單台裝置上使用多個權杖。使用者必須在登入期間出現提示時輸入裝置中的有效代碼。每個指派給使用者的權杖都必須是唯一的。使用者無法輸入另一個使用者的權杖來進行身分驗證。

我們強烈建議您在等待硬體的購買核准或等待硬體就定位時，使用虛擬 MFA 裝置。如需可以用來做為虛擬 MFA 裝置的支援應用程式清單，請參閱[多重要素驗證 (MFA)](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。如需使用 設定虛擬 MFA 裝置的指示 AWS，請參閱 [針對根使用者啟用虛擬 MFA 裝置 (主控台)](enable-virt-mfa-for-root.md)。

## 硬體 TOTP 權杖
<a name="hardware-totp-token-for-root"></a>

一種在[以時間為基礎的一次性密碼 (TOTP) 演算法](https://datatracker.ietf.org/doc/html/rfc6238)的基礎上產生六位數字程式碼的硬體裝置。使用者必須在登入期間在第二個網頁上輸入裝置中的有效程式碼。每個指派給使用者的 MFA 裝置都必須是唯一的。使用者無法輸入另一個使用者裝置的代碼來進行身分驗證。如需支援的硬體 MFA 裝置資訊，請參閱[多重要素驗證 (MFA)](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。如需使用 AWS設定硬體 TOTP 權杖的說明，請參閱 [針對根使用者啟用硬體 TOTP 權杖 (主控台)](enable-hw-mfa-for-root.md)。

如果想要使用實體 MFA 裝置，我們建議您使用 FIDO 安全金鑰作為硬體 TOTP 裝置的替代方案。FIDO 安全金鑰具有無需電池和防釣魚的優勢，而且可在單一裝置上支援多個根使用者和 IAM 使用者，以增強安全性。

**Topics**
+ [通行密鑰和安全金鑰](#passkeys-security-keys-for-root)
+ [虛擬驗證器應用程式](#virtual-auth-apps-for-root)
+ [硬體 TOTP 權杖](#hardware-totp-token-for-root)
+ [為根使用者啟用通行密鑰或安全金鑰 (主控台)](enable-fido-mfa-for-root.md)
+ [針對根使用者啟用虛擬 MFA 裝置 (主控台)](enable-virt-mfa-for-root.md)
+ [針對根使用者啟用硬體 TOTP 權杖 (主控台)](enable-hw-mfa-for-root.md)

# 為根使用者啟用通行密鑰或安全金鑰 (主控台)
<a name="enable-fido-mfa-for-root"></a>

您只能從 為根使用者設定和啟用通行金鑰 AWS 管理主控台 ，而不是從 AWS CLI 或 AWS API。<a name="enable_fido_root"></a>

**若要為您的根使用者啟用通行密鑰或安全金鑰 (主控台)**

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。

1. 在導覽列右側選擇您的帳戶名稱，然後選擇 **安全憑證** 。  
![\[在導覽選單中的安全憑證\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 在根使用者**我的安全憑證**頁面的**多重要素驗證 (MFA)** 下，選擇**指派 MFA 裝置**。

1. 在 **MFA 裝置名稱**頁面上，輸入**裝置名稱**，選擇**通行密鑰或安全金鑰**，然後選擇**下一步**。

1. 在**設定裝置**上，設定您的通行密鑰。使用臉部或指紋等生物識別資料、裝置 PIN，或將 FIDO 安全金鑰插入電腦的 USB 連接埠並點選，由此建立通行密鑰。

1. 遵循瀏覽器上的指示，選擇通行密鑰提供者或您要存放通行密鑰的位置，以便跨裝置使用。

1. 選擇**繼續**。

您現在已註冊要與 搭配使用的通行密鑰 AWS。下一次當您使用根使用者憑證登入時，您必須使用通行密鑰進行驗證，才能完成登入程序。

如需針對 FIDO 安全金鑰問題進行疑難排解的協助，請參閱[對通行密鑰和 FIDO 安全金鑰進行疑難排解](troubleshoot_mfa-fido.md)。

# 針對根使用者啟用虛擬 MFA 裝置 (主控台)
<a name="enable-virt-mfa-for-root"></a>

您可以使用 AWS 管理主控台 為您的根使用者設定和啟用虛擬 MFA 裝置。若要為 啟用 MFA 裝置 AWS 帳戶，您必須 AWS 使用根使用者憑證登入 。

**設定和啟用虛擬 MFA 裝置以與根使用者一起使用 (主控台)**

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。

1. 在導覽列右側，選擇您的帳戶名稱，然後選擇 **安全憑證** 。  
![\[在導覽選單中的安全憑證\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 在 **Multi-Factor Authentication (MFA)** (多重要素驗證 (MFA)) 區段中，選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在精靈中輸入 **Device name**，然後選擇 **驗證器應用程式**，再選擇 **下一步**。

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

1. 在裝置上開啟虛擬 MFA 應用程式。

   如果虛擬 MFA 應用程式支援多個虛擬 MFA 裝置或帳戶，請選擇對應的選項以建立新的虛擬 MFA 裝置或帳戶。

1. 設定應用程式的最簡單方法是使用該應用程式掃描 QR 條碼。如果您無法掃描代碼，則可以手動輸入組態資訊。IAM 產生的 QR 程式碼和私密組態金鑰會繫結至您的 AWS 帳戶 ，無法與不同的 帳戶搭配使用。但是，如果您無法存取原始 MFA 裝置，則他們可以重複使用，以便為您的帳戶設定新的 MFA 裝置。
   + 若要使用 QR 碼設定虛擬 MFA 裝置，請從精靈中選擇 **Show QR code (顯示 QR 碼)**。然後，遵循應用程式說明來掃描代碼。例如，您可能需要選擇相機圖示，或選擇與 **Scan account barcode (掃描帳戶代碼)** 相似的命令，然後使用裝置的相機掃描 QR 碼。
   + 在 **Set up device** (設定裝置) 精靈中，選擇 **Show secret key** (顯示私密金鑰)，然後在您的 MFA 應用程式中輸入私密金鑰。
**重要**  
對 QR 條碼或私密組態金鑰進行安全備份，或確保為您的帳戶啟用多台 MFA 裝置。您可以向 AWS 帳戶根使用者 和 IAM 使用者註冊最多**八個**[目前支援 MFA 類型之任何組合的 MFA](https://aws.amazon.com/iam/features/mfa/) 裝置。虛擬 MFA 裝置可能無法使用，例如，如果您遺失託管在虛擬 MFA 裝置的智慧型手機。如果發生這種情況且您沒有連接到使用者的其他 MFA 裝置，甚至無法透過 [復原根使用者 MFA 裝置](id_credentials_mfa_lost-or-broken.md#root-mfa-lost-or-broken) 登入您的帳戶，您將無法登入您的帳戶，您必須[聯絡客戶服務](https://support.aws.amazon.com/#/contacts/aws-mfa-support)以移除該帳戶的 MFA 保護。

   裝置開始產生六位數的號碼。

1. 在精靈中的 **MFA code 1** (MFA 代碼 1) 方塊內，輸入虛擬 MFA 裝置上目前顯示的一次性密碼。請等待 30 秒，裝置將產生新的一次性密碼。然後將第二個一次性密碼輸入 **MFA code 2 (MFA 代碼 2)** 方塊中。選擇 **Add MFA** (新增 MFA)。
**重要**  
產生代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。這種情況下，您可以[重新同步裝置](id_credentials_mfa_sync.md)。

裝置已準備好與 搭配使用 AWS。如需與 AWS 管理主控台一起使用 MFA 的詳細資訊，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。

# 針對根使用者啟用硬體 TOTP 權杖 (主控台)
<a name="enable-hw-mfa-for-root"></a>

您只能從 AWS 管理主控台 為根使用者設定和啟用實體 MFA 裝置，而不是從 AWS CLI 或 AWS API。

**注意**  
您可能會看到不同的文字，例如**使用 MFA 登入**和**對您的身分驗證裝置進行疑難排解**。不過，其功能是相同的。在任一情況下，若無法使用其他身分驗證要素來驗證您的帳戶電子郵件地址和電話號碼，請聯絡 [AWS 支援](https://aws.amazon.com/forms/aws-mfa-support)刪除您的 MFA 設定。<a name="enable_physical_root"></a>

**若要針對您的根使用者啟用硬體 TOTP 權杖 (主控台)**

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。

1. 在導覽列右側選擇您的帳戶名稱，然後選擇 **安全憑證** 。  
![\[在導覽選單中的安全憑證\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 展開 **Multi-factor authentication (MFA)** (多重要素驗證 (MFA)) 區段。

1. 選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在精靈中，輸入一個**裝置名稱**，然後選取 **Hardware TOTP token** (硬體 TOTP 權杖)，再選擇 **Next** (下一步)。

1. 在 **Serial number (序號)** 方塊中，輸入在 MFA 裝置背面找到的序號。

1. 在 **MFA code 1 (MFA 代碼 1)** 方塊中，輸入 MFA 裝置顯示的六位數字。您可能需要按下裝置正面的按鈕以顯示數字。  
![\[IAM 儀表板，MFA 裝置\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/MFADevice.png)

1. 當裝置在重新整理代碼時，等候 30 秒時間後，在 **MFA code 2 (MFA 代碼 2)** 方塊中輸入六位數字。您可能需要再次按下裝置正面的按鈕以顯示第二個數字。

1. 選擇 **Add MFA** (新增 MFA)。現在，MFA 裝置已與 AWS 帳戶建立關聯。
**重要**  
產生驗證代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置卻變成不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。這種情況下，您可以[重新同步裝置](id_credentials_mfa_sync.md)。

   下次使用根使用者憑證登入時，您必須輸入 MFA 裝置的代碼。

# 變更 的密碼 AWS 帳戶根使用者
<a name="root-user-password"></a>

您可以在[安全憑證](https://console.aws.amazon.com/iam/home?#security_credential)或**帳戶**頁面上變更電子郵件地址和密碼。您也可以在 AWS 登入頁面上選擇**忘記密碼？** 來重設密碼。

若要變更根使用者的密碼，您必須以 身分登入 AWS 帳戶根使用者 ，而不是以 IAM 使用者身分登入。若要了解如何重設*忘記的*根使用者密碼，請參閱 [重設遺失或忘記的根使用者密碼](reset-root-password.md)。

為了保護您的密碼，請務必遵循這些最佳實務：
+ 定期變更您的密碼。
+ 請保持您密碼的私密性，因為任何獲知您的密碼的人員都能存取您的帳戶。
+ 在 上使用 AWS 不同於您在其他網站上使用的密碼。
+ 避免使用容易猜中的密碼。這些密碼包含，例如 `secret`、`password`、`amazon` 或 `123456`。另外還要避免使用字典字詞、您的名字、電子郵件地址或其他可以輕鬆取得的個人資訊。

**重要**  
AWS 帳戶 使用 受管 AWS Organizations 可能已啟用成員帳戶的[集中式根存取](id_root-user.md#id_root-user-access-management)。這些成員帳戶沒有根使用者憑證，無法以根使用者身分登入，而且無法復原根使用者密碼。如果需要執行要求根使用者憑證的任務，請聯絡您的管理員。

------
#### [ AWS 管理主控台 ]

**變更根使用者的密碼**
**最低許可**  
若要執行下列步驟，您至少必須擁有下列 IAM 許可：  
您必須以 AWS 帳戶 根使用者身分登入，這不需要額外的 AWS Identity and Access Management (IAM) 許可。您無法以 IAM 使用者或角色的身分執行這些步驟。

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。

1. 在主控台的右上角，選擇帳戶名稱或號碼，然後選取**安全憑證**。

1. 在**帳戶**頁面的**帳戶設定**旁，選擇**編輯**。出於安全目的，系統會提示您再次進行身分驗證。
**注意**  
如果您看不到**編輯**選項，則可能是您未以帳戶根使用者的身分登入。在以 IAM 使用者或角色的身分登入時，您無法修改帳戶設定。

1. 在**更新帳戶設定**頁面上，選擇**密碼**下方的**編輯**。

1. 在**更新您的密碼**頁面上，填寫**目前的密碼**、**新密碼**和**確認新密碼**欄位。
**重要**  
確保選擇強式密碼。雖然您可以設定 IAM 使用者的帳戶密碼政策，但該政策不適用於根使用者。

   AWS 需要您的密碼符合下列條件：
   + 它必須至少有 8 個字元，最多 128 個字元。
   + 它至少混用 3 種下列類型字元：大寫、小寫、數字和 \$1 @ \$1 \$1 % ^ & \$1 () <> [] \$1\$1 \$1 \$1\$1-= 符號。
   + 它不能與 AWS 帳戶 您的姓名或電子郵件地址相同。

1. 選擇**儲存變更**。

------
#### [ AWS CLI or AWS SDK ]

中 AWS CLI 或其中一個 AWS SDKs 的 API 操作不支援此任務。您只能使用 來執行此任務 AWS 管理主控台。

------

# 重設遺失或忘記的根使用者密碼
<a name="reset-root-password"></a>

當您第一次建立 時 AWS 帳戶，您提供了電子郵件地址和密碼。這些是您的 AWS 帳戶根使用者 登入資料。若您忘記根使用者密碼，可從 AWS 管理主控台重設密碼。

AWS 帳戶 使用 受管 AWS Organizations 可能已啟用成員帳戶的[集中式根存取](id_root-user.md#id_root-user-access-management)。這些成員帳戶沒有根使用者憑證，無法以根使用者身分登入，而且無法復原根使用者密碼。如果需要執行要求根使用者憑證的任務，請聯絡您的管理員。

**重要**  
**無法登入 AWS？** 請確定您位在使用者類型的正確 [AWS 登入頁面](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html)。如果您是 AWS 帳戶根使用者 （帳戶擁有者），您可以使用您在建立 時設定的登入資料登入 AWS AWS 帳戶。如果您是 IAM 使用者，您的帳戶管理員可以為您提供可用來登入 AWS的憑證。如果您需要請求支援，請勿使用此頁面上的意見回饋連結，因為表單是由 AWS 文件團隊接收，而不是 支援。相反地，在[聯絡我們](https://aws.amazon.com/contact-us/)頁面上，選擇**仍然無法登入 AWS 您的帳戶**，然後選擇其中一個可用的支援選項。

**若要重設您的根使用者密碼**

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。
**注意**  
 如果您是使用 *IAM 使用者憑證*登入 [AWS 管理主控台](https://console.aws.amazon.com/)，則必須先登出再重設根使用者密碼。如果您看到帳戶專屬的 IAM 使用者登入頁面，請選擇頁面底部旁的 **Sign-in using root account credentials** (使用根帳戶憑證來登入)。如有需要，請提供您的帳戶電子郵件地址，然後選擇 **Next** (下一步)，以存取 **Root user sign in** (根使用者登入) 頁面。

1. 選擇 **Forgot your password? (忘記您的密碼？)**。
**注意**  
如果您是 IAM 使用者，則此選項無法使用。**忘記您的密碼？**選項僅適用於根使用者帳戶。IAM 使用者必須要求管理員重設已忘記的密碼。如需詳細資訊，請參閱[我忘記 AWS 帳戶的 IAM 使用者密碼](https://docs.aws.amazon.com/signin/latest/userguide/troubleshooting-sign-in-issues.html#troubleshoot-forgot-iam-password)。如果您透過 AWS 存取入口網站登入，請參閱[重設 IAM Identity Center 使用者密碼](https://docs.aws.amazon.com/singlesignon/latest/userguide/resetpassword-accessportal.html)。

1. 提供與帳戶相關聯的電子郵件地址。然後提供 CAPTCHA 文字並選擇 **Continue (繼續)**。

1. 檢查與您的 相關聯的電子郵件 AWS 帳戶 是否有來自 Amazon Web Services 的訊息。電子郵件來自於結尾為 `@verify.signin.aws` 的地址。請遵循電子郵件中的指示進行。若您在帳戶中沒有看到電子郵件，請檢查您的垃圾郵件資料夾。如果您不再能夠存取電子郵件，請參閱*AWS 登入 《 使用者指南*》中的[我無法存取我 AWS 帳戶的電子郵件](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-troubleshooting.html#credentials-not-working-console)。

# 為根使用者建立存取金鑰
<a name="id_root-user_manage_add-key"></a>

**警告**  
我們強烈建議您**不要**為您的根使用者建立存取金鑰對。由於[只有少數任務需要根使用者，](id_root-user.md#root-user-tasks)而且您通常不常執行這些任務，因此我們建議您登入 AWS 管理主控台 以執行根使用者任務。在建立存取金鑰前，請檢閱[長期存取金鑰的替代方案](security-creds-programmatic-access.md#security-creds-alternatives-to-long-term-access-keys)。

雖然我們不建議這麼做，但您可以為您的根使用者建立存取金鑰，以便您可以在 AWS Command Line Interface (AWS CLI) 中執行命令，或使用根使用者憑證從其中一個 AWS SDKs 使用 API 操作。當您建立存取金鑰時，可以將存取金鑰 ID 與私密存取金鑰建立為一組。在建立存取金鑰期間， AWS 可讓您有機會檢視和下載存取金鑰的私密存取金鑰部分。如果您沒有下載或者遺失私密存取金鑰，可以先刪除再建立新的存取金鑰。您可以使用 主控台 AWS CLI或 AWS API 建立根使用者存取金鑰。

新建立存取金鑰的狀態為「作用中」**，這表示您可以使用存取金鑰進行 CLI 和 API 呼叫。您可以將最多兩個存取金鑰指派給根使用者。

未使用的存取金鑰應該停用。一旦存取金鑰處於非作用中，您將無法用它來進行 API 呼叫。非作用中金鑰仍會計入您的限制。您可以隨時建立或刪除存取金鑰。不過，刪除存取金鑰之後，即永久消失且無法擷取。

------
#### [ AWS 管理主控台 ]

**建立 的存取金鑰 AWS 帳戶根使用者**
**最低許可**  
若要執行下列步驟，您至少必須擁有下列 IAM 許可：  
您必須以 AWS 帳戶 根使用者身分登入，這不需要額外的 AWS Identity and Access Management (IAM) 許可。您無法以 IAM 使用者或角色的身分執行這些步驟。

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。

1. 在主控台的右上角，選擇您的帳戶名稱或號碼，然後選擇 **安全憑證** 。

1. 在**存取金鑰**區段中，選擇**建立存取金鑰**。如果此選項不可用，表示您所擁有的存取金鑰已達最大數目。您必須先刪除其中一個現有的存取金鑰，才能建立新的金鑰。如需詳細資訊，請參閱 [IAM 物件配額](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entities)。

1. 在**根使用者存取金鑰的替代方案**頁面上，檢閱安全建議。若要繼續，請選取核取方塊，然後選擇**建立存取金鑰**。

1. 在**擷取存取金鑰**頁面上，會顯示您的**存取金鑰** ID。

1. 在**私密存取金鑰**下方，選擇**顯示**，然後從您的瀏覽器視窗複製存取金鑰 ID 和私密金鑰，將其貼到安全的地方。或者，您可以選擇**下載 .csv 檔案**，這樣做會下載一個名為 `rootkey.csv` 的檔案，其中包含存取金鑰 ID 和私密金鑰。將檔案儲存到安全的位置。

1. 選擇**完成**。當您不再需要存取金鑰時，[我們建議您將其刪除](id_root-user_manage_delete-key.md)，或者至少考慮停用該金鑰，以防止其他人濫用。

------
#### [ AWS CLI & SDKs ]

**若要為根使用者建立存取金鑰**
**注意**  
若要以根使用者身分執行下列命令或 API 操作，您必須已有一個作用中的存取金鑰對。如果您沒有任何存取金鑰，可使用 AWS 管理主控台建立第一個存取金鑰。然後，您可以將該第一個存取金鑰中的登入資料與 搭配使用 AWS CLI ，以建立第二個存取金鑰，或刪除存取金鑰。
+ AWS CLI：[aws iam create-access-key](https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html)  
**Example**  

  ```
  $ aws iam create-access-key
  {
      "AccessKey": {
          "UserName": "MyUserName",
          "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
          "Status": "Active",
          "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
          "CreateDate": "2021-04-08T19:30:16+00:00"
      }
  }
  ```
+ AWS API：*IAM API 參考*中的 [CreateAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html)。

------

# 刪除根使用者的存取金鑰
<a name="id_root-user_manage_delete-key"></a>

您可以使用 AWS 管理主控台、 AWS CLI 或 AWS API 來刪除根使用者存取金鑰。

------
#### [ AWS 管理主控台 ]

**若要刪除根使用者的存取金鑰**
**最低許可**  
若要執行下列步驟，您至少必須擁有下列 IAM 許可：  
您必須以 AWS 帳戶 根使用者身分登入，這不需要額外的 AWS Identity and Access Management (IAM) 許可。您無法以 IAM 使用者或角色的身分執行這些步驟。

1. 開啟 [AWS 管理主控台](https://console.aws.amazon.com/)，並使用您的根使用者憑證登入。

   如需說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者的 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html) 。

1. 在主控台的右上角，選擇您的帳戶名稱或號碼，然後選擇 **安全憑證** 。

1. 在**存取金鑰**區段中，選擇您想要刪除的存取金鑰，然後在**動作**下方選擇**刪除**。
**注意**  
或者，您可以**停用**存取金鑰，而不是永久刪除它。這可讓您在未來繼續使用它，而無需變更金鑰 ID 或私密金鑰。當金鑰處於非作用中狀態時，任何在 AWS API 請求中使用金鑰的嘗試都會失敗，錯誤存取遭拒。

1. 在**刪除 <access key ID>** 對話方塊中，選擇**停用**，輸入存取金鑰 ID 以確認您想要刪除它，然後選擇**刪除**。

------
#### [ AWS CLI & SDKs ]

**若要刪除根使用者的存取金鑰**
**最低許可**  
若要執行下列步驟，您至少必須擁有下列 IAM 許可：  
您必須以 AWS 帳戶 根使用者身分登入，這不需要額外的 AWS Identity and Access Management (IAM) 許可。您無法以 IAM 使用者或角色的身分執行這些步驟。
+ AWS CLI：[aws iam delete-access-key](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html)  
**Example**  

  ```
  $ aws iam delete-access-key \
      --access-key-id AKIAIOSFODNN7EXAMPLE
  ```

  此命令成功後就不會產生輸出。
+ AWS API：[DeleteAccessKey](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html) 

------

## 需要根使用者憑證的任務
<a name="root-user-tasks"></a>

建議您[在 中設定管理使用者 AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)，以執行每日任務和存取 AWS 資源。不過，您可以只以帳戶根使用者身分登入來執行任務下面所列的任務。

為了簡化在 中跨成員帳戶管理特權根使用者憑證 AWS Organizations，您可以啟用集中式根存取，以協助您集中保護對 的高度特權存取 AWS 帳戶。 [集中管理成員帳戶的根存取權](#id_root-user-access-management)可讓您集中移除和防止長期根使用者憑證復原，改善組織中的帳戶安全性。啟用此功能後，您可以對成員帳戶執行下列特權任務。
+ 移除成員帳戶根使用者憑證，以防止根使用者的帳戶復原。您也可以允許密碼復原，來復原成員帳戶的根使用者憑證。
+ 移除設定錯誤的儲存貯體政策，此政策拒絕所有主體存取 Amazon S3 儲存貯體。
+ 刪除拒絕所有主體存取 Amazon SQS 佇列的 Amazon Simple Queue Service 資源型政策。

**帳戶管理任務**
+ [變更 AWS 帳戶 設定。](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-root-user.html)不屬於 AWS Organizations 的獨立 AWS 帳戶 需要根登入資料，才能更新電子郵件地址、根使用者密碼和根使用者存取金鑰。其他帳戶設定，例如帳戶名稱、聯絡資訊、替代聯絡人、付款貨幣偏好設定 AWS 區域，以及不需要根使用者憑證。
**注意**  
AWS Organizations啟用所有功能之後，可用於從管理帳戶和委派管理員帳戶集中管理成員帳戶設定。管理帳戶和委派管理員帳戶中的授權 IAM 使用者或 IAM 角色可以關閉成員帳戶，並更新成員帳戶的根電子郵件地址、帳戶名稱、聯絡資訊、替代聯絡人和 AWS 區域 。
+ [關閉您的 AWS 帳戶。](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/close-account.html)不屬於 的獨立 AWS 帳戶 AWS Organizations 需要根登入資料才能關閉帳戶。使用 AWS Organizations，您可以從管理帳戶和委派的管理員帳戶集中關閉成員帳戶。
+ [還原 IAM 使用者許可。](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)如果唯一的 IAM 管理員不小心撤銷自己的許可，您可以根使用者的身分登入，即可編輯政策和還原這些許可。

**帳單任務**
+ [啟動對帳單與成本管理主控台的 IAM 存取](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/control-access-billing.html#ControllingAccessWebsite-Activate)。
+ 一些帳單任務僅限於根使用者。如需詳細資訊，請參閱 AWS Billing [《 使用者指南》中的管理 AWS 帳戶](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/manage-account-payment.html) 。
+ 檢視特定稅務發票。具有 [aws-portal：ViewBilling](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/billing-permissions-ref.html#user-permissions) 許可的 IAM 使用者可以從 AWS 歐洲檢視和下載增值稅發票，但不能從 AWS Inc. 或 Amazon Internet Services Private Limited(AISPL) 下載增值稅發票。

**AWS GovCloud (US) 任務**
+ [註冊 AWS GovCloud (US)](https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/getting-started-sign-up.html)。
+ 從 請求 AWS GovCloud (US) 帳戶根使用者存取金鑰 AWS 支援。

**Amazon EC2 任務**
+ 在預留執行個體市場[註冊為賣方](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html)。

**AWS KMS 任務**
+ 如果 AWS Key Management Service 金鑰變成無法管理，管理員可以透過聯絡 來復原金鑰 支援；不過， 會透過確認票證 OTP 來 支援 回應根使用者的主要電話號碼以進行授權。

**Amazon Mechanical Turk 任務**
+  [將您的 AWS 帳戶 連結至您的 MTurk 申請者帳戶](https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMechanicalTurkGettingStartedGuide/SetUp.html#accountlinking)。

**Amazon Simple Storage Service 任務**
+ [設定 Amazon S3 儲存貯體，以啟用 MFA (多重因素認證)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiFactorAuthenticationDelete.html)。
+ [編輯或刪除拒絕所有主體的 Amazon S3 儲存貯體政策](https://aws.amazon.com/premiumsupport/knowledge-center/change-vpc-endpoint-s3-bucket-policy/)。

  您可以使用特權動作，來解除鎖定儲存貯體政策設定錯誤的 Amazon S3 儲存貯體。如需詳細資訊，請參閱[在 AWS Organizations 成員帳戶上執行特權任務](id_root-user-privileged-task.md)。

**Amazon Simple Queue Service 任務**
+ [編輯或刪除拒絕所有主體的 Amazon SQS 資源型政策](https://aws.amazon.com/premiumsupport/knowledge-center/sqs-queue-access-issues-deny-policy)。

  您可以使用特權動作，來解除鎖定資源型政策設定錯誤的 Amazon SQS 佇列。如需詳細資訊，請參閱[在 AWS Organizations 成員帳戶上執行特權任務](id_root-user-privileged-task.md)。

## 其他資源
<a name="id_root-user-resources"></a>

如需 AWS 根使用者的詳細資訊，請參閱下列資源：
+ 如需根使用者問題的協助，請參閱 [使用根使用者來疑難排解問題](troubleshooting_root-user.md)。
+ 若要集中管理 中的根使用者電子郵件地址 AWS Organizations，請參閱*AWS Organizations 《 使用者指南*》中的[更新成員帳戶的根使用者電子郵件地址](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_update_primary_email.html)。

下列文章將提供有關如何使用根使用者的更多資訊。
+ [保護我 AWS 帳戶 及其資源的最佳實務有哪些？](https://repost.aws/knowledge-center/security-best-practices)
+ [如何建立 EventBridge 事件規則，以便在有人使用我的根使用者時通知我？](https://repost.aws/knowledge-center/root-user-account-eventbridge-rule) 
+ [監控並通知 AWS 帳戶根使用者 活動](https://aws.amazon.com/blogs/mt/monitor-and-notify-on-aws-account-root-user-activity/) 
+ [監控 IAM 根使用者活動](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/monitor-iam-root-user-activity.html) 

# IAM 使用者
<a name="id_users"></a>

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

*IAM 使用者*是您在 AWS 帳戶中建立的實體。IAM 使用者表示使用 IAM 使用者與 AWS 資源互動的人類使用者或工作負載。IAM 使用者包含名稱和憑證。

具有管理員許可的 IAM 使用者與 AWS 帳戶根使用者並不相同。如需有關根使用者的詳細資訊，請參閱 [AWS 帳戶根使用者](id_root-user.md)。

## 如何 AWS 識別 IAM 使用者
<a name="id_users_create_aws-identifiers"></a>

當建立 IAM 使用者時，IAM 建立這些方法來識別該使用者：
+ IAM 使用者的「易用名稱」，即您在建立 IAM 使用者時指定的名稱，例如 `Richard` 或 `Anaya`。這些是您在 AWS 管理主控台中看到的名稱。由於 IAM 使用者名稱會顯示在 Amazon Resource Name (ARN) 中，因此不建議在 IAM 名稱中包含個人識別資訊。如需 IAM 名稱的需求和限制，請參閱 [IAM 名稱需求](reference_iam-quotas.md#reference_iam-quotas-names)。
+ IAM 使用者的 Amazon Resource Name (ARN)。當您需要唯一識別所有 的 IAM 使用者時，您可以使用 ARN AWS。例如，在 Amazon S3 儲存貯體的 IAM 政策中，您可以使用 ARN 將 IAM 使用者指定為 `Principal`。IAM 使用者的 ARN 可能如下所示：

  `arn:aws:iam::account-ID-without-hyphens:user/Richard`
+ IAM 使用者的唯一識別碼。只有在您使用 API、Tools for Windows PowerShell 或 AWS CLI 建立 IAM 使用者時，才會傳回此 ID；您在 主控台中看不到此 ID。

如需有關這些識別碼的詳細資訊，請參閱 [IAM 識別碼](reference_identifiers.md)。

## IAM 使用者和憑證
<a name="id_users_creds"></a>

您可以根據 IAM 使用者登入資料 AWS ，以不同的方式存取 ：
+ [**主控台密碼**](id_credentials_passwords.md)：IAM 使用者可以輸入的密碼，以登入互動式工作階段 (如 AWS 管理主控台)。停用 IAM 使用者的密碼 （主控台存取） 可防止他們 AWS 管理主控台 使用登入憑證登入 。它不會變更其許可，也不會阻止他們使用擔任的角色來存取主控台。已啟用主控台存取的 IAM 使用者也可以使用這些相同的登入資料，使用 `aws login` AWS CLI 命令來驗證 AWS CLI 和 SDK 存取。這些使用者將需要具有 [SignInLocalDevelopmentAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/SignInLocalDevelopmentAccess.html) 許可。如需詳細資訊，請參閱*AWS Command Line Interface 《 使用者指南*》中的 [的身分驗證和存取憑證 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html)。
+ [**存取金鑰**](id_credentials_access-keys.md)：用來向 AWS發出程式化呼叫。但在為 IAM 使用者建立存取金鑰之前，您可以考慮其他更安全的替代方案。如需詳細資訊，請參閱 *AWS 一般參考* 中的[長期存取金鑰的考量事項和替代方案](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#alternatives-to-long-term-access-keys)。如果 IAM 使用者具有作用中的存取金鑰，他們會繼續運作並允許透過 AWS CLI、Tools for Windows PowerShell、 AWS API 或 AWS 主控台行動應用程式進行存取。
+ [**與 CodeCommit 一起使用的 SSH 金鑰**](id_credentials_ssh-keys.md)：OpenSSH 格式的 SSH 公有金鑰，可用於透過 CodeCommit 驗證身分。
+ [**伺服器憑證**](id_credentials_server-certs.md)：您可以使用 SSL/TLS 憑證來驗證某些 AWS 服務。建議您使用 AWS Certificate Manager (ACM) 來佈建、管理和部署伺服器憑證。只有當您必須在 ACM 不支援的區域中支援 HTTPS 連接時，才應使用 IAM。如需了解哪些區域支援 ACM，請參閱 *AWS 一般參考* 中的 [AWS Certificate Manager 端點和配額](https://docs.aws.amazon.com/general/latest/gr/acm.html)。

您可以選擇最適合您 IAM 使用者的憑證。當您使用 AWS 管理主控台 來建立 IAM 使用者，您必須選擇至少包含一個主控台密碼或存取金鑰。根據預設，使用 AWS CLI 或 AWS API 建立的全新 IAM 使用者沒有任何類型的登入資料。您必須根據使用案例，建立 IAM 使用者的憑證類型。

您可以使用以下選項來管理密碼、存取金鑰和多重要素驗證 (MFA) 裝置：
+ **[管理 IAM 使用者的密碼](id_credentials_passwords.md)。**建立和變更允許存取 AWS 管理主控台的密碼。設定密碼政策，以強制執行最低密碼複雜性。允許 IAM 使用者變更自己的密碼。
+ **[管理 IAM 使用者的存取金鑰](id_credentials_access-keys.md)。**建立和更新存取金鑰，以便以程式設計方式存取您帳戶中的資源。
+ **[為 IAM 使用者啟用多重要素驗證 (MFA)](id_credentials_mfa.md)。**根據[最佳實務](best-practices.md)，我們建議您要求帳戶中的所有 IAM 使用者進行多重要素驗證。使用 MFA 時，IAM 使用者需要提供兩種身分驗證形式：首先，提供憑證，那是屬於他們的使用者身分 (密碼或存取金鑰) 的一部分。此外，他們提供硬體裝置或智慧型手機或平板電腦上的應用程式所產生的臨時數字代碼。
+ **[尋找未使用的密碼和存取金鑰](id_credentials_finding-unused.md)。**擁有您帳戶或帳戶中 IAM 使用者的密碼或存取金鑰的任何人都可以存取您的 AWS 資源。安全[最佳實務](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html)是在 IAM 使用者不再需要密碼和存取金鑰時將其移除。
+ **[下載您帳戶的憑證報告](id_credentials_getting-report.md)。**您可以產生並下載「憑證報告」，其中會列出帳戶中的所有 IAM 使用者，及其各種憑證的狀態，包括密碼、存取金鑰和 MFA 裝置。對於密碼和存取金鑰、憑證報告會顯示密碼或存取金鑰最近使用的狀況。

## IAM 使用者和許可
<a name="id_users_perms"></a>

在預設情況下，新的 IAM 使用者沒有[許可](access.md)採取任何行動。他們無權執行任何 AWS 操作或存取任何 AWS 資源。擁有個別 IAM 使用者的好處是您可以為每個使用者個別指派許可。您可以指派管理許可給幾個使用者，這些使用者接著可以管理您的 AWS 資源，甚至可以建立和管理其他 IAM 使用者。不過，在大多數情況下，您想要將使用者的許可限制為只有任務所需的任務 (AWS 動作或操作） 和資源。

試想一名叫做 Diego 的使用者。當您建立 IAM 使用者 `Diego` 時，您為該使用者建立一個密碼並連接許可，讓該使用者可以啟動特定 Amazon EC2 執行個體並從 Amazon RDS 資料庫的表格中讀取 (`GET`) 資訊。有關如何建立 IAM 使用者並授予其初始憑證和許可的程序的更多資訊，請參閱 [在 中建立 IAM 使用者 AWS 帳戶](id_users_create.md)。有關如何變更現有使用者的程序的詳細資訊，請參閱 [變更 IAM 使用者的許可](id_users_change-permissions.md)。有關如何變更使用者的密碼或存取金鑰的程序的詳細資訊，請參閱 [中的使用者密碼 AWS](id_credentials_passwords.md) 和 [管理 IAM 使用者的存取金鑰](id_credentials_access-keys.md)。

您也可以新增許可界限到您的 IAM 使用者。許可界限是一項進階功能，可讓您使用 AWS 受管政策來限制身分型政策可授予 IAM 使用者或角色的最大許可。如需有關政策類型及其使用的詳細資訊，請參閱 [中的政策和許可 AWS Identity and Access Management](access_policies.md)。

## IAM 使用者和帳戶
<a name="id_users_accounts"></a>

每位 IAM 使用者只能與一個 AWS 帳戶建立關聯。由於 IAM 使用者是在您的 中定義 AWS 帳戶，因此他們不需要在 的檔案中有付款方式 AWS。您帳戶中 IAM 使用者執行的任何 AWS 活動都會向您的帳戶收費。

 AWS 帳戶中 IAM 資源的數量和大小有限。如需詳細資訊，請參閱[IAM AWS STS 和配額](reference_iam-quotas.md)。

## IAM 使用者做為服務帳戶
<a name="id_users_service_accounts"></a>

IAM 使用者是擁有關聯憑證和許可之 IAM 中的資源。IAM 使用者可以代表人員或應用程式，其會使用它的憑證來做出 AWS 請求。這通常稱為「*服務帳戶*」。如果您選擇在您的應用程式使用 IAM 使用者的長期憑證，**請勿在應用程式程式碼中直接內嵌存取金鑰**。 AWS SDKs和 AWS Command Line Interface 可讓您將存取金鑰放在已知位置，讓您不必將其保留在程式碼中。如需詳細資訊，請參閱 *AWS 一般參考* 中的[適當管理 IAM 使用者存取金鑰](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html#iam-user-access-keys)。或者，最佳實務的作法是可以[使用臨時安全憑證 (IAM 角色)，而不是長期存取金鑰](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html#use-roles)。

# IAM 使用者如何登入 AWS
<a name="id_users_sign-in"></a>

若要以 IAM 使用者 AWS 管理主控台 身分登入 ，除了使用者名稱和密碼之外，您還必須提供您的帳戶 ID 或帳戶別名。當您的管理員在主控台中建立 IAM 使用者時，他們應已將您的登入憑證傳送給您，包括您的使用者名稱，以及包含您的帳戶 ID 或帳戶別名的帳戶登入頁面 URL。

```
https://My_AWS_Account_ID.signin.aws.amazon.com/console/
```

**秘訣**  
要在網頁瀏覽器為您的帳戶登入頁面建立書籤，您應該在書籤項目手動輸入帳戶的登入 URL。請勿使用 web 瀏覽器的書籤功能，因為重新引導會模糊登入 URL。

您也可以在以下通用登入端點登入，並手動輸入您的帳戶 ID 或帳戶別名：

```
[https://console.aws.amazon.com/](https://console.aws.amazon.com/)
```

為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住 IAM 使用者名稱和帳戶資訊。下次使用者前往 中的任何頁面時 AWS 管理主控台，主控台會使用 Cookie 將使用者重新導向至帳戶登入頁面。

您只能存取管理員在連接到 IAM 使用者身分的政策中指定的 AWS 資源。若要在主控台中運作，您必須具有執行主控台所執行動作的許可，例如列出和建立 AWS 資源。如需詳細資訊，請參閱[AWS 資源的存取管理](access.md)及[以身分為基礎的 IAM 政策範例](access_policies_examples.md)。

**注意**  
如果您的組織已有現有的身分系統，您可能會想建立單一登入 (SSO) 選項。SSO 可讓使用者存取 AWS 管理主控台 您帳戶的 ，而無需擁有 IAM 使用者身分。SSO 也消除了使用者登入組織網站和 AWS 單獨登入 的需求。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。

**在 CloudTrail 中記錄登入詳細資訊**  
若您啟用 CloudTrail 將登入事件記錄到您的日誌，您需要注意 CloudTrail 如何選擇記錄事件日誌的地方。
+ 如果您的使用者直接登入到主控台，則會根據所選服務主控台是否支援區域，將它們重新引導到全域登入或區域登入端點。例如，主要主控台首頁支援區域，所以您若登入以下 URL：

  ```
  https://alias.signin.aws.amazon.com/console
  ```

  您重新引導到區域登入端點，例如 `https://us-east-2.signin.aws.amazon.com`，從而導致在使用者的區域日誌中產生區域 CloudTrail 日誌項目：

  另一方面，Amazon S3 主控台不支援區域，所以您若登入以下 URL

  ```
  https://alias.signin.aws.amazon.com/console/s3
  ```

  AWS 會將您重新導向至 的全域登入端點`https://signin.aws.amazon.com`，導致全域 CloudTrail 日誌項目。
+ 您可以手動請求特定區域登入端點，只要使用如下所示的 URL 語法，登入啟用區域的主要主控台首頁：

  ```
  https://alias.signin.aws.amazon.com/console?region=ap-southeast-1
  ```

  AWS 會將您重新導向至`ap-southeast-1`區域登入端點，並導致區域 CloudTrail 日誌事件。

如需有關 CloudTrail 和 IAM 的詳細資訊，請參閱[使用 CloudTrail 記錄 IAM 事件日誌](https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html)。

如果使用者需要以程式設計存取的方式使用您的帳戶，則您可以為每位使用者建立存取金鑰對 (存取金鑰 ID 和私密存取金鑰)。但在為使用者建立存取金鑰之前，您可以考慮其他更安全的替代方案。如需詳細資訊，請參閱 *AWS 一般參考* 中的[長期存取金鑰的考量事項和替代方案](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#alternatives-to-long-term-access-keys)。

## 其他資源
<a name="id_users_sign-in-additional-resources"></a>

下列資源可協助您進一步了解 AWS 登入。
+ [AWS Sign-In User Guide](https://docs.aws.amazon.com/signin/latest/userguide/what-is-sign-in.html) 可協助您了解根據使用者類型登入 Amazon Web Services (AWS) 的不同方式。
+ 您可以在 AWS 管理主控台中的單一 Web 瀏覽器中同時登入最多五個不同的身分。如需詳細資訊，請參閱 *AWS 管理主控台 Getting Started Guide* 中的 [Signing in to multiple accounts](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/multisession.html)。

# 啟用 MFA 的登入
<a name="console_sign-in-mfa"></a>

設定使用者的[多重要素驗證 (MFA)](id_credentials_mfa.md) 裝置必須使用自己的 MFA 裝置登入 AWS 管理主控台。使用者輸入登入憑證後， 會 AWS 檢查使用者帳戶，以查看該使用者是否需要 MFA。

**重要**  
如果您使用存取金鑰和私密金鑰登入資料透過 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API AWS STS 呼叫直接 AWS 管理主控台 存取，則不需要 MFA。如需詳細資訊，請參閱[使用存取金鑰和秘密金鑰憑證存取主控台](securing_access-keys.md#console-access-security-keys)。

以下各主題提供使用者在需要 MFA 時完成登入方式的資訊。

**Topics**
+ [已啟用多個 MFA 裝置](#console_sign-in-multiple-mfa)
+ [FIDO 安全性金鑰](#console_sign-in-mfa-fido)
+ [虛擬 MFA 裝置](#console_sign-in-mfa-virtual)
+ [硬體 TOTP 權杖](#console_sign-in-mfa-hardware)

## 已啟用多個 MFA 裝置
<a name="console_sign-in-multiple-mfa"></a>

如果使用者以 AWS 帳戶 根使用者或 IAM 使用者 AWS 管理主控台 身分登入 ，且該帳戶已啟用多個 MFA 裝置，他們只需要使用一個 MFA 裝置登入。使用者使用其密碼進行身分驗證以後，他們要選取希望使用哪種 MFA 裝置類型來完成身分驗證。然後，使用者會收到使用其所選裝置類型進行身分驗證的提示。

## FIDO 安全性金鑰
<a name="console_sign-in-mfa-fido"></a>

若使用者需要 MFA，則會出現第二個登入頁面。使用者需要點選 FIDO 安全性金鑰。

**注意**  
Google Chrome 瀏覽器使用者不應在要求 **Verify your identity with amazon.com** (使用 amazon.com 驗證您身分) 的彈出畫面中選擇任何可用選項。您只需要點選安全性金鑰。

與其他 MFA 裝置不同，FIDO 安全性金鑰不會失去同步。管理員可以在其遺失或損壞時停用 FIDO 安全性金鑰。如需詳細資訊，請參閱[停用 MFA 裝置 (主控台)](id_credentials_mfa_disable.md#deactive-mfa-console)。

如需支援 WebAuthn 的瀏覽器和 AWS 支援 的 FIDO 相容裝置的相關資訊，請參閱 [使用通行密鑰和安全金鑰的支援組態](id_credentials_mfa_fido_supported_configurations.md)。

## 虛擬 MFA 裝置
<a name="console_sign-in-mfa-virtual"></a>

若使用者需要 MFA，則會出現第二個登入頁面。在 **MFA code (MFA 代碼)** 方塊中，使用者必須輸入 MFA 應用程式提供的數字代碼。

如果 MFA 代碼正確，則使用者可以存取 AWS 管理主控台。如果程式碼不正確，使用者可以重試其他代碼。

虛擬 MFA 裝置可能會失去同步。如果使用者在多次嘗試 AWS 管理主控台 後無法登入 ，系統會提示使用者同步虛擬 MFA 裝置。使用者可以根據螢幕上的提示同步虛擬 MFA 裝置。如需有關如何在 中代表使用者同步裝置的資訊 AWS 帳戶，請參閱 [重新同步虛擬和硬體 MFA 裝置](id_credentials_mfa_sync.md)。

## 硬體 TOTP 權杖
<a name="console_sign-in-mfa-hardware"></a>

若使用者需要 MFA，則會出現第二個登入頁面。在 **MFA code** (MFA 代碼) 方塊中，使用者必須輸入硬體 TOTP 權杖提供的數字代碼。

如果 MFA 代碼正確，則使用者可以存取 AWS 管理主控台。如果程式碼不正確，使用者可以重試其他代碼。

硬體 TOTP 權杖可能不同步。如果使用者在多次嘗試 AWS 管理主控台 後無法登入 ，系統會提示使用者同步 MFA 字符裝置。使用者可以根據螢幕上的提示同步 MFA 權杖裝置。如需有關如何在 中代表使用者同步裝置的資訊 AWS 帳戶，請參閱 [重新同步虛擬和硬體 MFA 裝置](id_credentials_mfa_sync.md)。

# 在 中建立 IAM 使用者 AWS 帳戶
<a name="id_users_create"></a>

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

建立 IAM 使用者並讓該使用者執行任務的程序，包含以下步驟：

1. 在 [AWS 管理主控台、、Tools for Windows PowerShell 或使用 API 操作建立使用者 AWS CLI](getting-started-workloads.md)。 PowerShell AWS 如果您在 中建立使用者 AWS 管理主控台，則會根據您的選擇自動處理步驟 1-4。如果您透過程式設計的方式建立 IAM 使用者，則必須單獨執行每一個步驟。

1. 根據使用者需要的存取類型，建立使用者的憑證：
   + **啟用主控台存取 – *選用***：如果使用者需要存取 AWS 管理主控台，[請為使用者建立密碼](id_credentials_passwords_admin-change-user.md)。針對使用者停用主控台存取可以防止他們使用其使用者名稱和密碼登入 AWS 管理主控台 。它不會變更其許可，也不會阻止他們使用擔任的角色來存取主控台。
**提示**  
僅建立使用者需要的憑證。例如，對於只需要透過 存取的使用者 AWS 管理主控台，請勿建立存取金鑰。

1. 為使用者提供許可，以執行必要的任務。建議您將 IAM 使用者放入群組中，透過連接到這些群組的政策來管理許可。不過，也可以將許可政策直接連接到使用者來授予許可。如果使用主控台來新增使用者，可以將許可從現有使用者複製到新使用者。

   也可以新增[許可界限](access_policies_boundaries.md)，透過指定可定義使用者可擁有之最大許可的政策來限制使用者的許可。許可界限不會授予任何許可。

   如需建立自訂許可政策以用於授予許可或設定許可界限的說明，請參閱[使用客戶管理政策定義自訂 IAM 許可](access_policies_create.md)。

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

1. 提供使用者必要的登入資訊。這包括使用者提供這些憑證所在的帳戶登入頁面的密碼和主控台 URL。如需詳細資訊，請參閱 [IAM 使用者如何登入 AWS](id_users_sign-in.md)。

1. (選用) 設定使用者的[多重要素驗證 (MFA)](id_credentials_mfa.md)。MFA 要求使用者每次登入 AWS 管理主控台時提供一次性使用的代碼。

1. (選用) 為 IAM 使用者提供許可，以管理他們自己的安全憑證。(根據預設，IAM 使用者沒有管理他們自己的憑證的許可)。如需詳細資訊，請參閱[允許 IAM 使用者變更自己的密碼](id_credentials_passwords_enable-user-change.md)。
**注意**  
如果使用主控台建立使用者，並選取**使用者必須在下次登入時建立新密碼 (建議)**，則使用者擁有必要的許可。

如需有關建立使用者所需的許可資訊，請參閱 [存取 IAM 資源所需的許可](access_permissions-required.md)。

如需為特定使用案例建立 IAM 使用者的說明，請參閱下列主題：
+ [建立 IAM 使用者以進行緊急存取](getting-started-emergency-iam-user.md)
+ [為無法使用 IAM 角色的工作負載建立 IAM 使用者](getting-started-workloads.md)

# 檢視 IAM 使用者
<a name="id_users_list"></a>

您可以列出 AWS 帳戶 或特定 IAM 群組中的 IAM 使用者，並列出使用者所在的所有 IAM 群組。有關列出使用者所需的許可資訊，請參閱 [存取 IAM 資源所需的許可](access_permissions-required.md)。

## 若要列出帳戶中的所有 IAM 使用者
<a name="id_users_manage_list-users"></a>

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

主控台會在您的 中顯示 IAM 使用者 AWS 帳戶。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam list-users](https://docs.aws.amazon.com/cli/latest/reference/iam/list-users.html)`

------
#### [ API ]

呼叫以下操作：
+ `[ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html)` 

------

## 若要列出 IAM 群組中的 IAM 使用者
<a name="id_users_manage_list-users-group"></a>

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

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

1. 選擇使用者群組的名稱。

屬於該群組的 IAM 使用者會列在**使用者**索引標籤中。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam get-group](https://docs.aws.amazon.com/cli/latest/reference/iam/get-group.html)`

------
#### [ API ]

呼叫以下操作：
+ `[GetGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroup.html)` 

------

## 若要列出使用者所屬的 IAM 群組
<a name="id_users_manage_list-groups-users"></a>

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中選擇 IAM 使用者名稱。

1. 選取**群組**索引標籤，以顯示包含目前使用者的群組清單。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam list-groups-for-user](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups-for-user.html)`

------
#### [ API ]

呼叫以下操作：
+ `[ListGroupsForUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupsForUser.html)` 

------

## 後續步驟
<a name="id_users_list-next-steps"></a>

取得 IAM 使用者清單後，可以使用下列程序重新命名、刪除或停用 IAM 使用者。
+ [重新命名 IAM 使用者](id_users_rename.md)
+ [移除或停用 IAM 使用者](id_users_remove.md)

# 重新命名 IAM 使用者
<a name="id_users_rename"></a>

**注意**  
[最佳實務](best-practices.md)是，建議您要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取 。如果遵循最佳實務，則您不用管理 IAM 使用者和群組。反之，您的使用者和群組是在 外部管理 AWS ，並且能夠以*聯合身分*的形式存取 AWS 資源。聯合身分是來自您的企業使用者目錄、Web 身分提供者、 AWS Directory Service、Identity Center 目錄或任何使用透過身分來源提供的登入資料存取 AWS 服務的使用者。聯合身分使用由其身分提供者定義的群組。如果您使用的是 AWS IAM Identity Center，請參閱*AWS IAM Identity Center *[《 使用者指南》中的在 IAM Identity Center 中管理](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source-sso.html)身分，以取得在 IAM Identity Center 中建立使用者和群組的相關資訊。

Amazon Web Services 提供在 AWS 帳戶中管理 IAM 使用者的多項工具。您可以列出帳戶或使用者群組中的 IAM 使用者，也可以列出使用者所屬的所有 IAM 群組。您可以重新命名或變更 IAM 使用者的路徑。如果您要改用聯合身分而非 IAM 使用者，您可以刪除 AWS 帳戶的 IAM 使用者，或停用該使用者。

如需有關新增、變更或移除 IAM 使用者之受管政策的詳細資訊，請參閱 [變更 IAM 使用者的許可](id_users_change-permissions.md)。如需管理 IAM 使用者之內嵌政策的資訊，請參閱[新增和移除 IAM 身分許可](access_policies_manage-attach-detach.md)、[編輯 IAM 政策](access_policies_manage-edit.md) 和 [刪除 IAM 政策](access_policies_manage-delete.md)。最佳實務的做法是，使用受管政策而不是內嵌政策。*AWS 受管政策*為很多常見使用案例授予許可。請記住， AWS 受管政策可能不會授予特定使用案例的最低權限許可，因為它們可供所有 AWS 客戶使用。因此，我們建議您定義使用案例的[客戶管理政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)，以便進一步減少許可。如需詳細資訊，請參閱[AWS 受管政策](access_policies_managed-vs-inline.md#aws-managed-policies)。如需專為特定任務函數設計的 AWS 受管政策的詳細資訊，請參閱 [AWS 任務函數的 受管政策](access_policies_job-functions.md)。

若要了解驗證 IAM 政策的資訊，請參閱 [IAM 政策驗證](access_policies_policy-validator.md)。

**提示**  
[IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 可以分析您 IAM 角色使用的服務和動作，然後產生您可以使用的精細政策。測試產生的每個政策後，您可以將政策部署到生產環境。這可確保您僅授予所需的許可給工作負載。如需政策產生的詳細資訊，請參閱 [IAM Access Analyzer 政策產生](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)。

如需有關管理 IAM 使用者密碼的資訊，請參閱 [管理 IAM 使用者的密碼](id_credentials_passwords_admin-change-user.md)。

## 重新命名 IAM 使用者
<a name="id_users_renaming"></a>

若要變更使用者名稱或路徑，您必須使用 AWS CLI、Tools for Windows PowerShell 或 AWS API。主控台中沒有用於重新命名使用者的選項。有關重新命名使用者所需的許可資訊，請參閱 [存取 IAM 資源所需的許可](access_permissions-required.md)。

當您更改使用者名稱或路徑時，會發生以下情況：
+ 連接到使用者的所有政策繼續採用新使用名稱。
+ 使用者以新名稱保留在相同的 IAM 群組中。
+ 該使用者的唯一 ID 保持不變。如需有關唯一 ID 的詳細資訊，請參閱 [唯一識別碼](reference_identifiers.md#identifiers-unique-ids)。
+ 任何將該使用者*視為「主體」*(向該使用者授予存取權) 的資源或角色政策都會自動更新，以使用新名稱或路徑。例如，Amazon SQS 中的任何佇列類型政策或 Amazon S3 中的任何資源類型政策都會自動更新，以使用新名稱和路徑。

IAM 不會自動更新將該使用者視為*資源*以使用新使用者名稱或路徑的政策；您只能手動更新。例如，該使用者 `Richard` 連接了一個政策，而該政策讓使用者可管理其自己的安全憑證。如果管理員將 `Richard` 重新命名為 `Rich`，則管理員還需要更新該政策以將資源從：

```
arn:aws:iam::111122223333:user/division_abc/subdivision_xyz/Richard
```

變更為此：

```
arn:aws:iam::111122223333:user/division_abc/subdivision_xyz/Rich
```

如果管理員更改路徑，也會發生這種情況；管理員需要更新政策以反映該使用者使用新路徑。

### 重新命名使用者
<a name="id_users_manage_list-users-rename"></a>
+ AWS CLI：[aws iam update-user](https://docs.aws.amazon.com/cli/latest/reference/iam/update-user.html)
+ AWS API：[UpdateUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateUser.html) 

# 移除或停用 IAM 使用者
<a name="id_users_remove"></a>

[最佳實務](best-practices.md#remove-credentials)建議您從 中移除未使用的 IAM 使用者 AWS 帳戶。如果想要保留 IAM 使用者憑證以供日後使用，而不是從帳戶中刪除它們，可以停用使用者的存取權。如需詳細資訊，請參閱[停用 IAM 使用者](#id_users_deactivating)。

**警告**  
IAM 使用者及其存取金鑰一經刪除，將無法還原或復原。

## 先決條件 – 檢視 IAM 使用者存取權
<a name="users-manage_prerequisites"></a>

在移除使用者之前，請檢閱其最近的服務層級活動。這有助於防止從正在使用它的主體 (人員或應用程式) 中移除存取權。如需有關檢視上次存取的資訊的詳細資訊，請參閱 [AWS 使用上次存取的資訊在 中精簡許可](access_policies_last-accessed.md)。

## 移除 IAM 使用者 (主控台)
<a name="id_users_deleting_console"></a>

當您使用 AWS 管理主控台 移除 IAM 使用者時，IAM 會自動刪除下列相關資訊：
+ IAM 使用者識別符
+ 任何群組成員關係，即從該 IAM 使用者所屬的任何群組中移除該 IAM 使用者
+ 與 IAM 使用者有關的任何密碼 
+ 嵌入於 IAM 使用者的所有內嵌政策 (透過使用者群組許可套用至 IAM 使用者的政策不受影響) 
**注意**  
當您刪除使用者時，IAM 會移除任何連接至 IAM 使用者的受管政策，但不會刪除受管政策。
+ 任何相關的 MFA 裝置

### 若要移除 IAM 使用者 (主控台)
<a name="id_users_remove-section-1"></a>

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者**，然後選取您要刪除之 IAM 使用者名稱旁的核取方塊。

1. 在頁面頂端，選擇 **Delete (刪除)**。
**注意**  
如果任何使用者擁有作用中的存取金鑰，則必須先停用這些存取金鑰，然後再刪除使用者。如需詳細資訊，請參閱[若要停用 IAM 使用者的存取金鑰](access-keys-admin-managed.md#admin-deactivate-access-key)。

1. 確認對話方塊中，在文字輸入欄位中輸入使用者名稱以確認刪除使用者。選擇 **刪除**。

主控台會顯示已刪除 IAM 使用者的狀態通知。

------

## 刪除 IAM 使用者 (AWS CLI)
<a name="id_users_deleting_cli"></a>

與 不同 AWS 管理主控台，當您使用 刪除 IAM 使用者時 AWS CLI，您必須手動刪除連接到 IAM 使用者的項目。此程序說明步驟。

**從 AWS 帳戶 (AWS CLI) 刪除 IAM 使用者**

1. 如果使用者有密碼，刪除該使用者的密碼。

   `[aws iam delete-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-login-profile.html)`

1. 如果使用者有存取金鑰，則將其刪除。

   `[aws iam list-access-keys](https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html)` (列出使用者的存取金鑰) 和 `[aws iam delete-access-key](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html)`

1. 刪除使用者的簽署憑證。注意，當您刪除安全憑證時，將會永遠消失、無法還原。

   `[aws iam list-signing-certificates](https://docs.aws.amazon.com/cli/latest/reference/iam/list-signing-certificates.html)` (列出使用者的簽署的憑證) 和 `[aws iam delete-signing-certificate](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-signing-certificate.html)`

1. 如果使用者有 SSH 公有金鑰，則將其刪除。

   `[aws iam list-ssh-public-keys](https://docs.aws.amazon.com/cli/latest/reference/iam/list-ssh-public-keys.html)` (列出使用者的 SSH 公有金鑰) 和 `[aws iam delete-ssh-public-key](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-ssh-public-key.html)`

1. 刪除使用者的 Git 憑證。

   `[aws iam list-service-specific-credentials](https://docs.aws.amazon.com/cli/latest/reference/iam/list-service-specific-credentials.html)` (列出使用者的 Git 憑證) 和 `[aws iam delete-service-specific-credential](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-service-specific-credential.html)`

1. 如果使用者有多重要素驗證 (MFA) 裝置，請將其停用。

   `[aws iam list-mfa-devices](https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-devices.html)` (列出使用者的 MFA 裝置)、`[aws iam deactivate-mfa-device](https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html)` (停用裝置) 和 `[aws iam delete-virtual-mfa-device](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-virtual-mfa-device.html)` (永久刪除虛擬 MFA 裝置) 

1. 刪除使用者的內嵌政策。

   `[aws iam list-user-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-user-policies.html)` (列出使用者的內嵌政策) 和 [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-user-policy.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-user-policy.html) (刪除政策) 

1. 分開連接到該使用者的任何受管政策。

   `[aws iam list-attached-user-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-user-policies.html)` (列出連接到使用者的受管政策) 和 [https://docs.aws.amazon.com/cli/latest/reference/iam/detach-user-policy.html](https://docs.aws.amazon.com/cli/latest/reference/iam/detach-user-policy.html) (分開政策) 

1. 將該使用者從任何 IAM 群組中移除。

   `[aws iam list-groups-for-user](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups-for-user.html)` (列出使用者所屬的 IAM 群組) 和 `[aws iam remove-user-from-group](https://docs.aws.amazon.com/cli/latest/reference/iam/remove-user-from-group.html)` 

1. 刪除使用者。

   `[aws iam delete-user](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-user.html)` 

## 停用 IAM 使用者
<a name="id_users_deactivating"></a>

當 IAM 使用者暫時離開公司時，您可能需要停用他們。您可以將他們的 IAM 使用者憑證保留在適當位置，但仍然封鎖他們的 AWS 存取權。

若要停用使用者，請建立並連接政策以拒絕使用者存取 AWS。您可以稍後恢復使用者的存取權限。

以下是您可以連接到使用者以拒絕其存取的兩個拒絕政策範例。

下列政策不包含時間限制。您必須移除政策才能恢復使用者的存取權。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [ 
      {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*"
      } 
   ]
}
```

------

下列政策包括在 2024 年 12 月 24 日晚上 11:59 (UTC) 啟動政策的條件，並於 2025 年 2 月 28 日晚上 11:59 (UTC) 結束該政策。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
          "DateGreaterThan": {"aws:CurrentTime": "2024-12-24T23:59:59Z"},
          "DateLessThan": {"aws:CurrentTime": "2025-02-28T23:59:59Z"}
          }
       }
   ]
}
```

------

# 控制 IAM 使用者對 的存取 AWS 管理主控台
<a name="console_controlling-access"></a>

具有 AWS 帳戶 透過 登入 許可的 IAM AWS 管理主控台 使用者可以存取您的 AWS 資源。以下清單顯示您可以透過 授予 IAM 使用者存取 AWS 帳戶 資源的方式 AWS 管理主控台。它還顯示 IAM 使用者如何透過 AWS 網站存取其他 AWS 帳戶功能。

**注意**  
使用 IAM 免費。

**的 AWS 管理主控台**  
您為需要存取 AWS 管理主控台的每個 IAM 使用者建立密碼。使用者透過啟用 IAM 的 AWS 帳戶 登入頁面存取主控台。如需有關存取登入頁面的資訊，請參閱《AWS 登入 使用者指南》** 中的 [如何登入 AWS](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。如需有關建立密碼的資訊，請參閱[中的使用者密碼 AWS](id_credentials_passwords.md)。  
您可以 AWS 管理主控台 移除 IAM 使用者的密碼，以防止其存取 。這可防止他們 AWS 管理主控台 使用其登入憑證登入 。它不會變更其許可，也不會阻止他們使用擔任的角色來存取主控台。如果使用者有作用中的存取金鑰，他們會繼續運作並允許透過 AWS CLI、Tools for Windows PowerShell、 AWS API 或 AWS 主控台行動應用程式進行存取。

**您的 AWS 資源，例如 Amazon EC2 執行個體、Amazon S3 儲存貯體等**  
即使 IAM 使用者有密碼，還是需要許可才能存取您的 AWS 資源。在建立 IAM 使用者時，該使用者預設是沒有許可的。若要為您的 IAM 使用者提供所需的許可，請將政策連接到他們。如果您有多個 IAM 使用者使用相同的資源執行相同的任務，則可以將這些 IAM 使用者指派給一個群組。然後，將許可指派給該群組。如需有關建立 IAM 使用者與群組的詳細資訊，請參閱 [IAM 身分](id.md)。如需使用政策來設定許可的詳細資訊，請參閱 [AWS 資源的存取管理](access.md)。

**AWS 開發論壇**  
任何人都可以讀取 [AWS 開發論壇](https://forums.aws.amazon.com/)上的文章。想要將問題或評論發佈到 AWS 開發論壇的使用者可以使用其使用者名稱這樣做。使用者第一次張貼到 AWS 開發論壇時，系統會提示使用者輸入暱稱和電子郵件地址。只有該使用者可以在 AWS 開發論壇中使用該暱稱。

**您的 AWS 帳戶 帳單和用量資訊**  
您可以授予使用者存取您的 AWS 帳戶 帳單和用量資訊。如需詳細資訊，請參閱 *AWS Billing 使用者指南*中的[控制帳單資訊的存取](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/control-access-billing.html)。

**您的 AWS 帳戶 設定檔資訊**  
使用者無法存取您的 AWS 帳戶 設定檔資訊。

**您的 AWS 帳戶 安全登入資料**  
使用者無法存取您的 AWS 帳戶 安全登入資料。

**注意**  
無論介面為何，IAM 政策控制存取權。例如，您可以提供使用者存取 AWS 管理主控台所需的密碼。該使用者 (或使用者所屬的任何群組) 適用的政策會控制使用者可以在 AWS 管理主控台中做哪些事。或者，您可以為使用者提供 AWS 存取金鑰，以便對 進行 API 呼叫 AWS。這些政策會控制使用者可以透過使用這些存取金鑰進行身分驗證的文件庫或用戶端，呼叫哪些動作。

# 變更 IAM 使用者的許可
<a name="id_users_change-permissions"></a>

您可以變更 IAM 使用者的許可， AWS 帳戶 方法是變更其群組成員資格、從現有使用者複製許可、將政策直接連接到使用者，或設定[許可界限](access_policies_boundaries.md)。許可界限控制使用者可以擁有的許可上限。許可界限是一項進階 AWS 功能。

如需有關修改使用者許可所需的許可資訊，請參閱 [存取 IAM 資源所需的許可](access_permissions-required.md)。

**Topics**
+ [檢視使用者存取](#users-modify_prerequisites)
+ [根據使用者的存取活動產生政策](#users_change_permissions-gen-policy)
+ [新增許可到使用者 (主控台)](#users_change_permissions-add-console)
+ [變更使用者的許可 (主控台)](#users_change_permissions-change-console)
+ [若要從使用者中移除許可政策 (主控台)](#users_change_permissions-remove-policy-console)
+ [若要從使用者中移除許可界限 (主控台)](#users_change_permissions-remove-boundary-console)
+ [新增和移除使用者的許可 (AWS CLI 或 AWS API)](#users_change_permissions-add-programmatic)

## 檢視使用者存取
<a name="users-modify_prerequisites"></a>

變更使用者的許可之前，您應該檢閱其最近的服務層級活動。這很重要，因為您不希望從正在使用該許可的主體 (人員或應用程式) 中移除存取。如需有關檢視上次存取的資訊的詳細資訊，請參閱 [AWS 使用上次存取的資訊在 中精簡許可](access_policies_last-accessed.md)。

## 根據使用者的存取活動產生政策
<a name="users_change_permissions-gen-policy"></a>

您有時可能會對 IAM 實體 (使用者或角色) 授予超出其要求的許可。為了協助您精簡所授予的許可，您可以根據實體的存取活動產生 IAM 政策。IAM Access Analyzer 會檢閱您的 AWS CloudTrail 日誌，並產生政策範本，其中包含實體在指定日期範圍內已使用的許可。您可以使用範本建立具有精細許可的受管政策，然後將其連接至 IAM 實體。如此一來，您只會授予使用者或角色與特定使用案例 AWS 的資源互動所需的許可。若要進一步了解，請參閱 [IAM Access Analyzer 政策產生](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)。

## 新增許可到使用者 (主控台)
<a name="users_change_permissions-add-console"></a>

IAM 提供三種方法將許可政策新增到使用者：
+ **新增 IAM 使用者至 IAM 群組**：讓使用者成為群組的成員。群組的政策連接到使用者。
+ **從現有的 IAM 使用者複製許可**：複製所有群組成員資格、連接的受管政策、內嵌政策，以及來源使用者的任何現有許可界限。
+ **直接連接政策到 IAM 使用者**：將受管政策直接連接到使用者。為方便管理許可，請將您的政策連接到群組，然後讓 IAM 使用者成為相應群組的成員。

**重要**  
如果使用者具有許可界限，則您無法新增比許可界限允許的還要多的許可至使用者。

### 若要透過將 IAM 使用者新增到群組來新增許可
<a name="users_change_permissions-add-group-console"></a>

將 IAM 使用者新增至 IAM 群組，會立即使用為群組定義的許可來更新使用者的許可。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中選擇 IAM 使用者名稱。

1. 選取**群組**索引標籤，以顯示包含目前使用者的群組清單。

1. 選擇**將使用者新增至群組**。

1. 選取您要使用者加入的各個群組的核取方塊。如果成為群組的成員，清單會顯示每個群組的名稱和使用者所接收的政策。

1. (選用) 可以選擇**建立群組**來定義新群組。如果想要將使用者新增至連接政策與現有群組不同的群組，這很有用：

   1. 在新標籤中的 **使用者群組名稱** 中輸入新群組的名稱。
**注意**  
 AWS 帳戶中 IAM 資源的數量和大小有限。如需詳細資訊，請參閱[IAM AWS STS 和配額](reference_iam-quotas.md)。群組名稱可以是長達 128 個字母、數字以及這些字元的組合：加號 (\$1)、等號 (=)、逗號 (,)、句號 (.)、@ 符號以及連字號 (-)。名稱在帳戶中必須是唯一的。它們無法透過大小寫進行區分。例如，您無法建立兩個名為 *TESTGROUP* 和 *testgroup* 的群組。

   1. 選擇一個或多個您要連接到群組的受管政策的核取方塊。您也可以選擇 **建立政策** 來建立新的受管政策。如果您這麼做時，在新政策完成時會返回此瀏覽器標籤或視窗；選擇 **重新整理**，然後選擇新的政策，以將它連接至您的群組。如需詳細資訊，請參閱[使用客戶管理政策定義自訂 IAM 許可](access_policies_create.md)。

   1. 選擇 **建立使用者群組**。

   1. 返回原始標籤，重新整理您的群組清單。然後，選取新群組的核取方塊。

1. 選擇**將使用者新增至群組**。

主控台會顯示狀態訊息，通知您使用者已新增至指定的群組。

------

### 若要透過從其他 IAM 使用者中複製來新增許可
<a name="users_change_permissions-add-copy-console"></a>

如果選擇透過複製許可來為 IAM 使用者新增許可，IAM 會從指定的使用者中複製所有群組成員資格、連接的受管政策、內嵌政策以及任何現有的許可界限，並立即將它們套用到目前選取的使用者。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中選擇 IAM 使用者名稱。

1. 在**許可**索引標籤中，選取**新增許可**。

1. 在**新增許可**頁面中，選擇**複製許可**。清單會顯示可用的 IAM 使用者及其群組成員資格和連接的政策。

1. 選擇您要複製許可的使用者旁的選項按鈕。

1. 選擇 **下一步**，以查看要對使用者進行的變更清單。然後選擇 **新增許可**。

主控台會顯示狀態訊息，通知您已從指定的 IAM 使用者中複製許可。

------

### 若要透過直接連接政策到 IAM 使用者來新增許可
<a name="users_change_permissions-add-directly-console"></a>

可以將受管政策直接連接至 IAM 使用者。會立即套用更新的許可。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中選擇 IAM 使用者名稱。

1. 在**許可**索引標籤中，選取**新增許可**。

1. 在**新增許可**頁面中，選擇**直接連接政策**。**許可政策**清單會顯示可用政策及其政策類型和連接的實體。

1. 選取要連接的**政策名稱**旁的選項按鈕。

1. 選擇 **下一步**，以查看要對使用者進行的變更清單。然後選擇 **新增許可**。

主控台會顯示狀態訊息，通知您政策已新增至指定的 IAM 使用者。

------

### 若要設定 IAM 使用者的許可界限
<a name="users_change_permissions-set-boundary-console"></a>

許可界限是用於管理 中許可的進階功能 AWS ，用於設定 IAM 使用者可擁有的最大許可。設定許可界限會立即將 IAM 使用者許可限制在界限內，無論授予的其他許可為何。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中，選擇您要變更其許可界限的 IAM 使用者名稱。

1. 選擇 **許可** 標籤。如有必要，請開啟 **許可界限** 區段，然後選擇 **設定許可界限**。

1. 在**設定許可界限**頁面的**許可政策**下，選取要用於許可界限的政策。

1. 選擇 **設定界限**。

主控台會顯示狀態訊息，通知您已新增許可界限。

------

## 變更使用者的許可 (主控台)
<a name="users_change_permissions-change-console"></a>

IAM 可讓您以下列方式變更與使用者建立關聯的許可：
+ **編輯許可政策** – 編輯使用者的內嵌政策、使用者群組的內嵌政策，或編輯直接連接到使用者或從群組連接的受管政策。如果使用者具有許可界限，則您無法提供比當成使用者的許可界限來人用的政策所允許的還要更多的許可。
+ **變更許可界限** – 變更用作使用者的許可界限的政策。這會擴展或限制使用者可以擁有的許可上限。

### 編輯連接到使用者的許可政策
<a name="users_change_permissions-edit-policy-console"></a>

變更許可會立即更新使用者的存取權。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中，選擇您要變更其許可界限的 IAM 使用者名稱。

1. 選擇**許可**索引標籤。如有必要，請開啟**許可界限**區段。

1. 選擇您要編輯以檢視詳細資訊的政策名稱。選擇**連接的實體**索引標籤，檢視編輯政策時可能受影響的其他實體 (IAM 使用者、群組和角色）。

1. 選擇 **許可** 標籤，然後檢閱政策授予的許可。若要對許可進行變更，請選擇**編輯**。

1. 編輯該政策並解決任何[政策驗證](access_policies_policy-validator.md)建議。如需詳細資訊，請參閱[編輯 IAM 政策](access_policies_manage-edit.md)。

1. 選擇**下一步**，檢閱政策摘要，然後選擇**儲存變更**。

主控台會顯示狀態訊息，通知您已更新政策。

------

### 若要變更使用者的許可界限
<a name="users_change_permissions-change-boundary-console"></a>

變更許可界限會立即更新使用者的存取權。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中，選擇您要變更其許可界限的 IAM 使用者名稱。

1. 選擇 **Permissions (許可)** 標籤。如有必要，開啟 **許可界限** 區段，然後選擇 **變更界限**。

1. 選擇要用於許可界限的政策。

1. 選擇 **設定界限**。

主控台會顯示狀態訊息，通知您已變更許可界限。

------

## 若要從使用者中移除許可政策 (主控台)
<a name="users_change_permissions-remove-policy-console"></a>

移除許可政策會立即更新使用者的存取權。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇您想要移除其許可政策的使用者名稱。

1. 選擇**許可**索引標籤。

1. 如果想要透過移除現有政策來移除許可，在選擇**移除**來移除該政策之前，請檢視**連接方式**資料欄來了解使用者如何取得該政策：
   + 如果因群組成員資格而套用政策，則選擇 **移除** 會從群組移除使用者。請記住，您可能會有多個政策連接到單一群組。如果您移除群組中的使用者，使用者會失去透過群組成員資格收到的「所有」**政策的存取權。
   + 如果政策是直接連接到使用者的受管政策，則選擇 **移除** 會將政策與使用者分開。這不會影響政策本身或政策可能連接的任何其他目標實體。
   + 如果政策是內嵌政策，則選擇**移除**會從 IAM 移除政策。直接連接到使用者的內嵌政策只存在於該使用者。

如果政策是透過群組成員資格授予給使用者，主控台會顯示狀態訊息，通知您已從 IAM 群組中移除 IAM 使用者。如果政策為直接連接或內嵌，則狀態訊息會通知您已移除政策。

------

## 若要從使用者中移除許可界限 (主控台)
<a name="users_change_permissions-remove-boundary-console"></a>

移除許可界限會立即更新使用者的存取權。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中，選擇您要移除其許可界限的 IAM 使用者名稱。

1. 選擇**許可**索引標籤。如有必要，請開啟**許可界限**區段。

1.  選擇 **Change boundary (變更界限)**。若要確認您要移除許可界限，在確認對話方塊中，選擇**移除界限**。

主控台會顯示狀態訊息，通知您已移除許可界限。

------

## 新增和移除使用者的許可 (AWS CLI 或 AWS API)
<a name="users_change_permissions-add-programmatic"></a>

若要以程式設計方式新增或移除許可，您必須新增或移除群組成員資格、連接或分開受管政策，或者新增或刪除內嵌政策。如需詳細資訊，請參閱下列主題：
+ [編輯 IAM 群組中的使用者](id_groups_manage_add-remove-users.md)
+ [新增和移除 IAM 身分許可](access_policies_manage-attach-detach.md)

# 中的使用者密碼 AWS
<a name="id_credentials_passwords"></a>

您可以您帳戶中的 IAM 使用者管理密碼。IAM 使用者需要密碼才能存取 AWS 管理主控台。使用者不需要密碼，即可透過使用 Tools for Windows PowerShell AWS CLI、 AWS SDKs或 APIs 以程式設計方式存取 AWS 資源。對於這些環境，您可以選擇指派 IAM 使用者[存取金鑰](id_credentials_access-keys.md)。不過，建議您先考慮其他更安全的方案來替代存取金鑰。如需詳細資訊，請參閱[AWS 安全登入資料](security-creds.md)。

**注意**  
如果其中一個 IAM 使用者遺失或忘記密碼，您*無法*從 IAM 擷取。根據您的設定，使用者或管理員必須建立新密碼。

**Topics**
+ [設定 IAM 使用者的帳戶密碼政策](id_credentials_passwords_account-policy.md)
+ [管理 IAM 使用者的密碼](id_credentials_passwords_admin-change-user.md)
+ [允許 IAM 使用者變更自己的密碼](id_credentials_passwords_enable-user-change.md)
+ [IAM 使用者如何變更自己的密碼](id_credentials_passwords_user-change-own.md)

# 設定 IAM 使用者的帳戶密碼政策
<a name="id_credentials_passwords_account-policy"></a>

您可以在 上設定自訂密碼政策 AWS 帳戶 ，以指定 IAM 使用者密碼的複雜性要求和強制輪換期間。如果您未設定自訂密碼政策，IAM 使用者密碼必須符合預設 AWS 密碼政策。如需詳細資訊，請參閱[自訂密碼政策選項](#password-policy-details)。

**Topics**
+ [設定密碼政策的規則](#password-policy-rules)
+ [設定密碼政策所需的許可](#default-policy-permissions-required)
+ [預設密碼政策](#default-policy-details)
+ [自訂密碼政策選項](#password-policy-details)
+ [若要設定密碼政策 (主控台)](#IAMPasswordPolicy)
+ [若要變更密碼政策 (主控台)](#id_credentials_passwords_account-policy-section-1)
+ [要刪除自訂密碼政策 (主控台)](#id_credentials_passwords_account-policy-section-2)
+ [設定密碼政策 (AWS CLI)](#PasswordPolicy_CLI)
+ [設定密碼政策 (AWS API)](#PasswordPolicy_API)

## 設定密碼政策的規則
<a name="password-policy-rules"></a>

IAM 密碼政策不適用於 AWS 帳戶根使用者 密碼或 IAM 使用者存取金鑰。如果密碼過期，IAM 使用者無法登入 ， AWS 管理主控台 但可以繼續使用其存取金鑰。

當您建立或變更密碼政策時，大多數密碼政策設定將在使用者下次變更密碼時強制執行。但是，某些設定會立即強制執行。例如：
+ 當最短長度和字元類型要求變更時，將在使用者下次變更密碼時強制執行這些設定。即使現有的密碼不遵守更新的密碼政策，也不會強制使用者變更現有的密碼。
+ 當您設定密碼過期期間時，會立即強制執行過期期間。例如，假設您將密碼過期期間設定為 90 天。在這種情況下，現有密碼超過 90 天的所有 IAM 使用者的密碼會到期。這些使用者必須在下次登入時變更其密碼。

在指定次數的登入嘗試失敗之後，您無法建立「鎖定政策」來鎖定使用者帳戶。為了增強安全性，我們建議您將強式密碼政策與多重要素驗證 (MFA) 結合。如需有關 MFA 的詳細資訊，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

## 設定密碼政策所需的許可
<a name="default-policy-permissions-required"></a>

您必須設定許可，以允許 IAM 實體 (使用者或角色) 檢視或編輯其帳戶密碼政策。您可以在 IAM 政策中包含下列密碼政策動作：
+ `iam:GetAccountPasswordPolicy` – 允許實體檢視其帳戶的密碼政策
+ `iam:DeleteAccountPasswordPolicy` – 允許實體刪除其帳戶的自訂密碼政策，並還原為預設密碼政策
+ `iam:UpdateAccountPasswordPolicy` – 允許實體建立或變更其帳戶的自訂密碼政策

下列政策允許完整存取權以檢視和編輯帳戶密碼政策。若要了解如何使用此範例 JSON 政策文件來建立 IAM 政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "FullAccessPasswordPolicy",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:DeleteAccountPasswordPolicy",
                "iam:UpdateAccountPasswordPolicy"
            ],
            "Resource": "*"
        }
    ]
}
```

------

如需 IAM 使用者變更其自己密碼所需許可的資訊，請參閱 [允許 IAM 使用者變更自己的密碼](id_credentials_passwords_enable-user-change.md)。

## 預設密碼政策
<a name="default-policy-details"></a>

如果管理員未設定自訂密碼政策，IAM 使用者密碼必須符合預設 AWS 密碼政策。

預設密碼政策會強制執行下列條件：
+ 密碼長度最短為 8 個字元，最長為 128 個字元。
+ 至少混用 3 種下列類型字元：大寫、小寫、數字和非英數字元 (`! @ # $ % ^ & * ( ) _ + - = [ ] { } | '`)
+ 與 AWS 帳戶 您的姓名或電子郵件地址不同
+ 保證密碼不會過期

## 自訂密碼政策選項
<a name="password-policy-details"></a>

當您設定帳戶的自訂密碼政策時，您可以指定下列條件：
+ **密碼最小長度** – 您可以指定至少 6 個字元，最多可指定 128 個字元。
+ **密碼強度**：您可以選取下列任一核取方塊來定義 IAM 使用者密碼的強度：
  + 至少需要一個拉丁字母 (A–Z) 的大寫字母
  + 至少需要一個拉丁字母 (a–z) 的小寫字母
  + 至少需要有一個數字
  + 至少需要一個非英數字元的字元 `! @ # $ % ^ & * ( ) _ + - = [ ] { } | '` 
+ **Turn on password expiration** (啟用密碼過期) – 您可以選取並指定至少 1 天，且最長為 1,095 天的 IAM 使用者密碼有效期，設定後生效。例如，如果您指定 90 天的到期日，它會立即影響所有使用者。對於密碼超過 90 天的使用者，當他們在變更後登入主控台時，必須設定新密碼。密碼為 75-89 天的使用者會收到密碼過期的 AWS 管理主控台 警告。IAM 使用者可隨時變更密碼 (如果他們有許可)。當他們設定新的密碼時，該密碼的到期期間將重新開始。IAM 使用者一次只能有一個有效的密碼。
+ **密碼過期需要管理員重設** – 選取此選項，以防止 IAM 使用者在密碼過期後使用 AWS 管理主控台 更新自己的密碼。在選取此選項之前，請確認您的 AWS 帳戶 有多個具有管理許可的使用者，以重設 IAM 使用者密碼。具有 `iam:UpdateLoginProfile` 許可的管理員可以重設 IAM 使用者密碼。具有 `iam:ChangePassword` 許可和作用中存取金鑰的 IAM 使用者可以程式設計方式重設自己的 IAM 使用者主控台密碼。如果您清除此核取方塊，密碼到期的 IAM 使用者仍必須先設定新密碼，然後才能存取 AWS 管理主控台。
+ **Allow users to change their own password** (允許使用者變更自己的密碼) – 您可以允許帳戶中的所有 IAM 使用者變更自己的密碼。這可讓使用者僅針對其使用者存取 `iam:ChangePassword` 動作，並存取 `iam:GetAccountPasswordPolicy` 動作。此選項不會將許可政策連接到每個使用者。反之，IAM 會在帳戶層級套用許可到所有使用者。或者，您只允許一些使用者管理自己的密碼。若要執行這項操作，請清除此核取方塊。如需有關使用政策以限制誰可以管理密碼的詳細資訊，請參閱 [允許 IAM 使用者變更自己的密碼](id_credentials_passwords_enable-user-change.md)。
+ **防止密碼重複使用** – 您可以防止 IAM 使用者重複使用舊密碼的指定數字。您可以指定長度下限為 1，以及長度上限為 24 的舊密碼，無法重複使用。

## 若要設定密碼政策 (主控台)
<a name="IAMPasswordPolicy"></a>

您可以使用 AWS 管理主控台 來建立、變更或刪除自訂密碼政策。對密碼政策的變更適用於此政策變更後建立的新 IAM 使用者，以及變更密碼時的現有 IAM 使用者。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**帳戶設定**。

1. 在 **Password policy** (密碼政策) 區段中，選擇 **Edit** (編輯)。

1. 選擇 **Custom** (自訂) 以使用自訂密碼政策。

1. 選取要套用至密碼政策的選項，然後選擇 **Save changes (儲存變更)**。

1. 選擇 **Set custom** (設定自訂)，確認您要設定自訂密碼政策。

主控台會顯示狀態訊息，通知您 IAM 使用者的密碼需求已更新。

------

## 若要變更密碼政策 (主控台)
<a name="id_credentials_passwords_account-policy-section-1"></a>

您可以使用 AWS 管理主控台 來建立、變更或刪除自訂密碼政策。對密碼政策的變更適用於此政策變更後建立的新 IAM 使用者，以及變更密碼時的現有 IAM 使用者。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**帳戶設定**。

1. 在 **Password policy** (密碼政策) 區段中，選擇 **Edit** (編輯)。

1. 選取要套用至密碼政策的選項，然後選擇 **Save changes (儲存變更)**。

1. 選擇 **Set custom** (設定自訂)，確認您要設定自訂密碼政策。

主控台會顯示狀態訊息，通知您 IAM 使用者的密碼需求已更新。

------

## 要刪除自訂密碼政策 (主控台)
<a name="id_credentials_passwords_account-policy-section-2"></a>

您可以使用 AWS 管理主控台 來建立、變更或刪除自訂密碼政策。對密碼政策的變更適用於此政策變更後建立的新 IAM 使用者，以及變更密碼時的現有 IAM 使用者。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

1. 在導覽窗格中，選擇**帳戶設定**。

1. 在 **Password policy** (密碼政策) 區段中，選擇 **Edit** (編輯)。

1. 選擇 **IAM default** (IAM 預設值) 以刪除自訂密碼政策，然後選擇 **Save changes** (儲存變更)。

1. 選擇 **Set default** (設定預設值)，確認您要設定 IAM 預設密碼政策。

主控台會顯示狀態訊息，通知您密碼政策已設定為 IAM 預設。

------

## 設定密碼政策 (AWS CLI)
<a name="PasswordPolicy_CLI"></a>

您可以使用 AWS Command Line Interface 來設定密碼政策。

**從 管理自訂帳戶密碼政策 AWS CLI**  
執行下列命令：
+ 若要建立或變更自訂密碼政策：[https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html](https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html)
+ 若要檢視密碼政策：[https://docs.aws.amazon.com/cli/latest/reference/iam/get-account-password-policy.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-account-password-policy.html)
+ 若要刪除自訂密碼政策：[https://docs.aws.amazon.com/cli/latest/reference/iam/delete-account-password-policy.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-account-password-policy.html)

## 設定密碼政策 (AWS API)
<a name="PasswordPolicy_API"></a>

您可以使用 AWS API 操作來設定密碼政策。

**從 AWS API 管理自訂帳戶密碼政策**  
呼叫以下操作：
+ 若要建立或變更自訂密碼政策：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccountPasswordPolicy.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccountPasswordPolicy.html)
+ 若要檢視密碼政策：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html)
+ 若要刪除自訂密碼政策：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccountPasswordPolicy.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccountPasswordPolicy.html)

# 管理 IAM 使用者的密碼
<a name="id_credentials_passwords_admin-change-user"></a>

使用 處理 AWS 資源 AWS 管理主控台 的 IAM 使用者必須擁有密碼才能登入。您可以建立、更改或刪除您的 AWS 帳戶中 IAM 使用者的密碼。

將密碼指派給使用者之後，使用者可以 AWS 管理主控台 使用帳戶的登入 URL 登入 ，如下所示：

```
https://12-digit-AWS-account-ID or alias.signin.aws.amazon.com/console
```

如需 IAM 使用者如何登入 的詳細資訊 AWS 管理主控台，請參閱*AWS 登入 《 使用者指南*》中的[如何登入 AWS](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

即使使用者有自己的密碼，還是需要許可才能存取您的 AWS 資源。使用者預設沒有任何許可。為授予使用者所需的許可，您可向使用者或使用者所屬的群組分配政策。如需有關建立使用者與群組的詳細資訊，請參閱 [IAM 身分](id.md)。如需使用政策來設定許可的詳細資訊，請參閱 [變更 IAM 使用者的許可](id_users_change-permissions.md)。

您可以授予使用者變更自己密碼的許可。如需詳細資訊，請參閱[允許 IAM 使用者變更自己的密碼](id_credentials_passwords_enable-user-change.md)。如需有關使用者如何存取您帳戶登入頁面的資訊，請參閱 *《AWS 登入 使用者指南》* 中的 [如何登入 AWS](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html)。

**Topics**
+ [建立、變更或刪除 IAM 使用者密碼 (主控台)](#id_credentials_passwords_admin-change-user_console)

## 建立、變更或刪除 IAM 使用者密碼 (主控台)
<a name="id_credentials_passwords_admin-change-user_console"></a>

您可以使用 AWS 管理主控台 來管理 IAM 使用者的密碼。

您的使用者存取需求可能會隨著時間而變更。您可能需要讓打算讓 CLI 存取的使用者擁有主控台存取權、變更使用者的密碼，因為他們會收到含有其登入資料的電子郵件，或在使用者離開組織或不再需要 AWS 存取權時將其刪除。

### 若要建立 IAM 使用者密碼 (主控台)
<a name="id_credentials_passwords_admin-change-user-section-1"></a>

使用此程序建立與使用者名稱關聯的密碼，以授予使用者主控台存取權。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

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

1. 選擇您想要為之建立密碼的使用者名稱。

1. 選擇 **安全憑證** 標籤，然後在 **主控台登入** 下方選擇 **啟用主控台存取**。

1. 在**啟用主控台存取**對話方塊中，選取**重設密碼**，然後選擇是否要讓 IAM 產生密碼或建立自訂密碼：
   + 若要讓 IAM 產生密碼，請選擇 **Autogenerated password** (自動產生的密碼)。
   + 若要建立自訂密碼，請選擇 **Custom password (自訂密碼)** 並輸入密碼。
**注意**  
您建立的密碼必須符合帳戶的[密碼政策](id_credentials_passwords_account-policy.md)。

1. 若要要求使用者登入時建立新的密碼，請選擇**下次登入時需要變更密碼**。

1. 若要要求使用者立即使用新密碼，請選取**撤銷作用中主控台工作階段**。這會將內嵌政策連接至 IAM 使用者，如果使用者的憑證比政策指定的時間更舊，則會拒絕該使用者存取資源。

1. 選擇**重設密碼**

1. **主控台密碼**對話方塊會通知您已啟用使用者的新密碼。若要檢視密碼以便與使用者共用，請選擇**主控台密碼**對話方塊中的**顯示**。選取**下載 .csv 檔案**，以下載具有使用者憑證的檔案。
**重要**  
基於安全原因，在完成此步驟後您無法存取該密碼，但您可以隨時建立新密碼。

主控台會顯示狀態訊息，通知您已啟用主控台存取。

------

### 為 IAM 使用者變更密碼 (主控台)
<a name="id_credentials_passwords_admin-change-user-section-2"></a>

使用此程序來更新與使用者名稱關聯的密碼。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

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

1. 選擇您想要為之變更密碼的使用者名稱。

1. 選擇 **安全憑證** 標籤，然後在 **主控台登入** 下方選擇 **管理主控台存取**。

1. 在**管理主控台存取**對話方塊中，選取**重設密碼**，然後選擇是否要讓 IAM 產生密碼或建立自訂密碼：
   + 若要讓 IAM 產生密碼，請選擇 **Autogenerated password** (自動產生的密碼)。
   + 若要建立自訂密碼，請選擇 **Custom password (自訂密碼)** 並輸入密碼。
**注意**  
您建立的密碼必須符合帳戶的[密碼政策](id_credentials_passwords_account-policy.md)。

1. 若要要求使用者登入時建立新的密碼，請選擇**下次登入時需要變更密碼**。

1. 若要要求使用者立即使用新密碼，請選取**撤銷作用中主控台工作階段**。這會將內嵌政策連接至 IAM 使用者，如果使用者的憑證比政策指定的時間更舊，則會拒絕該使用者存取資源。

1. 選擇**重設密碼**

1. **主控台密碼**對話方塊會通知您已啟用使用者的新密碼。若要檢視密碼以便與使用者共用，請選擇**主控台密碼**對話方塊中的**顯示**。選取**下載 .csv 檔案**，以下載具有使用者憑證的檔案。
**重要**  
基於安全原因，在完成此步驟後您無法存取該密碼，但您可以隨時建立新密碼。

主控台會顯示狀態訊息，通知您已更新主控台存取。

------

### 刪除 (停用) IAM 使用者密碼 (主控台)
<a name="id_credentials_passwords_admin-change-user-section-3"></a>

使用此程序刪除與使用者名稱關聯的密碼，從而移除使用者的主控台存取權。

**重要**  
您可以 AWS 管理主控台 移除 IAM 使用者的密碼，以防止其存取 。這可防止他們 AWS 管理主控台 使用其登入憑證登入 。它不會變更其許可，也不會阻止他們使用擔任的角色來存取主控台。如果使用者有作用中的存取金鑰，他們會繼續運作並允許透過 AWS CLI、Tools for Windows PowerShell、 AWS API 或 AWS 主控台行動應用程式進行存取。

------
#### [ Console ]

1. 按照《AWS ‭‬ 登入使用者指南》‭‬**[如何登入 AWS‭‬](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 主題中適合您使用者類型的登入程序操作。

1. 在 **IAM 主控台首頁**的左側導覽窗格中，在**搜尋 IAM** 文字方塊中輸入查詢。

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

1. 選擇您想要為之刪除密碼的使用者名稱。

1. 選擇 **安全憑證** 標籤，然後在 **主控台登入** 下方選擇 **管理主控台存取**。

1. 若要要求使用者立即停止使用主控台，請選取**撤銷作用中主控台工作階段**。這會將內嵌政策連接至 IAM 使用者，如果使用者的憑證比政策指定的時間更舊，則會拒絕該使用者存取資源。

1. 選擇**停用存取**

主控台會顯示狀態訊息，通知您已停用主控台存取。

------

### 建立、變更或刪除 IAM 使用者密碼 (AWS CLI)
<a name="Using_ManagingPasswordsCLIAPI"></a>

您可以使用 AWS CLI API 來管理 IAM 使用者的密碼。

**建立密碼 (AWS CLI)**

1. (選用) 若要判斷使用者是否有密碼，請執行此命令：[aws iam get-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/get-login-profile.html)

1. 若要建立密碼，請執行此命令：[aws iam create-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/create-login-profile.html)

**若要變更使用者的密碼 (AWS CLI)**

1. (選用) 若要判斷使用者是否有密碼，請執行此命令：[aws iam get-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/get-login-profile.html)

1. 若要變更密碼，請執行此命令：[aws iam update-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/update-login-profile.html)

**若要刪除 (停用) 使用者的密碼 (AWS CLI)**

1. (選用) 若要判斷使用者是否有密碼，請執行此命令：[aws iam get-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/get-login-profile.html)

1. (選用) 若要判斷密碼前次使用的時間，請執行此命令：[aws iam get-user](https://docs.aws.amazon.com/cli/latest/reference/iam/get-user.html)

1. 若要刪除密碼，請執行此命令：[aws iam delete-login-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-login-profile.html)

**重要**  
當您刪除使用者密碼時，使用者將無法繼續登入 AWS 管理主控台。如果使用者有作用中的存取金鑰，他們會繼續運作並允許透過 AWS CLI、Tools for Windows PowerShell 或 AWS API 函數呼叫進行存取。當您使用 AWS CLI、Tools for Windows PowerShell 或 AWS API 從您的 中刪除使用者時 AWS 帳戶，您必須先使用此操作刪除密碼。如需詳細資訊，請參閱[刪除 IAM 使用者 (AWS CLI)](id_users_remove.md#id_users_deleting_cli)。

**在指定時間之前撤銷使用者的作用中主控台工作階段 (AWS CLI)**

1. 若要嵌入內嵌政策，以在指定時間之前撤銷 IAM 使用者的作用中主控台工作階段，請使用下列內嵌政策並執行以下命令：[aws iam put-user-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-user-policy.html)

   此內嵌政策會拒絕所有許可，並包含 `aws:TokenIssueTime` 條件索引鍵。它會在內嵌政策的 `Condition` 元素中指定的時間之前，撤銷使用者的作用中主控台工作階段。將 `aws:TokenIssueTime` 條件索引鍵值取代為您自己的值。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Deny",
       "Action": "*",
       "Resource": "*",
       "Condition": {
         "DateLessThan": {
           "aws:TokenIssueTime": "2014-05-07T23:47:00Z"
         }
       }
     }
   }
   ```

------

1. (選用) 若要列出嵌入在 IAM 使用者中的內嵌政策名稱，請執行以下命令：[aws iam list-user-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-user-policies.html)

1. (選用) 若要檢視嵌入在 IAM 使用者中的具名內嵌政策，請執行以下命令：[aws iam get-user-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/get-user-policy.html)

### 建立、變更或刪除 IAM 使用者密碼 (AWS API)
<a name="Using_ManagingPasswordsAPI"></a>

您可以使用 AWS API 來管理 IAM 使用者的密碼。

**建立密碼 (AWS API)**

1. (選用) 若要判斷使用者是否有密碼，請呼叫此操作：[GetLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html)

1. 若要建立密碼，請呼叫此操作：[CreateLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateLoginProfile.html)

**變更使用者的密碼 (AWS API)**

1. (選用) 若要判斷使用者是否有密碼，請呼叫此操作：[GetLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html)

1. 若要變更密碼，請呼叫此操作：[UpdateLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateLoginProfile.html)

**刪除 （停用） 使用者的密碼 (AWS API)**

1. (選用) 若要判斷使用者是否有密碼，請執行此命令：[GetLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html)

1. (選用) 若要判斷密碼前次使用的時間，請執行此命令：[GetUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html)

1. 若要刪除密碼，請執行此命令：[DeleteLoginProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteLoginProfile.html)

**重要**  
當您刪除使用者密碼時，使用者將無法繼續登入 AWS 管理主控台。如果使用者有作用中的存取金鑰，他們會繼續運作並允許透過 AWS CLI、Tools for Windows PowerShell 或 AWS API 函數呼叫進行存取。當您使用 AWS CLI、Tools for Windows PowerShell 或 AWS API 從您的 中刪除使用者時 AWS 帳戶，您必須先使用此操作刪除密碼。如需詳細資訊，請參閱[刪除 IAM 使用者 (AWS CLI)](id_users_remove.md#id_users_deleting_cli)。

**在指定時間 (AWS API) 之前撤銷使用者的作用中主控台工作階段**

1. 若要內嵌內嵌政策，以在指定時間之前撤銷 IAM 使用者的作用中主控台工作階段，請使用下列內嵌政策並執行以下命令：[PutUserPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutUserPolicy.html)

   此內嵌政策會拒絕所有許可，並包含 `aws:TokenIssueTime` 條件索引鍵。它會在內嵌政策的 `Condition` 元素中指定的時間之前，撤銷使用者的作用中主控台工作階段。將 `aws:TokenIssueTime` 條件索引鍵值取代為您自己的值。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Deny",
       "Action": "*",
       "Resource": "*",
       "Condition": {
         "DateLessThan": {
           "aws:TokenIssueTime": "2014-05-07T23:47:00Z"
         }
       }
     }
   }
   ```

------

1. (選用) 若要列出嵌入在 IAM 使用者中的內嵌政策名稱，請執行以下命令：[ListUserPolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUserPolicies.html)

1. (選用) 若要檢視嵌入在 IAM 使用者中的具名內嵌政策，請執行以下命令：[GetUserPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUserPolicy.html)

# 允許 IAM 使用者變更自己的密碼
<a name="id_credentials_passwords_enable-user-change"></a>

**注意**  
具有聯合身分的使用者將使用其身分提供者定義的程序來變更他們的密碼。[最佳實務](best-practices.md)是要求人類使用者使用聯合身分提供者，以 AWS 使用臨時憑證存取 。

您可以授予 IAM 使用者許可，讓他們能夠登入 AWS 管理主控台變更自己的密碼。您可以使用兩種方式的其中一種來執行此動作：
+ [允許帳戶中的所有 IAM 使用者變更自己的密碼](#proc_letalluserschangepassword)。
+ [僅允許選定的 IAM 使用者變更自己的密碼](#proc_letselectuserschangepassword)。在這種情況下您停用選項，讓所有使用者變更自己的密碼，並使用 IAM 政策僅為一些使用者授予許可。這種方法允許這些使用者變更自己的密碼以及選擇性的其他憑證，如他們自己的存取金鑰。

**重要**  
建議您[設定自訂密碼政策](id_credentials_passwords_account-policy.md)，以要求 IAM 使用者建立強式密碼。

## 允許所有 IAM 使用者變更自己的密碼
<a name="proc_letalluserschangepassword"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，按一下 **Account Settings** (帳戶設定)。

1. 在 **Password policy** (密碼政策) 區段中，選擇 **Edit** (編輯)。

1. 選擇 **Custom** (自訂) 以使用自訂密碼政策。

1. 選取 **Allow users to change their own password** (允許使用者變更自己的密碼)，然後選擇 **Save changes** (儲存變更)。這允許帳戶中的所有使用者僅針對其使用者存取 `iam:ChangePassword` 動作，並可存取 `iam:GetAccountPasswordPolicy` 動作。

1. 為使用者提供下列指示，以便變更其密碼：[IAM 使用者如何變更自己的密碼](id_credentials_passwords_user-change-own.md)。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam update-account-password-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html)`

------
#### [ API ]

若要為 AWS 管理主控台 登入頁面 URL 建立別名，請呼叫下列操作：
+ `[UpdateAccountPasswordPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccountPasswordPolicy.html)` 

------

## 允許選定的 IAM 使用者變更自己的密碼
<a name="proc_letselectuserschangepassword"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，按一下 **Account Settings** (帳戶設定)。

1. 在 **Password policy** (密碼政策) 區段中，請確認未選取 **Allow users to change their own password** (允許使用者變更自己的密碼)。如果已選取此核取方塊，所有使用者都可以變更自己的密碼。(請參閱之前的程序)。

1. 如果沒有使用者，可建立使用者，讓他們可以變更自己的密碼。如需詳細資訊，請參閱[在 中建立 IAM 使用者 AWS 帳戶](id_users_create.md)。

1. (選用) 為被允許變更密碼的使用者建立 IAM 群組，然後從之前的步驟將使用者加入到群組。如需詳細資訊，請參閱[IAM 使用者群組](id_groups.md)。

1. 指派以下政策到群組。如需詳細資訊，請參閱[管理 IAM 政策](access_policies_manage.md)。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "iam:GetAccountPasswordPolicy",
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": "iam:ChangePassword",
         "Resource": "arn:aws:iam::*:user/${aws:username}"
       }
     ]
   }
   ```

------

   此政策會授予 [ChangePassword](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html) 動作的存取權，讓使用者只能從主控台、、 AWS CLI Tools for Windows PowerShell 或 API 變更自己的密碼。它還授予存取權至 [GetAccountPasswordPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html) 動作，其可讓使用者檢視目前的密碼政策；此許可是必需的，以便使用者可在 **Change password** (變更密碼) 頁面檢視帳戶密碼政策。使用者必須能夠讀取目前的密碼政策，以確保變更的密碼符合政策的要求。

1. 為使用者提供下列指示，以便變更其密碼：[IAM 使用者如何變更自己的密碼](id_credentials_passwords_user-change-own.md)。

------

### 如需詳細資訊
<a name="HowToPwdIAMUser-moreinfo"></a>

如需有關管理憑證的詳細資訊，請參閱下列主題：
+ [允許 IAM 使用者變更自己的密碼](#id_credentials_passwords_enable-user-change) 
+ [中的使用者密碼 AWS](id_credentials_passwords.md)
+ [設定 IAM 使用者的帳戶密碼政策](id_credentials_passwords_account-policy.md)
+ [管理 IAM 政策](access_policies_manage.md)
+ [IAM 使用者如何變更自己的密碼](id_credentials_passwords_user-change-own.md)

# IAM 使用者如何變更自己的密碼
<a name="id_credentials_passwords_user-change-own"></a>

如果您已獲授予變更自己的 IAM 使用者密碼的許可，您可以使用 中的特殊頁面 AWS 管理主控台 來執行此操作。您也可以使用 AWS CLI 或 AWS API。

**Topics**
+ [必要許可](#change-own-passwords-permissions-required)
+ [IAM 使用者如何變更他們自己的密碼 (主控台)](#ManagingUserPwdSelf-Console)
+ [IAM 使用者如何變更自己的密碼 (AWS CLI 或 AWS API)](#ManagingUserPwdSelf-CLIAPI)

## 必要許可
<a name="change-own-passwords-permissions-required"></a>

若要變更您 IAM 使用者的密碼，您必須擁有以下政策的許可：[AWS：允許 IAM 使用者在「安全憑證」頁面中變更其主控台密碼](reference_policies_examples_aws_my-sec-creds-self-manage-password-only.md)。

## IAM 使用者如何變更他們自己的密碼 (主控台)
<a name="ManagingUserPwdSelf-Console"></a>

下列程序說明 IAM 使用者如何使用 AWS 管理主控台 來變更自己的密碼。

**變更您 IAM 使用者的密碼 (主控台)**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。在那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在 **AWS IAM 憑證**索引標籤上，選擇**更新密碼**。

1. 針對 **Current password (目前的密碼)**，請輸入目前的密碼。輸入 **New password (新密碼)** 及 **Confirm new password (確認新密碼 )** 的新密碼。接著選擇**更新密碼**。
**注意**  
新密碼必須符合帳戶密碼政策的要求。如需詳細資訊，請參閱[設定 IAM 使用者的帳戶密碼政策](id_credentials_passwords_account-policy.md)。

## IAM 使用者如何變更自己的密碼 (AWS CLI 或 AWS API)
<a name="ManagingUserPwdSelf-CLIAPI"></a>

下列程序說明 IAM 使用者如何使用 AWS CLI 或 AWS API 來變更自己的密碼。

**若要變更您自己的 IAM 密碼，請使用下列：**
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/change-password.html](https://docs.aws.amazon.com/cli/latest/reference/iam/change-password.html)
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html)

# 管理 IAM 使用者的存取金鑰
<a name="id_credentials_access-keys"></a>

**重要**  
[最佳實務](best-practices.md)的作法是使用臨時性安全憑證 (如 IAM 角色)，而不是建立長期憑證 (如存取金鑰)。在建立存取金鑰前，請檢閱[長期存取金鑰的替代方案](security-creds-programmatic-access.md#security-creds-alternatives-to-long-term-access-keys)。

存取金鑰是 IAM 使用者或 AWS 帳戶根使用者的長期憑證。您可以使用存取金鑰簽署對 AWS CLI 或 AWS API 的程式設計請求 （直接使用 AWS SDK)。如需詳細資訊，請參閱[使用 AWS 安全登入資料進行程式設計存取](security-creds-programmatic-access.md)。

存取金鑰包含兩個部分：存取金鑰 ID (例如 `AKIAIOSFODNN7EXAMPLE`) 和私密存取金鑰 (例如 `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY`)。您必須一起使用存取金鑰 ID 和私密存取金鑰來驗證您的請求。



建立存取金鑰對時，將存取金鑰 ID 和私密存取金鑰儲存在安全位置。私密存取金鑰只能在您建立時擷取。如果您遺失了私密存取金鑰，則必須刪除該存取金鑰並新建一個。如需更多說明，請參閱 [更新存取金鑰](id-credentials-access-keys-update.md)。

每位使用者最多可以擁有兩個存取金鑰。

**重要**  
具有存取金鑰的 IAM 使用者可能給帳戶帶來安全風險。安全地管理存取金鑰。請勿將您的存取金鑰提供給未經授權的當事方，即便是協助[尋找您的帳戶識別符](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html)也不妥。如果這麼做，就可能會讓他人能夠永久存取您的帳戶。  
使用存取金鑰時，請注意下列事項：  
**請勿**使用帳戶的根憑證來建立存取金鑰。
**請勿**將存取金鑰或憑證資訊放置在應用程式檔案中。
**請勿**將含有存取金鑰或憑證資訊的檔案包含在專案區域中。
存放在共用登入資料檔案中的存取金鑰或 AWS 登入資料資訊會以純文字儲存。

## 監控建議
<a name="monitor-access-keys"></a>

建立存取金鑰之後：
+ Use AWS CloudTrail 可監控存取金鑰使用情況，並偵測任何未經授權的存取嘗試。如需詳細資訊，請參閱[使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)。
+ 設定 CloudWatch 警示，以便通知管理員被拒絕的存取嘗試，協助偵測惡意活動。如需更多資訊，請參閱 [Amazon CloudWatch 使用者指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)。
+ 視需要定期檢閱、更新和刪除存取金鑰。

下列主題將詳細說明與存取金鑰相關的管理任務。

**Topics**
+ [監控建議](#monitor-access-keys)
+ [透過將內嵌政策連接至 IAM 使用者來控制存取金鑰的使用](access-keys_inline-policy.md)
+ [管理存取金鑰所需的許可](access-keys_required-permissions.md)
+ [IAM 使用者如何管理自己的存取金鑰](access-key-self-managed.md)
+ [IAM 管理員如何管理 IAM 使用者存取金鑰](access-keys-admin-managed.md)
+ [更新存取金鑰](id-credentials-access-keys-update.md)
+ [保護存取金鑰的安全](securing_access-keys.md)

# 透過將內嵌政策連接至 IAM 使用者來控制存取金鑰的使用
<a name="access-keys_inline-policy"></a>

建議的最佳實務是，[工作負載使用具有 IAM 角色的臨時憑證](best-practices.md#bp-workloads-use-roles)來存取 AWS。具有存取金鑰的 IAM 使用者應獲指派最低權限存取權，並啟用[多重要素驗證 (MFA)](id_credentials_mfa.md)。如需有關擔任 IAM 角色的詳細資訊，請參閱 [擔任角色的方法](id_roles_manage-assume.md)。

不過，如果您要建立服務自動化或其他短期使用案例的概念驗證測試，並選擇使用具有存取金鑰的 IAM 使用者來執行工作負載，建議您[使用政策條件來進一步限制對其 IAM 使用者憑證的存取](best-practices.md#use-policy-conditions)。

在這種情況下，您可以建立有時限的政策，使憑證在指定的時間後過期；或者，如果您是從安全網路執行工作負載，則可以使用 IP 限制政策。

在這兩種使用案例中，您都可以使用連接至具有存取金鑰之 IAM 使用者的內嵌政策。

**為 IAM 使用者設定有時限的政策**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者**，然後選取短期使用案例的使用者。如果您尚未建立使用者，現在可以[建立使用者](getting-started-workloads.md)。

1. 在使用者**詳細資訊**頁面上，選擇**許可**索引標籤。

1. 選擇**新增許可**，然後選取**建立內嵌政策**。

1. 在**政策編輯器**區段中，選取 **JSON** 以顯示 JSON 編輯器。

1. 在 JSON 編輯器中，輸入下列政策，將 `aws:CurrentTime` 時間戳記的值取代為所需的過期日期和時間：

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

****  

   ```
   {
   "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Deny",
         "Action": "*",
         "Resource": "*",
         "Condition": {
         "DateGreaterThan": {
         "aws:CurrentTime": "2025-03-01T00:12:00Z"
           }
         }
       }
     ]
   }
   ```

------

   此政策使用 `Deny` 效果來限制在指定日期後對所有資源執行的所有動作。`DateGreaterThan` 條件會將目前時間與您設定的時間戳記進行比較。

1. 選取 **下一步** 以繼續前往 **檢閱和建立** 頁面。在**政策**詳細資訊中，在**政策名稱**下輸入政策的名稱，然後選擇**建立政策**。

建立政策後，其會顯示在使用者的**許可**索引標籤上。當目前時間大於或等於政策中指定的時間時，使用者將無法再存取 AWS 資源。請務必通知工作負載開發人員您為這些存取金鑰指定的過期日期。

**為 IAM 使用者設定 IP 限制政策**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者**，然後選取將從安全網路執行工作負載的使用者。如果您尚未建立使用者，現在可以[建立使用者](getting-started-workloads.md)。

1. 在使用者**詳細資訊**頁面上，選擇**許可**索引標籤。

1. 選擇**新增許可**，然後選取**建立內嵌政策**。

1. 在**政策編輯器**區段中，選取 **JSON** 以顯示 JSON 編輯器。

1. 將下列 IAM 政策複製到 JSON 編輯器，並根據您的需求更改公有 IPv4 或 IPv6 位址或範圍。您可以使用 [https://checkip.amazonaws.com](https://checkip.amazonaws.com/) 來確定目前的公有 IP 位址。可以使用斜線表示法指定個別 IP 位址或 IP 位址範圍。如需詳細資訊，請參閱[aws:SourceIp](reference_policies_condition-keys.md#condition-keys-sourceip)。
**注意**  
不得透過 VPN 或代理伺服器來混淆 IP 位址。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid":"IpRestrictionIAMPolicyForIAMUser",
         "Effect": "Deny",
         "Action": "*",
         "Resource": "*",
         "Condition": {
           "NotIpAddress": {
             "aws:SourceIp": [
               "203.0.113.0/24",
               "2001:DB8:1234:5678::/64",
               "203.0.114.1"
             ]
           },
           "BoolIfExists": {
             "aws:ViaAWSService": "false"
           }
         }
       }
     ]
   }
   ```

------

   在此政策範例中，除非請求源自於網路 (以 CIDR 表示法指定) "203.0.113.0/24"、"2001:DB8:1234:5678::/64" 或特定 IP 位址 "203.0.114.1"，否則此政策會拒絕使用套用了此政策的 IAM 使用者的存取金鑰 

1. 選取 **下一步** 以繼續前往 **檢閱和建立** 頁面。在**政策**詳細資訊中，在**政策名稱**下輸入政策的名稱，然後選擇**建立政策**。

建立政策後，其會顯示在使用者的**許可**索引標籤上。

您也可以將此政策做為服務控制政策 (SCP) 套用到 中的多個 AWS 帳戶 AWS Organizations，我們建議您使用其他條件，`aws:PrincipalArn`讓此政策陳述式僅適用於受此 SCP 規範 AWS 的帳戶內的 IAM 使用者。下列政策包含該更新：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "IpRestrictionServiceControlPolicyForIAMUsers",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": [
            "203.0.113.0/24",
            "2001:DB8:1234:5678::/64",
            "203.0.114.1"
          ]
        },
        "BoolIfExists": {
          "aws:ViaAWSService": "false"
        },
        "ArnLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:user/*"
        }
      }
    }
  ]
}
```

------

# 管理存取金鑰所需的許可
<a name="access-keys_required-permissions"></a>

**注意**  
`iam:TagUser` 是新增和編輯存取金鑰描述的選用許可。如需詳細資訊，請參閱[標記 IAM 使用者](id_tags_users.md)

為 IAM 使用者建立存取金鑰，您必須擁有以下政策的許可：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CreateOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:GetUser",
                "iam:ListAccessKeys",
                "iam:TagUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        }
    ]
}
```

------

為您自己的 IAM 使用者更新存取金鑰，您必須擁有以下政策的許可：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ManageOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:DeleteAccessKey",
                "iam:GetAccessKeyLastUsed",
                "iam:GetUser",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey",
                "iam:TagUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        }
    ]
}
```

------

# IAM 使用者如何管理自己的存取金鑰
<a name="access-key-self-managed"></a>

IAM 管理員可以透過連接[管理存取金鑰所需的許可](access-keys_required-permissions.md)中所述的政策，授予 IAM 使用者自行管理其存取金鑰的許可。

透過這些許可，IAM 使用者可以使用下列程序來建立、啟用、停用和刪除與其使用者名稱關聯的存取金鑰。

**Topics**
+ [為自己建立存取金鑰 (主控台)](#Using_CreateAccessKey)
+ [停用您的存取金鑰 (主控台)](#deactivate-access-key-seccreds)
+ [啟用您的存取金鑰 (主控台)](#activate-access-key-seccreds)
+ [刪除您的存取金鑰 (主控台)](#delete-access-key-seccreds)

## 為自己建立存取金鑰 (主控台)
<a name="Using_CreateAccessKey"></a>

如果您已獲授予適當的許可，您可以使用 為自己 AWS 管理主控台 建立存取金鑰。

**若要建立您自己的存取金鑰 (主控台)**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。從那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在**存取金鑰**區段中，選擇**建立存取金鑰**。如果您已經有兩個存取金鑰，則此按鈕將被停用，您必須先刪除一個存取金鑰才能建立新的存取金鑰。

1. 在 **Access key best practices & alternatives** (存取金鑰最佳實務與替代方案) 頁面上，選擇您的使用案例以了解可協助您避免建立長期存取金鑰的其他選項。若您判定您的使用案例仍需要存取金鑰，請選取 **Other** (其他)，然後再選擇 **Next** (下一步)。

1. (選用) 為存取金鑰設定描述標籤值。這將新增標籤鍵值對到您的 IAM 使用者。這可協助您在未來辨別與更新存取金鑰。標籤索引鍵被設定為存取金鑰 id。標籤值被設定為您指定的存取金鑰描述。完成時，選擇 **Create access key** (建立存取金鑰)。

1. 在 **Retrieve access keys** (擷取存取金鑰) 頁面上，選擇 **Show** (顯示) 以顯示您的使用者的私密存取金鑰的值，或選擇 **Download .csv file** (下載 .csv 檔案)。這是您儲存您的私密存取金鑰的唯一機會。在將您的私密存取金鑰儲存到安全位置以後，選取 **Done** (完成)。

## 停用您的存取金鑰 (主控台)
<a name="deactivate-access-key-seccreds"></a>

如果您已獲授予適當的許可，您可以使用 AWS 管理主控台 來停用您的存取金鑰。

**要停用存取金鑰**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。從那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在 **Access keys** (存取金鑰) 區段中，找到您想要停用的金鑰，然後選取 **Actions** (動作)，再選擇 **Deactivate** (停用)。出現確認提示時，請選取 **Deactivate** (停用)。停用的存取金鑰仍會計入兩個存取金鑰的限制。

## 啟用您的存取金鑰 (主控台)
<a name="activate-access-key-seccreds"></a>

如果您已獲授予適當的許可，您可以使用 AWS 管理主控台 來啟用您的存取金鑰。

**要啟用存取金鑰**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。從那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在 **Access keys** (存取金鑰) 區段中，找到要啟用的金鑰，然後選取 **Actions** (動作)，再選擇 **Activate** (啟用)。

## 刪除您的存取金鑰 (主控台)
<a name="delete-access-key-seccreds"></a>

如果您已獲授予適當的許可，您可以使用 AWS 管理主控台 刪除您的存取金鑰。

**要刪除不再需要的存取金鑰**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。從那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在 **Access keys** (存取金鑰) 區段中，找到您想要刪除的金鑰，然後選取 **Actions** (動作)，再選擇 **Delete** (刪除)。依照對話中的指示先 **Deactivate** (停用)，然後再確認刪除。建議您在永久刪除存取金鑰前驗證不再使用該存取金鑰。

# IAM 管理員如何管理 IAM 使用者存取金鑰
<a name="access-keys-admin-managed"></a>

IAM 管理員可以建立、啟用、停用和刪除與個別 IAM 使用者關聯的存取金鑰。他們也可以列出帳戶中具有存取金鑰的 IAM 使用者，並找出哪些 IAM 使用者具有特定的存取金鑰。

**Topics**
+ [為 IAM 使用者建立存取金鑰](#admin-create-access-key)
+ [若要停用 IAM 使用者的存取金鑰](#admin-deactivate-access-key)
+ [若要啟用 IAM 使用者的存取金鑰](#admin-activate-access-key)
+ [刪除 IAM 使用者的存取金鑰](#admin-delete-access-key)
+ [若要列出 IAM 使用者的存取金鑰](#admin-list-access-key)
+ [若要列出 IAM 使用者的存取金鑰](#admin-list-access-key)
+ [若要顯示您帳戶中的使用者的所有存取金鑰 ID](#admin-list-all-access-keys)
+ [若要使用存取金鑰 ID 尋找使用者](#admin-find-user-access-keys)
+ [若要尋找存取金鑰 ID 的最近使用](#admin-find-most-recent-use-access-keys)

## 為 IAM 使用者建立存取金鑰
<a name="admin-create-access-key"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 在**安全性憑證**索引標籤的**存取金鑰**區段中，選擇**建立存取金鑰**。

   如果按鈕被停用，則您必須先刪除其中一個現有的金鑰，才能建立新的金鑰。

1. 在 **Access key best practices & alternatives** (存取金鑰最佳實務與替代方案) 頁面上，檢閱最佳實務和替代方案。選擇您的使用案例以了解可協助您避免建立長期存取金鑰的其他選項。

1. 若您判定您的使用案例仍需要存取金鑰，請選取 **Other** (其他)，然後再選擇 **Next** (下一步)。

1. **(選用)** 可以在**設定描述標籤**頁面上將描述標籤新增至存取金鑰，協助追蹤存取金鑰。選取**建立存取金鑰**。

1. 在 **Retrieve access keys** (擷取存取金鑰) 頁面上，選擇 **Show** (顯示) 以顯示您的使用者的私密存取金鑰的值。

1. 如要將存取金鑰 ID 和私密存取金鑰儲存到 `.csv` 檔案並在您電腦中的安全位置保管，請選擇 **Download .csv file** (下載 .csv 檔案) 按鈕。
**重要**  
這是您檢視或下載新建立之存取金鑰的唯一機會，之後您無法再將其復原。請務必安全地保管存取金鑰。

當您為您的使用者建立存取金鑰時，在預設情況下，該金鑰對是作用中的，且您的使用者可以立即使用該金鑰對。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html) 

------

## 若要停用 IAM 使用者的存取金鑰
<a name="admin-deactivate-access-key"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 在**安全憑證**索引標籤的**存取金鑰**區段中，選擇**動作**下拉式功能表，然後選擇**停用**。

1. 在**停用**對話方塊中，選擇**停用**，確認您想要停用存取金鑰

停用存取金鑰後，API 呼叫便無法再使用它。如有需要，可以再次啟用。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/update-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/update-access-key.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html) 

------

## 若要啟用 IAM 使用者的存取金鑰
<a name="admin-activate-access-key"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 在**安全憑證**索引標籤的**存取金鑰**區段中，選擇**動作**下拉式功能表，然後選擇**啟用**。

啟用存取金鑰後，API 呼叫便可以使用。如有需要，可以再次停用。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/update-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/update-access-key.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html) 

------

## 刪除 IAM 使用者的存取金鑰
<a name="admin-delete-access-key"></a>

停用存取金鑰後，如果不再需要，請將其刪除。

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 在**安全憑證**索引標籤的**存取金鑰**區段中，選擇非活動存取金鑰的**動作**下拉式功能表，然後選擇**刪除**。

1. 在**刪除**對話方塊中，在文字輸入欄位中輸入存取金鑰 ID，然後選擇**刪除**，確認您想要刪除存取金鑰。

刪除存取金鑰後，便無法復原。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html) 

------

## 若要列出 IAM 使用者的存取金鑰
<a name="admin-list-access-key"></a>

您可以檢視與 IAM 使用者相關聯的存取金鑰 ID 清單。

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 在**安全憑證**索引標籤上，**存取金鑰**區段會列出使用者的存取金鑰。

每個 IAM 使用者可以有兩個存取金鑰。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html) 

------

## 若要列出 IAM 使用者的存取金鑰
<a name="admin-list-access-key"></a>

您可以檢視與 IAM 使用者相關聯的存取金鑰 ID 清單。

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 在**安全憑證**索引標籤上，**存取金鑰**區段會列出使用者的存取金鑰 ID，包括所顯示的每個金錀的狀態。
**注意**  
只有使用者的存取金鑰 ID 是可見的。只有在建立金鑰時才能擷取私密存取金鑰。

每個 IAM 使用者可以有兩個存取金鑰。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html) 

------

## 若要顯示您帳戶中的使用者的所有存取金鑰 ID
<a name="admin-list-all-access-keys"></a>

您可以在 AWS 帳戶中檢視使用者的存取金鑰 ID 清單。

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇使用者名稱以前往使用者詳細資訊頁面。

1. 如有必要，請透過完成以下步驟將**存取金鑰 ID** 資料欄新增到使用者表格：

   1. 在資料表最右側的上方，選擇**偏好設定**圖示 (![\[Preferences icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在**偏好設定**對話方塊的**選取可見資料欄**下，開啟**存取金鑰 ID**。

   1. 選擇 **確認** 返回使用者清單。清單更新為包含存取金鑰 ID。

1. **存取金鑰 ID** 欄會顯示每個存取金鑰的狀態，其後跟隨其 ID，例如，**`Active - AKIAIOSFODNN7EXAMPLE`** 或**`Inactive - AKIAI44QH8DHBEXAMPLE`**。

   您可以使用此資訊來檢視和複製具有一個或兩個存取金鑰的使用者的存取金鑰 ID。該欄會向沒有存取金鑰的使用者顯示 **`-`**。
**注意**  
只有在建立金鑰時才能擷取私密存取金鑰。

每個 IAM 使用者可以有兩個存取金鑰。

------

## 若要使用存取金鑰 ID 尋找使用者
<a name="admin-find-user-access-keys"></a>

您可以使用存取金鑰 ID 在 AWS 帳戶中尋找使用者。

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格的搜尋方塊中輸入**存取金鑰 ID**，例如 AKIAI44QH8DHBEXAMPLE。

1. 與存取金鑰 ID 關聯的 IAM 使用者出現在導覽窗格中。選擇使用者名稱以前往使用者詳細資訊頁面。

------

## 若要尋找存取金鑰 ID 的最近使用
<a name="admin-find-most-recent-use-access-keys"></a>

存取金鑰的最近使用會顯示在 IAM 使用者頁面的使用者清單中、使用者詳細資訊頁面上，並且是憑證報告的一部分。

------
#### [ Console ]

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在使用者清單中，檢視**上次使用的存取金鑰**資料欄。

   如果未顯示該資料欄，請選擇**偏好設定**圖示 (![\[Preferences icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-settings-icon.console.png))，然後在**選取可見資料欄**下方開啟**上次使用的存取金鑰**以顯示該資料欄。

1. (選用) 在導覽窗格的**存取報告**下方，選取**憑證報告**以下載包含您帳戶中所有 IAM 使用者之存取金鑰上次使用資訊的報告。

1. (選用) 選取 IAM 使用者以檢視使用者詳細資訊。**摘要**區段包含存取金鑰 ID、其狀態，以及上次使用的時間。

------
#### [ AWS CLI ]

執行以下命令：
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html)

------
#### [ API ]

呼叫以下操作：
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html) 

------

# 更新存取金鑰
<a name="id-credentials-access-keys-update"></a>

作為安全[最佳實務](best-practices.md#update-access-keys)，我們建議在需要時更新 IAM 使用者存取金鑰，如當員工離職時。如果 IAM 使用者已獲得所需許可，他們可以更新自己的存取金鑰。

如需有關授予 IAM 使用者許可，讓他們可更新自己的存取金鑰的詳細資訊，請參閱 [AWS：允許 IAM 使用者在「安全憑證」頁面中管理其密碼、存取金鑰和 SSH 公有金鑰](reference_policies_examples_aws_my-sec-creds-self-manage-pass-accesskeys-ssh.md)。您還可以套用密碼政策到您的帳戶，以要求所有 IAM 使用者定期更新其密碼並規定必須多久更新一次。如需詳細資訊，請參閱[設定 IAM 使用者的帳戶密碼政策](id_credentials_passwords_account-policy.md)。

**注意**  
如果您遺失了私密存取金鑰，則必須刪除該存取金鑰並新建一個。私密存取金鑰只能在您建立時擷取。使用此步驟進行停用，然後使用新的憑證取代任何遺失的存取金鑰。

**Topics**
+ [更新 IAM 使用者存取金鑰 (主控台)](#rotating_access_keys_console)
+ [更新存取金鑰 (AWS CLI)](#rotating_access_keys_cli)
+ [更新存取金鑰 (AWS API)](#rotating_access_keys_api)

## 更新 IAM 使用者存取金鑰 (主控台)
<a name="rotating_access_keys_console"></a>

您可以從 AWS 管理主控台中更新存取金鑰。

**在不會中斷您的應用程式下更新 IAM 使用者的存取金鑰 (主控台)**

1. 當第一個存取金鑰仍然有效時，建立第二個存取金鑰。

   1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

   1. 選擇目標使用者的名稱，然後選擇 **Security credentials (安全憑證)** 索引標籤。

   1. 在**存取金鑰**區段中，選擇**建立存取金鑰**。在 **Access key best practices & alternatives** (存取金鑰最佳實務與替代方案) 頁面上，選取 **Other** (其他)，然後再選擇 **Next** (下一步)。

   1. (選用) 為存取金鑰設定描述標籤值，以新增標籤鍵值對到此 IAM 使用者。這可協助您在未來辨別與更新存取金鑰。標籤索引鍵被設定為存取金鑰 id。標籤值被設定為您指定的存取金鑰描述。完成時，選擇 **Create access key** (建立存取金鑰)。

   1. 在 **Retrieve access keys** (擷取存取金鑰) 頁面上，選擇 **Show** (顯示) 以顯示您的使用者的私密存取金鑰的值，或選擇 **Download .csv file** (下載 .csv 檔案)。這是您儲存您的私密存取金鑰的唯一機會。在將您的私密存取金鑰儲存到安全位置以後，選取 **Done** (完成)。

      當您為您的使用者建立存取金鑰時，在預設情況下，該金鑰對是作用中的，且您的使用者可以立即使用該金鑰對。此時，使用者有兩個作用中的存取金鑰。

1. 更新所有應用程式和工具以使用新的存取金鑰。

1. <a name="id_credentials_access-keys-key-still-in-use"></a>透過查看 **Last used** (上次使用) 資訊中最舊的存取金鑰，判斷第一個存取金鑰是否仍在使用中。其中一個方法是等待幾天，然後在繼續之前檢查舊的存取金鑰以供使用。

1. 即使 **Last used** (上次使用) 資訊指示從未使用舊金鑰，我們建議您不要立即刪除第一個存取金鑰。反之，選擇 **Actions** (動作)，然後選擇 **Deactivate** (停用) 來停用第一個存取金鑰。

1. 僅使用新的存取金鑰來確認您的應用程式正在工作。仍然使用原始存取金鑰的任何應用程式和工具此時都會停止運作，因為他們不再能夠存取 AWS 資源。如果您找到此類應用程式或工具，則可以重新啟用第一個存取金鑰。然後，返回 [Step 3](#id_credentials_access-keys-key-still-in-use) 並更新此應用程式以使用新的金鑰。

1. 等待一段時間後確保所有應用程式和工具都已更新，您可以刪除第一個存取金鑰：

   1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

   1. 選擇目標使用者的名稱，然後選擇 **Security credentials (安全憑證)** 索引標籤。

   1. 在 **Access keys** (存取金鑰) 區段中，找到您想要刪除的存取金鑰，然後選取 **Actions** (動作)，再選擇 **Delete** (刪除)。依照對話中的指示先 **Deactivate** (停用)，然後再確認刪除。

**判斷需要更新或刪除哪些存取金鑰 （主控台）**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 如有必要，請透過完成以下步驟將 **Access key age** (存取金鑰使用期限) 欄新增到使用者表格：

   1. 在最右側的表格上方，選擇設定圖示 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在 **Manage columns** (管理欄) 中，選取 **Access key age** (存取金鑰使用期限)。

   1. 選擇 **Close (關閉)** 返回使用者清單。

1. **Access key age** (存取金鑰使用期限) 列顯示自建立最早的作用中存取金鑰以來的天數。您可以使用此資訊來尋找可能需要更新或刪除存取金鑰的使用者。對於沒有存取金鑰的使用者，該欄會顯示 **None** (無)。

## 更新存取金鑰 (AWS CLI)
<a name="rotating_access_keys_cli"></a>

您可以從 AWS Command Line Interface中更新存取金鑰。

**在不會中斷您的應用程式下更新存取金鑰 (AWS CLI)**

1. 當第一個存取金鑰仍然有效時，建立第二個存取金鑰，該索引鍵在預設情況下處於作用中。執行以下命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html)

     此時，使用者有兩個作用中的存取金鑰。

1. <a name="step-update-apps"></a>更新所有應用程式和工具以使用新的存取金鑰。

1. <a name="step-determine-use"></a>使用此命令判斷第一個存取金鑰是否仍在使用中：
   +  [https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html)

   其中一個方法是等待幾天，然後在繼續之前檢查舊的存取金鑰以供使用。

1. 即使步驟 [Step 3](#step-determine-use) 表示不使用舊金鑰，我們也建議您不要立即刪除第一個存取金鑰。反之，使用此命令將第一個存取金鑰的狀態變更為 `Inactive`：
   +  [https://docs.aws.amazon.com/cli/latest/reference/iam/update-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/update-access-key.html)

1. 僅使用新的存取金鑰來確認您的應用程式正在工作。仍然使用原始存取金鑰的任何應用程式和工具此時都會停止運作，因為他們不再能夠存取 AWS 資源。如果找到此類應用程式或工具，則可以將其狀態切換回 `Active` 以重新啟用第一個存取金鑰。然後，返回步驟 [Step 2](#step-update-apps) 並更新此應用程式以使用新的金鑰。

1. 等待一段時間後確保所有應用程式和工具都已更新，可以使用此命令刪除第一個存取金鑰：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-access-key.html)

## 更新存取金鑰 (AWS API)
<a name="rotating_access_keys_api"></a>

您可以使用 AWS API 更新存取金鑰。

**在不中斷應用程式 (AWS API) 的情況下更新存取金鑰**

1. 當第一個存取金鑰仍然有效時，建立第二個存取金鑰，該索引鍵在預設情況下處於作用中。呼叫以下操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html)

     此時，使用者有兩個作用中的存取金鑰。

1. <a name="step-update-apps-2"></a>更新所有應用程式和工具以使用新的存取金鑰。

1. <a name="step-determine-use-2"></a>透過呼叫此操作判斷第一個存取金鑰是否仍在使用中：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html)

   其中一個方法是等待幾天，然後在繼續之前檢查舊的存取金鑰以供使用。

1. 即使步驟 [Step 3](#step-determine-use-2) 表示不使用舊金鑰，我們也建議您不要立即刪除第一個存取金鑰。反之，呼叫此操作將第一個存取金鑰的狀態變更為 `Inactive`：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html)

1. 僅使用新的存取金鑰來確認您的應用程式正在工作。仍然使用原始存取金鑰的任何應用程式和工具此時都會停止運作，因為他們不再能夠存取 AWS 資源。如果找到此類應用程式或工具，則可以將其狀態切換回 `Active` 以重新啟用第一個存取金鑰。然後，返回步驟 [Step 2](#step-update-apps-2) 並更新此應用程式以使用新的金鑰。

1. 等待一段時間後確保所有應用程式和工具都已更新，您可以刪除呼叫此操作的第一個存取金鑰：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html)

# 保護存取金鑰的安全
<a name="securing_access-keys"></a>

擁有您存取金鑰的任何人都擁有與您執行之 AWS 資源相同的存取層級。因此， AWS 會竭盡全力保護您的存取金鑰，而且為了符合我們的[共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)，您也應該這麼做。

展開下列各節，以取得協助您保護存取金鑰的指引。

**注意**  
您組織的安全要求和政策，可能會與本主題中所述的狀況不同。這裡提供的建議旨在做為一般指導方針。

## 移除 （或不產生） AWS 帳戶根使用者 存取金鑰
<a name="root-password"></a>

**保護帳戶其中一個最佳方法是，不要有 AWS 帳戶根使用者的存取金鑰**。除非您必須要有根使用者存取金鑰 (少數情況下)，否則最好不要產生存取金鑰。反之，請在 中 AWS IAM Identity Center 為每日管理任務建立管理使用者。如需如何在 IAM Identity Center 中建立管理使用者的相關資訊，請參閱《*IAM Identity Center 使用者指南*》中的[入門](https://docs.aws.amazon.com//singlesignon/latest/userguide/getting-started.html)。

如果您已經有帳戶的根使用者存取金鑰，建議您執行以下步驟：找出應用程式中目前使用金鑰 (如果有) 的地方，以 IAM 使用者存取金鑰取代根使用者存取金鑰。然後停用並移除根使用者存取金鑰。如需有關如何更新存取金鑰的詳細資訊，請參閱 [更新存取金鑰](id-credentials-access-keys-update.md)。



## 使用臨時安全憑證 (IAM 角色)，而不是長期存取金鑰
<a name="use-roles"></a>

在許多情況下，您不必像 IAM 使用者一樣需要永遠不會過期的長期存取金鑰。反之，您可以建立 IAM 角色並產生暫時安全憑證。臨時安全登入資料包含存取金鑰 ID 和私密存取金鑰，但其中也包含指出登入資料何時到期的安全符記。

例如與 IAM 使用者和根使用者相關聯的長期存取金鑰，會一直保持有效，直到您手動撤銷為止。不過，透過 IAM 角色和其他 功能取得的臨時安全登入資料會在短時間內 AWS Security Token Service 過期。使用臨時安全登入資料，可協助降低風險，以防登入資料意外洩露。

請在以下案例中使用 IAM 角色和臨時安全憑證：
+ **您有應用程式或 AWS CLI 指令碼在 Amazon EC2 執行個體上執行。**請勿直接在應用程式中使用存取金鑰。請勿將存取金鑰傳遞至應用程式、將其嵌入應用程式中，或讓應用程式從任何來源讀取存取金鑰。反之，請定義具有應用程式適當權許可的 IAM 角色，然後使用 [EC2 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)啟動 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。這樣做會將 IAM 角色與 Amazon EC2 執行個體相關聯。這種做法也可讓應用程式取得臨時安全憑證，以便用來對 AWS進行程式化呼叫。 AWS SDKs 和 AWS Command Line Interface (AWS CLI) 可以自動從角色取得臨時登入資料。
+ **您需要授予跨帳戶存取權。**使用 IAM 角色培養帳戶之間的信任，然後對一個帳戶中的使用者授予有限的許可，以存取信任的帳戶。如需詳細資訊，請參閱[IAM 教學課程：使用 IAM 角色在 AWS 帳戶之間委派存取權](tutorial_cross-account-with-roles.md)。
+ **您有一個行動應用程式。**請勿使用應用程式內嵌存取金鑰，甚至是內嵌於加密儲存中。反之，請使用 [Amazon Cognito](https://aws.amazon.com/cognito/) 來管理應用程式中的使用者身分。此服務可讓您使用 Login with Amazon、Facebook、Google 或任何與身分提供者相容的 OpenID Connect (OIDC)，驗證使用者的身分。然後，您可以使用 Amazon Cognito 憑證供應商，管理應用程式用來向 AWS提出請求的憑證。
+ **您想要與 聯合， AWS 且您的組織支援 SAML 2.0。**如果您處理的組織是具有支援 SAML 2.0 的身分識別提供者的組織，請將提供者設定為使用 SAML。您可以使用 SAML 與 交換身分驗證資訊， AWS 並取回一組臨時安全登入資料。如需詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。
+ **您想要與 聯合， AWS 而且您的組織具有內部部署身分存放區。**如果使用者可以在您的組織內部進行身分驗證，您可以撰寫應用程式，向他們發出臨時安全登入資料以存取 AWS 資源。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。
+ **在 IAM 政策中使用條件，僅允許從預期網路進行存取。**您可以透過實作[具有條件的 IAM 政策](reference_policies_elements_condition_operators.md)來限制存取金鑰的使用位置和方式，這些條件指定並僅允許預期網路，例如公有 IP 位址或虛擬私有雲端 (VPC)。如此一來，便能確保存取金鑰僅從預期且可接受的網路使用。

**注意**  
您是否將 Amazon EC2 執行個體與需要以程式設計方式存取 AWS 資源的應用程式搭配使用？ 如果是，請使用[適用於 EC2 的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html)。

## 適當管理 IAM 使用者存取金鑰
<a name="iam-user-access-keys"></a>

如果您必須為程式設計存取建立存取金鑰 AWS，請為 IAM 使用者建立存取金鑰，僅授予使用者所需的許可。

遵循這些預防措施，以協助保護 IAM 使用者存取金鑰：
+ **請勿將存取金鑰直接嵌入程式碼。**[AWS SDK](https://aws.amazon.com/tools/#sdk) 和 [AWS 命令列工具](https://aws.amazon.com/tools/#cli)可讓您將存取金鑰放入已知位置，如此一來，就不必將其留在程式碼中。

  將存取金鑰放入以下其中一個位置：
  + ** AWS 登入資料檔案。**SDKs和 AWS AWS CLI 會自動使用您在登入資料檔案中存放的 AWS 登入資料。

    如需有關使用 AWS 登入資料檔案的資訊，請參閱 SDK 的文件。範例包括《 *適用於 Java 的 AWS SDK 開發人員指南*》中的[設定 AWS 登入資料和區域](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-credentials.html)，以及*AWS Command Line Interface 《 使用者指南*》中的[組態和登入資料檔案](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。

    若要存放 適用於 .NET 的 AWS SDK 和 的登入資料 AWS Tools for Windows PowerShell，建議您使用 SDK 存放區。如需詳細資訊，請參閱《適用於 .NET 的 AWS SDK 開發人員指南》**中的[使用 SDK Store](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/sdk-store.html)。
  + **環境變數.** 在多租用戶系統中，請選擇使用者環境變數，而不是系統環境變數。

    如需有關使用環境變數來存放憑證的詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[環境變數](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)。
+ **對不同的應用程式使用不同的存取金鑰。**如果它們已經公開，這麼做可以隔離許可，並撤銷個別應用程式的存取金鑰。針對不同的應用程式擁有獨立的存取金鑰，也會在 [AWS CloudTrail](https://aws.amazon.com/cloudtrail/) 日誌檔中產生不同的項目。此組態可讓您更容易判斷哪個應用程式執行特定動作。
+ **視需要更新存取金鑰。**若有存取金鑰可能遭洩露的風險，請更新該存取金鑰並刪除先前的存取金鑰。如需詳細資訊，請參閱[更新存取金鑰](id-credentials-access-keys-update.md) 
+ **移除未使用的存取金鑰。**如果使用者離開組織，請移除相對應的 IAM 使用者，使該使用者無法再存取您的資源。若要了解上次使用存取金鑰的時間，請使用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html) API (AWS CLI 命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html))。
+ **為最機密的 API 操作使用臨時憑證並設定多重驗證。**利用 IAM 政策，可以指定允許使用者呼叫的 API 操作。在某些情況下，您可能希望在允許使用者執行特別敏感的動作之前，要求使用者使用 AWS MFA 進行身分驗證的額外安全性。例如，您可能擁有允許使用者執行 Amazon EC2 `RunInstances`、`DescribeInstances` 與 `StopInstances` 動作的政策。但您可能想要限制類似 的破壞性動作，`TerminateInstances`並確保使用者只有在使用 AWS MFA 裝置進行身分驗證時，才能執行該動作。如需詳細資訊，請參閱[透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

## 使用存取金鑰 AWS 存取行動應用程式
<a name="access-keys-mobile-app"></a>

您可以使用 AWS 行動應用程式存取一組有限的 AWS 服務和功能。行動應用程式可協助您在外出時支援事件回應。如需詳細資訊及下載應用程式，請參閱 [AWS 主控台行動應用程式](https://aws.amazon.com/console/mobile/)。

您可以使用主控台密碼或存取金鑰登入行動應用程式。根據最佳實務，請勿使用根使用者存取金鑰。相反地，我們強烈建議您除了在行動裝置上使用密碼或生物識別鎖定之外，還要建立專門用於使用行動應用程式管理 AWS 資源的 IAM 使用者。如果您遺失行動裝置，您可以移除 IAM 使用者的存取權。

**使用存取金鑰登入 (行動應用程式)**

1. 在行動裝置上開啟應用程式。

1. 如果這是您第一次將身分新增至裝置，請依序選擇 **Add an identity (新增身分)** 及選擇 **Access keys (存取金鑰)**。

   如果您已經使用其他身分登入，請依序選擇功能表圖示及 **Switch identity (切換身分)**。然後依序選擇 **Sign in as a different identity (以不同的身分登入)** 及 **Access keys (存取金鑰)**。

1. 在 **Access keys (存取金鑰)** 頁面輸入您的資訊。
   + **存取金鑰 ID** – 輸入您的存取金鑰 ID。
   + **私密存取金鑰** – 輸入您的私密存取金鑰。
   + **身分名稱** – 輸入將顯示在行動應用程式中的身分識別名稱。這不需要與您的 IAM 使用者名稱相符。
   + **身分識別 PIN** – 建立您將在未來登入期間使用的個人識別碼 (PIN)。
**注意**  
如果您為 AWS 行動應用程式啟用生物識別，系統會提示您使用您的指紋或臉部辨識進行驗證，而不是 PIN 碼。如果生物特徵辨識失敗，系統可能會提示您輸入 PIN 碼。

1. 選擇 **Verify and add keys (驗證並新增金鑰)**。

   您現在可以使用行動應用程式存取精選的一組資源。

## 相關資訊
<a name="more-resources"></a>

下列主題提供設定 AWS SDKs和 AWS CLI 以使用存取金鑰的指引：
+ 《 *適用於 Java 的 AWS SDK 開發人員指南*》中的[設定 AWS 登入資料和區域](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/setup-credentials.html) 
+ 《適用於 .NET 的 AWS SDK 開發人員指南》**中的[使用 SDK Store](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/sdk-store.html)
+ 《適用於 PHP 的 AWS SDK 開發人員指南》**中的[對 SDK 提供憑證](https://docs.aws.amazon.com/aws-sdk-php/v2/guide/credentials.html)
+ Boto 3 （適用於 Python 的AWS SDK) 文件中的[組態](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html#configuration) 
+ 《AWS Tools for Windows PowerShell 使用者指南》**中的[使用 AWS 憑證](https://docs.aws.amazon.com/powershell/latest/userguide/specifying-your-aws-credentials.html) 
+ 《AWS Command Line Interface 使用者指南》**中的[組態和憑證檔案](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) 
+ 《適用於 .NET 的 AWS SDK 開發人員指南》**中的[使用 IAM 角色授予存取權](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-hosm.html)
+ *AWS SDK for Java 2.x* 中的[為 Amazon EC2 設定 IAM 角色](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html)

## 使用存取金鑰和秘密金鑰憑證存取主控台
<a name="console-access-security-keys"></a>

除 AWS CLI外，還可以使用存取金鑰和秘密金鑰憑證直接存取 AWS 管理主控台 。這可以使用 API AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html)呼叫來實現。IAM 主體只需透過使用 `GetFederationToken` 提供的臨時憑證和權杖建構主控台 URL，就能存取主控台。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。

值得釐清的是，直接使用 IAM 或根使用者憑證登入主控台並啟用 MFA 時，將需要 MFA。不過，如果使用上述方法 (搭配 `GetFederationToken` 使用臨時憑證)，則不需要 MFA。



## 稽核存取金鑰
<a name="Using_access-keys-audit"></a>

您可以檢閱程式碼中的 AWS 存取金鑰，以判斷金鑰是否來自您擁有的帳戶。您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/sts/get-access-key-info.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-access-key-info.html) AWS CLI 命令或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetAccessKeyInfo.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetAccessKeyInfo.html) AWS API 操作傳遞存取金鑰 ID。

 AWS CLI 和 AWS API 操作會傳回存取金鑰所屬 AWS 帳戶 的 ID。開頭為 `AKIA` 的存取金鑰是 IAM 使用者或 AWS 帳戶根使用者的長期登入資料。以 開頭的存取金鑰 IDs `ASIA` 是使用 AWS STS 操作建立的臨時登入資料。如果回應中的帳戶是您的，您可以根使用者的身分登入並檢閱根使用者存取金鑰。然後，您可以提取[憑證報告](id_credentials_getting-report.md)來了解擁有金鑰的是哪位 IAM 使用者。若要了解誰請求`ASIA`存取金鑰的臨時登入資料，請檢視 CloudTrail 日誌中的 AWS STS 事件。

基於安全考量，您可以[檢閱 AWS CloudTrail 日誌](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)，以了解在其中執行動作的人員 AWS。您可以使用角色信任政策中的 `sts:SourceIdentity` 條件金鑰，請求使用者在擔任角色時指定身分。例如，您可以請求 IAM 使用者將自己的使用者名稱指定為其來源身分。這可以協助您判斷哪位使用者在 AWS中執行了特定動作。如需詳細資訊，請參閱[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)。

此操作不會指出存取金鑰的狀態。金鑰可能是作用中、非作用中或已刪除。作用中金鑰可能沒有操作的執行許可。提供已刪除的存取金鑰可能會傳回金鑰不存在的錯誤。

# AWS IAM 中的多重要素驗證
<a name="id_credentials_mfa"></a>

為了提高安全性，我們建議您設定多重要素驗證 (MFA)，以協助保護您的 AWS 資源。您可以為 AWS 帳戶根使用者 啟用 MFA AWS 帳戶，包括獨立帳戶、管理帳戶和成員帳戶，以及您的 IAM 使用者。我們建議您盡可能使用網路釣魚防護 MFA，例如通行金鑰和安全金鑰。這些 FIDO 型驗證器使用公有金鑰密碼編譯，可抵禦網路釣魚、man-in-the-middle和重播攻擊，提供比 TOTP 型選項更強的安全性。

對於所有類型的帳戶，其根使用者均強制執行 MFA。如需詳細資訊，請參閱[保護 AWS Organizations 您的帳戶根使用者登入資料](root-user-best-practices.md#ru-bp-organizations)。

當您為根使用者啟用 MFA 時，它僅影響根使用者憑證。帳戶中的 IAM 使用者都有自己憑證的不同身分，並且每個身分都有自己的 MFA 組態。如需有關使用 MFA 保護根使用者的詳細資訊，請參閱[的多重要素驗證 AWS 帳戶根使用者](enable-mfa-for-root.md)。

您的 AWS 帳戶根使用者 和 IAM 使用者可以註冊最多八個任何類型的 MFA 裝置。註冊多個 MFA 裝置可以提供彈性，並協助您降低裝置遺失或損壞時存取中斷的風險。您只需要一個 MFA 裝置登入 AWS 管理主控台 ，或透過 AWS CLI建立工作階段。

**注意**  
我們建議您要求人類使用者在存取時使用臨時登入資料 AWS。您是否考慮過使用 AWS IAM Identity Center？ 您可以使用 IAM Identity Center 集中管理對多個 的存取， AWS 帳戶 並為使用者提供受 MFA 保護的單一登入存取，可從單一位置存取其所有指派的帳戶。使用 IAM Identity Center，您可以在 IAM Identity Center 中建立和管理使用者身分，或輕鬆連線至您現有的 SAML 2.0 相容身分提供者。如需詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

MFA 增加了額外的安全性，要求使用者在存取 AWS 網站或服務時，除了登入憑證之外，還要從 AWS 支援的 MFA 機制提供唯一的身分驗證。

## MFA 類型
<a name="id_credentials_mfa-types"></a>

AWS 支援下列 MFA 類型：

**Contents**
+ [通行密鑰和安全金鑰](#passkeys-security-keys-for-iam-users)
+ [虛擬驗證器應用程式](#virtual-auth-apps-for-iam-users)
+ [硬體 TOTP 權杖](#hardware-totp-token-for-iam-users)

### 通行密鑰和安全金鑰
<a name="passkeys-security-keys-for-iam-users"></a>

AWS Identity and Access Management 支援 MFA 的通行金鑰和安全金鑰。根據 FIDO 標準，通行金鑰使用公有金鑰密碼編譯來提供比密碼更安全的強大、網路釣魚防護身分驗證。 AWS 支援兩種類型的通行金鑰：裝置繫結的通行金鑰 （安全金鑰） 和同步的通行金鑰。
+ **安全金鑰**：這些是用作身分驗證的第二個因素的實體裝置，例如 YubiKey。單一安全金鑰可以支援多個根使用者帳戶和 IAM 使用者。
+ **同步通行密鑰**：這些使用來自提供者 (例如 Google、Apple、Microsoft 帳戶等) 和第三方服務 (例如 1Password、Dashlane 和 Bitwarden 等) 的憑證管理工具作為第二個因素。

您可以使用內建的生物識別驗證器，例如 Apple MacBooks 上的 Touch ID，解鎖您的憑證管理工具並登入 AWS。通行密鑰是透過您選擇的提供者，使用指紋、面部或裝置 PIN 碼建立的。您也可以使用一台裝置 (例如行動裝置或硬體安全金鑰) 中的跨帳戶身分驗證 (CDA) 通行密鑰，在筆記型電腦等其他裝置上登入。如需詳細資訊，請參閱 [cross-device authentication](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda) (CDA)。

您可以跨裝置同步通行金鑰，以便使用 登入 AWS，增強可用性和可復原性。如需啟用通行密鑰和安全金鑰的詳細資訊，請參閱[為根使用者啟用通行密鑰或安全金鑰 (主控台)](enable-fido-mfa-for-root.md)。

FIDO Alliance 維護與 FIDO 規範相容的所有[經 FIDO 認證的產品](https://fidoalliance.org/certification/fido-certified-products/)的清單。

### 虛擬驗證器應用程式
<a name="virtual-auth-apps-for-iam-users"></a>

在手機或其他裝置上執行並模擬實體裝置的虛擬驗證器應用程式。虛擬驗證器應用程式實作[以時間為基礎的一次性密碼](https://datatracker.ietf.org/doc/html/rfc6238) (TOTP) 算法，並且支援在單台裝置上使用多個權杖。使用者必須在登入期間出現提示時輸入裝置中的有效代碼。每個指派給使用者的權杖都必須是唯一的。使用者無法輸入另一個使用者的權杖來進行身分驗證。

我們建議您使用網路釣魚防護 MFA，例如[通行金鑰或安全金鑰](#passkeys-security-keys-for-iam-users)，以獲得最強大的保護。如果您還無法使用通行金鑰或安全金鑰，建議您在等待硬體購買核准或等待硬體送達時使用虛擬 MFA 裝置做為臨時措施。如需可以用來做為虛擬 MFA 裝置的支援應用程式清單，請參閱[多重要素驗證 (MFA)](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。

如需為 IAM 使用者設定虛擬 MFA 裝置的說明，請參閱[在 中指派虛擬 MFA 裝置 AWS 管理主控台](id_credentials_mfa_enable_virtual.md)。

**注意**  
當您透過 AWS 管理主控台 或在登入程序期間新增新的虛擬 MFA 裝置時， AWS 帳戶 會刪除 中未指派的虛擬 MFA 裝置。未指派的虛擬 MFA 裝置是指位於您帳戶中但帳戶根使用者或 IAM 使用者並未在登入程序中使用的裝置。將這些裝置刪除後，便可將新的虛擬 MFA 裝置新增至您的帳戶。刪除這些裝置後，您還可以重複使用裝置名稱。  
若要檢視帳戶中未指派的虛擬 MFA 裝置，您可以使用 [list-virtual-mfa-devices](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-virtual-mfa-devices.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html) 呼叫。
若要停用虛擬 MFA 裝置，您可以使用 [deactivate-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/deactivate-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html) 呼叫。停用後，裝置會變成未指派狀態。
若要將未指派的虛擬 MFA 裝置連接至 AWS 帳戶 根使用者或 IAM 使用者，您需要裝置產生的驗證碼，以及 [enable-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/enable-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 呼叫。

### 硬體 TOTP 權杖
<a name="hardware-totp-token-for-iam-users"></a>

一種在[以時間為基礎的一次性密碼 (TOTP) 演算法](https://datatracker.ietf.org/doc/html/rfc6238)的基礎上產生六位數字程式碼的硬體裝置。使用者必須在登入期間在第二個網頁上輸入裝置中的有效程式碼。

這些字符僅用於 AWS 帳戶。您只能使用具有其安全共用之唯一字符種子的字符 AWS。權杖種子是權杖生產時產生的私密金鑰。從其他來源購買的權杖將無法與 IAM 一起運作。若要確保相容性，您必須從下列其中一個連結購買硬體 MFA 裝置：[OTP 權杖](https://www.amazon.com/SafeNet-IDProve-Time-based-6-Digit-Services/dp/B002CRN5X8)或 [OTP 顯示卡](https://www.amazon.com/SafeNet-IDProve-Card-Amazon-Services/dp/B00J4NGUO4)。
+ 每個指派給使用者的 MFA 裝置都必須是唯一的。使用者無法輸入另一個使用者裝置的代碼來進行身分驗證。如需支援的硬體 MFA 裝置資訊，請參閱[多重要素驗證 (MFA)](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。
+ 如果想要使用實體 MFA 裝置，我們建議您使用安全金鑰作為硬體 TOTP 裝置的替代方案。安全金鑰沒有電池需求、可防禦網路釣魚，並支援單一裝置上的多個使用者。

您只能從 啟用通行金鑰或安全金鑰 AWS 管理主控台 ，不能從 AWS CLI 或 AWS API 啟用。在可以啟用安全金鑰之前，您必須擁有對裝置的實體存取權。

如需有關為 IAM 使用者設定硬體 TOTP 權杖的說明，請參閱[在 中指派硬體 TOTP 字符 AWS 管理主控台](id_credentials_mfa_enable_physical.md)。

**注意**  
**SMS 文字訊息型 MFA** – 已 AWS 結束支援啟用 SMS 多重要素驗證 (MFA)。我們建議擁有使用 SMS 簡訊式 MFA 的 IAM 使用者的客戶改為使用下列任一種替代方式：[通行密鑰或安全金鑰](id_credentials_mfa_enable_fido.md)、[虛擬 (軟體式) MFA 裝置](id_credentials_mfa_enable_virtual.md)，或[硬體 MFA 裝置](id_credentials_mfa_enable_physical.md)。您可以使用已分配的 SMS MFA 裝置來識別帳戶中的使用者。在 IAM 主控台中，從導覽窗格選擇 **Users** (使用者)，然後在表格中 **MFA** 欄位尋找具有 **SMS** 的使用者。

## MFA 建議
<a name="id_credentials_mfa-recommendations"></a>

為了協助保護您的身分，請遵循這些 MFA AWS 身分驗證的建議。
+ 我們建議您使用網路釣魚防護 MFA，例如[通行金鑰和安全金鑰](#passkeys-security-keys-for-iam-users)，做為 MFA 裝置。這些以 FIDO 為基礎的驗證程式可針對網路釣魚等攻擊提供最強大的保護。
+ 建議您為 中的 AWS 帳戶根使用者 和 IAM 使用者啟用多個 MFA 裝置 AWS 帳戶。這可讓您提高 中的安全列 AWS 帳戶 ，並簡化管理高權限使用者的存取，例如 AWS 帳戶根使用者。
+ 您可以向 AWS 帳戶根使用者 和 IAM 使用者註冊最多**八個**[目前支援 MFA 類型之任何組合的 MFA](https://aws.amazon.com/iam/features/mfa/) 裝置。使用多個 MFA 裝置時，您只需一個 MFA 裝置即可登入 ， AWS 管理主控台 或透過 以該使用者 AWS CLI 身分建立工作階段。IAM 使用者必須使用現有的 MFA 裝置進行身分驗證，才能啟用或停用其他 MFA 裝置。
+ 如果發生遺失、遭竊或無法存取的 MFA 裝置，您可以使用其中一個剩餘的 MFA 裝置來存取 ， AWS 帳戶 而無需執行 AWS 帳戶 復原程序。如果 MFA 裝置遺失或遭竊，應取消 MFA 裝置與 IAM 主體的可能關聯。
+ 使用多個 MFAs 可讓您的員工分散在地理位置或遠端工作，使用硬體型 MFA 存取 ， AWS 而不必協調員工之間單一硬體裝置的實體交換。
+ 針對 IAM 主體使用額外的 MFA 裝置，可讓您在日常使用期間使用一或多個 MFA 裝置，同時將實體 MFA 裝置維護在安全的實體位置 (例如文件庫)，或是用於備份和備援的安全位置。

**備註**  
您無法將安全金鑰或通行金鑰的 MFA 資訊傳遞給 AWS STS API 操作，以請求臨時憑證。您可以在使用安全金鑰或通行金鑰時，透過執行 `aws login`命令取得登入資料，以搭配 AWS CLI 和 AWS SDKs 使用。
您無法使用 AWS CLI 命令或 AWS API 操作來啟用 [FIDO 安全金鑰](id_credentials_mfa_enable_fido.md)。
同一個名稱不能用於多個根使用者或 IAM MFA 裝置。

## 其他資源
<a name="id_credentials_mfa-resources"></a>

下列資源可協助您進一步了解 MFA。
+ 如需使用 MFA 存取的詳細資訊 AWS，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。
+  您可以利用 IAM Identity Center 啟用 AWS 存取入口網站、IAM Identity Center 整合應用程式和 的安全 MFA 存取 AWS CLI。如需詳細資訊，請參閱[在 IAM Identity Center 中啟用 MFA](https://docs.aws.amazon.com/singlesignon/latest/userguide/mfa-getting-started.html)。

# 在 中指派通行金鑰或安全金鑰 AWS 管理主控台
<a name="id_credentials_mfa_enable_fido"></a>

通行金鑰是一種[多重要素驗證 (MFA) 裝置](id_credentials_mfa.md)，可用來保護您的 AWS 資源。 AWS 支援同步通行金鑰和裝置繫結通行金鑰，也稱為安全金鑰。

同步通行密鑰可讓 IAM 使用者在許多裝置 (甚至是新裝置) 上存取 FIDO 登入憑證，而無需在每個帳戶上重新註冊每個裝置。同步通行密鑰包含 Google、Apple 和 Microsoft 等第一方憑證管理員，以及 1Password、Dashlane 和 Bitwarden 等第三方憑證管理員，作為第二個要素。您也可以使用裝置上的生物識別技術 (例如 TouchID、FaceID) 來解除鎖定您選擇的憑證管理員，以使用通行密鑰。

或者，裝置綁定的通行密鑰會綁定至 FIDO 安全金鑰，您可以將其插入電腦上的 USB 連接埠，然後在出現提示時點選以安全地完成登入程序。若您已搭配其他服務使用 FIDO 安全金鑰，並且它具備 [AWS 支援的組態](id_credentials_mfa_fido_supported_configurations.md) (例如來自 Yubico 的 YubiKey 5)，您也可以搭配 AWS來使用它。否則，若您希望在 AWS中使用 MFA 的 WebAuthn，您需要購買 FIDO 安全金鑰。此外，FIDO 安全金鑰可以支援同一裝置上的多個 IAM 或根使用者，從而增強其公用程式以確保帳戶安全。如需兩種裝置類型的規格及購買資訊，請參閱[多重要素驗證](https://aws.amazon.com/iam/details/mfa/)。

您可以向 AWS 帳戶根使用者 和 IAM 使用者註冊最多**八個**[目前支援 MFA 類型之任何組合的 MFA](https://aws.amazon.com/iam/features/mfa/) 裝置。使用多個 MFA 裝置時，您只需一個 MFA 裝置登入 ， AWS 管理主控台 或透過 以該使用者 AWS CLI 身分建立工作階段。我們建議您註冊多個 MFA 裝置。例如，您可以註冊內建驗證器，也可以註冊存放在實體安全位置的安全金鑰。如果無法使用內建驗證器，則可以使用已註冊的安全金鑰。對於驗證器應用程式，我們也建議您在這些應用程式中啟用雲端備份或同步功能，以協助避免在具有驗證器應用程式的裝置遺失或損壞時，失去對帳戶的存取權限。

**注意**  
存取 AWS時，我們建議您要求人類使用者使用暫時性憑證。您的使用者可以 AWS 與身分提供者聯合到 ，並在其中使用其公司登入資料和 MFA 組態進行身分驗證。若要管理對 AWS 和商業應用程式的存取，建議您使用 IAM Identity Center。如需詳細資訊，請參閱 [IAM Identity Center 使用者指南](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

**Topics**
+ [必要許可](#enable-fido-mfa-for-iam-user-permissions-required)
+ [為您自己的 IAM 使用者啟用通行密鑰或安全金鑰 (主控台)](#enable-fido-mfa-for-own-iam-user)
+ [為另一個 IAM 使用者啟用通行密鑰或安全金鑰 (主控台)](#enable-fido-mfa-for-iam-user)
+ [取代通行密鑰或安全金鑰](#replace-fido-mfa)
+ [使用通行密鑰和安全金鑰的支援組態](id_credentials_mfa_fido_supported_configurations.md)

## 必要許可
<a name="enable-fido-mfa-for-iam-user-permissions-required"></a>

若要管理您自己的 IAM 使用者的 FIDO 通行密鑰，同時保護敏感的 MFA 相關動作，您必須擁有下列政策的許可：

**注意**  
ARN 值是靜態值，不是哪項協定被用來註冊驗證器的指示器。我們已棄用 U2F，因此所有新的實作都採用 WebAuthn。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

------

## 為您自己的 IAM 使用者啟用通行密鑰或安全金鑰 (主控台)
<a name="enable-fido-mfa-for-own-iam-user"></a>

您只能從 為您自己的 IAM 使用者啟用通行金鑰或安全金鑰 AWS 管理主控台 ，不能從 AWS CLI 或 AWS API 啟用。在可以啟用安全金鑰之前，您必須擁有對裝置的實體存取權。

**若要為您自己的 IAM 使用者啟用通行密鑰或安全金鑰 (主控台)**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。從那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在選取的 IAM 使用者頁面上，選擇**安全憑證**索引標籤。

1. 在 **Multi-Factor Authentication (MFA)** (多重要素驗證 (MFA)) 區段下方，選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在 **MFA 裝置名稱**頁面上，輸入**裝置名稱**，選擇**通行密鑰或安全金鑰**，然後選擇**下一步**。

1. 在**設定裝置**上，設定您的通行密鑰。使用臉部或指紋等生物識別資料、裝置 PIN，或將 FIDO 安全金鑰插入電腦的 USB 連接埠並點選，由此建立通行密鑰。

1. 遵循瀏覽器上的說明進行操作，然後選擇**繼續**。

您現在已註冊要與 搭配使用的通行金鑰或安全金鑰 AWS。如需搭配 使用 MFA 的詳細資訊 AWS 管理主控台，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。

## 為另一個 IAM 使用者啟用通行密鑰或安全金鑰 (主控台)
<a name="enable-fido-mfa-for-iam-user"></a>

您只能從 為其他 IAM 使用者啟用通行金鑰或安全性 AWS 管理主控台 ，而不能從 AWS CLI 或 AWS API 啟用。

**若要為另一個 IAM 使用者啟用通行密鑰或安全 (主控台)**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**下，選擇要為其啟用 MFA 的使用者名稱。

1. 在選取的 IAM 使用者頁面上，選擇**安全憑證**索引標籤。

1. 在 **Multi-Factor Authentication (MFA)** (多重要素驗證 (MFA)) 區段下方，選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在 **MFA 裝置名稱**頁面上，輸入**裝置名稱**，選擇**通行密鑰或安全金鑰**，然後選擇**下一步**。

1. 在**設定裝置**上，設定您的通行密鑰。使用臉部或指紋等生物識別資料、裝置 PIN，或將 FIDO 安全金鑰插入電腦的 USB 連接埠並點選，由此建立通行密鑰。

1. 遵循瀏覽器上的說明進行操作，然後選擇**繼續**。

您現在已為另一個 IAM 使用者註冊通行密鑰或安全金鑰，以便與 AWS搭配使用。如需搭配 使用 MFA 的詳細資訊 AWS 管理主控台，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。

## 取代通行密鑰或安全金鑰
<a name="replace-fido-mfa"></a>

您的 AWS 帳戶根使用者 和 IAM 使用者一次最多可以有八個 MFA 裝置指派給使用者[目前支援的 MFA 類型](https://aws.amazon.com/iam/features/mfa/)任意組合。如果使用者遺失 FIDO 驗證器或因為任何原因需要更換，您必須先停用舊的 FIDO 驗證器。然後，再為使用者新增新的 MFA 裝置。
+ 如需停用目前與 IAM 使用者相關聯的裝置，請參閱 [停用 MFA 裝置](id_credentials_mfa_disable.md)。
+ 若要為 IAM 使用者新增新的 FIDO 安全性金鑰，請參閱 [為您自己的 IAM 使用者啟用通行密鑰或安全金鑰 (主控台)](#enable-fido-mfa-for-own-iam-user)。

如果您無法存取新的通行密鑰或安全金鑰，您可以啟用新的虛擬 MFA 裝置或硬體 TOTP 權杖。請參閱以下其中一項以取得說明：
+ [在 中指派虛擬 MFA 裝置 AWS 管理主控台](id_credentials_mfa_enable_virtual.md) 
+ [在 中指派硬體 TOTP 字符 AWS 管理主控台](id_credentials_mfa_enable_physical.md) 

# 使用通行密鑰和安全金鑰的支援組態
<a name="id_credentials_mfa_fido_supported_configurations"></a>

您可以使用 FIDO2 裝置綁定的通行密鑰 (亦稱為安全金鑰)，作為使用目前支援組態的 IAM 的多重要素驗證 (MFA) 方法。其中包括 IAM 支援的 FIDO2 裝置，以及支援 FIDO2 的瀏覽器。註冊 FIDO2 裝置之前，檢查您使用的是最新的瀏覽器和作業系統 (OS) 版本。功能在不同的瀏覽器、驗證器和作業系統用戶端上的行為可能有所不同。如果您的裝置在某個瀏覽器上註冊失敗，您可以嘗試使用其他瀏覽器註冊。

FIDO2 是 FIDO U2F 的開放認證標準，也是 FIDO U2F 的延伸，可根據公有金鑰加密技術提供相同的高度安全性。FIDO2 由 W3C Web Authentication 規範 (WebAuthn API) 和 FIDO Alliance Client-to-Authenticator Protocol (CTAP，一個應用程式層通訊協定) 組成。CTAP 可透過外部驗證器在用戶端或平台之間進行通訊，例如瀏覽器或作業系統。當您在 中啟用 FIDO 認證驗證器時 AWS，安全金鑰會建立新的金鑰對，僅用於 AWS。首先，您需要輸入您的憑證。出現提示時，您需要點選安全金鑰，回應 AWS發出的身分驗證查問。若要進一步了解 FIDO2 標準，請參閱 [FIDO2 專案](https://en.wikipedia.org/wiki/FIDO2_Project)。

## 支援的 FIDO2 裝置 AWS
<a name="id_credentials_mfa_fido_supported_devices"></a>

IAM 支援透過 USB、Bluetooth 或 NFC 連線到裝置的 FIDO2 安全裝置。IAM 也支援平台驗證器，例如 TouchID 或 FaceID。IAM 不支援 Windows Hello 的本機通行密鑰註冊。若要建立和使用通行密鑰，Windows 使用者應該使用[跨裝置身分驗證](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda)，您在其中使用諸如行動裝置等裝置的通行密鑰或硬體安全金鑰，登入諸如筆記型電腦等其他裝置。

**注意**  
AWS 需要存取電腦上的實體 USB 連接埠，才能驗證 FIDO2 裝置。安全金鑰無法與虛擬機器、遠端連線或瀏覽器無痕模式搭配使用。

FIDO Alliance 會維護與 FIDO 規範相容之所有 [FIDO2 產品](https://fidoalliance.org/certification/fido-certified-products/)的清單。

## 支援 FIDO2 的瀏覽器
<a name="id_credentials_mfa_fido_browsers"></a>

在 Web 瀏覽器中執行的 FIDO2 安全裝置的可用性取決於瀏覽器和作業系統的組合。以下瀏覽器目前支援使用安全金鑰：


****  

| Web 瀏覽器 | macOS 10.15\$1 | Windows 10 | Linux | iOS 14.5\$1 | Android 7\$1 | 
| --- | --- | --- | --- | --- | --- | 
| Chrome | 是 | 是 | 是 | 是 | 否 | 
| Safari | 是 | 否 | 否 | 是 | 否 | 
| Edge | 是 | 是 | 否 | 是 | 否 | 
| Firefox | 是 | 是 | 否 | 是 | 否 | 

**注意**  
依預設，目前支援 FIDO2 的大多數 Firefox 版本都不會啟用支援。如需在 Firefox 中啟用 FIDO2 支援的說明，請參閱 [對通行密鑰和 FIDO 安全金鑰進行疑難排解](troubleshoot_mfa-fido.md)。  
macOS 上的 Firefox 可能無法完全支援通行密鑰的跨裝置身分驗證工作流程。您可能會收到觸控安全金鑰的提示，而不是繼續進行跨裝置身分驗證。建議您使用不同的瀏覽器 (例如 Chrome 或 Safari)，在 macOS 上使用通行密鑰登入。

如需有關 YubiKey 等 FIDO2 認證的裝置的瀏覽器支援的詳細資訊，請參閱 [FIDO2 和 U2F 的作業系統和 Web 瀏覽器支援](https://support.yubico.com/hc/en-us/articles/360016615020-Operating-system-and-web-browser-support-for-FIDO2-and-U2F)。

### 瀏覽器外掛程式
<a name="id_credentials_mfa_fido_plugins"></a>

AWS 僅支援原生支援 FIDO2 AWS 的瀏覽器。不支援使用外掛程式來新增 FIDO2 瀏覽器支援。有些瀏覽器外掛程式與 FIDO2 標準不相容，可能會導致未預期的 FIDO2 安全金鑰結果。

如需停用瀏覽器外掛程式和其他故障診斷提示，請參閱 [我無法啟用 FIDO 安全性金鑰](troubleshoot_mfa-fido.md#troubleshoot_mfa-fido-cant-enable)。

## 裝置認證
<a name="id_credentials_mfa_fido_certifications"></a>

我們只會在註冊安全金鑰期間擷取和指派與裝置相關的認證，例如 FIPS 驗證和 FIDO 認證等級。從 [FIDO Alliance Metadata Service (MDS)](https://fidoalliance.org/metadata/) 中擷取裝置認證。如果安全金鑰的認證狀態或等級發生變更，它將不會自動反映在裝置標籤中。若要更新裝置的認證資訊，請再次註冊裝置以擷取更新的認證資訊。

AWS 在裝置註冊期間提供下列認證類型作為條件索引鍵，可從 FIDO MDS 中取得：FIPS-140-2、FIPS-140-3 和 FIDO 認證等級。您可以根據偏好的認證類型和等級，在其 IAM 政策中指定特定驗證器的註冊。如需詳細資訊，請參閱以下政策。

### 裝置認證的範例政策
<a name="id_credentials_mfa_fido_certifications_policies"></a>

下列使用案例顯示可讓您使用 FIPS 認證註冊 MFA 裝置的範例政策。

**Topics**
+ [使用案例 1：僅允許註冊具有 FIPS-140-2 L2 認證的裝置](#id_credentials_mfa_fido_certifications_policies_use_case_1)
+ [使用案例 2：允許註冊具有 FIPS-140-2 L2 和 FIDO L1 認證的裝置](#id_credentials_mfa_fido_certifications_policies_use_case_2)
+ [使用案例 3：允許註冊具有 FIPS-140-2 L2 或 FIPS-140-3 L2 認證的裝置](#id_credentials_mfa_fido_certifications_policies_use_case_3)
+ [使用案例 4：允許註冊具有 FIPS-140-2 L2 憑證的裝置，並支援其他 MFA 類型，例如虛擬身分驗證器和硬體 TOTP](#id_credentials_mfa_fido_certifications_policies_use_case_4)

#### 使用案例 1：僅允許註冊具有 FIPS-140-2 L2 認證的裝置
<a name="id_credentials_mfa_fido_certifications_policies_use_case_1"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Create"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-2-certification": "L2"
                }
            }
        }
    ]
}
```

------

#### 使用案例 2：允許註冊具有 FIPS-140-2 L2 和 FIDO L1 認證的裝置
<a name="id_credentials_mfa_fido_certifications_policies_use_case_2"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Create"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-2-certification": "L2",
                    "iam:FIDO-certification": "L1"
                }
            }
        }
    ]
}
```

------

#### 使用案例 3：允許註冊具有 FIPS-140-2 L2 或 FIPS-140-3 L2 認證的裝置
<a name="id_credentials_mfa_fido_certifications_policies_use_case_3"></a>

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Create"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-2-certification": "L2"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-3-certification": "L2"
                }
            }
        }
    ]
}
```

------

#### 使用案例 4：允許註冊具有 FIPS-140-2 L2 憑證的裝置，並支援其他 MFA 類型，例如虛擬身分驗證器和硬體 TOTP
<a name="id_credentials_mfa_fido_certifications_policies_use_case_4"></a>

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:EnableMFADevice",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:RegisterSecurityKey": "Create"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "iam:EnableMFADevice",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:RegisterSecurityKey": "Activate",
          "iam:FIDO-FIPS-140-2-certification": "L2"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "iam:EnableMFADevice",
      "Resource": "*",
      "Condition": {
        "Null": {
          "iam:RegisterSecurityKey": "true"
        }
      }
    }
  ]
}
```

------

## AWS CLI 和 AWS API
<a name="id_credentials_mfa_fido_cliapi"></a>

AWS 僅支援在 中使用通行金鑰和安全金鑰 AWS 管理主控台。[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/) 和 [AWS API](https://aws.amazon.com/tools/) 不支援使用通行密鑰和安全金鑰進行 MFA，或用以存取[受 MFA 保護的 API 操作](id_credentials_mfa_configure-api-require.md)。

## 其他資源
<a name="id_credentials_mfa_fido_additional_resources"></a>
+ 如需在 中使用通行金鑰和安全金鑰的詳細資訊 AWS，請參閱 [在 中指派通行金鑰或安全金鑰 AWS 管理主控台](id_credentials_mfa_enable_fido.md)。
+ 如需在 中對通行金鑰和安全金鑰進行故障診斷的說明 AWS，請參閱 [對通行密鑰和 FIDO 安全金鑰進行疑難排解](troubleshoot_mfa-fido.md)。
+ 如需有關 FIDO2 支援的一般行業資訊，請參閱 [FIDO2 專案](https://en.wikipedia.org/wiki/FIDO2_Project)。

# 在 中指派虛擬 MFA 裝置 AWS 管理主控台
<a name="id_credentials_mfa_enable_virtual"></a>

**重要**  
AWS 建議您 AWS盡可能使用 MFA 的通行金鑰或安全金鑰。如需詳細資訊，請參閱[在 中指派通行金鑰或安全金鑰 AWS 管理主控台](id_credentials_mfa_enable_fido.md)。

您可以使用手機或其他裝置，做為虛擬多重要素驗證 (MFA) 裝置。若要執行此操作，安裝與 [RFC 6238 (以標準為基礎的 TOTP (以時間為基礎的單次密碼) 演算法)](https://datatracker.ietf.org/doc/html/rfc6238) 相容的行動應用程式。這些應用程式產生六位數的身分驗證代碼。由於驗證器可以在不安全的行動裝置上執行，而且程式碼可能會與未經授權的對象共用，因此以 TOTP 為基礎的 MFA 不提供與 [FIDO2](https://en.wikipedia.org/wiki/FIDO_Alliance#FIDO2) 安全金鑰和通行金鑰等網路釣魚防護選項相同的安全層級。我們建議您使用 MFA 的通行金鑰或安全金鑰，以最強大的防護來防範網路釣魚等攻擊。

如果您還無法使用通行金鑰或安全金鑰，建議您在等待任何硬體購買核准或硬體送達時，使用虛擬 MFA 裝置做為臨時措施。

大多數虛擬 MFA 應用程式支援建立多個虛擬裝置，可讓您為多個 AWS 帳戶 或 使用者使用相同的應用程式。您最多可以向 AWS 帳戶根使用者 和 IAM 使用者註冊**任意**組合 MFA [類型的八個 MFA](https://aws.amazon.com/iam/features/mfa/) 裝置。您只需一個 MFA 裝置即可登入 AWS 管理主控台 或透過 建立工作階段 AWS CLI。我們建議您註冊多個 MFA 裝置。對於驗證器應用程式，我們也建議您啟用雲端備份或同步功能，以協助避免在裝置遺失或損壞時，失去對帳戶的存取權。

AWS 需要產生六位數 OTP 的虛擬 MFA 應用程式。如需您可以使用的虛擬 MFA 應用程式清單，請參閱[多重要素驗證](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。

**Topics**
+ [必要許可](#mfa_enable_virtual_permissions-required)
+ [針對 IAM 使用者啟用虛擬 MFA 裝置 (主控台)](#enable-virt-mfa-for-iam-user)
+ [取代虛擬 MFA 裝置](#replace-virt-mfa)

## 必要許可
<a name="mfa_enable_virtual_permissions-required"></a>

若要為 IAM 使用者[AWS：允許經過 MFA 驗證的 IAM 使用者在「安全憑證」頁面中管理其自己的 MFA 裝置](reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.md)管理虛擬 MFA 裝置時，您必須擁有以下政策的許可：。

## 針對 IAM 使用者啟用虛擬 MFA 裝置 (主控台)
<a name="enable-virt-mfa-for-iam-user"></a>

您可以在 中使用 IAM AWS 管理主控台 ，為帳戶中的 IAM 使用者啟用和管理虛擬 MFA 裝置。您可以將標籤連接至 IAM 資源 (包括虛擬 MFA 裝置)，以識別、整理和控制其存取權。您只能在使用 AWS CLI 或 AWS API 時標記虛擬 MFA 裝置。若要使用 AWS CLI 或 AWS API 啟用和管理 MFA 裝置，請參閱 [在 AWS CLI 或 AWS API 中指派 MFA 裝置](id_credentials_mfa_enable_cliapi.md)。如需標記 IAM 資源的詳細資訊，請參閱 [AWS Identity and Access Management 資源的標籤](id_tags.md)。

**注意**  
您必須擁有實體存取託管使用者的虛擬 MFA 裝置的硬體，才能設定 MFA。例如，您可以為使用者設定 MFA，該使用者將使用在智慧型手機上執行的虛擬 MFA 裝置。在這種情況下，您必須有可用的智慧型手機，才能完成精靈。因此，您可能想要讓使用者設定和管理自己的虛擬 MFA 裝置。在這種情況下，您必須授予使用者執行必要 IAM 動作的許可。如需詳細資訊以及授予這些許可的 IAM 政策範例，請參閱 [IAM 教學課程：允許使用者管理其憑證和 MFA 設定](tutorial_users-self-manage-mfa-and-creds.md) 和範例政策 [AWS：允許經過 MFA 驗證的 IAM 使用者在「安全憑證」頁面中管理其自己的 MFA 裝置](reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.md)。

**為 IAM 使用者啟用虛擬 MFA 裝置 (主控台)**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 在**使用者**清單中選擇 IAM 使用者名稱。

1. 選擇 **安全憑證** 標籤。在 **Multi-Factor Authentication (MFA)** (多重要素驗證 (MFA)) 區段下方，選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在精靈中輸入 **Device name**，然後選擇 **驗證器應用程式**，再選擇 **下一步**。

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

1. 開啟您的虛擬 MFA 應用程式。如需可以用於託管虛擬 MFA 裝置的應用程式清單，請參閱[多重要素驗證](https://aws.amazon.com/iam/details/mfa/)。

   如果虛擬 MFA 應用程式支援多個虛擬 MFA 裝置或帳戶，請選擇對應的選項以建立新的虛擬 MFA 裝置或帳戶。

1. 判定 MFA 應用程式是否支援 QR 碼，然後執行以下操作之一：
   + 從精靈中，選擇 **Show QR code (顯示 QR 碼)**，然後使用應用程式掃描 QR 碼。這可能是攝影機圖示或使用裝置的攝影機掃描代碼的**掃描代碼**選項。
   + 在精靈中，選擇 **Show secret key** (顯示私密金鑰)，然後在您的 MFA 應用程式中輸入私密金鑰。

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

1. 在 **設定裝置** 頁面中的 **MFA 代碼 1** 方塊內輸入虛擬 MFA 裝置上目前顯示的一次性密碼。請等待 30 秒，裝置將產生新的一次性密碼。然後將第二個一次性密碼輸入 **MFA code 2 (MFA 代碼 2)** 方塊中。選擇 **Add MFA** (新增 MFA)。
**重要**  
產生代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。這種情況下，您可以[重新同步裝置](id_credentials_mfa_sync.md)。

虛擬 MFA 裝置現在可以與 搭配使用 AWS。如需搭配 使用 MFA 的詳細資訊 AWS 管理主控台，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。

**注意**  
當您透過 AWS 管理主控台 或在登入程序期間新增新的虛擬 MFA 裝置時， AWS 帳戶 會刪除 中未指派的虛擬 MFA 裝置。未指派的虛擬 MFA 裝置是指位於您帳戶中但帳戶根使用者或 IAM 使用者並未在登入程序中使用的裝置。將這些裝置刪除後，便可將新的虛擬 MFA 裝置新增至您的帳戶。刪除這些裝置後，您還可以重複使用裝置名稱。  
若要檢視帳戶中未指派的虛擬 MFA 裝置，您可以使用 [list-virtual-mfa-devices](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-virtual-mfa-devices.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html) 呼叫。
若要停用虛擬 MFA 裝置，您可以使用 [deactivate-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/deactivate-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html) 呼叫。停用後，裝置會變成未指派狀態。
若要將未指派的虛擬 MFA 裝置連接至 AWS 帳戶 根使用者或 IAM 使用者，您需要裝置產生的驗證碼，以及 [enable-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/enable-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 呼叫。

## 取代虛擬 MFA 裝置
<a name="replace-virt-mfa"></a>

您的 AWS 帳戶根使用者 和 IAM 使用者可以註冊最多**八個** MFA 裝置，任何 MFA 類型的組合。如果使用者遺失裝置或基於任何原因需要更換，請停用舊裝置。然後，再為使用者加入新的裝置。
+ 如需停用目前與另一個 IAM 使用者相關聯的裝置，請參閱 [停用 MFA 裝置](id_credentials_mfa_disable.md)。
+ 若要新增另一個 IAM 使用者的取代用虛擬 MFA 裝置，請遵循上方 [針對 IAM 使用者啟用虛擬 MFA 裝置 (主控台)](#enable-virt-mfa-for-iam-user) 程序中的步驟。
+ 若要為 新增替代虛擬 MFA 裝置 AWS 帳戶根使用者，請遵循程序 中的步驟[針對根使用者啟用虛擬 MFA 裝置 (主控台)](enable-virt-mfa-for-root.md)。

# 在 中指派硬體 TOTP 字符 AWS 管理主控台
<a name="id_credentials_mfa_enable_physical"></a>

**重要**  
AWS 建議您 AWS盡可能使用 MFA 的通行金鑰或安全金鑰。如需詳細資訊，請參閱[在 中指派通行金鑰或安全金鑰 AWS 管理主控台](id_credentials_mfa_enable_fido.md)。

硬體 TOTP 權杖會在以時間為基礎的一次性密碼 (TOTP) 演算法的基礎上產生六位數字程式碼。使用者必須在登入程序期間出現提示時輸入裝置中的有效代碼。指派給使用者的每個 MFA 裝置必須是唯一的；使用者不能從另一個使用者的裝置中輸入代碼進行身分驗證。MFA 裝置無法跨帳戶或使用者共用。

硬體 TOTP 權杖與 [FIDO 安全金鑰](id_credentials_mfa_enable_fido.md)都是您購買的實體裝置。硬體 MFA 裝置會在您登入時產生 TOTP 代碼以進行身分驗證 AWS。它們依賴電池，這可能需要 AWS 隨著時間的推移替換和重新同步。FIDO 安全金鑰使用公有金鑰加密，不需要電池並提供無縫的身分驗證程序。我們建議使用 FIDO 安全金鑰來防禦網路釣魚，這為 TOTP 裝置提供了更安全的替代方案。此外，FIDO 安全金鑰可以支援同一裝置上的多個 IAM 或根使用者，從而增強其公用程式以確保帳戶安全。如需兩種裝置類型的規格及購買資訊，請參閱[多重要素驗證](https://aws.amazon.com/iam/details/mfa/)。



您可以從 、 AWS 管理主控台命令列或 IAM API 為 IAM 使用者啟用硬體 TOTP 字符。若要為您的 啟用 MFA 裝置 AWS 帳戶根使用者，請參閱 [針對根使用者啟用硬體 TOTP 權杖 (主控台)](enable-hw-mfa-for-root.md)。

您可以向 AWS 帳戶根使用者 和 IAM 使用者註冊最多**八個** MFA 裝置，其為[目前支援的 MFA 類型](https://aws.amazon.com/iam/features/mfa/)的任何組合。使用多個 MFA 裝置時，您只需一個 MFA 裝置即可登入 ， AWS 管理主控台 或透過 以該使用者 AWS CLI 身分建立工作階段。

**重要**  
建議您為您的使用者啟用多台 MFA 裝置，以便在一台 MFA 裝置遺失或無法存取時繼續存取您的帳戶。

**注意**  
如果您想要從命令列啟用 MFA 裝置，請使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html)。若要使用 IAM API 啟用 MFA 裝置，請使用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 操作。

**Topics**
+ [必要許可](#enable-hw-mfa-for-iam-user-permissions-required)
+ [啟用您 IAM 使用者的硬體 TOTP 權杖 (主控台)](#enable-hw-mfa-for-own-iam-user)
+ [啟用另一個 IAM 使用者的硬體 TOTP 權杖 (主控台)](#enable-hw-mfa-for-iam-user)
+ [取代實體 MFA 裝置](#replace-phys-mfa)

## 必要許可
<a name="enable-hw-mfa-for-iam-user-permissions-required"></a>

若要管理您 IAM 使用者的硬體 TOTP 權杖，同時保護敏感的 MFA 相關動作，您必須擁有下列政策的許可：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

------

## 啟用您 IAM 使用者的硬體 TOTP 權杖 (主控台)
<a name="enable-hw-mfa-for-own-iam-user"></a>

 您可以從 AWS 管理主控台啟用您自己的硬體 TOTP 權杖。

**注意**  
在您可以啟用硬體 TOTP 權杖之前，您必須擁有裝置的實體存取權。

**要啟用您 IAM 使用者的硬體 TOTP 權杖 (主控台)**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。從那裡，您可以輸入 AWS 您的帳戶 ID 或帳戶別名，以重新導向至您帳戶的 IAM 使用者登入頁面。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在 **AWS IAM credentials** ( IAM 憑證) 索引標籤上，在 **Multi-factor authentication (MFA)** (多重要素驗證 (MFA)) 區段，選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在精靈中，輸入一個**裝置名稱**，然後選取 **Hardware TOTP token** (硬體 TOTP 權杖)，再選擇 **Next** (下一步)。

1. 輸入裝置序號。序號通常位於裝置的背面。

1. 在 **MFA code 1 (MFA 代碼 1)** 方塊中，輸入 MFA 裝置顯示的六位數字。您可能需要按下裝置正面的按鈕以顯示數字。  
![\[IAM 儀表板，MFA 裝置\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/MFADevice.png)

1. 當裝置在重新整理代碼時，等候 30 秒時間後，在 **MFA code 2 (MFA 代碼 2)** 方塊中輸入六位數字。您可能需要再次按下裝置正面的按鈕以顯示第二個數字。

1. 選擇 **Add MFA** (新增 MFA)。
**重要**  
產生驗證代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置卻變成不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。這種情況下，您可以[重新同步裝置](id_credentials_mfa_sync.md)。

裝置已準備好與 搭配使用 AWS。如需與 AWS 管理主控台一起使用 MFA 的詳細資訊，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。

## 啟用另一個 IAM 使用者的硬體 TOTP 權杖 (主控台)
<a name="enable-hw-mfa-for-iam-user"></a>

 您可以從 AWS 管理主控台啟用另一個 IAM 使用者的硬體 TOTP 權杖。

**要啟用另一個 IAM 使用者的硬體 TOTP 權杖 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇**使用者** 。

1. 選擇要為其啟用 MFA 的使用者名稱。

1. 選擇 **安全憑證** 標籤。在 **Multi-Factor Authentication (MFA)** (多重要素驗證 (MFA)) 區段下方，選擇 **Assign MFA device** (指派 MFA 裝置)。

1. 在精靈中，輸入一個**裝置名稱**，然後選取 **Hardware TOTP token** (硬體 TOTP 權杖)，再選擇 **Next** (下一步)。

1. 輸入裝置序號。序號通常位於裝置的背面。

1. 在 **MFA code 1 (MFA 代碼 1)** 方塊中，輸入 MFA 裝置顯示的六位數字。您可能需要按下裝置正面的按鈕以顯示數字。  
![\[IAM 儀表板，MFA 裝置\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/MFADevice.png)

1. 當裝置在重新整理代碼時，等候 30 秒時間後，在 **MFA code 2 (MFA 代碼 2)** 方塊中輸入六位數字。您可能需要再次按下裝置正面的按鈕以顯示第二個數字。

1. 選擇 **Add MFA** (新增 MFA)。
**重要**  
產生驗證代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置卻變成不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。這種情況下，您可以[重新同步裝置](id_credentials_mfa_sync.md)。

裝置已準備好與 搭配使用 AWS。如需與 AWS 管理主控台一起使用 MFA 的詳細資訊，請參閱 [啟用 MFA 的登入](console_sign-in-mfa.md)。

## 取代實體 MFA 裝置
<a name="replace-phys-mfa"></a>

您的 AWS 帳戶根使用者 和 IAM 使用者一次最多可以有八個 MFA 裝置指派給使用者[目前支援的 MFA 類型](https://aws.amazon.com/iam/features/mfa/)任意組合。如果使用者遺失裝置或基於任何原因需要汰換，您必須先停用舊裝置。然後，再為使用者加入新的裝置。
+ 如需停用目前與使用者相關聯的裝置，請參閱 [停用 MFA 裝置](id_credentials_mfa_disable.md)。
+ 若要新增 IAM 使用者適用的替代硬體 TOTP 權杖，請遵循本主題稍早介紹的 [啟用另一個 IAM 使用者的硬體 TOTP 權杖 (主控台)](#enable-hw-mfa-for-iam-user) 程序。
+ 若要為 新增替換硬體 TOTP 權杖 AWS 帳戶根使用者，請遵循本主題[針對根使用者啟用硬體 TOTP 權杖 (主控台)](enable-hw-mfa-for-root.md)先前程序中的步驟。

# 在 AWS CLI 或 AWS API 中指派 MFA 裝置
<a name="id_credentials_mfa_enable_cliapi"></a>

您可以使用 AWS CLI 命令或 AWS API 操作，為 IAM 使用者啟用虛擬 MFA 裝置。您無法使用 AWS 帳戶根使用者 AWS CLI、 AWS API、Tools for Windows PowerShell 或任何其他命令列工具為 啟用 MFA 裝置。不過，您可以使用 AWS 管理主控台 為根使用者啟用 MFA 裝置。

當您從 啟用 MFA 裝置時 AWS 管理主控台，主控台會為您執行多個步驟。如果您改為使用 AWS CLI、Tools for Windows PowerShell 或 AWS API 建立虛擬裝置，則必須以正確的順序手動執行步驟。例如，如果要建立虛擬 MFA 裝置，則必須建立 IAM 物件，將程式碼擷取為字串或 QR 碼圖形，然後同步該裝置並將其與 IAM 使用者建立關聯。請參閱 [New-IAMVirtualMFADevice](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=New-IAMVirtualMFADevice.html&tocid=New-IAMVirtualMFADevice) 中的**範例**章節以了解更多詳細資訊。對於實體裝置，您可以跳過建立步驟，直接同步該裝置並將其與使用者建立關聯。

您可以將標籤連接至 IAM 資源 (包括虛擬 MFA 裝置)，以識別、整理和控制其存取權。您只能在使用 AWS CLI 或 AWS API 時標記虛擬 MFA 裝置。

使用 SDK 或 CLI 的 IAM 使用者可以透過呼叫 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 啟用額外的 MFA 裝置，或者透過呼叫 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html) 停用現有的 MFA 裝置。若要成功執行此動作，這些使用者必須先使用現有的 MFA 裝置呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 並提交 MFA 代碼。此呼叫會傳回暫時的安全憑證，然後可使用此憑證簽署需要 MFA 身分驗證的 API 作業。如需要求和回應的範例，請參閱 [`GetSessionToken` - 不受信任環境中使用者的暫時憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken)。

**在 IAM 中建立虛擬裝置實體來代表虛擬 MFA 裝置**  
這些命令提供在以下許多命令中代替序號的裝置 ARN。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/create-virtual-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-virtual-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateVirtualMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateVirtualMFADevice.html)

**啟用 MFA 裝置以搭配 使用 AWS**  
這些命令會將裝置與 同步， AWS 並將其與使用者建立關聯。如果裝置是虛擬裝置，則將虛擬裝置的 ARN 做為序號使用。

**重要**  
產生驗證代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置卻變成不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。如果發生這種情況，可以使用下面介紹的命令重新同步裝置。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html)

**停用裝置**  
這些命令將取消裝置與使用者間的關聯並停用裝置。如果裝置是虛擬裝置，則將虛擬裝置的 ARN 做為序號使用。您也必須單獨刪除虛擬裝置實體。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html)

**列出虛擬 MFA 裝置實體**  
使用這些命令來列出虛擬 MFA 裝置的實體。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-virtual-mfa-devices.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-virtual-mfa-devices.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html)

**標記虛擬 MFA 裝置**  
使用這些指令來標記虛擬 MFA 裝置。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/tag-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagMFADevice.html)

**列出虛擬 MFA 裝置的標籤**  
使用這些命令列出連接至虛擬 MFA 裝置的標籤。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-device-tags.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-device-tags.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADeviceTags.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADeviceTags.html)

**取消標記虛擬 MFA 裝置**  
使用這些命令移除連接至虛擬 MFA 裝置的標籤。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/untag-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagMFADevice.html)

**重新同步 MFA 裝置**  
如果裝置正在產生 不接受的代碼，請使用這些命令 AWS。如果裝置是虛擬裝置，則將虛擬裝置的 ARN 做為序號使用。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResyncMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResyncMFADevice.html)

**刪除 IAM 中的虛擬 MFA 裝置實體**  
在裝置與使用者取消關聯後，您可以刪除裝置實體。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-virtual-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-virtual-mfa-device.html) 
+ AWS API： [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteVirtualMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteVirtualMFADevice.html)

**復原遺失或無法運作的虛擬 MFA 裝置**  
有時，主控虛擬 MFA 應用程式的使用者的裝置會發生遺失、遭到替換，或無法運作。當這種情況發生時，使用者無法自行復原。使用者必須聯絡管理員以停用裝置。如需詳細資訊，請參閱[在 IAM 中復原受 MFA 保護的身分](id_credentials_mfa_lost-or-broken.md)。

# 檢查 MFA 狀態
<a name="id_credentials_mfa_checking-status"></a>

使用 IAM 主控台來檢查 AWS 帳戶根使用者 或 IAM 使用者是否已啟用有效的 MFA 裝置。

**若要查看根使用者的 MFA 狀態**

1.  AWS 管理主控台 使用您的根使用者憑證登入 ，然後在 開啟 IAM 主控台[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在右上方的導覽列中，選擇您的使用者名稱，然後選擇 **安全憑證** 。

1. 檢查 **多重要素驗證 (MFA)** 下方，查看 MFA 是否已啟用或停用。如果 MFA 尚未啟動，則會顯示提醒符號 (![\[Alert icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-alert-icon.console.png)) 

如果您想要啟用 MFA 帳戶，請參閱下列其中一項：
+ [針對根使用者啟用虛擬 MFA 裝置 (主控台)](enable-virt-mfa-for-root.md)
+ [為根使用者啟用通行密鑰或安全金鑰 (主控台)](enable-fido-mfa-for-root.md)
+ [針對根使用者啟用硬體 TOTP 權杖 (主控台)](enable-hw-mfa-for-root.md)

**查看 IAM 使用者的 MFA 狀態**

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

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

1. 如有必要，請透過完成以下步驟將 **MFA** 欄新增到使用者表格：

   1. 在最右側的表格上方，選擇設定圖示 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在 **Manage Columns (管理欄)** 中，選取 **MFA**。

   1. (選用) 清除您不想在使用者資料表中顯示的任何資料欄標題的核取方塊。

   1. 選擇 **Close (關閉)** 返回使用者清單。

1. **MFA** 欄告訴您有關已啟用的 MFA 裝置。如果沒有給使用者作用中的 MFA 裝置，則主控台會顯示 **None (無)**。如果使用者已啟用 MFA 裝置，則 **MFA** 欄顯示啟用裝置的類型值為 **Virtual** (虛擬)、**Security Key** (安全金鑰)、**Hardware** (硬體) 或 **SMS**。
**注意**  
AWS 結束對啟用 SMS 多重要素驗證 (MFA) 的支援。建議擁有使用 SMS 簡訊式 MFA 的 IAM 使用者的客戶改為使用下列任一種替代方式：[虛擬 (軟體式) MFA 裝置](id_credentials_mfa_enable_virtual.md)、[FIDO 安全性金鑰](id_credentials_mfa_enable_fido.md)或[硬體 MFA 裝置](id_credentials_mfa_enable_physical.md)。您可以使用已分配的 SMS MFA 裝置來識別帳戶中的使用者。為此，請前往 IAM 主控台，從導覽窗格中選擇 **Users** (使用者)，然後在表的 **MFA** 列中尋找具有 **SMS** 的使用者。

1. 若要查看有關使用者的 MFA 裝置的其他資訊，請選擇要檢查其 MFA 狀態的使用者名稱。然後選擇 **Security credentials** (安全憑證) 索引標籤。

1. 如果沒有給使用者作用中的 MFA 裝置，則主控台會顯示 **無 MFA 裝置。在**多重要素驗證 (MFA) **區段中指派 MFA 裝置來改善 AWS 環境的安全性**。如果使用者有已啟用的 MFA 裝置，則 **Multi-factor authentication (MFA)** (多重要素驗證 (MFA)) 區段會顯示有關這些裝置的詳細資訊：
   + 裝置名稱
   + 裝置類型
   + 裝置識別符，例如實體裝置的序號或 AWS 虛擬裝置的 中的 ARN
   + 何時建立裝置

若要移除或重新同步裝置，請選擇裝置旁的選項按鈕，然後選取 **Remove** (移除) 或 **Resync** (重新同步)。

如需有關啟用 MFA 的詳細資訊，請參閱以下內容：
+ [在 中指派虛擬 MFA 裝置 AWS 管理主控台](id_credentials_mfa_enable_virtual.md)
+ [在 中指派通行金鑰或安全金鑰 AWS 管理主控台](id_credentials_mfa_enable_fido.md)
+ [在 中指派硬體 TOTP 字符 AWS 管理主控台](id_credentials_mfa_enable_physical.md)

# 重新同步虛擬和硬體 MFA 裝置
<a name="id_credentials_mfa_sync"></a>

您可以使用 AWS 來重新同步虛擬和硬體多重要素驗證 (MFA) 裝置。如果您的裝置在您嘗試使用時未同步，登入嘗試失敗，且 IAM 提示您重新同步裝置。

**注意**  
FIDO 安全性金鑰不會失去同步。若 FIDO 安全性金鑰遺失或損壞，您可以停用它。如需停用任何 MFA 裝置類型的說明，請參閱 [為另一個 IAM 使用者停用 MFA 裝置 (主控台)](id_credentials_mfa_disable.md#deactivate-mfa-for-user)。

身為 AWS 管理員，如果 IAM 使用者的虛擬和硬體 MFA 裝置不同步，您可以重新同步它們。

如果您的 AWS 帳戶根使用者 MFA 裝置無法運作，您可以使用 IAM 主控台重新同步裝置，無論是否完成登入程序。如果您無法成功重新同步處理裝置，您可能需要為裝置取消關聯，再重新關聯此裝置。如需如何執行此作業的資訊，請參閱 [停用 MFA 裝置](id_credentials_mfa_disable.md) 和 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

**Topics**
+ [必要許可](#id_credentials_mfa_sync_console-permissions-required)
+ [重新同步虛擬及硬體 MFA 裝置 (IAM 主控台)](#id_credentials_mfa_sync_console)
+ [重新同步虛擬及硬體 MFA 裝置 (AWS CLI)](#id_credentials_mfa_sync_cli)
+ [重新同步虛擬和硬體 MFA 裝置 (AWS API)](#id_credentials_mfa_sync_api)

## 必要許可
<a name="id_credentials_mfa_sync_console-permissions-required"></a>

若要為自己的 IAM 使用者重新同步虛擬或硬體 MFA 裝置，您必須擁有以下政策的許可。此政策不允許您建立或停用裝置。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowListActions",
            "Effect": "Allow",
            "Action": [
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowUserToViewAndManageTheirOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "BlockAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

------

## 重新同步虛擬及硬體 MFA 裝置 (IAM 主控台)
<a name="id_credentials_mfa_sync_console"></a>

您可以使用 IAM 主控台來重新同步虛擬及硬體 MFA 裝置。

**重新同步您 IAM 使用者的虛擬或硬體 MFA 裝置 (主控台)**

1. 使用 AWS 您的帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 [IAM 主控台](https://console.aws.amazon.com/iam)。
**注意**  
為了方便起見， AWS 登入頁面會使用瀏覽器 Cookie 來記住您的 IAM 使用者名稱和帳戶資訊。如果您先前以不同的使用者身分登入，請選擇在頁面底部附近的 **Sign in to a different account** (登入不同的帳戶)，返回主要登入頁面。在那裡，您可以輸入要重新導向至 AWS 您帳戶的 IAM 使用者登入頁面的帳戶 ID 或帳戶別名。

   若要取得您的 AWS 帳戶 ID，請聯絡您的管理員。

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

1. 在 **AWS IAM 憑證** 標籤的 **多重要素驗證 (MFA)** 區段選擇 MFA 裝置旁的選項按鈕，然後選擇 **重新同步**。

1. 將裝置接下來連續產生的兩個代碼輸入 **MFA code 1 (MFA 代碼 1)** 和 **MFA code 2 (MFA 代碼 2)**。然後選擇 **Resync** (重新同步)。
**重要**  
產生代碼之後立即提交您的請求。如果您產生代碼，然後等太久而無法提交請求、請求會出現運作，但裝置保持未同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。

**重新同步另一個 IAM 使用者的虛擬或硬體 MFA 裝置 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Users (使用者)**，然後選擇需要重新同步 MFA 裝置的使用者名稱。

1. 選擇 **Security credentials** (安全憑證) 索引標籤。在 **多重要素驗證 (MFA)** 區段中選擇 MFA 裝置旁的選項按鈕，然後選擇 **重新同步**。

1. 將裝置接下來連續產生的兩個代碼輸入 **MFA code 1 (MFA 代碼 1)** 和 **MFA code 2 (MFA 代碼 2)**。然後選擇 **Resync** (重新同步)。
**重要**  
產生代碼之後立即提交您的請求。如果您產生代碼，然後等太久而無法提交請求、請求會出現運作，但裝置保持未同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。

**登入前重新同步根使用者 MFA (主控台)**

1. 在 **Amazon Web Services Sign In With Authentication Device** (使用身分驗證裝置登入 Amazon Web Services) 頁面上，選擇 **Having problems with your authentication device? (您的身分驗證裝置登有問題？ )。Click here (請點選此處)**。
**注意**  
您可能會看到不同的文字，例如**使用 MFA 登入**和**對您的身分驗證裝置進行疑難排解**。不過，其功能是相同的。

1. 在 **Re-Sync With Our Servers (與我們的伺服器重新同步)** 區段中，將裝置接下來連續產生的兩個代碼輸入 **MFA code 1 (MFA 代碼 1)** 和 **MFA code 2 (MFA 代碼 2)**。然後選擇 **Re-sync authentication device (重新同步身分驗證裝置)**。

1. 如果必要，再次輸入密碼，然後選擇**登入**。然後，使用您的 MFA 裝置完成登入。

**登入後重新同步根使用者 MFA 裝置 (主控台)**

1. 選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者身分登入 [IAM 主控台](https://console.aws.amazon.com/iam/)。在下一頁中，輸入您的密碼。
**注意**  
根使用者無法登入 **以 IAM 使用者身分登入** 頁面。如果您看到 **以 IAM 使用者身分登入** 頁面，請選擇頁面底部附近的 **使用根使用者電子郵件登入**。如需以根使用者身分登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-          root-user-sign-in-tutorial.html) 。

1. 在導覽列右側選擇您的帳戶名稱，然後選擇 **安全憑證** 。如有需要，選擇 **Continue to Security Credentials** (繼續至安全憑證)。  
![\[在導覽選單中的安全憑證\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 展開頁面上的 **Multi-factor authentication (MFA)** (多重要素驗證 (MFA)) 區段。

1. 選擇裝置旁的選項按鈕，然後選取 **Resync** (重新同步)。

1. 在 **Resync MFA device** (重新同步 MFA 裝置) 對話方塊中，將裝置接下來連續產生的兩個代碼輸入 **MFA code 1** (MFA 代碼 1) 和 **MFA code 2** (MFA 代碼 2)。然後選擇 **Resync** (重新同步)。
**重要**  
產生代碼之後立即提交您的請求。如果在產生代碼後等待很長時間才提交請求，MFA 裝置會成功地與使用者建立關聯，但 MFA 裝置將不同步。會發生這種情況是因為定時式的一次性密碼 (TOTP) 在過了一小段時間後就會過期。

## 重新同步虛擬及硬體 MFA 裝置 (AWS CLI)
<a name="id_credentials_mfa_sync_cli"></a>

您可以從 AWS CLI重新同步虛擬及硬體 MFA 裝置。

**重新同步 IAM 使用者的虛擬或硬體 MFA 裝置 (AWS CLI)**  
在命令提示字元中，發出 [aws iam resync-mfa-device](https://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html) 命令：
+ 虛擬 MFA 裝置：將裝置的 Amazon Resource Name (ARN) 指定為序號。

  ```
  aws iam resync-mfa-device --user-name Richard --serial-number arn:aws:iam::123456789012:mfa/RichardsMFA --authentication-code1 123456 --authentication-code2 987654
  ```
+ 硬體 MFA 裝置：將硬體裝置的序號指定為序號。格式為廠商特定。例如，您可以從 Amazon 購買 gemalto 權杖。其序號通常是四個字母，後面接著四個數字。

  ```
  aws iam resync-mfa-device --user-name Richard --serial-number ABCD12345678 --authentication-code1 123456 --authentication-code2 987654
  ```

**重要**  
產生代碼之後立即提交您的請求。如果您產生代碼，然後因等太久而無法提交請求、請求會因代碼在不久後過期而失敗。

## 重新同步虛擬和硬體 MFA 裝置 (AWS API)
<a name="id_credentials_mfa_sync_api"></a>

IAM 有一個執行同步化的 API 呼叫。在這種情況下，建議您提供您的虛擬及硬體 MFA 裝置使用者許可，讓其存取此 API 呼叫。然後根據該 API 呼叫建置工具，讓使用者在需要時能隨時重新同步他們的裝置。

**重新同步 IAM 使用者 (AWS API) 的虛擬或硬體 MFA 裝置**
+ 傳送 [ResyncMFADevice](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResyncMFADevice.html) 請求。

# 停用 MFA 裝置
<a name="id_credentials_mfa_disable"></a>

如果您無法將多重要素驗證 (MFA) 裝置作為 IAM 使用者登入，請聯絡您的管理員尋求協助。

身為管理員，您可以停用另一個 IAM 使用者的裝置。這可讓使用者在不使用 MFA 的情況下登入。在更換 MFA 裝置或裝置暫時不可用時，您可以將此做為臨時解決方案。但是，我們建議您盡快為使用者啟用新的裝置。若要了解如何啟用新的 MFA 裝置，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

**注意**  
如果您使用 API AWS CLI 或 從中刪除使用者 AWS 帳戶，則必須停用或刪除使用者的 MFA 裝置。您將此變更做為移除使用者的過程的一部分。如需有關移除使用者的詳細資訊，請參閱 [移除或停用 IAM 使用者](id_users_remove.md)。

**Topics**
+ [停用 MFA 裝置 (主控台)](#deactive-mfa-console)
+ [停用 MFA 裝置 (AWS CLI)](#deactivate-mfa-cli)
+ [停用 MFA 裝置 (AWS API)](#deactivate-mfa-api)

## 停用 MFA 裝置 (主控台)
<a name="deactive-mfa-console"></a><a name="deactivate-mfa-for-user"></a>

**為另一個 IAM 使用者停用 MFA 裝置 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 若要為使用者停用 MFA 裝置，請選擇要移除其 MFA 的使用者的名稱。

1. 選擇 **Security credentials** (安全憑證) 索引標籤。

1. 在 **多重要素驗證 (MFA)** 下方選擇 MFA 裝置旁的選項按鈕、選擇 **移除**，然後選擇 **移除**。

   裝置已從中移除 AWS。在重新啟用請求並與 AWS 使用者或 建立關聯之前，它無法用來登入或驗證請求 AWS 帳戶根使用者。<a name="deactivate-mfa-for-root"></a>

**停用 AWS 帳戶根使用者 （主控台） 的 MFA 裝置**

1. 選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者身分登入 [IAM 主控台](https://console.aws.amazon.com/iam/)。在下一頁中，輸入您的密碼。
**注意**  
根使用者無法登入 **以 IAM 使用者身分登入** 頁面。如果您看到 **以 IAM 使用者身分登入** 頁面，請選擇頁面底部附近的 **使用根使用者電子郵件登入**。如需以根使用者身分登入的說明，請參閱*AWS 登入 《 使用者指南*》中的[以根使用者 AWS 管理主控台 身分登入](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-          root-user-sign-in-tutorial.html) 。

1. 在導覽列右側選擇您的帳戶名稱，然後選擇 **安全憑證** 。如有需要，選擇 **Continue to Security Credentials** (繼續至安全憑證)。  
![\[在導覽選單中的安全憑證\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 在 **Multi-factor authentication (MFA)** (多重要素驗證 (MFA)) 區段中，選擇您想要停用的 MFA 裝置旁的選項按鈕，然後選擇 **Remove** (移除)。

1. 選擇**移除**。

   已為 AWS 帳戶停用 MFA 裝置。檢查與您的 相關聯的電子郵件， AWS 帳戶 以取得來自 Amazon Web Services 的確認訊息。該電子郵件會通知您，Amazon Web Services 多重要素驗證 (MFA) 已停用。訊息來自於 `@amazon.com` 或 `@aws.amazon.com`。

**注意**  
當您透過 AWS 管理主控台 或在登入程序期間新增新的虛擬 MFA 裝置時， AWS 帳戶 將刪除 中未指派的虛擬 MFA 裝置。未指派的虛擬 MFA 裝置是指位於您帳戶中但帳戶根使用者或 IAM 使用者並未在登入程序中使用的裝置。將這些裝置刪除後，便可將新的虛擬 MFA 裝置新增至您的帳戶。刪除這些裝置後，您還可以重複使用裝置名稱。

## 停用 MFA 裝置 (AWS CLI)
<a name="deactivate-mfa-cli"></a>

**為 IAM 使用者停用 MFA 裝置 (AWS CLI)**
+ 執行此命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html)

## 停用 MFA 裝置 (AWS API)
<a name="deactivate-mfa-api"></a>

**停用 IAM 使用者的 MFA 裝置 (AWS API)**
+ 呼叫此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html)

# 在 IAM 中復原受 MFA 保護的身分
<a name="id_credentials_mfa_lost-or-broken"></a>

如果您的[虛擬 MFA 裝置](id_credentials_mfa_enable_virtual.md)或[硬體 TOTP 字符](id_credentials_mfa_enable_physical.md)似乎正常運作，但您無法使用它來存取您的 AWS 資源，則它可能會與 不同步 AWS。如需同步虛擬 MFA 裝置或硬體 MFA 裝置的資訊，請參閱 [重新同步虛擬和硬體 MFA 裝置](id_credentials_mfa_sync.md)。[FIDO 安全性金鑰](id_credentials_mfa_enable_fido.md)不會失去同步。

如果 AWS 帳戶根使用者 的 [MFA 裝置](id_credentials_mfa.md)遺失、損壞或無法運作，您可以復原對帳戶的存取。IAM 使用者必須聯絡管理員以停用裝置。

**重要**  
我們建議您啟用多個 MFA 裝置。註冊多個 MFA 裝置有助於確保在裝置遺失或損壞時持續存取。您的 AWS 帳戶根使用者 和 IAM 使用者可以註冊最多八個任何類型的 MFA 裝置。

## 先決條件 – 使用另一個 MFA 裝置
<a name="mfa-lost-or-broken-prerequisites"></a>

如果您的[多重要素驗證 (MFA) 裝置](id_credentials_mfa.md)遺失、損毀或無法運作，您可以使用另一個註冊到相同根使用者或 IAM 使用者的 MFA 裝置登入。

**若要使用另一個 MFA 裝置登入**

1. 使用您的 AWS 帳戶 ID 或帳戶別名和密碼登入 [AWS 管理主控台](url-comsole-domain;iam)。

1. 在**需要其他驗證**頁面或**多重要素驗證**頁面上，選擇**嘗試其他 MFA 方法**。

1. 使用您選取的 MFA 裝置類型進行驗證。

1. 下一個步驟根據您是否成功使用替代 MFA 裝置登入而有所不同。
   + 如果您已成功登入，您可以[重新同步虛擬和硬體 MFA 裝置](id_credentials_mfa_sync.md)，這可能會解決此問題。如果您的 MFA 裝置遺失或損壞，您可以予以停用。如需停用任何 MFA 裝置類型的說明，請參閱 [停用 MFA 裝置](id_credentials_mfa_disable.md)。
   + 如果您無法使用 MFA 登入，請使用[復原根使用者 MFA 裝置](#root-mfa-lost-or-broken)或[復原 IAM 使用者 MFA 裝置](#iam-user-mfa-lost-or-broken)中的步驟來復原受 MFA 保護的身分。



## 復原根使用者 MFA 裝置
<a name="root-mfa-lost-or-broken"></a>

如果無法透過 MFA 登入，您可以使用其他身分驗證方法進行登入，即採用您帳戶中註冊的電子郵件和主要聯絡人電話號碼進行身分驗證。

確認在使用其他驗證要素以根使用者身分登入之前，您可以存取與您的帳戶關聯的電子郵件和主要聯絡人電話號碼。如果需要更新主要聯絡人電話號碼，請使用*管理員*存取權 (而非根使用者) 以 IAM 使用者的身分登入。如需了解有關更新帳戶聯絡人資訊的更多指示，請參閱 *AWS Billing 使用者指南*中的[編輯聯絡人資訊](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact-primary.html)。如果無權存取電子郵件和主要聯絡人電話號碼，則您必須聯絡 [AWS 支援](https://support.aws.amazon.com/#/contacts/aws-mfa-support)。

**重要**  
建議您保持電子郵件地址及聯絡人電話號碼與您的根使用者的關聯處於最新狀態，以成功地復原帳戶。如需詳細資訊，請參閱*《AWS 帳戶管理 參考指南》*中的[更新您 AWS 帳戶的主要連絡人](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact-primary.html)。

**使用身分驗證的替代因素做為 登入 AWS 帳戶根使用者**

1.  選擇**根使用者**並輸入 AWS 帳戶 您的電子郵件地址，以帳戶擁有者[AWS 管理主控台](https://console.aws.amazon.com/)身分登入 。在下一頁中，輸入您的密碼。

1. 在**需要其他驗證**頁面上，選取要用來進行驗證的 MFA 方法，然後選擇**下一步**。
**注意**  
您可能會看到替代文字，例如**使用 MFA 登入**、**對您的驗證裝置進行故障診斷**，或**對 MFA 進行故障診斷**，但功能是相同的。您不能使用其他驗證要素來驗證您的帳戶電子郵件地址和主要聯絡人電話號碼，請聯絡 [AWS 支援](https://support.aws.amazon.com/#/contacts/aws-mfa-support) 停用您的 MFA 裝置。

1. 視您使用的 MFA 類型而定，您會看到不同的頁面，但 **MFA 疑難排解**選項的功能相同。在**需要其他驗證**頁面或**多重要素驗證**頁面上，選擇 **MFA 疑難排解**。

1. 如果必要，再次輸入密碼，然後選擇 **Sign in (登入)**。

1. 在**使用其他驗證要素登入**區段中的**驗證裝置疑難排解**頁面上，選擇**使用其他要素登入**。

1. 在**使用其他驗證要素登入**頁面上，透過驗證電子郵件地址來驗證您的帳戶，然後選擇**傳送驗證電子郵件**。

1. 檢查與您的 相關聯的電子郵件 AWS 帳戶 是否有來自 Amazon Web Services (recover-mfa-no-reply@verify.signin.aws) 的訊息。請遵循電子郵件中的指示進行。

   如果您沒看到帳戶中有電子郵件，請檢查您的垃圾郵件資料夾，或返回瀏覽器，然後選擇 **Resend the email (重新傳送電子郵件)**。

1. 驗證電子郵件地址後，您可以繼續驗證您的帳戶。若要驗證主要聯絡人電話號碼，請選擇 **Call me now** (立即呼叫我)。

1. 接聽來自 的呼叫， AWS 並在出現提示時，在電話鍵盤上輸入網站上的 AWS 6 位數號碼。

   如果您沒有收到來自 的通話 AWS，請選擇**登入**以再次登入主控台並重新開始。或者，請參閱[遺失或無法使用的多重要素驗證 (MFA) 裝置](https://support.aws.amazon.com/#/contacts/aws-mfa-support)來聯絡支援中心以尋求協助。

1. 驗證您的電話號碼之後，您可以選擇 **Sign in to the console (登入主控台)** 登入您的帳戶。

1. 下一步取決於您使用的 MFA 類型：
   + 針對虛擬 MFA 裝置，請從您的裝置移除帳戶。然後，請前往 [AWS Security Credentials](https://console.aws.amazon.com/iam/home?#security_credential) (AWS 安全憑證) 頁面，並刪除舊 MFA 虛擬裝置實體，再建立新的實體。
   + 針對 FIDO 安全性金鑰，請前往 [AWS Security Credentials](https://console.aws.amazon.com/iam/home?#security_credential) (安全憑證) 頁面並停用舊 FIDO 安全性金鑰，然後再啟用新金鑰。
   + 針對硬體 TOTP 權杖，請聯絡第三方供應商，請其協助修復或更換裝置。您可以繼續使用其他身分驗證方法登入，直到收到新的裝置為止。擁有新的硬體 MFA 裝置之後，前往 [AWS 安全憑證](https://console.aws.amazon.com/iam/home?#security_credential)頁面，並刪除舊 MFA 裝置。
**注意**  
您無須將遺失或遭竊的 MFA 裝置更換成相同類型的裝置。例如，若您損壞了 FIDO 安全金鑰並訂購了新的金鑰，您可以使用虛擬 MFA 或硬體 TOTP 權杖，直到新的 FIDO 金鑰到達。

**重要**  
如果您的 MFA 裝置遺失或遭竊，請在登入並建立取代用 MFA 裝置後變更您的根使用者密碼。攻擊者可能竊取了驗證裝置，也可能擁有您目前的密碼。如需詳細資訊，請參閱[變更 的密碼 AWS 帳戶根使用者](root-user-password.md)。

## 復原 IAM 使用者 MFA 裝置
<a name="iam-user-mfa-lost-or-broken"></a>

如果您是無法使用 MFA 進行登入的 IAM 使用者，則無法自行復原 MFA 裝置。您必須聯絡管理員以停用裝置。然後，您就可以啟用新裝置。

**以 IAM 使用者身分取得 MFA 裝置的相關協助**

1. 請聯絡 AWS 管理員或為您提供 IAM 使用者使用者名稱和密碼的其他人員。管理員必須依 [停用 MFA 裝置](id_credentials_mfa_disable.md) 中所述停用 MFA 裝置，如此您才可以登入。

1. 下一步取決於您使用的 MFA 類型：
   + 針對虛擬 MFA 裝置，請從您的裝置移除帳戶。然後依 [在 中指派虛擬 MFA 裝置 AWS 管理主控台](id_credentials_mfa_enable_virtual.md) 所述啟用虛擬裝置。
   + 針對 FIDO 安全金鑰，請聯絡第三方供應商，請其協助更換裝置。當您收到新的 FIDO 安全性金鑰時，請遵循 [在 中指派通行金鑰或安全金鑰 AWS 管理主控台](id_credentials_mfa_enable_fido.md) 中所述的程序來啟用它。
   + 針對硬體 TOTP 權杖，請聯絡第三方供應商，請其協助修復或更換裝置。在擁有新的實體 MFA 裝置後，依 [在 中指派硬體 TOTP 字符 AWS 管理主控台](id_credentials_mfa_enable_physical.md) 所述啟用裝置。
**注意**  
您無須將遺失或遭竊的 MFA 裝置更換成相同類型的裝置。您最多可以有八台任意組合的 MFA 裝置。例如，若您損壞了 FIDO 安全金鑰並訂購了新的金鑰，您可以使用虛擬 MFA 或硬體 TOTP 權杖，直到新的 FIDO 金鑰到達。

1. 若您的 MFA 裝置遺失或遭竊，請同時變更您的 密碼，以防攻擊者竊取身分驗證裝置，同時還可能擁有您目前的密碼。如需詳細資訊，請參閱[管理 IAM 使用者的密碼](id_credentials_passwords_admin-change-user.md)

# 透過 MFA 實現安全的 API 存取
<a name="id_credentials_mfa_configure-api-require"></a>

利用 IAM 政策，可以指定允許使用者呼叫的 API 操作。您可以套用額外安全性，方法是先要求使用者透過多重要素驗證 (MFA) 進行身分驗證，然後再允許使用者執行特別敏感的動作。

例如，您可能擁有允許使用者執行 Amazon EC2 `RunInstances`、`DescribeInstances` 與 `StopInstances` 動作的政策。但您可能想要限制類似 的破壞性動作，`TerminateInstances`並確保使用者只有在使用 AWS MFA 裝置進行身分驗證時，才能執行該動作。

**Topics**
+ [概觀](#MFAProtectedAPI-overview)
+ [使用案例：跨帳戶委派的 MFA 防護](#MFAProtectedAPI-cross-account-delegation)
+ [使用案例：目前帳戶中 API 操作存取的 MFA 防護](#MFAProtectedAPI-user-mfa)
+ [使用案例：擁有以資源為基礎的政策之資源的 MFA 防護](#MFAProtectedAPI-resource-policies)

## 概觀
<a name="MFAProtectedAPI-overview"></a>

新增 MFA 防護到 API 操作將包括以下任務：

1. 管理員會為每個必須提出需要 AWS MFA 身分驗證之 API 請求的使用者設定 MFA 裝置。如需詳細資訊，請參閱[AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

1. 管理員會為使用者建立政策，其中包含檢查使用者是否使用 AWS MFA 裝置進行身分驗證的 `Condition` 元素。

1. 使用者呼叫其中一個支援 MFA 參數的 AWS STS API 操作：[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 或 [GetSessionToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html)。作為呼叫的一部分，使用者包含與其關聯的裝置的裝置識別碼。使用者也包含裝置產生之以時間為基礎的單次密碼 (TOTP)。在任一情況下，使用者都會取回稍後用來向 AWS發出其他請求的臨時安全憑證。
**注意**  
只有在服務支援臨時安全憑證時，才可使用該服務的 API 操作的 MFA 防護。如需這些服務的清單，請參閱[使用暫時安全憑證存取 AWS](https://docs.aws.amazon.com/STS/latest/UsingSTS/UsingTokens.html)。

如果授權失敗， 會 AWS 傳回存取遭拒錯誤訊息 （如同任何未經授權的存取）。使用受 MFA 保護的 API 政策時，如果使用者嘗試在沒有有效 MFA 身分驗證的情況下呼叫 API 操作， 會 AWS 拒絕存取政策中指定的 API 操作。如果 API 操作請求的時間戳記在政策中指定的允許範圍之外，也會拒絕該操作。使用者必須使用 MFA 代碼和裝置序號來請求新的臨時安全性憑證，並透過 MFA 重新進行身分驗證。

### 含有 MFA 條件的 IAM 政策
<a name="MFAProtectedAPI-policies"></a>

含有 MFA 條件的政策可連接到以下項目：
+ IAM 使用者或群組
+ 資源，例如 Amazon S3 儲存貯體、Amazon SQS 佇列或者 Amazon SNS 主題
+ 可由使用者擔任的 IAM 角色的信任政策

可使用政策中的 MFA 條件來檢查以下屬性：
+ 存在 - 如果只是驗證使用者是否已使用 MFA 進行身分驗證，請檢查 `aws:MultiFactorAuthPresent` 金鑰在 `Bool` 條件中是否為 `True`。只有在使用者使用短期憑證進行驗證時，索引鍵才會存在。長期憑證，例如存取金鑰，則不包括此鍵。
+ 持續時間 - 如果您只希望在 MFA 身分驗證後的指定時間內授予存取權限，請使用數值條件類型將 `aws:MultiFactorAuthAge` 索引鍵的有效期與某個值 (如 3600 秒) 進行比較。請注意，如果未使用 MFA，則 `aws:MultiFactorAuthAge` 索引鍵不會顯示。

以下範例顯示 IAM 角色的信任政策，該政策包含一個 MFA 條件，用於測試是否存在 MFA 身分驗證。使用此政策，來自 `Principal`元素中 AWS 帳戶 指定 (`ACCOUNT-B-ID`以有效的 AWS 帳戶 ID 取代） 的使用者可以擔任此政策所連接的角色。不過，如果使用者使用 MFA 進行身分驗證，這類的使用者只能擔任該角色。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {"AWS": "ACCOUNT-B-ID"},
    "Action": "sts:AssumeRole",
    "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
  }
}
```

------

如需有關 MFA 條件類型的詳細資訊，請參閱[AWS 全域條件內容索引鍵](reference_policies_condition-keys.md)、[數位條件運算子](reference_policies_elements_condition_operators.md#Conditions_Numeric) 與 [用於檢查條件索引鍵是否存在的條件運算子](reference_policies_elements_condition_operators.md#Conditions_Null)。

### 在 GetSessionToken 和 AssumeRole 之間選擇
<a name="scenarios"></a>

AWS STS 提供兩種 API 操作，可讓使用者傳遞 MFA 資訊： `GetSessionToken`和 `AssumeRole`。使用者呼叫以獲取臨時安全憑證的 API 操作取決於適用於以下哪個案例。

**針對以下案例使用 `GetSessionToken`：**
+ 呼叫 API 操作，以存取 AWS 帳戶 與發出請求的 IAM 使用者相同的 中的資源。請注意，*只有在*`GetSessionToken`憑證請求中包含 MFA 資訊時，請求中的臨時憑證才能存取 IAM 和 AWS STS API 操作。由於 `GetSessionToken` 傳回的臨時憑證包含 MFA 資訊，因此您可以檢查由該憑證發出的個別 API 操作中的 MFA。
+ 存取受到以資源為基礎且包含 MFA 條件的政策所保護的資源。

`GetSessionToken` 操作的目的是使用 MFA 驗證使用者的身分。您不能使用政策來控制驗證操作。

**針對以下案例使用 `AssumeRole`：**
+ 呼叫存取相同的或不同的 AWS 帳戶中的資源的 API 操作。API 呼叫可以包含任何 IAM 或 AWS STS API。請注意，要保護存取，您可以在使用者擔任角色時強制執行 MFA。由 `AssumeRole` 傳回的臨時憑證未將 MFA 資訊包含在上下文中，因此您無法檢查 MFA 的單一 API 操作。這就是您必須使用 `GetSessionToken` 限制對受到以資源為基礎之政策保護的資源的存取的原因。

**注意**  
AWS CloudTrail 當 IAM 使用者使用 MFA 登入時， 日誌將包含 MFA 資訊。如果 IAM 使用者擔任 IAM 角色，CloudTrail 也會將 `mfaAuthenticated: true` 記錄在使用該擔任角色執行的動作的 `sessionContext` 屬性中。不過，CloudTrail 記錄與使用擔任角色的憑證進行 API 呼叫時 IAM 所需的記錄是分開的。如需詳細資訊，請參閱 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com//awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

本文件稍後將提供有關如何實施這些使用案例的詳細資訊。

### 有關受 MFA 保護的 API 存取的要點
<a name="MFAProtectedAPI-important-points"></a>

瞭解 API 操作的 MFA 防護有下列數個層面非常重要：
+ MFA 防護僅透過使用臨時安全性憑證供，而該憑證必須使用 `AssumeRole` 或 `GetSessionToken` 來取得。
+ 您無法搭配 AWS 帳戶根使用者 登入資料使用受 MFA 保護的 API 存取。
+ 無法搭配 U2F 安全性金鑰使用受 MFA 保護的 API 存取。
+ 聯合身分使用者無法獲指派 MFA 裝置以搭配 AWS 服務使用，因此無法存取 MFA 控制 AWS 的資源。(請查看下一要點。) 
+ 傳回暫時登入資料的其他 AWS STS API 操作不支援 MFA。對於 `AssumeRoleWithWebIdentity`和 `AssumeRoleWithSAML`，使用者由外部提供者進行驗證， AWS 無法判斷該提供者是否需要 MFA。對於 `GetFederationToken`，MFA 不一定要與特定使用者相關聯。
+ 同樣地，長期憑證 (IAM 使用者存取金鑰和根使用者存取金鑰) 無法用於受 MFA 保護的 API 存取，因為此類憑證不會過期。
+ 也可以在沒有 MFA 資訊的情況下呼叫 `AssumeRole` 與 `GetSessionToken`。在此情況下，呼叫者將取回臨時安全性憑證，但這些臨時憑證的工作階段資訊不會顯示使用 MFA 進行身分驗證的使用者。
+ 若要建立 API 操作的 MFA 防護，可將 MFA 條件加入到政策。政策必須包含 `aws:MultiFactorAuthPresent` 條件索引鍵，才能強制使用 MFA。對於跨帳戶委派，該角色的信任政策必須包含條件索引鍵。
+ 當您允許另一個 AWS 帳戶 存取您帳戶中的資源時，資源的安全性取決於受信任帳戶的組態 （另一個帳戶，而不是您的帳戶）。即使您要求多重要素驗證，也是如此。有權建立虛擬 MFA 裝置的可信帳戶中的任何身分都可以建構 MFA 宣告，以滿足角色信任政策的該部分。在允許另一個帳戶的成員存取需要多重要素驗證 AWS 的資源之前，您應該確保信任帳戶的擁有者遵循安全最佳實務。例如，信任的帳戶應該限制存取敏感 API 操作 (例如 MFA 裝置管理 API 操作) 至特定的信任身分。
+ 如果政策包含 MFA 條件，則在以下情況下將拒絕請求：使用者未進行 MFA 身分驗證或使用者提供了無效的 MFA 裝置識別碼或無效的 TOTP。

## 使用案例：跨帳戶委派的 MFA 防護
<a name="MFAProtectedAPI-cross-account-delegation"></a>

在此案例中，您想要將存取權委派給另一個帳戶中的 IAM 使用者，但前提是使用者已使用 AWS MFA 裝置進行身分驗證。如需有關跨帳戶委派的詳細資訊，請參閱 [角色術語和概念](id_roles.md#id_roles_terms-and-concepts)。

假設您有一個帳戶 A (擁有要存取的資源的信任帳戶)，其 IAM 使用者 Anaya 擁有管理員許可。她希望對帳戶 B (可信任的帳戶) 中的使用者 Richard 授予存取權，但希望確保 Richard 在擔任該角色之前已使用 MFA 進行身分驗證。

1. 在信任帳戶 A 中，Anaya 會建立名為 的 IAM 角色，`CrossAccountRole`並將角色信任政策中的委託人設定為帳戶 B 的帳戶 ID。信任政策會將 AWS STS 許可授予 `AssumeRole`動作。Anaya 也將 MFA 條件加入到信任政策中，如以下範例中所示。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Allow",
       "Principal": {"AWS": "ACCOUNT-B-ID"},
       "Action": "sts:AssumeRole",
       "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
     }
   }
   ```

------

1. Anaya 在該角色新增一個許可政策，以指定允許該角色執行的操作。具有 MFA 防護的角色許可政策與任何其他角色許可政策沒有差別。以下範例顯示 Anaya 新增到角色的政策；它允許假定的使用者在帳戶 A 中的 `Books` 資料表上執行任何 Amazon DynamoDB 動作。此政策也允許 `dynamodb:ListTables` 動作，而這是在主控台中執行動作的必要項目。
**注意**  
該許可政策不包含 MFA 條件。了解 MFA 身分驗證僅用於確定使用者是否可以擔任此角色這點非常重要。在使用者擔任此角色後，將不會進行進一步的 MFA 檢查。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "TableActions",
               "Effect": "Allow",
               "Action": "dynamodb:*",
               "Resource": "arn:aws:dynamodb:*:111122223333:table/Books"
           },
           {
               "Sid": "ListTables",
               "Effect": "Allow",
               "Action": "dynamodb:ListTables",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在受信任帳戶 B 中，管理員會確定 IAM 使用者 Richard 已設定 AWS MFA 裝置，而且他知道裝置的 ID。如果是硬體 MFA 裝置，則裝置 ID 是序號，或如果是虛擬 MFA 裝置，裝置是 ARN。

1. 在帳戶 B 中，管理員將以下政策連接到使用者 Richard (或該使用者所在的群組)，該政策允許使用者呼叫 `AssumeRole` 動作。資源被設定到 Anaya 在第 1 步中所建立的角色 ARN。注意，該政策不包含 MFA 條件。

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

****  

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

------

1. 在帳戶 B 中，Richard (或 Richard 正在執行的應用程式) 呼叫 `AssumeRole`。API 呼叫包含要擔任角色的 ARN (`arn:aws:iam::ACCOUNT-A-ID:role/CrossAccountRole`)、MFA 裝置的 ID 和 Richard 從其裝置中取得的目前 TOTP。

   當 Richard 呼叫 時`AssumeRole`， AWS 判斷他是否擁有有效的登入資料，包括 MFA 的需求。如果是這種情況，Richard 將成功取得角色，並且可在使用角色的臨時憑證時對帳戶 A 中名為 `Books` 的表格執行任何 DynamoDB 動作。

   有關呼叫 `AssumeRole` 的程式之範例，請參閱 [使用 MFA 身分驗證呼叫 AssumeRole](id_credentials_mfa_sample-code.md#MFAProtectedAPI-example-assumerole)。

## 使用案例：目前帳戶中 API 操作存取的 MFA 防護
<a name="MFAProtectedAPI-user-mfa"></a>

在此案例中，您應該確保 中的使用者只有在使用 AWS MFA 裝置驗證使用者時 AWS 帳戶 ，才能存取敏感的 API 操作。

假設您擁有帳戶 A，其中包含一組需要使用 EC2 執行個體的開發人員。普通開發人員可以使用執行個體，但他們未獲得 `ec2:StopInstances` 或 `ec2:TerminateInstances` 操作的許可。您希望僅允許幾個可信任的使用者執行這些「破壞性」特權操作，因此您將 MFA 防護加入到允許這些敏感 Amazon EC2 動作的政策中。

在此使用案例中，使用者 Sofía 是可信任的使用者之一。使用者 Anaya 是帳戶 A 中的管理員。

1. Anaya 確保 Sofía 已設定 AWS MFA 裝置，且 Sofía 知道裝置的 ID。如果是硬體 MFA 裝置，則裝置 ID 是序號，或如果是虛擬 MFA 裝置，裝置是 ARN。

1. Anaya 建立一個名為 `EC2-Admins` 的群組並將使用者 Sofía 加入到該群組中。

1. Anaya 將以下政策連接到 `EC2-Admins` 群組。此政策授予使用者呼叫 Amazon EC2 `StopInstances` 與 `TerminateInstances` 動作的許可，但前提是該使用者已使用 MFA 進行身分驗證。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Action": [
         "ec2:StopInstances",
         "ec2:TerminateInstances"
       ],
       "Resource": ["*"],
       "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
     }]
   }
   ```

------

1. 
**注意**  
要讓此政策生效，使用者必須先登出，然後再次登入。

   如果使用者 Sofía 需要停止或終止 Amazon EC2 執行個體，她 (或執行中的應用程式) 會呼叫 `GetSessionToken`。此 API 操作傳遞 MFA 裝置的 ID，以及 Sofía 從其裝置取得的目前 TOTP。

1. 使用者 Sofía (或 Sofía 正在使用的應用程式) 使用由 `GetSessionToken` 提供的臨時憑證來呼叫 Amazon EC2 `StopInstances` 或者 `TerminateInstances` 動作。

   有關呼叫 `GetSessionToken` 的程式之範例，請參閱本文件後述的 [使用 MFA 身分驗證呼叫 GetSessionToken](id_credentials_mfa_sample-code.md#MFAProtectedAPI-example-getsessiontoken)。

## 使用案例：擁有以資源為基礎的政策之資源的 MFA 防護
<a name="MFAProtectedAPI-resource-policies"></a>

在此案例中，您是 S3 儲存貯體、SQS 佇列或 SNS 主題的擁有者。您想要確保來自任何存取資源 AWS 帳戶 的使用者都經過 AWS MFA 裝置驗證。

此使用案例介紹了一種提供跨帳戶 MFA 防護的方法，無需使用者先擔任角色。在此情況下，若符合三個條件，使用者便可存取資源。使用者必須通過 MFA 的身分驗證，能夠從 `GetSessionToken` 取得臨時安全性憑證，並且在資源政策所信任的帳戶中。

假設您在帳戶 A 中並建立一個 S3 儲存貯體。您想要將此儲存貯體的存取權授予位於數個不同 中的使用者 AWS 帳戶，但前提是這些使用者已使用 MFA 進行身分驗證。

在此方案中，使用者 Anaya 是帳戶 A 中的管理員。使用者 Nikhil 是帳戶 C 中的 IAM 使用者。

1. 在帳戶 A 中，Anaya 建立一個名為 `Account-A-bucket` 的儲存貯體。

1. Anaya 將儲存貯體政策加入到儲存貯體。該政策允許帳戶 A、帳戶 B 或帳戶 C 中的所有使用者執行儲存貯體中的 Amazon S3 `PutObject` 和 `DeleteObject` 動作。該政策包含 MFA 條件。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Principal": {"AWS": [
         "ACCOUNT-A-ID",
         "ACCOUNT-B-ID",
         "ACCOUNT-C-ID"
       ]},
       "Action": [
         "s3:PutObject",
         "s3:DeleteObject"
       ],
       "Resource": ["arn:aws:s3:::ACCOUNT-A-BUCKET-NAME/*"],
       "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
     }]
   }
   ```

------
**注意**  
Amazon S3 (僅) 針對*根*帳戶存取提供「MFA 刪除」功能。在您設定儲存貯體的版本控制狀態時，可啟用 Amazon S3 MFA Delete 功能。Amazon S3 MFA Delete 功能不適用於 IAM 使用者，在管理時獨立於 MFA 防護的 API 存取。即使 IAM 使用者有刪除儲存貯體的許可，但在啟用 Amazon S3 MFA Delete 功能時，也無法執行刪除。如需有關 Amazon S3 MFA Delete 的詳細資訊，請參閱 [MFA Delete](https://docs.aws.amazon.com/AmazonS3/latest/dev/MultiFactorAuthenticationDelete.html)。

1. 在帳戶 C 中，管理員確定使用者 Nikhil 以 AWS MFA 裝置設定，而且知道裝置的 ID。如果是硬體 MFA 裝置，則裝置 ID 是序號，或如果是虛擬 MFA 裝置，裝置是 ARN。

1. 在帳戶 C 中，Nikhil (或該使用者正在執行的應用程式) 呼叫 `GetSessionToken`。此呼叫包括 MFA 裝置的 ID 或 ARN 以及 Nikhil 從其裝置中取得的目前 TOTP。

1. Nikhil (或 Nikhil 正在使用的應用程式) 使用由 `GetSessionToken` 傳回的暫時憑證來呼叫 Amazon S3 `PutObject` 動作，上傳檔案到 `Account-A-bucket`。

   有關呼叫 `GetSessionToken` 的程式之範例，請參閱本文件後述的 [使用 MFA 身分驗證呼叫 GetSessionToken](id_credentials_mfa_sample-code.md#MFAProtectedAPI-example-getsessiontoken)。
**注意**  
`AssumeRole` 傳回的暫時憑證在此案例中則不會運作。雖然使用者可以提供 MFA 資訊以取得角色，`AssumeRole` 傳回的暫時憑證不會包含 MFA 資訊。有了這項資訊，才能符合政策中的 MFA 條件。

# 範本程式碼：使用多重要素驗證請求憑證
<a name="id_credentials_mfa_sample-code"></a>

以下範例顯示如何呼叫 `GetSessionToken` 和 `AssumeRole` 操作，並傳遞 MFA 驗證參數。呼叫 `GetSessionToken` 不需要許可，但您必須擁有一個可讓您呼叫 `AssumeRole` 的政策。傳回的憑證隨後用於列出帳戶中的所有 S3 儲存貯體。

## 使用 MFA 身分驗證呼叫 GetSessionToken
<a name="MFAProtectedAPI-example-getsessiontoken"></a>

以下範例說明如何呼叫 `GetSessionToken` 並傳遞 MFA 身分驗證資訊。然後，由 `GetSessionToken` 操作傳回的臨時安全憑證用於列出帳戶中的所有 S3 儲存貯體。

連接到執行此程式碼的使用者的政策 (或群組中的使用者)，會針對傳回的臨時憑證提供許可。對於此範本程式碼，政策必須授予使用者許可來請求 Amazon S3 `ListBuckets` 操作。

下列程式碼範例示範如何使用 `GetSessionToken`。

------
#### [ CLI ]

**AWS CLI**  
**為 IAM 身分取得一組短期憑證**  
下列 `get-session-token` 命令會為進行呼叫的 IAM 身分擷取一組短期憑證。產生的憑證可用於政策要求多重要素驗證 (MFA) 的請求。憑證會在產生後的 15 分鐘過期。  

```
aws sts get-session-token \
    --duration-seconds 900 \
    --serial-number "YourMFADeviceSerialNumber" \
    --token-code 123456
```
輸出：  

```
{
    "Credentials": {
        "AccessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
        "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE",
        "Expiration": "2020-05-19T18:06:10+00:00"
    }
}
```
如需詳細資訊，請參閱《AWS IAM 使用者指南》**中的[請求臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken)。  
+  如需 API 詳細資訊，請參閱《AWS CLI 命令參考》**中的 [GetSessionToken](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/get-session-token.html)。

------
#### [ PowerShell ]

**Tools for PowerShell V4**  
**範例 1：傳回 `Amazon.RuntimeAWSCredentials` 執行個體，其中包含有效期為設定時間段的臨時憑證。從目前 Shell 預設值中推斷出用於請求臨時憑證的憑證。若要指定其他憑證，請使用 -ProfileName 或 -AccessKey/-SecretKey 參數。**  

```
Get-STSSessionToken
```
**輸出：**  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**範例 2：傳回 `Amazon.RuntimeAWSCredentials` 執行個體，其中包含有效期為一小時的臨時憑證。從指定的設定檔中取得用於提出請求的憑證。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile
```
**輸出：**  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**範例 3：使用在設定檔 'myprofilename' 中指定其憑證的帳戶關聯的 MFA 裝置識別碼和裝置提供的值，傳回 `Amazon.RuntimeAWSCredentials` 執行個體，其中包含有效期為一小時的臨時憑證。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile -SerialNumber YourMFADeviceSerialNumber -TokenCode 123456
```
**輸出：**  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
+  如需 API 詳細資訊，請參閱《AWS Tools for PowerShell Cmdlet 參考 (V4)》**中的 [GetSessionToken](https://docs.aws.amazon.com/powershell/v4/reference)。

**Tools for PowerShell V5**  
**範例 1：傳回 `Amazon.RuntimeAWSCredentials` 執行個體，其中包含有效期為設定時間段的臨時憑證。從目前 Shell 預設值中推斷出用於請求臨時憑證的憑證。若要指定其他憑證，請使用 -ProfileName 或 -AccessKey/-SecretKey 參數。**  

```
Get-STSSessionToken
```
**輸出：**  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**範例 2：傳回 `Amazon.RuntimeAWSCredentials` 執行個體，其中包含有效期為一小時的臨時憑證。從指定的設定檔中取得用於提出請求的憑證。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile
```
**輸出：**  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**範例 3：使用在設定檔 'myprofilename' 中指定其憑證的帳戶關聯的 MFA 裝置識別碼和裝置提供的值，傳回 `Amazon.RuntimeAWSCredentials` 執行個體，其中包含有效期為一小時的臨時憑證。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile -SerialNumber YourMFADeviceSerialNumber -TokenCode 123456
```
**輸出：**  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
+  如需 API 詳細資訊，請參閱《AWS Tools for PowerShell Cmdlet 參考 (V5)》**中的 [GetSessionToken](https://docs.aws.amazon.com/powershell/v5/reference)。

------
#### [ Python ]

**適用於 Python 的 SDK (Boto3)**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sts#code-examples)中設定和執行。
透過傳遞 MFA 字符取得工作階段字符，並使用它列出該帳戶的 Amazon S3 儲存貯體。  

```
def list_buckets_with_session_token_with_mfa(mfa_serial_number, mfa_totp, sts_client):
    """
    Gets a session token with MFA credentials and uses the temporary session
    credentials to list Amazon S3 buckets.

    Requires an MFA device serial number and token.

    :param mfa_serial_number: The serial number of the MFA device. For a virtual MFA
                              device, this is an Amazon Resource Name (ARN).
    :param mfa_totp: A time-based, one-time password issued by the MFA device.
    :param sts_client: A Boto3 STS instance that has permission to assume the role.
    """
    if mfa_serial_number is not None:
        response = sts_client.get_session_token(
            SerialNumber=mfa_serial_number, TokenCode=mfa_totp
        )
    else:
        response = sts_client.get_session_token()
    temp_credentials = response["Credentials"]

    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )

    print(f"Buckets for the account:")
    for bucket in s3_resource.buckets.all():
        print(bucket.name)
```
+  如需 API 詳細資訊，請參閱 *AWS SDK for Python (Boto3) API Reference* 中的 [GetSessionToken](https://docs.aws.amazon.com/goto/boto3/sts-2011-06-15/GetSessionToken)。

------

## 使用 MFA 身分驗證呼叫 AssumeRole
<a name="MFAProtectedAPI-example-assumerole"></a>

以下範例說明如何呼叫 `AssumeRole` 並傳遞 MFA 身分驗證資訊。然後，由 `AssumeRole` 傳回的臨時安全憑證用於列出帳戶中的所有 Amazon S3 儲存貯體。

如需有關此案例的詳細資訊，請參閱 [使用案例：跨帳戶委派的 MFA 防護](id_credentials_mfa_configure-api-require.md#MFAProtectedAPI-cross-account-delegation)。

下列程式碼範例示範如何使用 `AssumeRole`。

------
#### [ .NET ]

**適用於 .NET 的 SDK**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/STS#code-examples)中設定和執行。

```
using System;
using System.Threading.Tasks;
using Amazon;
using Amazon.SecurityToken;
using Amazon.SecurityToken.Model;

namespace AssumeRoleExample
{
    class AssumeRole
    {
        /// <summary>
        /// This example shows how to use the AWS Security Token
        /// Service (AWS STS) to assume an IAM role.
        ///
        /// NOTE: It is important that the role that will be assumed has a
        /// trust relationship with the account that will assume the role.
        ///
        /// Before you run the example, you need to create the role you want to
        /// assume and have it trust the IAM account that will assume that role.
        ///
        /// See https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html
        /// for help in working with roles.
        /// </summary>

        // A region property may be used if the profile or credentials loaded do not specify a region,
        // or to use a specific region.
        private static readonly RegionEndpoint REGION = RegionEndpoint.USWest2;

        static async Task Main()
        {
            // Create the SecurityToken client and then display the identity of the
            // default user.
            var roleArnToAssume = "arn:aws:iam::123456789012:role/testAssumeRole";

            var client = new Amazon.SecurityToken.AmazonSecurityTokenServiceClient(REGION);

            // Get and display the information about the identity of the default user.
            var callerIdRequest = new GetCallerIdentityRequest();
            var caller = await client.GetCallerIdentityAsync(callerIdRequest);
            Console.WriteLine($"Original Caller: {caller.Arn}");

            // Create the request to use with the AssumeRoleAsync call.
            var assumeRoleReq = new AssumeRoleRequest()
            {
                DurationSeconds = 1600,
                RoleSessionName = "Session1",
                RoleArn = roleArnToAssume
            };

            var assumeRoleRes = await client.AssumeRoleAsync(assumeRoleReq);

            // Now create a new client based on the credentials of the caller assuming the role.
            var client2 = new AmazonSecurityTokenServiceClient(credentials: assumeRoleRes.Credentials, REGION);

            // Get and display information about the caller that has assumed the defined role.
            var caller2 = await client2.GetCallerIdentityAsync(callerIdRequest);
            Console.WriteLine($"AssumedRole Caller: {caller2.Arn}");
        }
    }
}
```
+  如需 API 詳細資訊，請參閱 *適用於 .NET 的 AWS SDK API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/goto/DotNetSDKV3/sts-2011-06-15/AssumeRole)。

------
#### [ Bash ]

**AWS CLI 使用 Bash 指令碼**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/iam#code-examples)中設定和執行。

```
###############################################################################
# function iecho
#
# This function enables the script to display the specified text only if
# the global variable $VERBOSE is set to true.
###############################################################################
function iecho() {
  if [[ $VERBOSE == true ]]; then
    echo "$@"
  fi
}

###############################################################################
# function errecho
#
# This function outputs everything sent to it to STDERR (standard error output).
###############################################################################
function errecho() {
  printf "%s\n" "$*" 1>&2
}

###############################################################################
# function sts_assume_role
#
# This function assumes a role in the AWS account and returns the temporary
#  credentials.
#
# Parameters:
#       -n role_session_name -- The name of the session.
#       -r role_arn -- The ARN of the role to assume.
#
# Returns:
#       [access_key_id, secret_access_key, session_token]
#     And:
#       0 - If successful.
#       1 - If an error occurred.
###############################################################################
function sts_assume_role() {
  local role_session_name role_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function sts_assume_role"
    echo "Assumes a role in the AWS account and returns the temporary credentials:"
    echo "  -n role_session_name -- The name of the session."
    echo "  -r role_arn -- The ARN of the role to assume."
    echo ""
  }

  while getopts n:r:h option; do
    case "${option}" in
      n) role_session_name=${OPTARG} ;;
      r) role_arn=${OPTARG} ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done

  response=$(aws sts assume-role \
    --role-session-name "$role_session_name" \
    --role-arn "$role_arn" \
    --output text \
    --query "Credentials.[AccessKeyId, SecretAccessKey, SessionToken]")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-role operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}
```
+  如需 API 詳細資訊，請參閱《AWS CLI 命令參考》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/aws-cli/sts-2011-06-15/AssumeRole)。

------
#### [ C\$1\$1 ]

**適用於 C\$1\$1 的 SDK**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sts#code-examples)中設定和執行。

```
bool AwsDoc::STS::assumeRole(const Aws::String &roleArn,
                             const Aws::String &roleSessionName,
                             const Aws::String &externalId,
                             Aws::Auth::AWSCredentials &credentials,
                             const Aws::Client::ClientConfiguration &clientConfig) {
    Aws::STS::STSClient sts(clientConfig);
    Aws::STS::Model::AssumeRoleRequest sts_req;

    sts_req.SetRoleArn(roleArn);
    sts_req.SetRoleSessionName(roleSessionName);
    sts_req.SetExternalId(externalId);

    const Aws::STS::Model::AssumeRoleOutcome outcome = sts.AssumeRole(sts_req);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error assuming IAM role. " <<
                  outcome.GetError().GetMessage() << std::endl;
    }
    else {
        std::cout << "Credentials successfully retrieved." << std::endl;
        const Aws::STS::Model::AssumeRoleResult result = outcome.GetResult();
        const Aws::STS::Model::Credentials &temp_credentials = result.GetCredentials();

        // Store temporary credentials in return argument.
        // Note: The credentials object returned by assumeRole differs
        // from the AWSCredentials object used in most situations.
        credentials.SetAWSAccessKeyId(temp_credentials.GetAccessKeyId());
        credentials.SetAWSSecretKey(temp_credentials.GetSecretAccessKey());
        credentials.SetSessionToken(temp_credentials.GetSessionToken());
    }

    return outcome.IsSuccess();
}
```
+  如需 API 詳細資訊，請參閱 *適用於 C\$1\$1 的 AWS SDK API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/goto/SdkForCpp/sts-2011-06-15/AssumeRole)。

------
#### [ CLI ]

**AWS CLI**  
**擔任角色**  
下列 `assume-role` 命令會為 IAM 角色 `s3-access-example` 擷取一組短期憑證。  

```
aws sts assume-role \
    --role-arn arn:aws:iam::123456789012:role/xaccounts3access \
    --role-session-name s3-access-example
```
輸出：  

```
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA3XFRBF535PLBIFPI4:s3-access-example",
        "Arn": "arn:aws:sts::123456789012:assumed-role/xaccounts3access/s3-access-example"
    },
    "Credentials": {
        "SecretAccessKey": "9drTJvcXLB89EXAMPLELB8923FB892xMFI",
        "SessionToken": "AQoXdzELDDY//////////wEaoAK1wvxJY12r2IrDFT2IvAzTCn3zHoZ7YNtpiQLF0MqZye/qwjzP2iEXAMPLEbw/m3hsj8VBTkPORGvr9jM5sgP+w9IZWZnU+LWhmg+a5fDi2oTGUYcdg9uexQ4mtCHIHfi4citgqZTgco40Yqr4lIlo4V2b2Dyauk0eYFNebHtYlFVgAUj+7Indz3LU0aTWk1WKIjHmmMCIoTkyYp/k7kUG7moeEYKSitwQIi6Gjn+nyzM+PtoA3685ixzv0R7i5rjQi0YE0lf1oeie3bDiNHncmzosRM6SFiPzSvp6h/32xQuZsjcypmwsPSDtTPYcs0+YN/8BRi2/IcrxSpnWEXAMPLEXSDFTAQAM6Dl9zR0tXoybnlrZIwMLlMi1Kcgo5OytwU=",
        "Expiration": "2016-03-15T00:05:07Z",
        "AccessKeyId": "ASIAJEXAMPLEXEG2JICEA"
    }
}
```
該命令的輸出包含存取金鑰、私密金鑰以及可用來向 AWS進行驗證的工作階段字符。  
對於 AWS CLI 使用，您可以設定與角色相關聯的具名設定檔。當您使用設定檔時，CLI AWS 會呼叫 assume-role 並為您管理登入資料。如需詳細資訊，請參閱《[CLI 使用者指南》中的在 AWS CLI 中使用 IAM 角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)。 *AWS *  
+  如需 API 詳細資訊，請參閱《AWS CLI 命令參考》**中的 [AssumeRole](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)。

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sts#code-examples)中設定和執行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;
import software.amazon.awssdk.services.sts.model.StsException;
import software.amazon.awssdk.services.sts.model.AssumeRoleResponse;
import software.amazon.awssdk.services.sts.model.Credentials;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

/**
 * To make this code example work, create a Role that you want to assume.
 * Then define a Trust Relationship in the AWS Console. You can use this as an
 * example:
 *
 * {
 * "Version":"2012-10-17",		 	 	 
 * "Statement": [
 * {
 * "Effect": "Allow",
 * "Principal": {
 * "AWS": "<Specify the ARN of your IAM user you are using in this code example>"
 * },
 * "Action": "sts:AssumeRole"
 * }
 * ]
 * }
 *
 * For more information, see "Editing the Trust Relationship for an Existing
 * Role" in the AWS Directory Service guide.
 *
 * Also, set up your development environment, including your credentials.
 *
 * For information, see this documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class AssumeRole {
    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <roleArn> <roleSessionName>\s

                Where:
                    roleArn - The Amazon Resource Name (ARN) of the role to assume (for example, arn:aws:iam::000008047983:role/s3role).\s
                    roleSessionName - An identifier for the assumed role session (for example, mysession).\s
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String roleArn = args[0];
        String roleSessionName = args[1];
        Region region = Region.US_EAST_1;
        StsClient stsClient = StsClient.builder()
                .region(region)
                .build();

        assumeGivenRole(stsClient, roleArn, roleSessionName);
        stsClient.close();
    }

    public static void assumeGivenRole(StsClient stsClient, String roleArn, String roleSessionName) {
        try {
            AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                    .roleArn(roleArn)
                    .roleSessionName(roleSessionName)
                    .build();

            AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
            Credentials myCreds = roleResponse.credentials();

            // Display the time when the temp creds expire.
            Instant exTime = myCreds.expiration();
            String tokenInfo = myCreds.sessionToken();

            // Convert the Instant to readable date.
            DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                    .withLocale(Locale.US)
                    .withZone(ZoneId.systemDefault());

            formatter.format(exTime);
            System.out.println("The token " + tokenInfo + "  expires on " + exTime);

        } catch (StsException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}
```
+  如需 API 詳細資訊，請參閱 *AWS SDK for Java 2.x API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/goto/SdkForJavaV2/sts-2011-06-15/AssumeRole)。

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sts#code-examples)中設定和執行。
建立用戶端。  

```
import { STSClient } from "@aws-sdk/client-sts";
// Set the AWS Region.
const REGION = "us-east-1";
// Create an AWS STS service client object.
export const client = new STSClient({ region: REGION });
```
擔任 IAM 角色。  

```
import { AssumeRoleCommand } from "@aws-sdk/client-sts";

import { client } from "../libs/client.js";

export const main = async () => {
  try {
    // Returns a set of temporary security credentials that you can use to
    // access Amazon Web Services resources that you might not normally
    // have access to.
    const command = new AssumeRoleCommand({
      // The Amazon Resource Name (ARN) of the role to assume.
      RoleArn: "ROLE_ARN",
      // An identifier for the assumed role session.
      RoleSessionName: "session1",
      // The duration, in seconds, of the role session. The value specified
      // can range from 900 seconds (15 minutes) up to the maximum session
      // duration set for the role.
      DurationSeconds: 900,
    });
    const response = await client.send(command);
    console.log(response);
  } catch (err) {
    console.error(err);
  }
};
```
+  如需 API 詳細資訊，請參閱 *適用於 JavaScript 的 AWS SDK API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sts/command/AssumeRoleCommand)。

**SDK for JavaScript (v2)**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascript/example_code/sts#code-examples)中設定和執行。

```
// Load the AWS SDK for Node.js
const AWS = require("aws-sdk");
// Set the region
AWS.config.update({ region: "REGION" });

var roleToAssume = {
  RoleArn: "arn:aws:iam::123456789012:role/RoleName",
  RoleSessionName: "session1",
  DurationSeconds: 900,
};
var roleCreds;

// Create the STS service object
var sts = new AWS.STS({ apiVersion: "2011-06-15" });

//Assume Role
sts.assumeRole(roleToAssume, function (err, data) {
  if (err) console.log(err, err.stack);
  else {
    roleCreds = {
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken,
    };
    stsGetCallerIdentity(roleCreds);
  }
});

//Get Arn of current identity
function stsGetCallerIdentity(creds) {
  var stsParams = { credentials: creds };
  // Create STS service object
  var sts = new AWS.STS(stsParams);

  sts.getCallerIdentity({}, function (err, data) {
    if (err) {
      console.log(err, err.stack);
    } else {
      console.log(data.Arn);
    }
  });
}
```
+  如需 API 詳細資訊，請參閱 *適用於 JavaScript 的 AWS SDK API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/goto/AWSJavaScriptSDK/sts-2011-06-15/AssumeRole)。

------
#### [ PowerShell ]

**Tools for PowerShell V4**  
**範例 1：傳回一組臨時登入資料 （存取金鑰、私密金鑰和工作階段字符），可用於存取請求使用者通常無法存取 AWS 的資源一小時。傳回的憑證擁有所擔任角色之存取政策和提供的政策所允許的許可 (您無法使用提供的政策來授予超過所擔任角色之存取政策所定義的許可)。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -Policy "...JSON policy..." -DurationInSeconds 3600
```
**範例 2：傳回一組臨時憑證，有效期為一小時，這些憑證擁有所擔任角色之存取政策中定義的相同許可。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600
```
**範例 3：傳回一組臨時憑證，提供序號，以及與用於執行 cmdlet 之使用者憑證相關聯的 MFA 產生的權杖。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -SerialNumber "GAHT12345678" -TokenCode "123456"
```
**範例 4：傳回一組臨時憑證，這些臨時憑證擔任了客戶帳戶中定義的角色。對於第三方可以擔任的每個角色，客戶帳戶必須使用識別符來建立角色，必須在每次擔任角色時在 -ExternalId 參數中傳遞該識別符。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -ExternalId "ABC123"
```
+  如需 API 詳細資訊，請參閱《AWS Tools for PowerShell Cmdlet 參考 (V4)》**中的 [AssumeRole](https://docs.aws.amazon.com/powershell/v4/reference)。

**Tools for PowerShell V5**  
**範例 1：傳回一組臨時登入資料 （存取金鑰、私密金鑰和工作階段字符），可用於存取請求使用者通常無法存取 AWS 的資源一小時。傳回的憑證擁有所擔任角色之存取政策和提供的政策所允許的許可 (您無法使用提供的政策來授予超過所擔任角色之存取政策所定義的許可)。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -Policy "...JSON policy..." -DurationInSeconds 3600
```
**範例 2：傳回一組臨時憑證，有效期為一小時，這些憑證擁有所擔任角色之存取政策中定義的相同許可。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600
```
**範例 3：傳回一組臨時憑證，提供序號，以及與用於執行 cmdlet 之使用者憑證相關聯的 MFA 產生的權杖。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -SerialNumber "GAHT12345678" -TokenCode "123456"
```
**範例 4：傳回一組臨時憑證，這些臨時憑證擔任了客戶帳戶中定義的角色。對於第三方可以擔任的每個角色，客戶帳戶必須使用識別符來建立角色，必須在每次擔任角色時在 -ExternalId 參數中傳遞該識別符。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -ExternalId "ABC123"
```
+  如需 API 詳細資訊，請參閱《AWS Tools for PowerShell Cmdlet 參考 (V5)》**中的 [AssumeRole](https://docs.aws.amazon.com/powershell/v5/reference)。

------
#### [ Python ]

**適用於 Python 的 SDK (Boto3)**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sts#code-examples)中設定和執行。
擔任需要 MFA 字符的 IAM 角色，並使用暫時性憑證列出該帳戶的 Amazon S3 儲存貯體。  

```
def list_buckets_from_assumed_role_with_mfa(
    assume_role_arn, session_name, mfa_serial_number, mfa_totp, sts_client
):
    """
    Assumes a role from another account and uses the temporary credentials from
    that role to list the Amazon S3 buckets that are owned by the other account.
    Requires an MFA device serial number and token.

    The assumed role must grant permission to list the buckets in the other account.

    :param assume_role_arn: The Amazon Resource Name (ARN) of the role that
                            grants access to list the other account's buckets.
    :param session_name: The name of the STS session.
    :param mfa_serial_number: The serial number of the MFA device. For a virtual MFA
                              device, this is an ARN.
    :param mfa_totp: A time-based, one-time password issued by the MFA device.
    :param sts_client: A Boto3 STS instance that has permission to assume the role.
    """
    response = sts_client.assume_role(
        RoleArn=assume_role_arn,
        RoleSessionName=session_name,
        SerialNumber=mfa_serial_number,
        TokenCode=mfa_totp,
    )
    temp_credentials = response["Credentials"]
    print(f"Assumed role {assume_role_arn} and got temporary credentials.")

    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )

    print(f"Listing buckets for the assumed role's account:")
    for bucket in s3_resource.buckets.all():
        print(bucket.name)
```
+  如需 API 詳細資訊，請參閱 *AWS SDK for Python (Boto3) API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/goto/boto3/sts-2011-06-15/AssumeRole)。

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/iam#code-examples)中設定和執行。

```
  # Creates an AWS Security Token Service (AWS STS) client with specified credentials.
  # This is separated into a factory function so that it can be mocked for unit testing.
  #
  # @param key_id [String] The ID of the access key used by the STS client.
  # @param key_secret [String] The secret part of the access key used by the STS client.
  def create_sts_client(key_id, key_secret)
    Aws::STS::Client.new(access_key_id: key_id, secret_access_key: key_secret)
  end

  # Gets temporary credentials that can be used to assume a role.
  #
  # @param role_arn [String] The ARN of the role that is assumed when these credentials
  #                          are used.
  # @param sts_client [AWS::STS::Client] An AWS STS client.
  # @return [Aws::AssumeRoleCredentials] The credentials that can be used to assume the role.
  def assume_role(role_arn, sts_client)
    credentials = Aws::AssumeRoleCredentials.new(
      client: sts_client,
      role_arn: role_arn,
      role_session_name: 'create-use-assume-role-scenario'
    )
    @logger.info("Assumed role '#{role_arn}', got temporary credentials.")
    credentials
  end
```
+  如需 API 詳細資訊，請參閱 *適用於 Ruby 的 AWS SDK API Reference* 中的 [AssumeRole](https://docs.aws.amazon.com/goto/SdkForRubyV3/sts-2011-06-15/AssumeRole)。

------
#### [ Rust ]

**適用於 Rust 的 SDK**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/sts/#code-examples)中設定和執行。

```
async fn assume_role(config: &SdkConfig, role_name: String, session_name: Option<String>) {
    let provider = aws_config::sts::AssumeRoleProvider::builder(role_name)
        .session_name(session_name.unwrap_or("rust_sdk_example_session".into()))
        .configure(config)
        .build()
        .await;

    let local_config = aws_config::from_env()
        .credentials_provider(provider)
        .load()
        .await;
    let client = Client::new(&local_config);
    let req = client.get_caller_identity();
    let resp = req.send().await;
    match resp {
        Ok(e) => {
            println!("UserID :               {}", e.user_id().unwrap_or_default());
            println!("Account:               {}", e.account().unwrap_or_default());
            println!("Arn    :               {}", e.arn().unwrap_or_default());
        }
        Err(e) => println!("{:?}", e),
    }
}
```
+  如需 API 詳細資訊，請參閱《適用於 Rust 的AWS SDK API 參考》**中的 [AssumeRole](https://docs.rs/aws-sdk-sts/latest/aws_sdk_sts/client/struct.Client.html#method.assume_role)。

------
#### [ Swift ]

**適用於 Swift 的 SDK**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift/example_code/iam#code-examples)中設定和執行。

```
import AWSSTS

    public func assumeRole(role: IAMClientTypes.Role, sessionName: String)
        async throws -> STSClientTypes.Credentials
    {
        let input = AssumeRoleInput(
            roleArn: role.arn,
            roleSessionName: sessionName
        )
        do {
            let output = try await stsClient.assumeRole(input: input)

            guard let credentials = output.credentials else {
                throw ServiceHandlerError.authError
            }

            return credentials
        } catch {
            print("Error assuming role: ", dump(error))
            throw error
        }
    }
```
+  如需 API 詳細資訊，請參閱 *《適用於 Swift 的AWS SDK API 參考》*中的 [AssumeRole](https://sdk.amazonaws.com/swift/api/awssts/latest/documentation/awssts/stsclient/assumerole(input:))。

------

# IAM 使用者的服務特定憑證
<a name="id_credentials_service-specific-creds"></a>

服務特定的登入資料是專門為特定 AWS 服務設計的身分驗證機制。相較於標準登入資料，這些 AWS 登入資料提供簡化的身分驗證，並針對個別 AWS 服務的身分驗證需求量身打造。與可在多個 AWS 服務中使用的存取金鑰不同，服務特定的登入資料僅設計用於建立它們的服務。這種具有較強針對性的方法透過限制憑證的適用範圍來增強安全性。

服務特定憑證通常包含使用者名稱與密碼對，或根據特定服務的需求經格式化的專用 API 金鑰。在建立服務特定憑證時，它們預設為處於作用中狀態，並且可以立即使用。每個 IAM 使用者的每項受支援服務最多可以有兩組服務特定憑證。此限制可讓您在在需要時輪換至新集時維持一個作用中集。 AWS 目前支援下列服務的服務特定憑證：

## 何時使用服務特定的登入資料
<a name="id_credentials_service-specific-creds-usecase"></a>

服務特定的登入資料旨在與第三方程式庫、SDKs、工具或應用程式相容，這些應用程式本質上與 AWS 登入資料、 AWS 軟體SDKs或 AWS APIs 不相容。這類使用案例包括從自我託管的基礎設施或其他供應商託管 AWS 的服務遷移至 服務。

從頭開始，並盡可能使用臨時登入資料， AWS 例如 IAM 角色提供的臨時登入資料，以使用支援 AWS 臨時登入資料的 AWS SDK 或程式庫來驗證 AWS 服務。

## 輪換服務特定憑證
<a name="id_credentials_service-specific-creds-rotation"></a>

作為安全性最佳實務，請定期輪換服務特定憑證。若要在不中斷應用程式的情況下輪換憑證，請執行下列動作：

1. 為相同服務和 IAM 使用者再建立一組服務特定憑證

1. 更新所有應用程式以使用新憑證，並確認它們可正常運作

1. 將原始憑證的狀態變更為「非作用中」

1. 確認所有應用程式仍在正常運作

1. 確定不再需要非作用中的服務特定憑證後，將其刪除

## 監控服務特定憑證
<a name="id_credentials_service-specific-creds-monitoring"></a>

您可以使用 AWS CloudTrail 來監控帳戶中 AWS 服務特定登入資料的使用情況。若要檢視與服務特定憑證使用情況相關的 CloudTrail 事件，請檢閱 CloudTrail 日誌以取得使用憑證之服務的事件。如需詳細資訊，請參閱[使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)。

為提高安全性，請考慮設定 CloudWatch 警示，以便通知您特定的憑證使用模式，這些使用模式可能指示存在未經授權的存取或其他安全問題。如需詳細資訊，請參閱 *AWS CloudTrail User Guide* 中的 [Monitoring CloudTrail Log Files with Amazon CloudWatch Logs](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/monitor-cloudtrail-log-files-with-cloudwatch-logs.html)。

下列主題提供有關服務特定憑證的資訊。

**Topics**
+ [何時使用服務特定的登入資料](#id_credentials_service-specific-creds-usecase)
+ [輪換服務特定憑證](#id_credentials_service-specific-creds-rotation)
+ [監控服務特定憑證](#id_credentials_service-specific-creds-monitoring)
+ [Amazon Bedrock 和 Amazon CloudWatch Logs 的 API 金鑰](id_credentials_bedrock_cloudwatchlogs.md)
+ [將 IAM 與 Amazon Keyspaces (適用於 Apache Cassandra) 搭配使用](id_credentials_keyspaces.md)

# Amazon Bedrock 和 Amazon CloudWatch Logs 的 API 金鑰
<a name="id_credentials_bedrock_cloudwatchlogs"></a>

**注意**  
Amazon CloudWatch Logs API 金鑰目前可在預覽版中使用，並將於未來幾週正式推出。Amazon CloudWatch Logs API 金鑰與此頁面所述的 Amazon Bedrock 長期 API 金鑰非常相似。若要進一步了解 Amazon CloudWatch Logs 長期 API 金鑰，請參閱[使用 HLC 端點將日誌傳送至 Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_HLC_Endpoint.html)。

Amazon Bedrock 是一項全受管服務，提供來自領先 AI 公司和 Amazon 的基礎模型。您可以透過 AWS 管理主控台 和使用 AWS CLI或 AWS API 以程式設計方式存取 Amazon Bedrock。向 Amazon Bedrock 發出程式設計請求時，您可以使用[臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)或 Amazon Bedrock API 金鑰進行身分驗證。Amazon Bedrock 支援兩種類型的 API 金鑰：
+ **短期 API 金鑰** – 短期 API 金鑰是使用 AWS Signature 第 4 版的預先簽章 URL。短期 API 金鑰與產生 API 金鑰的身分憑證具有相同的許可和過期時間，有效期最長為 12 小時或主控台工作階段的剩餘時間，以較短者為準。您可以使用 Amazon Bedrock 主控台、Python 套件 `aws-bedrock-token-generator` 和其他程式設計語言套件來產生短期 API 金鑰。如需詳細資訊，請參閱 *Amazon Bedrock User Guide* 中的 [Generate Amazon Bedrock API keys for easy access to the Amazon Bedrock API](https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys.html)。
+ **長期 API 金鑰** – 長期 API 金鑰與 IAM 使用者相關聯，並使用 [IAM 服務特定的憑證](id_credentials_service-specific-creds.md)產生。這些憑證僅用於 Amazon Bedrock，並透過限制憑證範圍來增強安全性。您可以設定長期 API 金鑰的過期時間。您可以使用 IAM 或 Amazon Bedrock 主控台、CLI AWS 或 AWS API 來產生長期 API 金鑰。

IAM 使用者最多可以擁有兩個 Amazon Bedrock 長期 API 金鑰，方便您輪換安全金鑰。

當您產生長期 API 金鑰時， AWS 受管政策 [AmazonBedrockLimitedAccess](https://docs.aws.amazon.com/bedrock/latest/userguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonBedrockLimitedAccess) 會自動連接到 IAM 使用者。此政策授予對核心 Amazon Bedrock API 操作的存取權。如果需要額外的 Amazon Bedrock 存取權，您可以修改 IAM 使用者的許可。如需有關修改許可的資訊，請參閱[新增和移除 IAM 身分許可](access_policies_manage-attach-detach.md)。如需有關如何使用 Amazon Bedrock 金鑰的詳細資訊，請參閱 *Amazon Bedrock User Guide* 中的 [Use an Amazon Bedrock API key](https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html)。

**注意**  
與短期 API 金鑰相比，長期 API 金鑰的安全風險更高。建議盡可能使用短期 API 金鑰或臨時安全憑證。如果使用長期 API 金鑰，建議定期輪換金鑰。

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

必須先符合下列先決條件，才能使用 IAM 主控台來產生 Amazon Bedrock 長期 API 金鑰：
+ 用於與長期 API 金鑰建立關聯的 IAM 使用者。如需有關建立 IAM 使用者的說明，請參閱[在 中建立 IAM 使用者 AWS 帳戶](id_users_create.md)。
+ 請確定您擁有下列 IAM 政策許可，以便管理 IAM 使用者的服務特定憑證。此範例政策授予建立、列出、更新、刪除和重設服務特定憑證的許可。將 Resource 元素中的 `username` 值取代為將為其產生 Amazon Bedrock API 金鑰的 IAM 使用者名稱：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ManageBedrockServiceSpecificCredentials",
              "Effect": "Allow",
              "Action": [
                  "iam:CreateServiceSpecificCredential",
                  "iam:ListServiceSpecificCredentials",
                  "iam:UpdateServiceSpecificCredential",
                  "iam:DeleteServiceSpecificCredential",
                  "iam:ResetServiceSpecificCredential"
              ],
              "Resource": "arn:aws:iam::*:user/username"
          }
      ]
  }
  ```

------

## 產生 Amazon Bedrock 長期 API 金鑰 (主控台)
<a name="id_credentials_bedrock_console_create"></a>

**產生 Amazon Bedrock 長期 API 金鑰 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在 IAM 主控台的導覽面板中，選擇**使用者**。

1. 選擇要為其產生 Amazon Bedrock 長期 API 金鑰的 IAM 使用者。

1. 選擇**安全憑證**索引標籤。

1. 在 **Amazon Bedrock 的 API 金鑰**區段中，選擇**產生 API 金鑰**。

1. 對於 **API 金鑰過期**，請執行下列其中一項操作：
   + 選擇 API 金鑰的有效期：**1**、**5**、**30**、**90** 或 **365** 天。
   + 選擇**自訂持續時間**以指定自訂 API 金鑰過期日期。
   + 選取**永不過期** (不建議)

1. 選擇**產生 API 金鑰**。

1. 複製或下載您的 API 金鑰。這是您唯一可以檢視 API 金鑰值的機會。
**重要**  
請妥善儲存您的 API 金鑰。關閉此對話方塊之後，您將無法再次擷取此 API 金鑰。如果遺失或忘記私密存取金鑰，將無法擷取它。請改為建立新的存取金鑰，並停用舊金鑰。

## 產生 Amazon Bedrock 長期 API 金鑰 (AWS CLI)
<a name="id_credentials_bedrock_cli_create"></a>

若要使用 產生 Amazon Bedrock 長期 API 金鑰 AWS CLI，請使用下列步驟：

1. 使用 [create-user](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-user.html) 命令建立將與 Amazon Bedrock 搭配使用的 IAM 使用者：

   ```
   aws iam create-user \
       --user-name BedrockAPIKey_1
   ```

1. 使用 [ attach-user-policy ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-user-policy.html)命令將 AWS 受管政策`AmazonBedrockLimitedAccess`連接至 Amazon Bedrock IAM 使用者：

   ```
   aws iam attach-user-policy --user-name BedrockAPIKey_1 \
       --policy-arn arn:aws:iam::aws:policy/AmazonBedrockLimitedAccess
   ```

1. 使用 [create-service-specific-credential](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-service-specific-credential.html) 命令產生 Amazon Bedrock 長期 API 金鑰。對於憑證存留期，您可以指定 1-36600 天之間的任意值。如果未指定憑證存留期，則 API 金鑰將不會過期。

   若要產生有效期為 30 天的長期 API 金鑰：

   ```
   aws iam create-service-specific-credential \
       --user-name BedrockAPIKey_1 \
       --service-name bedrock.amazonaws.com \
       --credential-age-days 30
   ```

回應中傳回的 `ServiceApiKeyValue` 便是您的長期 Amazon Bedrock API 金鑰。請妥善儲存 `ServiceApiKeyValue` 值，因為您之後將無法再擷取它。

### 列出長期 API 金鑰 (AWS CLI)
<a name="id_credentials_bedrock_cli_list"></a>

若要列出特定使用者的 Amazon Bedrock 長期 API 金鑰中繼資料，請使用 [list-service-specific-credentials](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-service-specific-credentials.html) 命令與 `--user-name` 參數：

```
aws iam list-service-specific-credentials \
    --service-name bedrock.amazonaws.com \
    --user-name BedrockAPIKey_1
```

若要列出帳戶中的所有 Amazon Bedrock 長期 API 金鑰中繼資料，請使用 [list-service-specific-credentials](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-service-specific-credentials.html) 命令與 `--all-users` 參數：

```
aws iam list-service-specific-credentials \
    --service-name bedrock.amazonaws.com \
    --all-users
```

### 更新長期 API 金鑰的狀態 (AWS CLI)
<a name="id_credentials_bedrock_cli_update"></a>

若要更新 Amazon Bedrock 長期 API 金鑰的狀態，請使用 [update-service-specific-credential](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/update-service-specific-credential.html) 命令：

```
aws iam update-service-specific-credential \
    --user-name "BedrockAPIKey_1" \
    --service-specific-credential-id "ACCA1234EXAMPLE1234" \
    --status Inactive|Active
```

## 產生 Amazon Bedrock (AWS API) 的長期 API 金鑰
<a name="id_credentials_bedrock_api"></a>

您可以使用下列 API 操作來產生和管理 Amazon Bedrock 長期 API 金鑰：
+  [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceSpecificCredential.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceSpecificCredential.html) 
+  [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServiceSpecificCredentials.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServiceSpecificCredentials.html) 
+  [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateServiceSpecificCredential.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateServiceSpecificCredential.html) 
+  [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServiceSpecificCredential.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServiceSpecificCredential.html) 
+  [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResetServiceSpecificCredential.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResetServiceSpecificCredential.html) 

# 將 IAM 與 Amazon Keyspaces (適用於 Apache Cassandra) 搭配使用
<a name="id_credentials_keyspaces"></a>

Amazon Keyspaces (適用於 Apache Cassandra) 是一種可擴展、高可用性且受管的 Apache Cassandra 相容資料庫服務。您可以透過 AWS 管理主控台或以程式設計方式存取 Amazon Keyspaces。若要使用服務特定憑證以程式設計方式存取 Amazon Keyspaces，您可以使用 `cqlsh` 或開放原始碼 Cassandra 驅動程式。*服務特定的憑證*包括使用者名稱和密碼，例如 Cassandra 用於身分驗證和存取管理的使用者名稱和密碼。對於每位使用者，每個支援的服務最多可以有兩組服務特定憑證。

若要使用存取金鑰以程式設計方式 AWS 存取 Amazon Keyspaces，您可以使用 AWS SDK、 AWS Command Line Interface (AWS CLI) 或開放原始碼 Cassandra 驅動程式搭配 SigV4 外掛程式。若要進一步了解，請參閱《[Amazon Keyspaces （適用於 Apache Cassandra) 開發人員指南》中的建立和設定 Amazon Keyspaces 的 AWS 登入](https://docs.aws.amazon.com//keyspaces/latest/devguide/access.credentials.html)資料。 **

**注意**  
如果您打算只透過主控台與 Amazon Keyspaces 互動，則不需要產生服務特定的憑證。如需詳細資訊，請參閱《Amazon Keyspaces (適用於 Apache Cassandra) 開發人員指南》中的[使用主控台存取 Amazon Keyspaces](https://docs.aws.amazon.com/keyspaces/latest/devguide/console_keyspaces.html)。

如需有關存取 Amazon Keyspaces 所需許可的詳細資訊，請參閱 *Amazon Keyspaces (適用於 Apache Cassandra) 開發人員指南*中的 [Amazon Keyspaces (適用於 Apache Cassandra) 以身分為基礎的政策範例](https://docs.aws.amazon.com/keyspaces/latest/devguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-console)。

## 產生 Amazon Keyspaces 憑證 (主控台)
<a name="keyspaces_credentials_console"></a>

您可以使用 AWS 管理主控台 為您的 IAM 使用者產生 Amazon Keyspaces （適用於 Apache Cassandra) 憑證。

**產生 Amazon Keyspaces 服務特定的憑證 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Users** (使用者)，然後選擇需要憑證的使用者名稱。

1. 在 **Security Credentials** (安全憑證) 索引標籤的 **Credentials for Amazon Keyspaces (for Apache Cassandra)** (Amazon Keyspaces (適用於 Apache Cassandra) 憑證) 上，選擇 **Generate credentials **(產生憑證)。

1. 您的服務特定憑證現在可供使用。這是唯一可以檢視或下載密碼的機會。您稍後無法進行復原。不過，您可以隨時重設密碼。請將使用者和密碼儲存在安全的位置，因為稍後需要用到。

## 產生 Amazon Keyspaces 憑證 (AWS CLI)
<a name="keyspaces_credentials_cli"></a>

您可以使用 AWS CLI 為您的 IAM 使用者產生 Amazon Keyspaces （適用於 Apache Cassandra) 憑證。

**產生 Amazon Keyspaces 服務特定的憑證 (AWS CLI)**
+ 使用下列命令：
  + [aws iam create-service-specific-credential](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-specific-credential.html)

## 產生 Amazon Keyspaces 登入資料 (AWS API)
<a name="keyspaces_credentials_api"></a>

您可以使用 AWS API 為您的 IAM 使用者產生 Amazon Keyspaces （適用於 Apache Cassandra) 憑證。

**產生 Amazon Keyspaces 服務特定登入資料 (AWS API)**
+ 請完成下列操作：
  + [CreateServiceSpecificCredential](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceSpecificCredential.html) 

# 尋找未使用的 AWS 登入資料
<a name="id_credentials_finding-unused"></a>

若要提高 的安全性 AWS 帳戶，請移除不需要的 IAM 使用者登入資料 （即密碼和存取金鑰）。例如，當使用者離開您的組織或不再需要 AWS 存取時，請尋找他們正在使用的登入資料，並確保他們不再運作。在理想情況下，如果不再需要可刪除憑證。有需要時，您隨時可以在日後重新建立它們。至少您應變更密碼或停用存取金鑰，讓前任持有者無法再繼續存取。

當然，*未使用*的定義可能有所不同，通常表示在指定期間內未使用的憑證。

## 尋找未使用的密碼
<a name="finding-unused-passwords"></a>

您可以使用 AWS 管理主控台 檢視使用者的密碼使用資訊。如果您有大量的使用者，您可以使用主控台來下載憑證報告與有關每位使用者上次使用他們的主控台密碼的資訊。您也可以從 AWS CLI 或 IAM API 存取資訊。

**尋找未使用的密碼 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 如果必要，請將 **Console last sign-in (主控台上次登入)** 欄位新增到使用者表格：

   1. 在最右側的表格上方，選擇設定圖示 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在 **選取可見欄** 中選取 **主控台上次登入**。

   1. 選擇 **確認** 返回使用者清單。

1. **主控台上次登入**資料欄會顯示使用者上次 AWS 透過主控台登入 的日期。您可以使用此資訊來尋找其密碼超過指定期間都沒有登入的使用者。該欄位對於其密碼從未登入的使用者顯示 **Never (永不)**。**None (無)** 指出使用者無密碼。最近未使用的密碼可能就是待移除的項目。
**重要**  
由於服務問題，上次使用密碼的資料不包含從 2018 年 5 月 3 日 22:50 (太平洋日光時間) 到 2018 年 5 月 23 日 14:08 (太平洋日光時間) 使用的密碼。這會影響顯示於 IAM 主控台中的[前次登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_finding-unused.html)日期，以及在 [IAM 憑證報告](https://docs.aws.amazon.com/IAM/latest/UserGuide/SupportedTypes.xmlid_credentials_getting-report.html)中的最後使用密碼日期，並由 [GetUser API 操作](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html)傳回。如果使用者在受影響的時間登入，傳回的上次使用密碼的日期會是使用者最後一次在 2018 年 5 月 3 日之前登入的日期。對於在 2018 年 5 月 23 日 14:08 (太平洋日光時間) 之後登入的使用者，傳回的上次使用密碼日期會是準確的。  
如果您使用密碼上次使用的資訊來識別未使用的登入資料以供刪除，例如刪除 AWS 過去 90 天內未登入 的使用者，建議您調整評估時段以包含 2018 年 5 月 23 日之後的日期。或者，如果您的使用者使用存取金鑰以 AWS 程式設計方式存取 ，您可以參考存取金鑰上次使用的資訊，因為它在所有日期都是準確的。

**透過下載憑證報告尋找未使用的密碼 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Credential report (憑證報告)**。

1. 選擇 **Download Report (下載報告)** 以下載名稱為 `status_reports_<date>T<time>.csv` 的逗號分隔值 (CSV) 檔案。第五個欄位包含 `password_last_used` 欄與日期或以下其中一項：
   + **N/A** (無) – 完全沒有指派密碼的使用者。
   + **no\$1information** (無資訊) – 自從 IAM 在 2014 年 10 月 20 日開始追蹤密碼使用期限，未使用他們密碼的使用者。

**若要尋找未使用的密碼 (AWS CLI)**  
執行以下命令來尋找未使用的密碼：
+ `[aws iam list-users](https://docs.aws.amazon.com/cli/latest/reference/iam/list-users.html)` 傳回使用者清單，每個都有一個 `PasswordLastUsed` 值。如果缺少值，則表示使用者沒有密碼或者自從 IAM 在 2014 年 10 月 20 日開始追蹤密碼使用期限，未使用密碼。

**尋找未使用的密碼 (AWS API)**  
呼叫以下操作來尋找未使用的密碼：
+  ` [ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html)` 傳回使用者集合，每個選項都有 `<PasswordLastUsed>` 值。如果缺少值，則表示使用者沒有密碼或者自從 IAM 在 2014 年 10 月 20 日開始追蹤密碼使用期限，未使用密碼。

如需關於下載憑證報告的命令的資訊，請參閱[取得憑證報告 (AWS CLI)](id_credentials_getting-report.md#getting-credential-reports-cliapi)。

## 尋找未使用的存取金鑰
<a name="finding-unused-access-keys"></a>

您可以使用 AWS 管理主控台 來檢視使用者的存取金鑰用量資訊。如果您有大量的使用者，您可以使用主控台來下載憑證報告，以尋找每位使用者上次使用他們的存取金鑰的時間。您也可以從 AWS CLI 或 IAM API 存取資訊。

**尋找未使用的存取金鑰 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 如有必要，請將 **Access key last used** (上次使用的存取金鑰) 欄位新增到使用者表格：

   1. 在最右側的表格上方，選擇設定圖示 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在 **選取可見欄** 中選取 **存取金鑰上次使用時間**。

   1. 選擇 **確認** 返回使用者清單。

1. **上次使用的存取金鑰**欄會顯示自上次 AWS 以程式設計方式存取使用者以來的天數。您可以使用此資訊來尋找存取金鑰超過指定期間都沒有使用的使用者。該欄會向沒有存取金鑰的使用者顯示 **–**。最近未使用的存取金鑰可能就是待移除的項目。

**透過下載憑證報告尋找未使用的存取金鑰 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Credential Report (憑證報告)**。

1. 選擇 **Download Report (下載報告)** 以下載名稱為 `status_reports_<date>T<time>.csv` 的逗號分隔值 (CSV) 檔案。欄位 11 到 13 包含存取金鑰 1 上次使用的日期、區域和服務資訊。欄位 16 到 18 包含存取金鑰 2 的相同資訊。如果使用者沒有存取金鑰，或者使用者自從 IAM 在 2015 年 4 月 22 日開始追蹤存取金鑰使用期限均未使用存取金鑰，該值為 **N/A** (無)。

**若要尋找未使用的存取金鑰 (AWS CLI)**  
執行以下命令來尋找未使用的存取金鑰：
+ `[aws iam list-access-keys](https://docs.aws.amazon.com/cli/latest/reference/iam/list-access-keys.html)` 傳回有關使用者的存取金鑰的資訊，包括 `AccessKeyID`。
+ `[aws iam get-access-key-last-used](https://docs.aws.amazon.com/cli/latest/reference/iam/get-access-key-last-used.html)` 需要存取金鑰 ID 並會傳回輸出，其中包含上次使用存取金鑰的 `LastUsedDate`、`Region`，以及上次所請求服務的 `ServiceName`。如果缺少 `LastUsedDate`，則表示自從 IAM 在 2015 年 4 月 22 日開始追蹤存取金鑰使用期限均未使用存取金鑰。

**尋找未使用的存取金鑰 (AWS API)**  
呼叫以下操作來尋找未使用的存取金鑰：
+ `[ListAccessKeys](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html)` 傳回與指定的使用者關聯之存取金鑰的 `AccessKeyID` 值清單。
+ `[GetAccessKeyLastUsed](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html)` 需要存取金鑰 ID 並會傳回值集合。包含有是上次使用的存取金鑰的 `LastUsedDate`、`Region`，以及上次所請求服務的 `ServiceName`。如果缺少值，則表示使用者沒有存取金鑰，或者自從 IAM 在 2015 年 4 月 22 日開始追蹤存取金鑰使用期限均未使用存取金鑰。

如需關於下載憑證報告的命令的資訊，請參閱[取得憑證報告 (AWS CLI)](id_credentials_getting-report.md#getting-credential-reports-cliapi)。

# 為您的 產生登入資料報告 AWS 帳戶
<a name="id_credentials_getting-report"></a>

您可以產生並下載*憑證報告*，其中會列出帳戶中的所有使用者，及其各種憑證的狀態，包括密碼、存取金鑰和 MFA 裝置。您可以從 AWS 管理主控台、 [AWS SDKs](https://aws.amazon.com/tools)和[命令列工具](https://aws.amazon.com/tools/#Command_Line_Tools)或 IAM API 取得登入資料報告。

**注意**  
IAM 登入資料報告僅包含下列 IAM 受管登入資料：密碼、每個使用者的前兩個存取金鑰、MFA 裝置和 X.509 簽署憑證。報告不包含服務特定的登入資料 （例如 CodeCommit 密碼、Amazon Bedrock 長期 API 金鑰或 Amazon CloudWatch Logs 長期 API 金鑰） 或任何其他超過前兩個的使用者存取金鑰。如需完整的登入資料可見性，請使用 [ListServiceSpecificCredentials](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServiceSpecificCredentials.html) 和 [ListAccessKeys](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html) APIs。

您可以使用憑證報告協助您進行稽核和合規性工作。您可以使用報告來稽核憑證生命週期要求的效果，如密碼和存取金鑰更新。您可以向外部稽核員提供報告，或向稽核員授予許可，以便該人員直接下載報告。

您可以依照每四小時一次的頻率來產生憑證報告。當您請求報告時，IAM 會先檢查是否已在過去四小時內 AWS 帳戶 產生 的報告。若是如此，便會下載最新的報告。如果帳戶的最新報告是四小時前產生的，或者如果帳戶無先前報告，則 IAM 會產生並下載新報告。

**Topics**
+ [必要許可](#id_credentials_required_permissions)
+ [了解報告格式](#id_credentials_understanding_the_report_format)
+ [取得憑證報告 (主控台)](#getting-credential-reports-console)
+ [取得憑證報告 (AWS CLI)](#getting-credential-reports-cliapi)
+ [取得登入資料報告 (AWS API)](#getting-credential-reports-api)

## 必要許可
<a name="id_credentials_required_permissions"></a>

建立和下載報告必須要有以下許可：
+ 建立憑證報告：`iam:GenerateCredentialReport`
+ 下載報告：`iam:GetCredentialReport`

## 了解報告格式
<a name="id_credentials_understanding_the_report_format"></a>

憑證報告採取逗號分隔值 (CSV) 檔案為格式。您可以使用常用試算表軟體打開 CSV 檔以執行分析，也可以建構應用程式來以程式設計方式使用 CSV 檔並執行自訂分析。

CSV 檔案內含下列欄位：

**使用者**  
易讀的使用者名稱。

**arn**  
使用者的 Amazon Resource Name (ARN)。如需有關 ARN 的詳細資訊，請參閱 [IAM ARN](reference_identifiers.md#identifiers-arns)。

**user\$1creation\$1time**  
使用者建立的日期和時間，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。

**password\$1enabled**  
當使用者有密碼時，此值為 `TRUE`，否則為 `FALSE`。對於作為組織的一部分建立的新成員帳戶，此值為 `FALSE`，因為這些帳戶預設不具備根使用者憑證。

**password\$1last\$1used**  
上次使用 AWS 帳戶根使用者 或 使用者密碼登入 AWS 網站的日期和時間，採用 [ISO 8601 日期時間格式](http://www.iso.org/iso/iso8601)。擷取使用者上次登入時間 AWS 的網站為 AWS 管理主控台、 AWS 開發論壇和 AWS Marketplace。如果密碼在 5 分鐘的時間範圍內多次使用，則僅在此欄位中記錄此期間內的第一次使用。  
+ 在以下情況中，此欄位的值為 `no_information`：
  + 從未使用使用者密碼。
  + 沒有與密碼關聯的登入資料，例如，在 IAM 於 2014 年 10 月 20 日開始追蹤此資訊後，使用者密碼未曾使用。
+ 當使用者沒有密碼時，此欄位中的值是 `N/A` (不適用)。

**重要**  
由於服務問題，上次使用密碼的資料不包含從 2018 年 5 月 3 日 22:50 (太平洋日光時間) 到 2018 年 5 月 23 日 14:08 (太平洋日光時間) 使用的密碼。這會影響顯示於 IAM 主控台中的[前次登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_finding-unused.html)日期，以及在 [IAM 憑證報告](https://docs.aws.amazon.com/IAM/latest/UserGuide/SupportedTypes.xmlid_credentials_getting-report.html)中的最後使用密碼日期，並由 [GetUser API 操作](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html)傳回。如果使用者在受影響的時間登入，傳回的上次使用密碼的日期會是使用者最後一次在 2018 年 5 月 3 日之前登入的日期。對於在 2018 年 5 月 23 日 14:08 (太平洋日光時間) 之後登入的使用者，傳回的上次使用密碼日期會是準確的。  
如果您使用密碼上次使用的資訊來識別未使用的登入資料以供刪除，例如刪除 AWS 過去 90 天內未登入 的使用者，建議您調整評估時段以包含 2018 年 5 月 23 日之後的日期。或者，如果您的使用者使用存取金鑰以 AWS 程式設計方式存取 ，您可以參考存取金鑰上次使用的資訊，因為它在所有日期都是準確的。

**password\$1last\$1changed**  
使用者密碼上次設定的日期和時間，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。若使用者沒有密碼，此欄位中的值是 `N/A` (不適用)。

**password\$1next\$1rotation**  
如果帳戶的[密碼政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingPasswordPolicies.html)要求密碼輪換，則此欄位包含使用者需要設定新密碼的日期和時間，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。 AWS 帳戶 （根） 的值一律為 `not_supported`。

**mfa\$1active**  
當使用者啟用[多重要素驗證 (MFA)](id_credentials_mfa.md) 裝置時，此值為 `TRUE`，否則為 `FALSE`。

**access\$1key\$11\$1active**  
當使用者有存取金鑰且存取金鑰狀態為 `Active` 時，此值為 `TRUE`，否則為 `FALSE`。同時適用於帳戶根使用者和 IAM 使用者。

**access\$1key\$11\$1last\$1rotated**  
使用者的存取金鑰建立或前次變更的時間與日期，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。若使用者沒有主動式存取金鑰，此欄位中的值是 `N/A` (不適用)。同時適用於帳戶根使用者和 IAM 使用者。

**access\$1key\$11\$1last\$1used\$1date**  
使用者存取金鑰最近用於登入 AWS API 請求的日期與時間，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。如果存取金鑰在 15 分鐘的時間範圍內多次使用，則僅在此欄位中記錄第一次使用。同時適用於帳戶根使用者和 IAM 使用者。  
在以下情況中，此欄位的值為 `N/A` (不適用)：  
+ 使用者無存取金鑰。
+ 從未使用存取金鑰。
+ 自 IAM 於 2015 年 4 月 22 日開始追蹤此資訊後，存取金鑰未曾使用。

**access\$1key\$11\$1last\$1used\$1region**  
最近使用過存取金鑰的 [AWS 區域](https://docs.aws.amazon.com/general/latest/gr/rande.html)。如果存取金鑰在 15 分鐘的時間範圍內多次使用，則僅在此欄位中記錄第一次使用。同時適用於帳戶根使用者和 IAM 使用者。  
在以下情況中，此欄位的值為 `N/A` (不適用)：  
+ 使用者無存取金鑰。
+ 從未使用存取金鑰。
+ 存取金鑰最後一次使用的時間為 IAM 於 2015 年 4 月 22 日開始追蹤此資訊之前。
+ 上次使用的服務沒有區域限制，如 Amazon S3。

**access\$1key\$11\$1last\$1used\$1service**  
最近使用 存取金鑰存取 AWS 的服務。此欄位中的值會使用服務的命名空間 — 舉例來說，Amazon S3 為 `s3`、而 Amazon EC2 為 `ec2`。如果存取金鑰在 15 分鐘的時間範圍內多次使用，則僅在此欄位中記錄第一次使用。同時適用於帳戶根使用者和 IAM 使用者。  
在以下情況中，此欄位的值為 `N/A` (不適用)：  
+ 使用者無存取金鑰。
+ 從未使用存取金鑰。
+ 存取金鑰最後一次使用的時間為 IAM 於 2015 年 4 月 22 日開始追蹤此資訊之前。

**access\$1key\$12\$1active**  
當使用者有第二個存取金鑰且第二個存取金鑰狀態為 `Active` 時，此值為 `TRUE`。否則為 `FALSE`。同時適用於帳戶根使用者和 IAM 使用者。  
使用者最多可有兩個存取金鑰，首先更新金鑰，然後刪除先前的金鑰，從而使輪換變得更簡單。如需有關更新存取金鑰的詳細資訊，請參閱 [更新存取金鑰](id-credentials-access-keys-update.md)。

**access\$1key\$12\$1last\$1rotated**  
使用者的第二個存取金鑰建立或前次更新的時間與日期，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。若使用者沒有第二個主動式存取金鑰，此欄位中的值是 `N/A` (不適用)。同時適用於帳戶根使用者和 IAM 使用者。

**access\$1key\$12\$1last\$1used\$1date**  
使用者第二個存取金鑰最近用於簽署 AWS API 請求的日期和時間，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。如果存取金鑰在 15 分鐘的時間範圍內多次使用，則僅在此欄位中記錄第一次使用。同時適用於帳戶根使用者和 IAM 使用者。  
在以下情況中，此欄位的值為 `N/A` (不適用)：  
+ 使用者沒有第二個存取金鑰。
+ 從未使用第二個存取金鑰。
+ 使用者的第二個存取金鑰最後一次使用的時間為 IAM 於 2015 年 4 月 22 日開始追蹤此資訊之前。

**access\$1key\$12\$1last\$1used\$1region**  
使用者的第二個最近使用過存取金鑰的 [AWS 區域](https://docs.aws.amazon.com/general/latest/gr/rande.html)。如果存取金鑰在 15 分鐘的時間範圍內多次使用，則僅在此欄位中記錄第一次使用。同時適用於帳戶根使用者和 IAM 使用者。在以下情況中，此欄位的值為 `N/A` (不適用)：  
+ 使用者沒有第二個存取金鑰。
+ 從未使用第二個存取金鑰。
+ 使用者的第二個存取金鑰最後一次使用的時間為 IAM 於 2015 年 4 月 22 日開始追蹤此資訊之前。
+ 上次使用的服務沒有區域限制，如 Amazon S3。

**access\$1key\$12\$1last\$1used\$1service**  
最近使用使用者的第二個存取金鑰存取 AWS 的服務。此欄位中的值會使用服務的命名空間 — 舉例來說，Amazon S3 為 `s3`、而 Amazon EC2 為 `ec2`。如果存取金鑰在 15 分鐘的時間範圍內多次使用，則僅在此欄位中記錄第一次使用。同時適用於帳戶根使用者和 IAM 使用者。在以下情況中，此欄位的值為 `N/A` (不適用)：  
+ 使用者沒有第二個存取金鑰。
+ 從未使用第二個存取金鑰。
+ 使用者的第二個存取金鑰最後一次使用的時間為 IAM 於 2015 年 4 月 22 日開始追蹤此資訊之前。

**cert\$11\$1active**  
當使用者有 X.509 簽署的憑證且該憑證的狀態為 `Active` 時，此值為 `TRUE`，否則為 `FALSE`。

**cert\$11\$1last\$1rotated**  
使用者的簽署憑證建立或前次變更的時間與日期，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。若使用者沒有主動式簽署憑證，此欄位中的值是 `N/A` (不適用)。

**cert\$12\$1active**  
當使用者有第二個 X.509 簽署的憑證且該憑證的狀態為 `Active` 時，此值為 `TRUE`，否則為 `FALSE`。  
使用者最多可有兩個 X.509 簽署憑證，讓輪換更容易。

**cert\$12\$1last\$1rotated**  
使用者的第二個簽署憑證建立或前次變更的時間與日期，採用 [ISO 8601 日期時間格式](https://en.wikipedia.org/wiki/ISO_8601)。若使用者沒有第二個主動式簽署憑證，此欄位中的值是 `N/A` (不適用)。

**additional\$1credentials\$1info**  
當使用者有兩個以上的存取金鑰或憑證時，此值是其他存取金鑰或憑證的數量，以及可用來列出與使用者相關聯之存取金鑰或憑證的動作。

## 取得憑證報告 (主控台)
<a name="getting-credential-reports-console"></a>

您可以使用 AWS 管理主控台 將登入資料報告下載為逗號分隔值 (CSV) 檔案。

**下載憑證報告 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Credential report (憑證報告)**。

1. 選擇 **Download Report (下載報告)**。

## 取得憑證報告 (AWS CLI)
<a name="getting-credential-reports-cliapi"></a>

**下載憑證報告 (AWS CLI)**

1. 產生登入資料報告。 會 AWS 儲存單一報告。如果報告存在，產生憑證報告會覆寫先前的報告。[https://docs.aws.amazon.com/cli/latest/reference/iam/generate-credential-report.html](https://docs.aws.amazon.com/cli/latest/reference/iam/generate-credential-report.html)

1. 檢視上次產生的報告：[https://docs.aws.amazon.com/cli/latest/reference/iam/get-credential-report.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-credential-report.html)

## 取得登入資料報告 (AWS API)
<a name="getting-credential-reports-api"></a>

**下載登入資料報告 (AWS API)**

1. 產生登入資料報告。 會 AWS 儲存單一報告。如果報告存在，產生憑證報告會覆寫先前的報告。[https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateCredentialReport.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateCredentialReport.html)

1. 檢視上次產生的報告：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetCredentialReport.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetCredentialReport.html)

# CodeCommit 的 IAM 登入資料：Git 登入資料、SSH 金鑰和 AWS 存取金鑰
<a name="id_credentials_ssh-keys"></a>

CodeCommit 是一項受管版本控制服務，可在 AWS 雲端中託管私有的 Git 儲存庫。若要使用 CodeCommit，請將 Git 用戶端設定為與 CodeCommit 儲存庫通訊。作為此組態的一部分，您提供 CodeCommit 可用於對您進行身分驗證的 IAM 憑證。IAM 支援 CodeCommit 有三種類型的憑證：
+ Git 憑證，一種 IAM 產生的使用者名稱和密碼對，可用於透過 HTTPS 與 CodeCommit 儲存庫進行通訊。
+ SSH 金鑰，一種本機產生的公有私有金鑰對，您可以將其與 IAM 使用者關聯，以透過 SSH 與 CodeCommit 儲存庫進行通訊。
+  [AWS 存取金鑰](id_credentials_access-keys.md)，您可以使用 隨附的登入資料協助程式 AWS CLI ，透過 HTTPS 與 CodeCommit 儲存庫通訊。

**注意**  
您無法使用 SSH 金鑰或 Git 憑證來存取另一個 AWS 帳戶中的儲存庫。若要了解如何為另一個 IAM 使用者和群組設定 CodeCommit 儲存庫的存取權 AWS 帳戶，請參閱*AWS CodeCommit 《 使用者指南*》中的[使用 角色設定 AWS CodeCommit 儲存庫的跨帳戶存取權](https://docs.aws.amazon.com/codecommit/latest/userguide/cross-account.html)。

如需有關每個選項的詳細資訊，請參閱下列各節。

## 與 CodeCommit 一起使用 Git 憑證和 HTTPS (建議)
<a name="git-credentials-code-commit"></a>

使用 Git 憑證後，您可以為 IAM 使用者產生靜態的使用者名稱和密碼對，然後將這些憑證用於 HTTPS 連線。您還可以將這些憑證用於支援靜態的 Git 憑證的任何第三方工具或整合開發環境 (IDE)。

由於這些憑證對於所有受支援的作業系統都是通用的，並且與大多數憑證管理系統、開發環境和其他軟體開發工具相容，因此建議使用此方法。您可以隨時重設 Git 憑證的密碼。您還可以使憑證處於非作用中，或者在不再需要時刪除它們。

**注意**  
您無法為 Git 憑證選擇自己的使用者名稱或密碼。IAM 會為您產生這些登入資料，以協助確保它們符合 CodeCommit 中 AWS 和 安全儲存庫的安全標準。您只能在產生憑證時作一次下載。請確定將憑證儲存在安全的位置。如有需要，您可以隨時重設密碼，但這樣做會使用舊密碼設定的任何連線無效。在連線之前，必須重新設定連線以使用新密碼。

如需詳細資訊，請參閱下列主題：
+ 若要建立 IAM 使用者，請參閱 [在 中建立 IAM 使用者 AWS 帳戶](id_users_create.md)。
+ 若要使用 CodeCommit 產生和使用 Git 憑證，請參閱 *AWS CodeCommit 使用者指南*中的[使用 Git 憑證的 HTTPS 使用者](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html)。

**注意**  
產生 Git 憑證後變更 IAM 使用者的名稱不會變更 Git 憑證的使用者名稱。使用者名稱和密碼保持不變，且仍然有效。

**若要更新服務特定的憑證**

1. 除了目前正在使用的設定之外，還要建立第二個特定於服務的憑證設定。

1. 更新您的所有應用程式，以使用新設定的憑證並驗證應用程式是否正常工作。

1. 將原始憑證的狀態變更為「非作用中」。

1. 確認您的所有應用程式仍在運作。

1. 刪除非作用中特定於服務的憑證

## 與 CodeCommit 一起使用的 SSH 金鑰和 SSH
<a name="ssh-keys-code-commit"></a>

使用 SSH 連接，您可以在本機電腦上建立 Git 和 CodeCommit 用於 SSH 身分驗證的公有和私有金鑰檔案。您將公有金鑰與 IAM 使用者關聯，並將私有金鑰存放在本機電腦上。如需詳細資訊，請參閱下列主題：
+ 若要建立 IAM 使用者，請參閱 [在 中建立 IAM 使用者 AWS 帳戶](id_users_create.md)。
+ 若要建立 SSH 公有金鑰，並將其與 IAM 使用者關聯的詳細資訊，請參閱[在 Linux、macOS 或 Unix 上的 SSH 連線](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-ssh-unixes.html)，或查看 *AWS CodeCommit 使用者指南*中的[在 Windows 上的 SSH 連線](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-ssh-windows.html)。

**注意**  
公有金鑰必須以 ssh-rsa 格式或 PEM 格式編碼。公有金鑰的最小位元長度為 2048 位元，最長為 16384 位元。這與您上傳的檔案大小不同。例如，您可以產生 2048 位元索引鍵，產生的 PEM 檔案長度為 1679 位元組。如果以其他格式或大小提供公有金鑰，則會看到錯誤訊息，指出該金鑰格式無效。

## 搭配 AWS CLI 登入資料協助程式和 CodeCommit 使用 HTTPS
<a name="access-keys-code-commit"></a>

做為使用 Git 登入資料進行 HTTPS 連線的替代方案，只要 Git 需要向 進行身分驗證 AWS 才能與 CodeCommit 儲存庫互動，您就可以允許 Git 使用 IAM 使用者登入資料或 Amazon EC2 執行個體角色的密碼編譯簽署版本。這是 CodeCommit 儲存庫不需要 IAM 使用者的唯一連線方法。這也是使用聯合身分存取和臨時憑證的唯一方法。如需詳細資訊，請參閱下列主題：
+ 若要進一步了解有關聯合身分存取的詳細資訊，請參閱 [身分提供者和聯合身分 AWS](id_roles_providers.md) 和 [對外部驗證的使用者的存取權 (聯合身分)](id_roles_common-scenarios_federated-users.md)。
+ 若要進一步了解暫時憑證，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md) 和 [CodeCommit 儲存庫的暫時存取](https://docs.aws.amazon.com/codecommit/latest/userguide/temporary-access.html)。

 AWS CLI 登入資料協助程式與其他登入資料協助程式系統不相容，例如 Keychain Access 或 Windows Credential Management。當使用憑證協助程式設定 HTTPS 連線時，會有額外的組態考量。如需詳細資訊，請參閱*AWS CodeCommit 《 使用者指南*》中的[使用 AWS CLI 登入資料協助程式進行 Linux、macOS 或 Unix](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-unixes.html) 上的 HTTPS 連線，或使用[AWS CLI 登入資料協助程式進行 Windows 上的 HTTPS 連線](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-windows.html)。

# 在 IAM 中管理伺服器憑證
<a name="id_credentials_server-certs"></a>

若要在 中啟用網站或應用程式的 HTTPS 連線 AWS，您需要 SSL/TLS *伺服器憑證*。處理 AWS Certificate Manager (ACM) 可支援區域中的憑證時，我們建議您使用 ACM 來佈建、管理和部署您的伺服器憑證。在不支援的區域中，您必須使用 IAM 作為憑證管理員。如需了解 ACM 支援哪些區域，請參閱 *AWS 一般參考* 中的 [AWS Certificate Manager 端點和配額](https://docs.aws.amazon.com/general/latest/gr/acm.html)。

**重要**  
ACM 為佈建、管理和部署伺服器憑證的首選工具。使用 ACM，您可以請求憑證或將現有的 ACM 或外部憑證部署至 AWS 資源。ACM 提供的憑證為免費且會自動續約。在[支援的區域](https://docs.aws.amazon.com/general/latest/gr/acm.html)中，您可以使用 ACM 從主控台或以程式設計方式管理伺服器憑證。如需有關 ACM 的詳細資訊，請參閱 [https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)。如需有關請求 ACM 憑證的詳細資訊，請參閱 *AWS Certificate Manager 使用者指南*中的[請求公有憑證](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html)或[請求私有憑證](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-private.html)。如需有關將第三方憑證匯入 ACM 的詳細資訊，請參閱《*AWS Certificate Manager 使用者指南*》中的[匯入憑證](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)。

只有當您必須在 [ACM 不支援](https://docs.aws.amazon.com/general/latest/gr/acm.html)的區域中支援 HTTPS 連接時，才應使用 IAM 作為憑證管理器。IAM 會安全地加密您的私有金鑰並將加密的版本儲存在 IAM SSL 憑證存放區中。IAM 支援在所有區域中部署伺服器憑證，但您必須從外部供應商取得憑證以搭配 使用 AWS。不能將 ACM 憑證上傳到 IAM。此外，也無法從 IAM 主控台管理憑證，

如需有關如何將第三方憑證上傳到 IAM 的詳細資訊，請參閱下列主題。

**Topics**
+ [上傳伺服器憑證 (AWS API)](#upload-server-certificate)
+ [AWS 伺服器憑證的 API 操作](#id_credentials_server-certs-api)
+ [對伺服器憑證進行疑難排解](#server-certificate-troubleshooting)

## 上傳伺服器憑證 (AWS API)
<a name="upload-server-certificate"></a>

若要將伺服器憑證上傳至 IAM，您必須提供憑證及相符的私有金鑰。當憑證並非自我簽署憑證時，您還必須提供憑證鏈。(上傳自簽署憑證時無需憑證連結。) 在上傳憑證前，請確保您已具有所有這些項目且滿足以下條件：
+ 憑證在上傳時必須有效。您不能在憑證有效期開始 (憑證的 `NotBefore` 日期) 之前或憑證有效期到期 (憑證的 `NotAfter` 日期) 之後上傳憑證。
+ 私有金鑰必須為未加密。您無法上傳受密碼或複雜密碼保護的私有金鑰。有關解密已加密的私有金鑰的說明資訊，請參閱 [對伺服器憑證進行疑難排解](#server-certificate-troubleshooting)。
+ 憑證、私有金鑰和憑證鏈全都必須採用 PEM 編碼。有關將這些項目轉換為 PEM 格式的說明資訊，請參閱 [對伺服器憑證進行疑難排解](#server-certificate-troubleshooting)。

若要使用 [IAM API](https://docs.aws.amazon.com/IAM/latest/APIReference/) 上傳憑證，請傳送 [UploadServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadServerCertificate.html) 請求。以下範例顯示如何使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/) 執行此作業。該範例假設如下：
+ PEM 編碼的憑證存放在名為 `Certificate.pem` 的檔案中。
+ PEM 編碼的憑證鏈存放在名為 `CertificateChain.pem` 的檔案中。
+ PEM 編碼的未加密私有金鑰存放在名為 `PrivateKey.pem` 的檔案中。
+ (選用) 您要使用鍵值組來標記伺服器憑證。例如，您可以新增標籤金鑰 `Department` 和標籤值 `Engineering`，以協助您識別和整理憑證。

若要使用下列範例命令，請將這些檔案名稱取代為您自己的檔案名稱。使用您上傳憑證的名稱取代 *ExampleCertificate*。如果您要標記憑證，請將 *ExampleKey* 和 *ExampleValue* 標籤鍵值組取代為您自己的值。在連續的一行中輸入命令。為方便閱讀，以下範例包含分行符號和多餘的空格。

```
aws iam upload-server-certificate --server-certificate-name ExampleCertificate
                                    --certificate-body file://Certificate.pem
                                    --certificate-chain file://CertificateChain.pem
                                    --private-key file://PrivateKey.pem
                                    --tags '{"Key": "ExampleKey", "Value": "ExampleValue"}'
```

如果上述命令執行成功，則它將傳回上傳憑證的相關中繼資料，包括其 [Amazon Resource Name (ARN)](reference_identifiers.md#identifiers-arns)、易記名稱、識別符 (ID)、過期日期、標籤等。

**注意**  
如果您要上傳用於 Amazon CloudFront 的伺服器憑證，則必須使用 `--path` 選項指定路徑。路徑必須以 `/cloudfront` 開頭，且必須包含結尾反斜線 (例如，`/cloudfront/test/`)。

若要使用 AWS Tools for Windows PowerShell 上傳憑證，請使用 [Publish-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Publish-IAMServerCertificate.html&tocid=Publish-IAMServerCertificate)。

## AWS 伺服器憑證的 API 操作
<a name="id_credentials_server-certs-api"></a>

使用下列命令來檢視、標記、重新命名及刪除伺服器憑證。
+ 使用 [GetServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServerCertificate.html) 來擷取憑證。此請求將傳回憑證、憑證鏈 (如果已上傳一個) 和有關憑證的中繼資料。
**注意**  
在您上傳後，無法從 IAM 下載或擷取私有金鑰。
+ 使用 [Get-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Get-IAMServerCertificate.html&tocid=Get-IAMServerCertificate) 來擷取憑證。
+ 使用 [ListServerCertificates](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServerCertificates.html) 來列出您已上傳的伺服器憑證。請求會傳回包含有關每個憑證的中繼資料的清單。
+ 使用 [Get-IAMServerCertificates](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Get-IAMServerCertificates.html&tocid=Get-IAMServerCertificates) 來列出您已上傳的伺服器憑證。
+ 使用 [TagServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagServerCertificate.html) 來標記現有的伺服器憑證。
+ 使用 [UntagServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagServerCertificate.html) 來取消標記伺服器憑證。
+ 使用 [UpdateServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateServerCertificate.html) 來重新命名伺服器憑證或更新其路徑。

   以下範例顯示如何使用 AWS CLI執行此作業。

  若要使用以下範例指令，請將取代舊與新的憑證名稱與憑證路徑，並在連續的一行中輸入命令。為方便閱讀，以下範例包含分行符號和多餘的空格。

  ```
  aws iam update-server-certificate --server-certificate-name ExampleCertificate
                                      --new-server-certificate-name CloudFrontCertificate
                                      --new-path /cloudfront/
  ```

  若要使用 AWS Tools for Windows PowerShell 重新命名伺服器憑證或更新其路徑，請使用 [Update-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Update-IAMServerCertificate.html&tocid=Update-IAMServerCertificate)。
+ 使用 [DeleteServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServerCertificate.html) 來刪除伺服器憑證。

  若要使用 AWS Tools for Windows PowerShell 刪除伺服器憑證，請使用 [Remove-IAMServerCertificate](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=Remove-IAMServerCertificate.html&tocid=Remove-IAMServerCertificate)。

## 對伺服器憑證進行疑難排解
<a name="server-certificate-troubleshooting"></a>

您必須先確保憑證、私有金鑰和憑證連結均使用 PEM 編碼，然後才能將憑證上傳到 IAM。您還必須確保私有金鑰為未加密。請參閱以下範例。

**Example PEM 編碼憑證範例**  

```
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
```

**Example PEM 編碼的未加密私有金鑰範例**  

```
-----BEGIN RSA PRIVATE KEY-----
Base64-encoded private key
-----END RSA PRIVATE KEY-----
```

**Example PEM 編碼的憑證鏈範例**  
憑證鏈包含一或多個憑證。您可以使用文字編輯器、Windows 的 copy 命令，或 Linux cat 命令，將憑證檔案串連為憑證鏈。當您包含多個憑證時，每個憑證必須認證先前的憑證。您可以透過串連憑證 (包含上一個根 CA 憑證) 來完成此動作。  
以下範例包含三個憑證，但您的憑證鏈可包含更多或更少憑證。  

```
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Base64-encoded certificate
-----END CERTIFICATE-----
```

如果這些項目在上傳到 IAM 時未採用正確的格式，您可以使用 [OpenSSL](https://openssl.org/) 將其轉換為正確的格式。

**將憑證或憑證鍊從 DER 轉換為 PEM**  
使用 [OpenSSL **x509** 命令](https://openssl.org/docs/manmaster/man1/x509.html)，如下列範例。在以下範例命令中，將 `Certificate.der` 替換為包含您的 DER 編碼的憑證檔案的名稱。以偏好的輸出檔案名稱取代 `Certificate.pem`，以包含 PEM 編碼的憑證。  

```
openssl x509 -inform DER -in Certificate.der -outform PEM -out Certificate.pem
```
 

**若要將私有金鑰從 DER 轉換為 PEM**  
使用 [OpenSSL **rsa** 命令](https://openssl.org/docs/manmaster/man1/rsa.html)，如下列範例。在以下範例命令中，將 `PrivateKey.der` 替換為包含您的 DER 編碼的私有金鑰檔案的名稱。以偏好的輸出檔案名稱取代 `PrivateKey.pem`，以包含 PEM 編碼的私有金鑰。  

```
openssl rsa -inform DER -in PrivateKey.der -outform PEM -out PrivateKey.pem
```
 

**解密已加密的私有金鑰 (移除密碼或密碼短語)**  
使用 [OpenSSL **rsa** 命令](https://openssl.org/docs/manmaster/man1/rsa.html)，如下列範例。若要使用以下範例命令，將 `EncryptedPrivateKey.pem` 替換為包含您的已加密私有金鑰檔案的名稱。以偏好的輸出檔案名稱取代 `PrivateKey.pem`，以包含 PEM 編碼的未加密私有金鑰。  

```
openssl rsa -in EncryptedPrivateKey.pem -out PrivateKey.pem
```
 

**將憑證 bundle 從 PKCS\$112 (PFX) 轉換為 PEM**  
使用 [OpenSSL **pkcs12** 命令](https://openssl.org/docs/manmaster/man1/pkcs12.html)，如下列範例。在以下範例命令中，將 `CertificateBundle.p12` 替換為包含您的 PKCS\$112 編碼的憑證 bundle 的名稱。以偏好的輸出檔案名稱取代 `CertificateBundle.pem`，以包含 PEM 編碼的憑證 bundle。  

```
openssl pkcs12 -in CertificateBundle.p12 -out CertificateBundle.pem -nodes
```
 

**將憑證 bundle 從 PKCS\$17 轉換為 PEM**  
使用 [OpenSSL **pkcs7** 命令](https://openssl.org/docs/manmaster/man1/pkcs7.html)，如下列範例。在以下範例命令中，將 `CertificateBundle.p7b` 替換為包含您的 PKCS\$17 編碼的憑證 bundle 的名稱。以偏好的輸出檔案名稱取代 `CertificateBundle.pem`，以包含 PEM 編碼的憑證 bundle。  

```
openssl pkcs7 -in CertificateBundle.p7b -print_certs -out CertificateBundle.pem
```

# IAM 使用者群組
<a name="id_groups"></a>

IAM [*使用者群組*](#id_groups)是 IAM 使用者的集合。使用者群組可讓您指定多個使用者的許可，從而可以更輕鬆地管理這些使用者的許可。例如，您可以擁有一個名為 *Admins* 的使用者群組，並為該使用者群組提供典型的管理員許可。該使用者群組中的任何使用者都自動擁有 *Admins* 群組許可。如果新使用者加入您的組織並需要管理員權限，您可以透過將使用者新增到 *Admins* 使用者群組來指派適當的許可。如果某人在您的組織中變更工作，而不是編輯該使用者的許可，您可以將他們從舊 IAM 群組中移除，並將他們新增到適當的新 IAM 群組中。

您可以將身分型政策連接至使用者群組，以便使用者群組中的所有使用者都會收到該政策的許可。您無法將使用者群組識別為政策 (例如資源型政策) 中的 `Principal`，因為群組與許可 (而非驗證) 相關，並且主體是經過驗證的 IAM 實體。如需有關政策類型的詳細資訊，請參閱 [以身分為基礎和以資源為基礎的政策](access_policies_identity-vs-resource.md)。

以下是 IAM 群組的一些重要特性：
+ 使用者群組可以包含許多使用者，使用者可以屬於多個使用者群組。
+ 使用者群組不能為巢狀；群組只能包含使用者，而不包含其他 IAM 群組。
+ 沒有預設使用者群組自動包含 AWS 帳戶中的所有使用者。如果您想擁有這樣的使用者群組，您必須建立它並指派每個新使用者到該群組。
+ 中的 IAM 資源數量和大小會受到限制 AWS 帳戶，例如群組數量，以及使用者可以成為成員的群組數量。如需詳細資訊，請參閱[IAM AWS STS 和配額](reference_iam-quotas.md)。

下圖顯示一個小型公司的簡單範例。該公司擁有者為使用者建立 `Admins` 使用者群組，以便隨著公司的成長建立和管理其他使用者。所以此 `Admins` 使用者群組會建立 `Developers` 使用者群組和 `Test` 使用者群組。這些 IAM 群組都包含與 (Jim、Brad、DevApp1 等） 互動的使用者 AWS （人類和應用程式）。每個使用者都有一組個別的安全憑證。在這個範例中，每個使用者均屬於單一使用者群組。不過，使用者可屬於多個 IAM 群組。

![\[AWS 帳戶、使用者和 IAM 群組之間的關係範例\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/Relationship_Between_Entities_Example.diagram.png)


# 建立 IAM 群組
<a name="id_groups_create"></a>

**注意**  
[最佳實務](best-practices.md)是，建議您要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取 。如果遵循最佳實務，則您不用管理 IAM 使用者和群組。反之，您的使用者和群組是在 外部管理 AWS ，並且能夠以*聯合身分*的形式存取 AWS 資源。聯合身分是來自您的企業使用者目錄、Web 身分提供者、 AWS Directory Service、Identity Center 目錄或任何使用透過身分來源提供的登入資料存取 AWS 服務的使用者。聯合身分使用由其身分提供者定義的群組。如果您使用的是 AWS IAM Identity Center，請參閱*AWS IAM Identity Center *[《 使用者指南》中的在 IAM Identity Center 中管理](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source-sso.html)身分，以取得在 IAM Identity Center 中建立使用者和群組的相關資訊。

您可以建立 IAM 群組來管理具有類似角色或責任的多個使用者的存取許可。透過將政策連接至這些群組，可以授予或撤銷整組使用者的許可。您對群組許可所做的變更會自動套用至該群組的所有成員，確保存取控制保持一致，因此可以簡化安全政策的維護。建立群組之後，請根據您期望群組中 IAM 使用者要執行的工作類型向群組授予許可，然後將 IAM 使用者新增至群組。

如需有關建立 IAM 群組所需許可的資訊，請參閱[存取 IAM 資源所需的許可](access_permissions-required.md)。

## 建立 IAM 群組和連接政策
<a name="id_groups_create-section-1"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中選擇 **User groups** (使用者群組)，然後選擇 **Create group** (建立群組)。

1. 針對 **User group name** (使用者群組名稱)，請輸入群組名稱。
**注意**  
 AWS 帳戶中 IAM 資源的數量和大小有限。如需詳細資訊，請參閱[IAM AWS STS 和配額](reference_iam-quotas.md)。群組名稱可以是長達 128 個字母、數字以及這些字元的組合：加號 (\$1)、等號 (=)、逗號 (,)、句號 (.)、@ 符號、底線 (\$1) 以及連字號 (-)。名稱在帳戶中必須是唯一的。群組名稱無法透過大小寫進行區分。例如，您無法建立名為 **ADMINS** 和 **admins** 的群組。

1. 在使用者清單中，針對您要新增到群組的每個使用者，選取其核取方塊。

1. 在政策清單中，對於您要套用到群組所有成員的每個政策選取核取方塊。

1. 選擇 **Create group (建立群組)**。

------
#### [ AWS CLI ]

執行以下命令：
+ [aws iam create-group](https://docs.aws.amazon.com/cli/latest/reference/iam/create-group.html)

------
#### [ API ]

呼叫以下操作：
+ [CreateGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateGroup.html)

------

# 檢視 IAM 群組
<a name="id_groups_manage_list"></a>

您可以列出帳戶中的所有 IAM 群組，列出使用者群組中的使用者，以及列出使用者所屬的 IAM 群組。如果您使用的是 CLI 或 API，您可以列出所有具有特定路徑字首的 IAM 群組。

------
#### [ Console ]

若要列出帳戶中的所有 IAM 群組，請執行下列動作：
+ 在導覽窗格中，選擇**使用者群組**。

若要列出特定 IAM 群組中的 IAM 使用者，請執行下列動作：
+ 在導覽窗格中，選擇 **User groups** (使用者群組)。然後選擇群組的名稱以開啟群組詳細資訊頁面。檢閱**使用者**索引標籤以查看群組成員資格。

若要列出使用者所在的 IAM 群組，請執行下列動作：
+ 在導覽窗格中，選擇**使用者** 。然後選擇使用者名稱以開啟使用者詳細資訊頁面。選擇**群組**索引標籤，以查看使用者所屬的群組清單。

------
#### [ AWS CLI ]

若要列出帳戶中的所有 IAM 群組，請執行下列動作：
+ [aws iam list-groups](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups.html)

若要列出特定 IAM 群組中的使用者，請執行下列動作：
+ [aws iam get-group](https://docs.aws.amazon.com/cli/latest/reference/iam/get-group.html)

若要列出使用者所在的 IAM 群組，請執行下列動作：
+ [aws iam list-groups-for-user](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups-for-user.html)

------
#### [ API ]

若要列出帳戶中的所有 IAM 群組，請執行下列動作：
+ [ListGroups](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroups.html)

若要列出特定 IAM 群組中的使用者，請執行下列動作：
+ [GetGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroup.html)

若要列出使用者所在的 IAM 群組，請執行下列動作：
+ [ListGroupsForUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupsForUser.html)

------

# 編輯 IAM 群組中的使用者
<a name="id_groups_manage_add-remove-users"></a>

使用 IAM 群組來將相同許可一次套用到多個使用者。然後可以從 IAM 群組新增或移除使用者。這在有人員加入和離開您的組織時很實用

## 檢閱政策存取
<a name="groups-remove_prerequisites"></a>

在移除群組之前，請使用群組詳細資訊頁面來檢閱群組的成員 (IAM 使用者)，在**許可**索引標籤上檢閱連接至群組的政策，以及使用**上次存取**索引標籤檢閱最近的服務層級活動。這有助於防止無意中從正在使用它的主體 (人員或應用程式) 中移除存取權。如需有關檢視上次存取的資訊的詳細資訊，請參閱 [AWS 使用上次存取的資訊在 中精簡許可](access_policies_last-accessed.md)。

## 將 IAM 使用者新增至 IAM 群組
<a name="groups-add-remove-console"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇 **Users** (使用者) 索引標籤，然後選擇 **Add Users** (新增使用者)。選取要新增之使用者旁的核取方塊。

1. 選擇 **Add users** (新增使用者)。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam add-user-to-group](https://docs.aws.amazon.com/cli/latest/reference/iam/add-user-to-group.html)`

------
#### [ API ]

呼叫以下操作：
+ `[AddUserToGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddUserToGroup.html)`

------

## 從 IAM 群組中移除 IAM 使用者
<a name="id_groups_manage_add-remove-users-section-1"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇 **Users** (使用者) 索引標籤。選取要移除之使用者旁的核取方塊，然後選擇 **Remove users** (移除使用者)。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam remove-user-from-group](https://docs.aws.amazon.com/cli/latest/reference/iam/remove-user-from-group.html)`

------
#### [ API ]

呼叫以下操作：
+ `[RemoveUserFromGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveUserFromGroup.html)`

------

# 將政策連接至 IAM 使用者群組
<a name="id_groups_manage_attach-policy"></a>

您可以將 [AWS 提供的預先撰寫政策 受管政策](access_policies_managed-vs-inline.md#aws-managed-policies)連接至 AWS使用者群組，如下列步驟所述。若要連接客戶受管政策 ，即具有您建立的自訂許可的政策，必須先建立政策。如需建立客戶受管政策的詳細資訊，請參閱 [使用客戶管理政策定義自訂 IAM 許可](access_policies_create.md)。

如需有關許可和政策的詳細資訊，請參閱 [AWS 資源的存取管理](access.md)。

## 將政策連接至 IAM 群組
<a name="id_groups_manage_attach-policy-section-1"></a>

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇 **Permissions (許可)** 標籤。

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

1. 連接至使用者群組的目前政策會顯示在**目前的許可政策**清單。在 **Other permissions policies** (其他許可政策) 清單中，選取要連接的政策名稱旁的核取方塊。您可以使用搜尋方塊來依類型和政策名稱篩選政策清單。

1. 選取要連接至 IAM 群組的政策，然後選擇**連接政策**。

------
#### [ AWS CLI ]

執行以下命令：
+ `[aws iam attach-group-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-group-policy.html)`

------
#### [ API ]

呼叫以下操作：
+ `[AttachGroupPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachGroupPolicy.html)`

------

# 重新命名 IAM 使用者群組
<a name="id_groups_manage_rename"></a>

當您更改使用者群組名稱或路徑時，會發生以下情況：
+ 連接到使用者群組的所有政策繼續採用新名稱。
+ 使用者群組保留新名稱下的所有使用者。
+ 使用者群組的唯一 ID 保持不變。如需有關唯一 ID 的詳細資訊，請參閱 [唯一識別碼](reference_identifiers.md#identifiers-unique-ids)。

IAM 不會自動更新將該使用者群組視為資源以使用新名稱的政策。因此，當您重新命名使用者群組時，請務必謹慎。在重新命名使用者群組之前，必須手動檢查所有政策，以尋找按名稱提及該使用者群組的任何政策。例如，假設 Bob 是組織測試部分的經理。Bob 擁有政策連接到他的 IAM 使用者實體，可讓他從測試使用者群組中新增和移除使用者。如果管理員更改使用者群組的名稱 (或更改群組的路徑)，則管理員還需更新連接到 Bob 的政策以使用新名稱或新路徑。否則，Bob 將無法在該使用者群組中新增或移除使用者。

**若要尋找將 IAM 群組作為資源來引用的政策，請執行下列動作：**

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

1. 以 **Type** (類型) 資料欄排序，尋找 **Customer managed** (客戶受管) 自訂政策。

1. 選擇要編輯的政策的政策名稱。

1. 選擇**許可**索引標籤，然後選擇**摘要**。

1. 從服務清單中選擇 **IAM**，如果存在。

1. 在 **Resource** (資源) 欄位中尋找使用者群組的名稱。

1. 選擇**編輯**，可在政策中變更您的使用者群組名稱。

## 變更 IAM 使用者群組名稱
<a name="id_groups_manage_rename-section-1"></a>

------
#### [ Console ]

1. 在導覽窗格中，選取**使用者群組**，然後選取群組名稱。

1. 選擇 **Edit (編輯)**。輸入新的使用者群組名稱，然後選擇 **Save changes** (儲存變更)。

------
#### [ AWS CLI ]

執行以下命令：
+ [aws iam update-group](https://docs.aws.amazon.com/cli/latest/reference/iam/update-group.html)

------
#### [ API ]

呼叫以下操作：
+ [UpdateGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateGroup.html)

------

# 刪除 IAM 群組
<a name="id_groups_manage_delete"></a>

當您在主控台中刪除某個 IAM 群組時，主控台會自動移除所有群組成員、分離所有連接的受管政策，並刪除所有內嵌政策。不過，由於 IAM 不會自動刪除將 IAM 群組作為資源來引用的政策，因此刪除 IAM 群組時必須小心。在刪除 IAM 群組之前，請手動檢閱政策，尋找依名稱提及該群組的政策。例如，測試團隊管理員 John 擁有與其 IAM 使用者實體相連的政策，可讓他從測試使用者群組中新增和移除使用者。如果管理員刪除該群組，則管理員還必須刪除連接到 John 的政策。否則，如果管理員重新建立已刪除的群組，並為其指定相同的名稱，則 John 的許可將保持不變，即使他已離開測試團隊。

相反，在使用 CLI、SDK 或 API 刪除群組時，需先移除群組中的使用者。然後刪除嵌入在 IAM 群組中的所有內嵌政策。接下來，分離連接至該群組的所有受管政策。然後刪除該 IAM 群組本身。

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 在 IAM 群組清單中，選取要刪除的 IAM 群組名稱旁的核取方塊。您可以使用搜尋方塊，依類型、許可和群組名稱來篩選 IAM 群組清單。

1. 選擇 **刪除**。

1. 在確認方塊中，如果要刪除單一群組，請輸入群組名稱，然後選擇**刪除**。如果要刪除多個群組，請輸入要刪除的 IAM 群組數量，後接 **user groups**，然後選擇**刪除**。例如，如果要刪除三個群組，則輸入 **3 **user groups****。

------
#### [ AWS CLI ]

1. 從 IAM 群組中移除所有使用者。
   + [aws iam get-group](https://docs.aws.amazon.com/cli/latest/reference/iam/get-group.html) (取得 IAM 群組中的使用者清單) 和 [aws iam remove-user-from-group](https://docs.aws.amazon.com/cli/latest/reference/iam/remove-user-from-group.html) (從 IAM 群組中移除使用者)

1. 刪除嵌入在 IAM 群組中的所有內嵌政策。
   + [aws iam list-group-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-group-policies.html) (取得 IAM 群組內嵌政策的清單) 和 [aws iam delete-group-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-group-policy.html) (刪除 IAM 群組的內嵌政策)

1. 分離連接至 IAM 群組的所有受管政策。
   + [aws iam list-attached-group-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-group-policies.html) (取得連接至 IAM 群組的受管政策清單) 和 [aws iam detach-group-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/detach-group-policy.html) (從 IAM 群組中分離受管政策)

1. 刪除 IAM 群組。
   + [aws iam delete-group](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-group.html)

------
#### [ API ]

1. 從 IAM 群組中移除所有使用者。
   + [GetGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroup.html) (取得 IAM 群組中的使用者清單) 和 [RemoveUserFromGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveUserFromGroup.html) (從 IAM 群組中移除使用者)

1. 刪除嵌入在 IAM 群組中的所有內嵌政策。
   + [ListGroupPolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupPolicies.html) (取得 IAM 群組內嵌政策的清單) 和 [DeleteGroupPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteGroupPolicy.html) (刪除 IAM 群組的內嵌政策)

1. 分離連接至 IAM 群組的所有受管政策。
   + [ListAttachedGroupPolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedGroupPolicies.html) (取得連接至 IAM 群組的受管政策清單) 和 [DetachGroupPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachGroupPolicy.html) (從 IAM 群組中分離受管政策)

1. 刪除 IAM 群組。
   + [DeleteGroup](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteGroup.html)

------

# IAM 角色
<a name="id_roles"></a>

*IAM 角色*是您可以在帳戶中建立的另一種 IAM 身分，具有特定的許可。IAM 角色類似於 IAM 使用者，因為同樣是 AWS 身分，也有許可政策可決定該身分在 AWS中可執行和不可執行的操作。但是，角色的目的是讓需要它的任何人可代入，而不是單獨地與某個人員關聯。此外，角色沒有與之關聯的標準長期憑證，例如密碼或存取金鑰。反之，當您擔任角色時，其會為您的角色工作階段提供臨時安全性憑證。

您可以使用 角色，將存取權委派給通常無法存取 AWS 資源的使用者、應用程式或服務。例如，您可能想要授予您 AWS 帳戶中的使用者存取他們通常沒有的資源，或授予使用者 AWS 帳戶 存取另一個帳戶中的資源。或者，您可能想要允許行動應用程式使用 AWS 資源，但不想在應用程式中嵌入 AWS 金鑰 （在難以更新的地方，以及使用者可以擷取的地方）。有時，您想要提供 AWS 存取權給已在 外部定義身分的使用者 AWS，例如在您的公司目錄中。或者，您可能需要向第三方授予存取您帳戶的許可，讓他們可以對您的資源執行稽核。

對於這些案例，您可以使用 *IAM 角色*委派對 AWS 資源的存取。本節介紹各種角色和它們的不同使用方式，如何從不同方式中選出適合的時機與方法，以及如何建立、管理、切換到 (或擔任) 和刪除角色。

**注意**  
當您第一次建立 時 AWS 帳戶，預設不會建立任何角色。為帳戶新增服務時，這些服務可能會新增服務連結角色，以支援其使用案例。  
 服務連結角色是連結至 的一種服務角色 AWS 服務。服務可以擔任代表您執行動作的角色。服務連結角色會出現在您的 中 AWS 帳戶 ，並由服務擁有。IAM 管理員可以檢視，但不能編輯服務連結角色的許可。  
在您刪除服務連結角色之前，您必須先刪除這些角色的相關資源。這可保護您的資源，避免您不小心移除資源的存取許可。  
如需哪些服務支援使用服務連結角色的資訊，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並尋找 **Service-Linked Role (服務連結角色)** 欄中顯示 **Yes (是)** 的服務。選擇具有連結的 **Yes (是)**，以檢視該服務的服務連結角色文件。

**Topics**
+ [何時建立 IAM 使用者 (而不是角色)](#id_which-to-choose)
+ [角色術語和概念](#id_roles_terms-and-concepts)
+ [其他資源](#id_roles_additional-resources)
+ [混淆代理人問題](confused-deputy.md)
+ [IAM 角色的常見案例](id_roles_common-scenarios.md)
+ [IAM 角色建立](id_roles_create.md)
+ [IAM 角色管理](id_roles_manage.md)
+ [擔任角色的方法](id_roles_manage-assume.md)

## 何時建立 IAM 使用者 (而不是角色)
<a name="id_which-to-choose"></a>

建議您僅將 IAM 使用者用於聯合身分不支援的使用案例。以下是部分使用案例：
+ **無法使用 IAM 角色的工作負載** - 您可以從需要存取 AWS的位置執行工作負載。在某些情況下，您無法使用 IAM 角色提供暫時性憑證，例如針對 WordPress 外掛程式。在這些情況下，請將 IAM 使用者長期存取金鑰用於該工作負載，對 AWS進行身分驗證。
+ **第三方 AWS 用戶端** – 如果您使用不支援透過 IAM Identity Center 存取的工具，例如非託管的第三方 AWS 用戶端或廠商 AWS，請使用 IAM 使用者長期存取金鑰。
+ **AWS CodeCommit 存取** – 如果您使用 CodeCommit 存放程式碼，您可以使用 IAM 使用者搭配 SSH 金鑰或服務特定的登入資料，讓 CodeCommit 驗證您的儲存庫。除了將 IAM Identity Center 中的使用者用於一般身分驗證之外，我們也建議您這樣做。IAM Identity Center 中的使用者是您人力中需要存取您的 AWS 帳戶 或雲端應用程式的人員。若要將您 CodeCommit 儲存庫的存取權授予使用者，而不設定 IAM 使用者，您可以設定 **git-remote-codecommit** 公用程式。如需 IAM 和 CodeCommit 的詳細資訊，請參閱 [CodeCommit 的 IAM 登入資料：Git 登入資料、SSH 金鑰和 AWS 存取金鑰](id_credentials_ssh-keys.md)。如需設定**git-remote-codecommit**公用程式的詳細資訊，請參閱*AWS CodeCommit 《 使用者指南*》中的[使用輪換憑證連線至 AWS CodeCommit 儲存庫](https://docs.aws.amazon.com/codecommit/latest/userguide/temporary-access.html#temporary-access-configure-credentials)。
+ **Amazon Keyspaces (適用於 Apache Cassandra) 存取** – 在無法使用 IAM Identity Center 中的使用者的情況下，例如為了測試 Cassandra 相容性，您可以將 IAM 使用者搭配服務特定憑證使用，以便使用 Amazon Keyspaces 進行身分驗證。IAM Identity Center 中的使用者是您人力中需要存取您的 AWS 帳戶 或雲端應用程式的人員。您也可以使用暫時性憑證連線到 Amazon Keyspaces。如需詳細資訊，請參閱 *Amazon Keyspaces (for Apache Cassandra) Developer Guide* 中的 [Using temporary credentials to connect to Amazon Keyspaces using an IAM role and the SigV4 plugin](https://docs.aws.amazon.com/keyspaces/latest/devguide/access.credentials.html#temporary.credentials.IAM)。
+ **緊急存取**：無法存取身分提供者且必須在 AWS 帳戶中採取動作的情況下。您可以將建立緊急存取 IAM 使用者列入彈性計劃中的一環。建議您使用多重要素驗證 (MFA) 嚴格控管緊急使用者憑證並加以保護。

## 角色術語和概念
<a name="id_roles_terms-and-concepts"></a>

以下是一些基本術語，可協助您開始使用角色。

****Role****  
您可以在帳戶中建立的 IAM 身分具有特定的許可。IAM 角色與 IAM 使用者有一些相似之處。角色和使用者都是具備許可政策的 AWS 身分，可決定身分在 AWS中可執行和不可執行的操作。但是，角色的目的是讓需要它的任何人可代入，而不是單獨地與某個人員關聯。此外，角色沒有與之關聯的標準長期憑證，例如密碼或存取金鑰。反之，當您擔任角色時，其會為您的角色工作階段提供臨時安全性憑證。  
角色可由以下項目擔任：  
+ 相同 AWS 帳戶 或另一個 中的 IAM 使用者 AWS 帳戶
+ 相同帳戶中的 IAM 角色
+ 服務主體，用於 AWS 服務和功能，例如：
  + 可讓您在運算服務上執行程式碼的服務，例如 Amazon EC2 或 AWS Lambda
  + 代表您對資源執行動作的功能，例如 Amazon S3 物件複寫
  + 為在 外部執行的應用程式提供臨時安全登入資料的服務 AWS，例如 IAM Roles Anywhere 或 Amazon ECS Anywhere
+ 透過外部身分提供者 (IdP) 服務進行驗證的外部使用者，並且該服務與 SAML 2.0 或 OpenID Connect 相容

****AWS 服務角色****  
 服務角色是服務擔任的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)，可代您執行動作。IAM 管理員可以從 IAM 內建立、修改和刪除服務角色。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以委派許可給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

****AWS 服務連結角色****  
 服務連結角色是連結至 的一種服務角色 AWS 服務。服務可以擔任代表您執行動作的角色。服務連結角色會出現在您的 中 AWS 帳戶 ，並由服務擁有。IAM 管理員可以檢視，但不能編輯服務連結角色的許可。  
如果當服務開始支援服務連結的角色時您已經在使用服務，您可能會收到一封電子郵件，宣告您帳戶中的新角色。在這種情況下，服務會自動在您的帳戶中建立服務連結的角色。您不需要採取任何動作來支援此角色，而且您不應手動刪除它。如需詳細資訊，請參閱 [我的 AWS 帳戶中出現新角色](troubleshoot_roles.md#troubleshoot_roles_new-role-appeared)。
如需哪些服務支援使用服務連結角色的資訊，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並尋找 **Service-Linked Role (服務連結角色)** 欄中顯示 **Yes (是)** 的服務。選擇具有連結的 **Yes (是)**，以檢視該服務的服務連結角色文件。如需詳細資訊，請參閱[建立服務連結角色](id_roles_create-service-linked-role.md)。

****角色鏈結****  
當您使用一個角色來擔任第二個角色時，會發生角色鏈結。您可以透過 AWS 管理主控台 切換角色 AWS CLI、 或 API，透過 執行角色鏈結。例如，`RoleA` 擁有擔任 `RoleB` 的許可。您可以透過在 AssumeRole API 操作中使用長期使用者憑證，啟用 User1 擔任 `RoleA`。這會傳回 `RoleA` 短期憑證。透過角色鏈結，您可以使用 `RoleA` 的短期憑證，啟用 User1 擔任 `RoleB`。  
當您擔任角色時，您可以傳遞工作階段標籤，並將標籤設為可轉移。可轉移工作階段標籤會傳遞到角色鏈中所有的後續工作階段。若要進一步了解工作階段標籤，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。  
角色鏈結會將您的 AWS 管理主控台 AWS CLI 或 AWS API 角色工作階段限制為最多一小時。無論為個別角色設定的工作階段持續時間上限為何，其皆適用。當您使用 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作來擔任角色時，可以使用 `DurationSeconds` 參數指定角色工作階段的持續時間。您可以指定參數值高達 43200 秒 (12 小時)，這取決於您角色的[最大工作階段持續時間設定](id_roles_update-role-settings.md#id_roles_update-session-duration) 。然而，如果在您使用角色鏈結來擔任角色時，並提供大於一小時的 `DurationSeconds` 參數值，則操作失敗。  
如需切換到 中角色的資訊 AWS 管理主控台，請參閱 [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)。

****委派****  
授予許可給某人，以允許存取您控制的資源。委派涉及設定兩個帳戶間的信任。第一個是擁有資源的帳戶 (信任帳戶)。第二個是包含需要存取資源使用者的帳戶 (受信任帳戶)。受信任帳戶和信任帳戶可以是以下任何一個：  
+ 相同帳戶。
+ 都在您的組織的控制之下的個別帳戶。
+ 由不同組織擁有的兩個帳戶。
若要委派許可來存取資源，您要在具有連接兩個政策的信任帳戶中[建立 IAM 角色](id_roles_create_for-user.md)。*許可政策*會授予角色的使用者所需的許可，以對資源執行預定的任務。*信任政策*會指定允許哪些受信任帳戶成員可擔任角色。  
建立信任政策時，您無法在主體元素中指定萬用字元 (\$1) 做為 ARN 的一部分。信任政策會連接到信任帳戶中的角色，並且是許可的二分之一。另外一半是連接到受信任帳戶中使用者的許可政策，其[允許切換為該使用者或擔任該角色 ](id_roles_use_permissions-to-switch.md)。擔任角色的使用者會暫時放棄其自己的許可，改為接受該角色的許可。當使用者退出或停止使用該角色時，會恢復原有的使用者許可。其他稱為[外部 ID](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) 的參數有助於確保在不是由相同組織控制的帳戶之間安全使用角色。

****信任政策****  
[JSON 政策文件](reference_policies_grammar.md)，您會在其中定義您*信任*擔任角色的主體。角色信任政策是在 IAM 中連接至角色的[以資源為基礎的必要政策](access_policies.md#policies_resource-based)。您在信任政策中可指定的[主體](reference_policies_elements_principal.md)包含使用者、角色、帳戶和服務。如需詳細資訊，請參閱 *AWS 安全部落格*中的 [How to use trust policies in IAM roles](https://aws.amazon.com/blogs//security/how-to-use-trust-policies-with-iam-roles/)。

****跨帳戶存取的角色****  
將一個帳戶中的資源存取權，授予不同帳戶中受信任主體的角色。角色是授予跨帳戶存取權的主要方式。不過，某些 AWS 服務可讓您將政策直接連接到資源 （而不是使用角色做為代理）。這些稱為以資源為基礎的政策，您可以使用它們來授予其他資源 AWS 帳戶 存取權中的委託人。其中一些資源包括 Amazon Simple Storage Service (S3) 儲存貯體、Amazon Glacier 保存庫、Amazon Simple Notification Service (SNS) 主題以及 Amazon Simple Queue Service (SQS) 佇列。若要了解哪些服務支援以資源為基礎的政策，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。如需有關以資源為基礎的政策詳細資訊，請參閱 [IAM 中的跨帳戶資源存取](access_policies-cross-account-resource-access.md)。

## 其他資源
<a name="id_roles_additional-resources"></a>

下列資源可協助您進一步了解與 IAM 角色相關的 IAM 術語。
+ **委託人**是 中的實體 AWS ，可執行動作和存取資源。委託人可以是 AWS 帳戶根使用者、IAM 使用者或角色。代表 AWS 服務身分的委託人是[服務委託人](reference_policies_elements_principal.md#principal-services)。使用角色信任政策中的 Principal 元素，來定義您信任能夠擔任角色的主體。

   如需您可以允許擔任角色之主體的詳細資訊和範例，請參閱 [AWS JSON 政策元素： Principal](reference_policies_elements_principal.md)。
+ **聯合身分**會在外部身分提供者與 之間建立信任關係 AWS。您可以使用現有的 OpenID Connect (OIDC) 或安全性聲明標記語言 (SAML) 2.0 提供者來管理誰可以存取 AWS 資源。當您使用 OIDC 和 SAML 2.0 設定這些外部身分提供者與 之間的信任關係時 AWS ，系統會將使用者指派給 IAM 角色。使用者也可以接收臨時憑證，其允許使用者存取您的 AWS 資源。

  如需有關聯合身分主體的詳細資訊，請參閱[身分提供者和聯合身分 AWS](id_roles_providers.md)。
+ **聯合主體**是來自 Directory Service企業使用者目錄或 OIDC 提供者的現有身分。當透過[身分提供者](id_roles_providers.md)請求存取時， 會將角色 AWS 指派給聯合主體。

  如需有關 SAML 和 OIDC 聯合身分主體的詳細資訊，請參閱[聯合身分使用者工作階段和角色](introduction_access-management.md#intro-access-roles)。
+ **許可政策**是身分型政策，可定義角色可以使用的動作和資源。文件的撰寫會根據 IAM 政策語言的規則。

  如需詳細資訊，請參閱[IAM JSON 政策參考](reference_policies.md)。
+ **許可界限**是一種進階功能，可供您使用政策，限制身分型政策可以授予角色的最大許可。您不能將許可界限用到服務連結的角色。

  如需詳細資訊，請參閱[IAM 實體的許可界限](access_policies_boundaries.md)。

# 混淆代理人問題
<a name="confused-deputy"></a>

混淆代理人問題屬於安全性議題，其中沒有執行動作許可的實體可以強制具有更多許可的實體執行該動作。為了避免這種情況，如果您提供第三方 （稱為*跨帳戶*) 或其他 AWS 服務 （稱為*跨服務*) 存取您帳戶中的資源， AWS 會提供可協助您保護帳戶的工具。

有時，您可能需要讓第三方存取您的 AWS 資源 （委派存取權）。例如，您決定聘請名為 Example Corp 的第三方公司來監控您的 AWS 帳戶 並協助最佳化成本。為了追蹤您的每日花費，Example Corp 需要存取您的 AWS 資源。Example Corp 也可監控其他客戶的許多其他 AWS 帳戶 。您可以使用 IAM 角色，在您的 AWS 帳戶 和 Example Corp 帳戶之間建立信任關係。此案例的一個重要方面是*外部 ID*。外部 ID 是一個選用識別碼，您可在 IAM 角色信任政策中使用該識別碼來指定誰可以擔任該角色。外部 ID 的主要功能是解決並防止混淆代理人問題。

有些 AWS 服務 （呼叫 服務） 會使用其 AWS 服務主體從其他服務 AWS （稱為 服務） 存取 AWS 資源。在其中一些服務互動中，您可以設定呼叫服務，以與不同 中呼叫服務的資源通訊 AWS 帳戶。其中一個範例是 AWS CloudTrail 將 設定為寫入位於不同 的中央 Amazon S3 儲存貯體 AWS 帳戶。可透過為 `cloudtrail.amazonaws.com` 新增允許陳述式，使用 S3 儲存貯體的政策向呼叫服務 CloudTrail 授予對 S3 儲存貯體的存取權。

當呼叫 AWS 服務的服務委託人從呼叫的服務存取資源時，呼叫服務的資源政策只會授權 AWS 服務委託人，而不是設定呼叫服務的動作者。例如，信任 CloudTrail 服務主體且無條件的 S3 儲存貯體，可以從 AWS 帳戶 信任的管理員設定的 接收 CloudTrail 日誌，但如果 CloudTrail 知道 S3 儲存貯體的名稱 AWS 帳戶，也會從其中未經授權的演員接收 CloudTrail 日誌。

當演員使用 AWS 服務委託人的信任來存取他們不打算存取的資源時，就會發生混淆代理人問題。

## 預防跨帳戶混淆代理人
<a name="mitigate-confused-deputy"></a>

下圖說明了跨帳戶混淆代理人問題。

![\[混淆代理人問題描述。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/confuseddeputyproblem2.png)


此案例假設如下：
+ **AWS 1** 是您的 AWS 帳戶。
+ **AWS 1:ExampleRole** 是您帳戶中的角色。此角色的信任政策透過將 Example Corp 的 AWS 帳戶指定為可擔任該角色的帳戶來信任 Example Corp。

將發生以下情況：

1. 在您開始使用 Example Corp 的服務時，您將向 Example Corp 提供 **AWS 1:ExampleRole** 的 ARN。

1. Example Corp 使用該角色 ARN 來取得臨時安全登入資料，以存取 中的資源 AWS 帳戶。這樣一來，您將信任 Example Corp 做為可代表您執行操作的「代理人」。

1. 另一個 AWS 客戶也開始使用 Example Corp 的服務，而此客戶也提供 **AWS 1：ExampleRole** 的 ARN，供 Example Corp 使用。另一個客戶可能已了解或猜到已不是機密資訊的 **AWS 1:ExampleRole**。

1. 當其他客戶要求 Example Corp 存取其 帳戶中 AWS 的資源 （其聲稱的內容） 時，Example Corp 會使用 **AWS 1：ExampleRole** 來存取您帳戶中的資源。

這就是其他客戶可對您的資源進行未授權存取的方式。由於此客戶能夠誘使 Example Corp 無意中操作您的資源，因此 Example Corp 現在是一個「混淆代理人」。

Example Corp 可以透過要求在角色的信任政策中包含 `ExternalId` 條件檢查來解決混淆代理人問題。Example Corp 為每個客戶生成唯一的 `ExternalId` 值，並在其請求中使用該值來擔任此角色。因此，`ExternalId` 值必須在 Example Corp 的客戶中具備唯一性，並由 Example Corp 而非其客戶控制。這就是您從 Example Corp 取得該 ID 且不能自行提供該 ID 的原因。這可防止 Example Corp 成為混淆代理人，並授予另一個帳戶的 AWS 資源存取權。

在我們的方案中，假設 Example Corp 為您提供的獨有識別碼是 12345，而為另一個客戶提供的識別碼是 67890。這些識別碼已針對此方案進行簡化。通常，這些識別碼為 GUID。假定這些識別碼在 Example Corp 的客戶之間是獨有的，它們將是用於外部 ID 的有意義的值。

Example Corp 將為您提供外部 ID 值 12345。然後，您必須將一個 `Condition` 元素加入到角色的信任政策，該政策要求 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-sts](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-sts) 值為 12345，如下所示：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {
      "AWS": "Example Corp's AWS Account ID"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "StringEquals": {
        "sts:ExternalId": "12345"
      }
    }
  }
}
```

------

此政策中的 Condition 元素允許 Example Corp 僅在 AssumeRole API 呼叫包括外部 ID 值 12345 時擔任該角色。Example Corp 會確認，只要它代表客戶擔任角色，就會一律在 AssumeRole 呼叫中包括客戶的外部 ID。即使其他客戶為您的 ARN 提供 Example Corp，也無法控制 Example Corp 在其請求中包含的外部 ID AWS。這有助於防止未經授權的客戶取得對您的資源的存取權限。

下圖說明此程序。

![\[如何消除混淆代理人問題。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/confuseddeputymitigation2.png)


1. 與之前一樣，在您開始使用 Example Corp 的服務時，您將向 Example Corp 提供 **AWS 1:ExampleRole** 的 ARN。

1.  在 Example Corp 使用該角色 ARN 來擔任 **AWS 1:ExampleRole** 角色時，Example Corp 將在 AssumeRole API 呼叫中包含您的外部 ID (12345)。外部 ID 符合角色的信任政策，因此 AssumeRole API 呼叫成功，而 Example Corp 會取得臨時安全登入資料來存取您 中的資源 AWS 帳戶。

1. 另一個 AWS 客戶也開始使用 Example Corp 的服務，而如同之前一樣，此客戶也提供 **AWS 1：ExampleRole** 的 ARN，供 Example Corp 使用。

1. 但這一次，在 Example Corp 嘗試擔任角色 **AWS 1:ExampleRole** 時，它提供與其他客戶建立關聯的外部 ID (67890)。其他客戶無法更改此外部 ID。Example Corp 這樣做是因為另一個客戶請求使用該角色，因此 67890 表示 Example Corp 正在其中操作的環境。因為您已將具有您自己的外部 ID (12345) 的條件新增至 **AWS 1:ExampleRole** 的信任政策，所以 AssumeRole API 呼叫將失敗。該其他客戶不能對您帳戶中的資源進行未經授權的存取 (由圖表中的紅色 "X" 表示)。

該外部 ID 說明阻止任何其他客戶誘使 Example Corp 無意中存取您的資源。

## 預防跨服務混淆代理人
<a name="cross-service-confused-deputy-prevention"></a>

下圖使用 CloudTrail 和 Amazon S3 互動範例示範了跨服務混淆代理人問題，其中未經授權的執行者將 CloudTrail 日誌寫入到他們無權存取的 Amazon S3 儲存貯體中。

![\[未經授權的執行者利用 CloudTrail 服務主體取得了對另一個帳戶中 Amazon S3 儲存貯體的存取權。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/cross-service-confused-deputy1.png)


為了協助防止未經授權的演員使用 委託人的信任 AWS 來存取您的資源， AWS 服務委託人包含 AWS 資源 AWS 帳戶及其代表 AWS 的組織的相關資訊。

此資訊可用於可在資源政策中使用的全域條件索引鍵值，或用於 AWS 服務主體所提出請求的資源控制政策。建議您在資源政策[aws:SourceOrgPaths](reference_policies_condition-keys.md#condition-keys-sourceorgpaths)中使用 [aws:SourceArn](reference_policies_condition-keys.md#condition-keys-sourcearn)、[aws:SourceOrgID](reference_policies_condition-keys.md#condition-keys-sourceorgid)、 [aws:SourceAccount](reference_policies_condition-keys.md#condition-keys-sourceaccount)或 ，只要 AWS 服務主體獲得存取其中一個資源的許可。這些條件索引鍵可讓您在資源政策或資源控制政策中進行測試，讓存取資源 AWS 的主體代表 AWS 資源執行此操作 AWS 帳戶，或您 AWS Organizations 預期執行此操作。
+ 使用 `aws:SourceArn` 允許 AWS 服務主體代表特定資源存取您的資源，例如特定 AWS CloudTrail 線索或 AppStream 機群。
+ 使用 `aws:SourceAccount` 允許 AWS 服務主體代表特定 存取您的 資源 AWS 帳戶。
+ 使用 `aws:SourceOrgID` 允許 AWS 服務主體代表特定 存取您的 資源 AWS Organizations。
+ 使用 允許`aws:SourceOrgPaths` AWS 服務主體代表特定 AWS Organizations 路徑存取您的資源。

下圖示範當資源使用`aws:SourceAccount`全域條件內容索引鍵設定時，跨服務混淆代理人案例，而來自另一個帳戶的未經授權演員嘗試存取他們不打算存取 AWS 的資源。

![\[未經授權的執行者無法利用 CloudTrail 服務主體存取另一個帳戶中的 Amazon S3 儲存貯體。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/cross-service-confused-deputy2.png)


在政策中使用 `aws:SourceArn`、`aws:SourceAccount`、`aws:SourceOrgID` 和 `aws:SourceOrgPaths` 全域條件索引鍵，可協助您確保服務主體是代表您存取您的資源。建議您在將其中一個資源的存取權授予 AWS 服務委託人時，使用這些條件金鑰。

**注意**  
有些 AWS 服務 互動具有額外的控制，可協助防止測試使用者存取資源的跨服務混淆代理人問題。例如，當 KMS 金鑰授予授予給 時 AWS 服務， AWS KMS 會使用與資源相關聯的加密內容，以及金鑰授予，以協助防範跨服務混淆代理人問題。  
如需有關可協助避免跨服務混淆代理人風險的服務特定機制，以及 `aws:SourceArn`、`aws:SourceAccount`、`aws:SourceOrgID` 和 `aws:SourceOrgPaths` 是否受支援的詳細資訊，請參閱您所用服務的相關文件。

## 跨服務混淆代理人保護與資源型政策搭配使用
<a name="cross-service-confused-deputy-prevention-resource"></a>

下列範例政策僅在服務主體代表 AWS 帳戶 111122223333 時，授予服務主體對 Amazon S3 儲存貯體 arn：aws：s3：：amzn-s3-demo-bucket1 的`cloudtrail.amazonaws.com`存取權。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CloudTrailAclCheck",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        },
        {
            "Sid": "AWSCloudTrailWrite",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/[optionalPrefix]/Logs/myAccountID/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

------

此範例儲存貯體政策僅在服務主體 `appstream.amazonaws.com` 代表指定的 Amazon AppStream 機群執行動作 (透過以 `aws:SourceArn` 來指定機群 ARN) 時，才授予服務主體對 s3://amzn-s3-demo-bucket2 內的 powershell 指令碼 examplefile.psh 的存取權。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "appstream.amazonaws.com"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket2/examplefile.psh",
            "Condition": {
                "ArnEquals": {
                    "aws:SourceArn": "arn:aws:appstream:us-east-1:111122223333:fleet/ExampleFleetName"
                } 
            }
        }
    ]
}
```

------

## 跨服務混淆代理人保護與資源控制政策搭配使用
<a name="cross-service-confused-deputy-prevention-resource-control"></a>

您可以使用資源控制政策 (RCP)，將跨服務混淆代理人控制套用至支援的 AWS 服務資源。RCP 讓您可以在資源上集中套用跨服務混淆代理人控制。您可以使用條件金鑰，例如 `aws:SourceOrgId`和 `aws:SourceOrgPaths` 搭配連接至您 AWS Organizations、組織單位 (OU) 或 AWS 帳戶 組織中RCPs，而無需將陳述式新增至特定資源型政策。如需有關 RCP 和支援服務的詳細資訊，請參閱 *AWS Organizations User Guide* 中的 [Resource control policies (RCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。

當 `aws:SourceOrgID` 不等於 o-ExampleOrg 時，下列範例 RCP 會拒絕 AWS 服務主體存取成員帳戶中的 Amazon S3 儲存貯體。對應的允許必須存在於 S3 儲存貯體的資源型政策中，以允許`SourceOrgID`等於 o-ExampleOrg 的 AWS 服務 主體。

此政策僅對具有 `aws:SourceAccount` 索引鍵 (`"Null": {"aws:SourceAccount": "false"}`) 的服務主體 (`"Bool": {"aws:PrincipalIsAWSService": "true"}`) 發出的請求套用控制項，因此不需要使用條件索引鍵的服務整合與您主體的呼叫不會受到影響。如果請求內容中存在 `aws:SourceAccount` 條件索引鍵，則 Null 條件將評估為 true，從而導致強制執行 `aws:SourceOrgID`。我們在 Null 條件運算子中使用 `aws:SourceAccount` 而非 `aws:SourceOrgID`，因此如果請求來自不屬於組織的帳戶，則控制項仍然適用。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "RCPEnforceConfusedDeputyProtectionForS3",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEqualsIfExists": {
          "aws:SourceOrgID": "o-ExampleOrg"
        },
        "Null": {
          "aws:SourceAccount": "false"
        },
        "Bool": {
          "aws:PrincipalIsAWSService": "true"
        }
      }
    }
  ]
}
```

------

# IAM 角色的常見案例
<a name="id_roles_common-scenarios"></a>

與大多數 AWS 功能一樣，您通常有兩種方式可以使用角色：在 IAM 主控台中以互動方式使用，或以程式設計方式使用 AWS CLI、Tools for Windows PowerShell 或 API。
+ 使用 IAM 主控台的帳戶中的 IAM 使用者可以*切換到*角色，以臨時使用主控台中角色的許可。使用者放棄其原始許可並取得指派給該角色的許可。當使用者退出角色時，將恢復其原始許可。
+  AWS （例如 Amazon EC2) 提供的應用程式或服務可以透過請求角色的臨時安全登入資料來*擔任*角色，以便向其發出程式設計請求 AWS。您以這種方式使用角色，這樣您就不必為需要存取資源的每個實體分享或維護長期安全憑證 (例如，透過建立 IAM 使用者)。

**注意**  
本指南互換使用*切換到角色*和*擔任角色*字詞。

使用角色的最簡單方法是授予 IAM 使用者切換到您在自己或另一個 AWS 帳戶中建立之角色的許可。他們可以使用 IAM 主控台輕鬆切換角色，以使用您通常不希望他們擁有的許可，然後退出角色以放棄這些許可。這有助於防止*意外*存取或修改敏感資源。

如需角色的更複雜用途，例如授予存取應用程式和服務，或聯合身分外部使用者，您可以呼叫 `AssumeRole` API。這個 API 呼叫會傳回一組臨時憑證，應用程式可以在後續 API 呼叫中使用這些憑證。嘗試使用臨時憑證的動作只能透過相關的角色授予許可。應用程式不需要像主控台中的使用者般「退出」角色；相反，應用程式只是停止使用臨時憑證並繼續使用原始憑證進行呼叫。

聯合身分使用者使用來自身分提供者 (IdP) 的登入資料來登入。 AWS 然後， 會提供暫時登入資料給信任的 IdP，以傳遞給使用者，以便在後續 AWS 資源請求中包含 。這些憑證提供授予指定角色的許可。

本節概述以下案例：
+ [為您擁有的 IAM 使用者提供存取權 AWS 帳戶 ，以存取您擁有的另一個帳戶中的資源](id_roles_common-scenarios_aws-accounts.md)
+ [提供對非 AWS 工作負載的存取權](id_roles_common-scenarios_non-aws.md)
+ [將存取權提供給第三方擁有之 AWS 帳戶 中的 IAM 使用者](id_roles_common-scenarios_third-party.md)
+ [為 AWSAWS 資源提供的服務提供存取權](id_roles_common-scenarios_services.md)
+ [將存取權提供給外部驗證使用者 (聯合身分)](id_roles_common-scenarios_federated-users.md)

# 在您擁有的另一個 IAM 使用者中 AWS 帳戶 存取
<a name="id_roles_common-scenarios_aws-accounts"></a>

您可以授予 IAM 使用者許可，以切換到 內的角色， AWS 帳戶 或切換到 AWS 帳戶 您擁有的其他 中定義的角色。

**注意**  
如果要授予對您未擁有或無法控制的帳戶的存取許可，請參閱本主題後面的 [存取第三方 AWS 帳戶 擁有的](id_roles_common-scenarios_third-party.md)。

假設您擁有一個對組織來說至關重要的 Amazon EC2 執行個體。您可以使用這些許可來建立角色，而非直接授予使用者終止執行個體的許可。然後，允許管理員可以在需要終止執行個體時切換為該角色。這麼做，可為執行個體加入以下幾層保護：
+ 您必須向使用者明確授予擔任該角色的許可。
+ 您的使用者必須使用 主動切換到角色， AWS 管理主控台 或使用 AWS CLI 或 AWS API 擔任角色。
+ 您可以為角色加入多重要素驗證 (MFA) 保護，僅限登入 MFA 裝置的使用者才能擔任該角色。若要了解如何配置角色以使擔任角色的使用者必須先使用多重要素驗證 (MFA) 進行身分驗證，請參閱 [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

我們建議使用此方法強制實施*最低權限*。也就是僅限於特定任務需要時，才能使用升級的許可。藉由角色，您可以幫助防止意外更改敏感環境，如果您將它們與[審核](cloudtrail-integration.md)合併以協助確保僅在需要時才使用角色，將會有極大幫助。

在您出於此目的建立角色時，可在該角色的信任政策的 `Principal` 元素中依照 ID 指定其使用者需要存取許可的帳戶。隨後可以向這些其他帳戶中的特定使用者授予切換到角色的許可。若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

一個帳戶中的使用者可以切換為相同或不同帳戶中的角色。使用角色過程中，使用者只能執行角色允許的操作並且只能存取角色允許的資源；其原始使用者許可處於暫停狀態。使用者退出角色時，恢復原始使用者許可。

## 使用不同的開發和生產帳戶的範例方案
<a name="id_roles_common-scenarios_aws-accounts-example"></a>

假設您的組織有多個 AWS 帳戶 來隔離開發環境與生產環境。開發帳戶中的使用者有時可能需要存取生產帳戶中的資源。例如在將更新從開發環境推廣到生產環境時，可能就需要跨帳戶存取許可。儘管您可以為在兩個帳戶中工作的使用者建立單獨的身分 (和密碼)，多個帳戶的憑證管理還是會為身分管理帶來難題。在以下圖表中，所有使用者都透過開發帳戶進行管理，但部分開發人員需要對生產帳戶進行有限存取。開發帳戶有兩個群組：測試人員和開發人員，每個群組有其專屬的政策。

![\[使用角色將許可指派給在不同帳戶中的使用者\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/roles-usingroletodelegate.png)


1. 生產帳戶中的一名管理員使用 IAM 在該帳戶中建立 `UpdateApp` 角色。在角色中，管理員定義信任政策，該政策將開發帳戶指定為 `Principal`，這表示開發帳戶中的授權使用者可以使用 `UpdateApp` 角色。管理員也可以為角色定義許可政策，該政策指定名為 `productionapp` 之 Amazon S3 儲存貯體的讀取和寫入許可。

   然後，管理員將與需要擔任角色的任何人共用該角色的帳號和名稱。該資訊是角色的帳號和名稱 （適用於 AWS 主控台使用者） 或 Amazon Resource Name (ARN) （適用於 AWS CLI 或 AWS API 存取）。角色 ARN 類似於 `arn:aws:iam::123456789012:role/UpdateApp`，其中角色名為 `UpdateApp`，而且角色使用帳戶號碼 123456789012 所建立。
**注意**  
管理員可以選擇是否配置角色，以便擔任角色的使用者必須先使用多重要素驗證 (MFA) 進行身分驗證。如需詳細資訊，請參閱 [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

1. 在開發帳戶中，管理員向開發人員群組的成員授予切換為角色的許可。這是透過授予開發人員群組許可來呼叫`UpdateApp`角色的 AWS Security Token Service (AWS STS) `AssumeRole` API 來完成的。開發帳戶中的開發人員群組的所有 IAM 使用者現在都可以切換為生產帳戶中的 `UpdateApp` 角色。不在開發人員群組中的其他使用者無權切換為該角色，因此無法存取生產帳戶中的 S3 儲存貯體。

1. 使用者請求切換為該角色：
   + AWS 主控台：使用者選擇導覽列上的帳戶名稱，然後選擇**切換角色**。使用者指定帳戶 ID (或別名) 和角色名稱。或者，使用者可以按一下管理員在電子郵件中發送的連結。透過該連結，使用者可以前往已填寫詳細資訊的 **Switch Role (切換角色)** 頁面。
   + AWS API/AWS CLI：開發帳戶開發人員群組中的使用者呼叫 `AssumeRole`函數以取得`UpdateApp`角色的登入資料。使用者將 `UpdateApp` 角色的 ARN 指定為呼叫的一部分。如果測試人員群組中的使用者發出相同請求，請求將失敗，因為測試人員沒有針對 `AssumeRole` 角色 ARN 呼叫 `UpdateApp` 的許可。

1. AWS STS 傳回臨時登入資料：
   + AWS console：使用角色的信任政策 AWS STS 驗證請求，以確保請求來自信任的實體 （即開發帳戶）。驗證後， 會將 AWS [臨時安全登入](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html)資料 AWS STS 傳回至 主控台。
   + API/CLI：根據角色的信任政策 AWS STS 驗證請求，以確保請求來自信任的實體 （即開發帳戶）。驗證後， 會 AWS STS 傳回[暫時安全登入](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html)資料給應用程式。

1. 暫時登入資料允許存取 AWS 資源：
   + AWS 主控台： AWS 主控台會代表使用者使用暫時登入資料進行所有後續主控台動作，在此情況下會讀取和寫入儲存`productionapp`貯體。主控台無法存取生產帳戶中的任何其他資源。使用者退出角色時，使用者的許可恢復為切換為角色之前所擁有的原始許可。
   + API/CLI：應用程式使用臨時安全性憑證更新 `productionapp` 儲存貯體。應用程式只能使用臨時安全性憑證讀取和寫入 `productionapp` 儲存貯體，無法存取生產帳戶的任何其他資源。應用程式不必退出角色，只需在後續 API 呼叫中停止使用臨時憑證並使用原始憑證。

## 其他資源
<a name="id_roles_common-scenarios_more-info"></a>

如需詳細資訊，請參閱下列內容：
+ [IAM 教學課程：使用 IAM 角色在 AWS 帳戶之間委派存取權](tutorial_cross-account-with-roles.md)

# 非 AWS 工作負載的存取
<a name="id_roles_common-scenarios_non-aws"></a>

[IAM 角色](id_roles.md)是 AWS Identity and Access Management (IAM) 中獲指派[許可](access_policies.md)的物件。當您使用來自 外部的 IAM 身分或身分[擔任該角色](id_roles_manage-assume.md)時 AWS，它會為您的角色工作階段提供暫時安全登入資料。您可能在資料中心或 外部的其他基礎設施中執行工作負載 AWS ，這些工作負載必須存取您的 AWS 資源。您可以使用 AWS Identity and Access Management Roles Anywhere (IAM Roles Anywhere) 驗證非 AWS 工作負載，而不是建立、分發和管理長期存取金鑰。IAM Roles Anywhere 使用來自憑證授權單位 (CA) 的 X.509 憑證來驗證身分 AWS 服務 ，並使用 IAM 角色提供的臨時憑證安全地提供對 的存取。

**若要使用 IAM Roles Anywhere**

1. 使用 [AWS 私有憑證授權單位](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)設定 CA，或者使用您自己的 PKI 基礎設施中的 CA。

1. 設定 CA 之後，在 IAM Roles Anywhere 中建立稱為*信任錨*的物件。此錨點在 IAM Roles Anywhere 和 CA 之間建立信任，以進行身分驗證。

1. 然後您可以設定現有的 IAM 角色，或建立信任 IAM Roles Anywhere 服務的新角色。

1. 使用信任錨點透過 IAM Roles Anywhere 驗證您的非 AWS 工作負載。 會將非 AWS 工作負載臨時憑證 AWS 授予可存取您 AWS 資源的 IAM 角色。

## 其他資源
<a name="id_roles_non-aws_additional_resources"></a>

下列資源可協助您進一步了解如何提供對非AWS 工作負載的存取權。
+ 如需設定 IAM Roles Anywhere 的詳細資訊，請參閱*《IAM Roles Anywhere 使用者指南》*中的 [What is AWS Identity and Access Management Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html) (什麼是 IAM Roles Anywhere)。
+ 若要了解如何為 IAM Roles Anywhere 設定公有金鑰基礎設施 (PKI)，請參閱 *AWS 安全部落格*中的 [IAM Roles Anywhere with an external certificate authority](https://aws.amazon.com/blogs/)。

# 存取第三方 AWS 帳戶 擁有的
<a name="id_roles_common-scenarios_third-party"></a>

當第三方需要存取您組織 AWS 的資源時，您可以使用 角色來委派存取權給他們。例如，第三方可能提供一種用於管理您的 AWS 資源之服務。透過 IAM 角色，您可以授予這些第三方存取 資源 AWS 的權限，而無需共用您的 AWS 安全登入資料。相反地，第三方可以透過擔任您在 中建立的角色來存取您的 AWS 資源 AWS 帳戶。若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

為了建立他們可以代入的角色，第三方必須為您提供以下資訊：
+ **第三方的 AWS 帳戶 ID**。為角色定義信任政策時，可將其 AWS 帳戶 ID 指定為主體。
+ **與角色唯一關聯的外部 ID**。外部 ID 可以是只有您和第三方知道的任何識別碼。例如，您可以使用您與該第三方之間的發票 ID，但不要使用能被猜到的內容，例如第三方的電話號碼。為角色定義信任政策時，必須指定該 ID。第三方在代入角色時必須提供該 ID。
+ **第三方為使用您的 AWS 資源而請求獲得的許可**。定義角色的許可政策時，必須指定這些許可。這個政策定義了他們可以執行哪些操作以及可以存取哪些資源。

建立完角色後，您必須向第三方提供該角色的 Amazon Resource Name (ARN)。他們需要使用您的角色的 ARN 來代入該角色。

**重要**  
當您授予第三方存取 資源的權限時 AWS ，他們可以存取您在政策中指定的任何資源。他們使用的資源費用將由您支付。請確保適當地限制他們對資源的使用。

## 第三方存取的外部 ID
<a name="id_roles_third-party_external-id"></a>

外部 ID 允許正擔任該角色的使用者聲明所操作的環境。它還為帳戶擁有者提供一種方法來允許僅在特定情況下擔任該角色。外部 ID 的主要功能是解決並防止 [混淆代理人問題](confused-deputy.md)。

**重要**  
AWS 不會將外部 ID 視為秘密。在您建立存取金鑰對或密碼等秘密之後 AWS，就無法再次檢視它們。具有檢視角色許可的任何人都可看見角色的外部 ID。

## 我何時應使用外部 ID？
<a name="external-id-use"></a>

在以下情況下使用外部 ID：
+ 您是 AWS 帳戶 擁有者，而且已為存取 AWS 帳戶 您 以外的其他 的第三方設定角色。您應要求第三方提供其在擔任您的角色時包含的外部 ID。然後，在您角色的信任政策中檢查該外部 ID。這樣做可確保外部方僅在代表您執行操作時才能擔任您的角色。
+ 在前述情況下，您代表不同客戶 (如 Example Corp) 擔任角色。您應該為每個客戶分配一個唯一的外部 ID 並指導他們將該外部 ID 加入到其角色的信任政策。然後，您必須確保在代入角色的請求中始終包含正確的外部 ID。

  您可能已為您的每個客戶提供一個獨有識別碼，而且此獨有 ID 足以用作外部 ID。該外部 ID 不是您要明確建立或分別追蹤所需的特殊值 (僅用於此目的)。

  您應始終在您的 `AssumeRole` API 呼叫中指定外部 ID。此外，在客戶為您提供角色 ARN 時，請測試是否能在含有/不含有正確外部 ID 的情況下擔任該角色。如果可在沒有正確外部 ID 的情況下擔任角色，則請勿在您的系統中儲存該客戶的角色 ARN。等待該客戶將角色信任政策更新為要求提供正確的外部 ID。這樣一來，您協助您的客戶執行了正確的操作，並幫助您和客戶避免了混淆代理人問題。

## 使用外部 ID 的範例案例
<a name="id_roles_third-party_example"></a>

例如，假設您決定聘請名為 Example Corp 的第三方公司來監控您的 AWS 帳戶 並協助最佳化成本。為了追蹤您的每日花費，Example Corp 需要存取您的 AWS 資源。Example Corp 也可監控其他客戶的許多其他 AWS 帳戶。

請不要向 Example Corp 提供對您 AWS 帳戶中的 IAM 使用者和其長期憑證的存取權。請改用 IAM 角色及其臨時安全性憑證。IAM 角色提供一種機制，允許第三方存取您的 AWS 資源，而不需要共用長期憑證 （例如 IAM 使用者存取金鑰）。

您可以使用 IAM 角色，在您的 AWS 帳戶 與 Example Corp 帳戶之間建立信任關係。建立此關係後，Example Corp 帳戶的成員可以呼叫 AWS Security Token Service [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 來取得臨時安全登入資料。Example Corp 成員接著可以使用登入資料來存取您帳戶中 AWS 的資源。

**注意**  
如需 AssumeRole 和其他您可以呼叫以取得臨時安全登入資料之 AWS API 操作的詳細資訊，請參閱 [比較 AWS STS 登入資料](id_credentials_sts-comparison.md)。

以下是此方案的更多詳細資訊：

1. 您聘請了 Example Corp，此公司將為您建立獨有的客戶識別碼。他們為您提供這個唯一的客戶 ID 及其 AWS 帳戶 號碼。您需要此資訊來在下一個步驟中建立 IAM 角色。
**注意**  
Example Corp 可使用其想用於 ExternalId 的任何字串值，只要該值對於每個客戶來說都是獨有的。該值可以是客戶帳戶，甚至可以是一個隨機字串，只要沒有兩個客戶擁有相同的值即可。該值不是「機密」。Example Corp 必須為每個客戶提供 ExternalId 值。關鍵在於，該值必須由 Example Corp 而***非***由其客戶產生，以確保每個外部 ID 都是唯一的。

1. 您登入 AWS 並建立 IAM 角色，讓 Example Corp 存取您的 資源。與任何 IAM 角色類似，該角色具有兩個政策：許可政策和信任政策。角色的信任政策指定擔任該角色的對象。在我們的範例案例中，政策會將 Example Corp AWS 帳戶 的數量指定為 `Principal`。這允許來自此帳戶的身分擔任該角色。此外，您新增 `[Condition](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#Condition)` 元素到信任政策。此 `Condition` 測試 `ExternalId` 內容索引鍵，以確保它與 Example Corp 的獨有客戶 ID 一致。例如：

   ```
       "Principal": {"AWS": "Example Corp's AWS 帳戶 ID"},
       "Condition": {"StringEquals": {"sts:ExternalId": "Unique ID Assigned by Example Corp"}}
   ```

1. 該角色的許可政策指定該角色允許某個人執行哪些操作。例如，您可以指定該角色允許某人只能管理您的 Amazon EC2 和 Amazon RDS 資源，但不能管理您的 IAM 使用者或群組。在我們的範例方案中，您使用許可政策為 Example Corp 授予帳戶中的所有資源的唯讀存取許可。

1. 建立完角色後，為 Example Corp 提供該角色的 Amazon Resource Name (ARN) (ARN)。

1. 當 Example Corp 需要存取您的 AWS 資源時，公司的某人會 AWS `sts:AssumeRole`呼叫 API。此呼叫包括要擔任的角色的 ARN 和與其客戶 ID 對應的 ExternalId 參數。

如果請求來自使用 Example Corp 的某人 AWS 帳戶，且角色 ARN 和外部 ID 正確，則請求會成功。然後，它會提供臨時安全登入資料，讓 Example Corp 可用來存取您的角色允許 AWS 的資源。

換言之，當角色政策包括外部 ID 時，任何需要擔任該角色的人都必須是該角色中的主體，還必須包括正確的外部 ID。

## 外部 ID 的要點
<a name="id_roles_third-party_key-points"></a>
+ 在多租戶環境中，您支援具有不同 AWS 帳戶的多個客戶，我們建議每個客戶使用一個外部 ID AWS 帳戶。此 ID 應該是由第三方產生的隨機字串。
+ 如要請求第三方在取得角色時提供外部 ID，請使用您選擇的外部 ID 來更新角色的信任政策。
+ 若要在擔任角色時提供外部 ID，請使用 AWS CLI 或 AWS API 擔任該角色。如需詳細資訊，請參閱 STS [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作，或是 STS [assume-role](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html) CLI 操作。
+ `ExternalId` 值必須最少為 2 個字元，最多為 1,224 個字元。該值必須為英數字元，且不包含空格。也可以包含下列符號：加號 (\$1)、等號 (=)、逗號 (,)、句號 (.)、小老鼠 (@)、冒號 (:)、正斜線 (/) 和連字號 (-)。

## 其他資源
<a name="id_roles_third-party_additional_resources"></a>

下列資源可協助您進一步了解如何提供對第三方擁有的 AWS 帳戶 的存取權。
+ 若要了解如何允許其他人在您的 中執行動作 AWS 帳戶，請參閱 [使用自訂信任政策建立角色](id_roles_create_for-custom.md)。
+ 若要了解如何授予許可以切換至角色，請參閱[向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)
+ 若要了解如何建立並向信任的使用者提供臨時安全憑證，請參閱[臨時安全憑證的許可](id_credentials_temp_control-access.md)。

# 存取 AWS 服務
<a name="id_roles_common-scenarios_services"></a>

許多 AWS 服務要求您使用 角色來控制該服務可存取的內容。服務會擔任代您執行動作的角色稱為[服務角色](id_roles.md#iam-term-service-role)。當角色做為服務的專業用途時，它可以歸類為[服務連結角色](id_roles.md#iam-term-service-linked-role)。請參閱每個服務的 [AWS 文件](https://docs.aws.amazon.com/)，以查看它是否使用角色，以及了解如何指派角色以供服務使用。

如需建立角色以委派存取 提供的服務的詳細資訊 AWS，請參閱 [建立角色以將許可委派給 AWS 服務](id_roles_create_for-service.md)。

# 對外部驗證的使用者的存取權 (聯合身分)
<a name="id_roles_common-scenarios_federated-users"></a>

您的使用者可能已經在 外部擁有身分 AWS，例如在您的公司目錄中。如果這些使用者需要使用 AWS 資源 （或使用存取這些資源的應用程式），則這些使用者也需要 AWS 安全登入資料。您可以使用 IAM 角色為從您的組織或第三方身分提供者 (IdP) 聯合身分的使用者指定許可。

**注意**  
作為安全最佳實務，建議您使用聯合身分在 [IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/what-is.html) 中管理使用者存取權，而不是建立 IAM 使用者。若要了解需要 IAM 使用者的特定情形，請參閱[建立 IAM 使用者 (而非角色) 的時機](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_which-to-choose)。

## 使用 Amazon Cognito 聯合行動或以 Web 為基礎的應用程式的使用者
<a name="id_roles_common-scenarios_federated-users-cognito"></a>

如果您建立可存取 AWS 資源的行動或 Web 應用程式，則應用程式需要安全登入資料，才能向 發出程式設計請求 AWS。對於大多數行動應用程式藍本，建議您使用 [Amazon Cognito](https://aws.amazon.com/cognito/)。您可以將此服務與適用於 [AWS iOS 的 Mobile SDK](https://aws.amazon.com/sdkforios/) 和[AWS 適用於 Android 和 Fire OS 的 Mobile SDK](https://aws.amazon.com/sdkforandroid/) 搭配使用，為使用者建立唯一身分，並對其進行驗證，以安全地存取您的 AWS 資源。Amazon Cognito 支援與下一個部分中列出的身分提供者相同的身分提供者，並且還支援[開發人員驗證身分](https://aws.amazon.com/blogs/mobile/amazon-cognito-announcing-developer-authenticated-identities)和未經身分驗證 (訪客) 的存取。Amazon Cognito 還提供 API 操作以同步使用者資料，如此可在使用者於不同裝置之間移動時進行保留。如需詳細資訊，請參閱 [用於行動應用程式的 Amazon Cognito](id_federation_common_scenarios.md#id_roles_providers_oidc_cognito)。

## 使用公有身分服務提供者或 OpenID Connect 來聯合使用者
<a name="id_roles_common-scenarios_federated-users-openId"></a>

在可能的情況下，將 Amazon Cognito 用於行動和以 Web 為基礎的應用程式案例。Amazon Cognito 為您提供公有身分提供者服務的大部分幕後工作。它適用於相同的第三方服務，並且還支援匿名登入。但是，對於更進階的案例，您可以直接使用 Login with Amazon、Facebook、Google 或與 OpenID Connect (OIDC) 相容的任何 IdP 等第三方服務。如需有關使用 OIDC 聯合身分來使用其中一項服務的詳細資訊，請參閱 [OIDC 聯合身分](id_roles_providers_oidc.md)。

## 使用 SAML 2.0 聯合使用者
<a name="id_roles_common-scenarios_federated-users-saml20"></a>

如果您的組織已使用支援 SAML 2.0 （安全性聲明標記語言 2.0) 的身分提供者軟體套件，您可以在組織之間建立信任做為身分提供者 (IdP) 和 AWS 做為服務提供者。然後，您可以使用 SAML 為使用者提供 AWS 管理主控台 或 聯合身分的單一登入 (SSO)，以呼叫 AWS API 操作。例如，如果您的公司使用 Microsoft Active Directory 和 Active Directory Federation Services，則可以使用 SAML 2.0 聯合。如需有關使用 SAML 2.0 聯合使用者的詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。

## 透過建立自訂身分經紀人應用程式來聯合使用者
<a name="id_roles_common-scenarios_federated-users-idbroker"></a>

如果您的身分存放區與 SAML 2.0 不相容，則可以建置自訂身分經紀人應用程式以執行類似的功能。代理程式應用程式會驗證使用者、請求使用者的臨時登入資料 AWS，然後將他們提供給使用者以存取 AWS 資源。

例如，Example Corp. 有許多員工需要執行存取公司 AWS 資源的內部應用程式。員工已經在公司身分和身分驗證系統中擁有身分，而 Example Corp. 不想要為每個公司員工建立個別的 IAM 使用者。

Bob 是 Example Corp. 的開發人員。 為了讓 Example Corp. 內部應用程式能夠存取公司的 AWS 資源，Bob 開發了自訂身分代理程式應用程式。該應用程式驗證員工是否已登入到現有的 Example Corp. 身分和身分驗證系統，該系統可能使用 LDAP、Active Directory 或其他系統。然後，身分經紀人應用程式取得員工的臨時安全憑證。此案例類似於前一個案例 （使用自訂身分驗證系統的行動應用程式），但需要存取 AWS 資源的應用程式全都在公司網路中執行，而且公司有現有的身分驗證系統。

若要取得臨時安全憑證，身分經紀人應用程式將呼叫 `AssumeRole` 或 `GetFederationToken` 以取得臨時安全憑證，具體取決於 Bob 想要如何管理使用者政策以及臨時憑證何時過期。(如需有關這些 API 操作間差異的詳細資訊，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md) 和 [臨時安全憑證的許可](id_credentials_temp_control-access.md))。呼叫會傳回暫時性安全登入資料，其中包含 AWS 存取金鑰 ID、私密存取金鑰和工作階段字符。身分經紀人應用程式讓這些臨時安全憑證可供內部公司應用程式使用。然後，應用程式可以使用臨時憑證直接呼叫 AWS 。該應用程式快取憑證，直到過期，然後請求一組新的臨時憑證。下圖說明此情況。

![\[使用自訂身分經紀人應用程式的範例工作流程\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/enterprise-authentication-with-identity-broker-application.diagram.png)


此案例具有以下屬性：
+ 身分經紀人應用程式有權存取 IAM 的權杖服務 (STS) API 來建立臨時安全憑證。
+ 身分經紀人應用程式能夠驗證員工是否在現有身分驗證系統中進行了身分驗證。
+ 使用者可以取得臨時 URL，讓他們能夠存取 AWS 管理主控台 （稱為單一登入）。

如需建立臨時安全性憑證檔案的詳細資訊，請參閱 [比較 AWS STS 登入資料](id_credentials_sts-comparison.md)。如需 SAML 聯合身分主體存取 AWS 管理主控台的詳細資訊，請參閱 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。

# IAM 角色建立
<a name="id_roles_create"></a>

若要建立角色，您可以使用 AWS 管理主控台、 AWS CLI、Tools for Windows PowerShell 或 IAM API。

如果您使用 AWS 管理主控台，精靈會引導您完成建立角色的步驟。精靈的步驟略有不同，具體取決於您是為 AWS 服務、為 建立角色 AWS 帳戶，還是為 SAML 或 OIDC 聯合委託人建立角色。

**IAM 使用者的角色**  
建立此角色，將 或您擁有之其他 中定義的角色的許可委派 AWS 帳戶 給 AWS 帳戶 。一個帳戶中的使用者可以切換為相同或不同帳戶中的角色。使用角色過程中，使用者只能執行角色允許的操作並且只能存取角色允許的資源；其原始使用者許可處於暫停狀態。使用者退出角色時，恢復原始使用者許可。

如需詳細資訊，請參閱[建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)。

如需有關建立跨帳戶存取權的角色的詳細資訊，請參閱[使用自訂信任政策建立角色](id_roles_create_for-custom.md)。

**AWS 服務的角色**  
建立此角色，以將許可委派給可以代表您執行動作的服務。您傳遞給服務的[服務角色](id_roles.md#iam-term-service-role)必須具有 IAM 政策，其許可允許服務執行與該服務關聯的動作。每個 AWS 服務需要不同的許可。

如需有關建立服務角色的詳細資訊，請參閱[建立角色以將許可委派給 AWS 服務](id_roles_create_for-service.md)。

如需有關建立服務連結角色的詳細資訊，請參閱[建立服務連結角色](id_roles_create-service-linked-role.md)。

**聯合身分的角色**  
建立此角色，以將許可委派給已在 AWS外部擁有身分的使用者。當您使用 身分提供者時，您不需要建立自訂登入代碼或管理自己的使用者身分，IdP 會為您處理這些工作。您的外部使用者透過 IdP 登入，您可以授予這些外部身分許可，以使用您帳戶中 AWS 的資源。身分提供者可協助保護 AWS 您的帳戶安全，因為您不必在應用程式中分發或嵌入長期安全登入資料，例如存取金鑰。

如需詳細資訊，請參閱[為第三方身分提供者建立角色](id_roles_create_for-idp.md)。

# 建立角色以將許可授予 IAM 使用者
<a name="id_roles_create_for-user"></a>

您可以使用 IAM 角色來提供 AWS 資源的存取權。透過 IAM 角色，您可以在*信任*帳戶和其他 AWS *信任*帳戶之間建立信任關係。信任帳戶擁有要存取的資源，而受信任帳戶包含需要存取資源的使用者。不過，可以讓另一個帳戶在您的帳戶中擁有資源。例如，信任的帳戶可能允許信任的帳戶來建立新的資源，例如在 Amazon S3 儲存貯體中建立新物件。在這種情況下，建立資源的帳戶擁有資源，並控制誰可以存取該資源。

建立信任關係後，來自信任帳戶的 IAM 使用者或應用程式可以使用 AWS Security Token Service (AWS STS) [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作。此操作提供臨時安全登入資料，可讓您存取帳戶中 AWS 的資源。

兩個帳戶可都由您控制，或者含有使用者的帳戶可由第三方進行控制。如果使用者的其他帳戶是您無法控制的 AWS 帳戶 ，則您可以使用 `externalId` 屬性。外部 ID 可以是您和第三方帳戶管理員之間商定的任何文字或數字。此選項會自動新增條件到信任政策，讓使用者只在請求包含正確的 `sts:ExternalID` 時才擔任該角色。如需詳細資訊，請參閱[存取第三方 AWS 帳戶 擁有的](id_roles_common-scenarios_third-party.md)。

如需有關如何使用角色委派許可的資訊，請參閱[角色術語和概念](id_roles.md#id_roles_terms-and-concepts)。如需使用服務角色以允許服務存取您帳戶中的資源的資訊，請參閱[建立角色以將許可委派給 AWS 服務](id_roles_create_for-service.md)。

## 建立 IAM 角色 (主控台)
<a name="roles-creatingrole-user-console"></a>

您可以使用 AWS 管理主控台 來建立 IAM 使用者可以擔任的角色。例如，假設您的組織有多個 AWS 帳戶 來隔離開發環境與生產環境。如需有關建立可讓開發帳戶中的使用者存取生產帳戶中資源的角色的高級別資訊，請參閱[使用不同的開發和生產帳戶的範例方案](id_roles_common-scenarios_aws-accounts.md#id_roles_common-scenarios_aws-accounts-example)。

**最低許可**  
若要執行下列步驟，您至少必須擁有下列 IAM 許可：  
`access-analyzer:ValidatePolicy`
`iam:AttachRolePolicy`
`iam:CreatePolicy`
`iam:CreateRole`
`iam:GetAccountSummary`
`iam:GetPolicy`
`iam:GetPolicyVersion`
`iam:GetRole`
`iam:ListAccountAliases`
`iam:ListAttachedRolePolicies`
`iam:ListOpenIDConnectProviders`
`iam:ListPolicies`
`iam:ListRolePolicies`
`iam:ListRoles`
`iam:ListRoleTags`
`iam:ListSAMLProviders`

------
#### [ Console ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

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

1. 若要為您的帳戶建立角色，請選取 **This account** (此帳號)。若要為其他帳戶建立角色，請選擇 **Another AWS 帳戶** (另一個 )，然後輸入您要對其授予資源存取權的 **Account ID** (帳戶 ID)。

   指定帳戶的管理員可以授予許可給該帳戶中的任何 IAM 使用者來擔任此角色。若要執行此操作，管理員要將政策連接到授予 `sts:AssumeRole` 動作之許可的使用者或群組。該政策必須指定角色的 ARN 為 `Resource`。

1. 如果您將許可授予您不控制之帳戶的使用者，而且使用者將以程式設計方式擔任此角色，則請選取 **Require external ID** (需要外部 ID)。外部 ID 可以是您和第三方帳戶管理員之間商定的任何文字或數字。此選項會自動新增條件到信任政策，讓使用者只在請求包含正確的 `sts:ExternalID` 時才擔任該角色。如需詳細資訊，請參閱[存取第三方 AWS 帳戶 擁有的](id_roles_common-scenarios_third-party.md)。
**重要**  
選擇此選項只會透過 AWS CLI、Tools for Windows PowerShell 或 AWS API 來限制對角色的存取。這是因為您無法使用 AWS 主控台切換到在其信任政策中具有 `externalId`條件的角色。不過，您可以程式設計方式建立存取這類存取，即透過編寫指令碼或使用相關開發套件的應用程式。如需詳細資訊和範例指令碼，請參閱 AWS 安全部落格中的[如何啟用跨帳戶存取 AWS 管理主控台](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console)。

1. 如果您想限制角色為使用多重要素驗證 (MFA) 登入的使用者，請選取 **Require MFA (需要 MFA)**。這會新增條件到角色的信任政策，以檢查 MFA 登入。想要擔任該角色的使用者必須從設定的 MFA 裝置使用臨時的一次性密碼登入。未經 MFA 身分驗證的使用者無法擔任角色。如需有關 MFA 的詳細資訊，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)

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

1. IAM 包含您帳戶中 AWS 受管和客戶受管政策的清單。選取用於許可政策的政策，或者選擇 **Create policy (建立政策)** 以開啟新的瀏覽器標籤，並從頭建立新的政策。如需詳細資訊，請參閱[建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。在您建立政策後，關閉該標籤並返回您的原始標籤。選取您希望擔任角色的任何人具有的許可政策旁的核取方塊。如果您希望，您目前可以不選取政策，稍後再將政策連接到角色。角色預設沒有任何許可。

1. (選用) 設定[許可界限](access_policies_boundaries.md)。這是進階功能。

   開啟 **Set permissions boundary (設定許可界限)** 區段，並選擇 **Use a permissions boundary to control the maximum role permissions (使用許可界限來控制角色許可上限)**。選取用於許可界限的政策。

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

1. 針對 **Role name (角色名稱)**，輸入您的角色名稱。角色名稱在您的 中必須是唯一的 AWS 帳戶。角色名稱用在政策中或作為 ARN 的一部分時，角色名稱區分大小寫。當主控台中的客戶顯示角色名稱時 (例如在登入程序期間)，角色名稱不區分大小寫。因為有各種實體可能會參考此角色，所以建立角色之後，您就無法編輯其名稱。

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

1. 在 **Step 1: Select trusted entities** (步驟 1：選取受信任的實體) 或者 **Step 2: Add permissions** (步驟 2：新增許可) 區段中選擇 **Edit** (編輯)，可編輯使用案例和角色許可。您將會返回先前的頁面進行編輯。

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

1. 檢閱角色，然後選擇 **Create role** (建立角色)。
**重要**  
請記住，這只是所需設定的前半部。您也必須以信任的帳戶許可提供給個別使用者，以切換到主控台中的角色，或程式化方式擔任角色。如需有關此步驟的詳細資訊，請參閱 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

------

## 建立 IAM 角色 (AWS CLI)
<a name="roles-creatingrole-user-cli"></a>

從 建立角色 AWS CLI 涉及多個步驟。當您使用 主控台建立角色時，會為您完成許多步驟，但您必須使用 自行 AWS CLI 明確執行每個步驟。您必須建立角色，然後為該角色指派許可政策。或者，您也可以設定角色的[許可界限](access_policies_boundaries.md)。

**若要為跨帳戶存取建立角色 (AWS CLI)**

1. 建立角色：[aws iam create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)

1. 將受管許可政策連接到角色：[aws iam attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html)

    或

   為角色建立內嵌許可政策：[aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

1. (選用) 透過連接標籤來將自訂屬性新增至該角色：[aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)

   如需詳細資訊，請參閱 [管理 IAM 角色 (AWS CLI 或 AWS API) 上的標籤](id_tags_roles.md#id_tags_roles_procs-cli-api)。

1. (選用) 設定角色的[許可界限](access_policies_boundaries.md)：[aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   許可界限控制角色可以擁有的許可上限。許可界限是一項進階 AWS 功能。

以下範例顯示前兩個最常見步驟，可在簡單的環境中建立一個跨帳戶角色。此範例允許 `123456789012` 帳戶中的任何使用者擔任角色，並檢視 `example_bucket` Amazon S3 儲存貯體。此範例也假定您使用執行 Windows 的用戶端電腦，並且已使用您的帳戶憑證和區域設定您的命令列界面。如需詳細資訊，請參閱[設定 AWS 命令列界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。

當您建立角色時，這個範例在第一個命令包含下列信任政策。此信任政策允許 `123456789012` 帳戶中的使用者使用 `AssumeRole` 操作來擔任角色，但只在使用者採用 `SerialNumber` 和 `TokenCode` 參數以提供 MFA 身分驗證時。如需有關 MFA 的詳細資訊，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
          "Effect": "Allow",
          "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
          "Action": "sts:AssumeRole",
          "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } }
      }
  ]
}
```

------

**重要**  
如果您的 `Principal` 元素包含特定 IAM 角色或使用者的 ARN，則該 ARN 會在儲存政策時轉換為唯一的主體 ID。如果有人希望藉由刪除並重新建立角色或使用者來提升許可時，這麼做可有助於減少此類風險。您通常不會在主控台中看到此 ID，因為在顯示信任政策時還會反向轉換回 ARN。不過，如果您刪除角色或使用者，則主體 ID 會顯示在主控台中，因為 AWS 無法再將其對應回 ARN。因此，如果您刪除並重新建立了信任政策的 `Principal` 元素所引用的使用者或角色，您必須編輯角色來替換 ARN。

當您使用第二個命令的政策，您必須將現有受管政策連接到角色。下列許可政策允許任何擔任角色的人只對 `example_bucket` Amazon S3 儲存貯體執行 `ListBucket` 動作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
      {
          "Effect": "Allow",
          "Action": "s3:ListBucket",
          "Resource": "arn:aws:s3:::example_bucket"
      }
  ]
}
```

------

若要建立此 `Test-UserAccess-Role` 角色，您必須先將之前的信任政策以名稱 `trustpolicyforacct123456789012.json` 儲存到 `policies` 資料夾 (在您的本機 `C:` 磁碟機)。然後將先前的許可政策儲存為 中的客戶受管政策 AWS 帳戶 ，名稱為 `PolicyForRole`。然後，您可以使用以下命令來建立角色，並連接受管政策。

```
# Create the role and attach the trust policy file that allows users in the specified account to assume the role.
$ aws iam create-role --role-name Test-UserAccess-Role --assume-role-policy-document file://C:\policies\trustpolicyforacct123456789012.json

# Attach the permissions policy (in this example a managed policy) to the role to specify what it is allowed to do.
$ aws iam attach-role-policy --role-name Test-UserAccess-Role --policy-arn arn:aws:iam::123456789012:policy/PolicyForRole
```

**重要**  
請記住，這只是所需設定的前半部。您還必須提供受信任帳戶中的個別使用者許可，以切換到該角色。如需有關此步驟的詳細資訊，請參閱 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

在您建立角色並授予其執行 AWS 任務或存取 AWS 資源的許可後，`123456789012`帳戶中的任何使用者都可以擔任該角色。如需詳細資訊，請參閱[切換到 IAM 角色 (AWS CLI)](id_roles_use_switch-role-cli.md)。

## 建立 IAM 角色 (AWS API)
<a name="roles-creatingrole-user-api"></a>

從 AWS API 建立角色涉及多個步驟。當您使用主控台建立角色時，有許多步驟會自動為您完成，但是使用 API 的話，您必須自行明確執行每個步驟。您必須建立角色，然後為該角色指派許可政策。或者，您也可以設定角色的[許可界限](access_policies_boundaries.md)。

**在程式碼中建立角色 (AWS API)**

1. 建立角色：[CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)

   對於角色的信任政策，您可以指定一個檔案位置。

1. 將受管許可政策連接到角色：[AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

   或

   為角色建立內嵌許可政策：[PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)
**重要**  
請記住，這只是所需設定的前半部。您還必須提供受信任帳戶中的個別使用者許可，以切換到該角色。如需有關此步驟的詳細資訊，請參閱 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

1. (選用) 藉由連接標籤將自訂屬性新增至使用者：[TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

   如需詳細資訊，請參閱 [管理 IAM 使用者 (AWS CLI 或 AWS API) 上的標籤](id_tags_users.md#id_tags_users_procs-cli-api)。

1. (選用) 設定角色的[許可界限](access_policies_boundaries.md)：[PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   許可界限控制角色可以擁有的許可上限。許可界限是一項進階 AWS 功能。

在您建立角色並授予其執行 AWS 任務或存取 AWS 資源的許可後，您必須將許可授予帳戶中的使用者，以允許他們擔任該角色。如需有關擔任角色的詳細資訊，請參閱 [切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)。

## 建立 IAM 角色 (AWS CloudFormation)
<a name="roles_creatingrole-user-cloudformation"></a>

如需有關在 中建立 IAM 角色的資訊 AWS CloudFormation，請參閱*AWS 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#aws-resource-iam-role--examples)。

如需 IAM 範本的詳細資訊 AWS CloudFormation，請參閱《 *AWS CloudFormation 使用者指南*》中的[AWS Identity and Access Management 範本程式碼片段](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-iam.html)。

# 建立角色以將許可委派給 AWS 服務
<a name="id_roles_create_for-service"></a>

許多 AWS 服務要求您使用 角色，以允許服務代表您存取其他 服務中的資源。服務會擔任代您執行動作的角色稱為[服務角色](id_roles.md#iam-term-service-role)。當角色做為服務的專業用途時，它歸類為[服務連結角色](id_roles.md#iam-term-service-linked-role)。若要查看使用服務連結的角色支援哪些服務，或者服務是否支援任何形式的臨時憑證的詳細資訊，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。若要了解個別服務如何使用角色，請在表格中選擇服務名稱以查看該服務的文件。

設定 `PassRole` 許可時，您應確保使用者傳遞的角色不會具有比您希望使用者具有之許可更多的許可。例如，可能不允許 Alice 執行任何 Amazon S3 動作。如果 Alice 可以將角色傳遞給允許 Amazon S3 動作的服務，則該服務可以在執行任務時代表 Alice 執行 Amazon S3 動作。

如需有關角色如何協助您委派許可的詳細資訊，請參閱 [角色術語和概念](id_roles.md#id_roles_terms-and-concepts)。

## 服務角色許可
<a name="id_roles_create_service-permissions"></a>

您必須設定許可，允許 IAM 實體 (使用者或角色) 建立或編輯服務角色。

**注意**  
服務連結角色的 ARN 包括服務主體，這在下列政策中以 `SERVICE-NAME.amazonaws.com` 形式指出。不要嘗試猜測服務主體，因為它是區分大小寫，且格式可以因各 AWS 服務而異。若要檢視服務的服務主體，請參閱該服務連結的角色文件。

**允許 IAM 實體建立特定服務角色**

將下列政策新增至需要建立服務角色的 IAM 實體。此政策可讓您建立所指定服務且具有特定名稱的服務角色。然後，您可以將受管或內嵌政策連接至該角色。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:CreateRole",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
        }
    ]
}
```

------

**允許 IAM 實體建立任何服務角色**

AWS 建議您只允許管理使用者建立任何服務角色。具有建立角色和連接任何政策之許可的人員可以提升自己的許可。反之，建立一個政策，讓他們只建立所需的角色，或讓系統管理員代表他們建立服務角色。

若要連接允許管理員存取整個 的政策 AWS 帳戶，請使用 [AdministratorAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AdministratorAccess) AWS 受管政策。

**允許 IAM 實體編輯服務角色**

將下列政策新增至需要編輯服務角色的 IAM 實體。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EditSpecificServiceRole",
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DetachRolePolicy",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListAttachedRolePolicies",
                "iam:ListRolePolicies",
                "iam:PutRolePolicy",
                "iam:UpdateRole",
                "iam:UpdateRoleDescription"
            ],
            "Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
        },
        {
            "Sid": "ViewRolesAndPolicies",
            "Effect": "Allow",
            "Action": [
                "iam:GetPolicy",
                "iam:ListRoles"
            ],
            "Resource": "*"
        }
    ]
}
```

------

**允許 IAM 實體刪除特定服務角色**

將下列陳述式新增至需要刪除所指定服務角色之 IAM 實體的許可政策。

```
{
    "Effect": "Allow",
    "Action": "iam:DeleteRole",
    "Resource": "arn:aws:iam::*:role/SERVICE-ROLE-NAME"
}
```

**允許 IAM 實體刪除任何服務角色**

AWS 建議您只允許管理使用者刪除任何服務角色。反之，建立一個政策，只允許他們刪除所需的角色，或讓系統管理員代表他們刪除服務角色。

若要連接允許管理員存取整個 的政策 AWS 帳戶，請使用 [AdministratorAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AdministratorAccess) AWS 受管政策。

## 為 AWS 服務建立角色 （主控台）
<a name="roles-creatingrole-service-console"></a>

您可以使用 AWS 管理主控台 來建立 服務的角色。因為有些服務支援多個服務角色，所以請參閱服務的 [AWS 文件](https://docs.aws.amazon.com/)，以查看要選擇的使用案例。您可以了解如何為角色指派必要的信任和許可政策，以便服務可以代表您擔任角色。您用來控制角色的許可的步驟可能有所不同，端視服務如何定義使用案例，以及是否建立服務連結的角色而定。

------
#### [ Console ]

**為 AWS 服務 (IAM 主控台） 建立角色**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在 IAM 主控台的導覽窗格中，選擇**角色**，然後選擇**建立角色**。

1. 對於 **Trusted entity type** (信任的實體類型)，請選擇 **AWS 服務**。

1. 針對**服務或使用案例**，選擇服務，然後選擇使用案例。服務會定義使用案例，以包含服務所需的信任政策。

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

1. 對於**許可政策**，選項取決於您選取的使用案例：
   + 如果服務定義了角色的許可，則您無法選取許可政策。
   + 從一組有限的許可政策中選取。
   + 從所有許可政策中選取。
   + 選取無許可政策，在建立角色之後建立政策，然後將政策連接到角色。

1. (選用) 設定[許可界限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。這是進階功能，可用於服務角色，而不是服務連結的角色。

   1. 開啟**設定許可界限**區段，然後選擇**使用許可界限來控制角色許可上限**。

      IAM 包含您帳戶中 AWS 受管和客戶受管政策的清單。

   1. 選取用於許可界限的政策。

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

1. 對於**角色名稱**，選項取決於服務：
   + 如果服務定義了角色名稱，則無法編輯角色名稱。
   + 如果服務定義了角色名稱的字首，則可以輸入選用字尾。
   + 如果服務未定義角色名稱，則可以為角色命名。
**重要**  
當您命名角色時，請注意下列事項：  
角色名稱在您的 中必須是唯一的 AWS 帳戶，而且無法依大小寫設為唯一。  
例如，不要同時建立名為 **PRODROLE** 和 **prodrole** 的角色。當角色名稱用於政策或 ARN 的一部分時，角色名稱會區分大小寫，但是當角色名稱在主控台中顯示給客戶時，例如在登入過程中，角色名稱不會區分大小寫。
因為其他實體可能會參考角色，所以在建立角色之後，就無法編輯其名稱。

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

1. (選用) 若要編輯使用案例和角色許可，請在**步驟 1：選取受信任的實體**或者**步驟 2：新增許可**區段中選擇**編輯**。

1. (選用) 若要協助識別、組織或搜尋角色，請將標籤新增為索引鍵值對。如需在 IAM 中使用標籤的詳細資訊，請參閱《*IAM 使用者指南*》中的[AWS Identity and Access Management 資源的標籤](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html)。

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

------

## 為服務建立角色 (AWS CLI)
<a name="roles-creatingrole-service-cli"></a>

從 建立角色 AWS CLI 涉及多個步驟。當您使用 主控台建立角色時，會為您完成許多步驟，但您必須使用 自行 AWS CLI 明確執行每個步驟。您必須建立角色，然後為該角色指派許可政策。如果您使用的服務是 Amazon EC2，則還必須建立執行個體描述檔並新增該角色。或者，您也可以設定角色的[許可界限](access_policies_boundaries.md)。

**從 建立 AWS 服務的角色 AWS CLI**

1. 以下 `[create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)` 命令會建立名為 *Test-Role* 的角色，並將信任政策連接至該角色：

   `aws iam create-role --role-name Test-Role --assume-role-policy-document file://Test-Role-Trust-Policy.json`

1. 將受管許可政策連接到角色：[aws iam attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html)

   例如，下列 `attach-role-policy` 命令會將名為 `ReadOnlyAccess` 的 AWS 受管政策連接至名為 `ReadOnlyRole` 的 IAM 角色：

   `aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess --role-name ReadOnlyRole`

    或

   為角色建立內嵌許可政策：[aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

   若要新增嵌許可政策，請參閱以下範例：

    `aws iam put-role-policy --role-name Test-Role --policy-name ExamplePolicy --policy-document file://AdminPolicy.json`

1. (選用) 透過連接標籤來將自訂屬性新增至該角色：[aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)

   如需詳細資訊，請參閱 [管理 IAM 角色 (AWS CLI 或 AWS API) 上的標籤](id_tags_roles.md#id_tags_roles_procs-cli-api)。

1. (選用) 設定角色的[許可界限](access_policies_boundaries.md)：[aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   許可界限控制角色可以擁有的許可上限。許可界限是一項進階 AWS 功能。

如果您要將角色與 Amazon EC2 或其他使用 Amazon EC2 AWS 的服務搭配使用，則必須將角色存放在執行個體描述檔中。執行個體描述檔是角色的容器，可以在啟動時連接到 Amazon EC2 執行個體。執行個體設定檔只能包含一個角色，並且無法增加該限制。如果您使用 建立角色 AWS 管理主控台，則會使用與角色相同的名稱為您建立執行個體描述檔。如需有關執行個體描述檔的詳細資訊，請參閱 [使用執行個體設定檔](id_roles_use_switch-role-ec2_instance-profiles.md)。如需有關如何使用角色啟動 EC2 執行個體的資訊，請參閱《Amazon EC2 使用者指南》**中的[控制對 Amazon EC2 資源的存取](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances)。

**建立執行個體設定檔並將角色存放在其中 (AWS CLI)**

1. 建立執行個體描述檔：[aws iam create-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html)

1. 將角色新增至執行個體描述檔：[aws iam add-role-to-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html)

以下 AWS CLI 範例命令集示範建立角色和連接許可的前兩個步驟。它還說明兩個建立執行個體設定檔和新增角色至描述檔的步驟。此範例信任允許 Amazon EC2 服務擔任角色並檢視 `example_bucket` Amazon S3 儲存貯體的政策。此範例也假定您在執行 Windows 的用戶端電腦上執行，並且已使用您的帳戶憑證和區域設定您的命令列界面。如需詳細資訊，請參閱[設定 AWS 命令列界面](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。

當您建立角色時，這個範例在第一個命令包含下列信任政策。此信任政策允許 Amazon EC2 服務擔任該角色。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {"Service": "ec2.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }
}
```

------

當您使用第二個命令的政策，您必須將許可政策連接到角色。以下範例許可政策允許角色僅在 `example_bucket` Amazon S3 儲存貯體上執行 `ListBucket` 動作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::example_bucket"
  }
}
```

------

若要建立此 `Test-Role-for-EC2` 角色，您必須先將之前的信任政策以名稱 `trustpolicyforec2.json` 和之前名為 `permissionspolicyforec2.json` 的許可政策儲存到您本機 `policies` 磁碟機的 `C:` 目錄。然後，您可以使用以下命令來建立角色、連接政策、建立執行個體設定檔，並新增角色到執行個體設定檔。

```
# Create the role and attach the trust policy that allows EC2 to assume this role.
$ aws iam create-role --role-name Test-Role-for-EC2 --assume-role-policy-document file://C:\policies\trustpolicyforec2.json

# Embed the permissions policy (in this example an inline policy) to the role to specify what it is allowed to do.
$ aws iam put-role-policy --role-name Test-Role-for-EC2 --policy-name Permissions-Policy-For-Ec2 --policy-document file://C:\policies\permissionspolicyforec2.json

# Create the instance profile required by EC2 to contain the role
$ aws iam create-instance-profile --instance-profile-name EC2-ListBucket-S3

# Finally, add the role to the instance profile
$ aws iam add-role-to-instance-profile --instance-profile-name EC2-ListBucket-S3 --role-name Test-Role-for-EC2
```

當您啟動 EC2 執行個體時，如果您使用 AWS 主控台，請在**設定執行個體詳細資訊頁面中指定執行個體**描述檔名稱。如果您使用 `aws ec2 run-instances` CLI 命令，指定 `--iam-instance-profile` 參數。

## 為服務建立角色 (AWS API)
<a name="roles-creatingrole-service-api"></a>

從 AWS API 建立角色涉及多個步驟。當您使用主控台建立角色時，有許多步驟會自動為您完成，但是使用 API 的話，您必須自行明確執行每個步驟。您必須建立角色，然後為該角色指派許可政策。如果您使用的服務是 Amazon EC2，則還必須建立執行個體描述檔並新增該角色。或者，您也可以設定角色的[許可界限](access_policies_boundaries.md)。

**為 AWS 服務建立角色 (AWS API)**

1. 建立角色：[CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)

   對於角色的信任政策，您可以指定一個檔案位置。

1. 將受管許可政策連接到角色：[AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

    或

   為角色建立內嵌許可政策：[PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

1. (選用) 藉由連接標籤將自訂屬性新增至使用者：[TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

   如需詳細資訊，請參閱 [管理 IAM 使用者 (AWS CLI 或 AWS API) 上的標籤](id_tags_users.md#id_tags_users_procs-cli-api)。

1. (選用) 設定角色的[許可界限](access_policies_boundaries.md)：[PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   許可界限控制角色可以擁有的許可上限。許可界限是一項進階 AWS 功能。

如果您要將角色與 Amazon EC2 或其他使用 Amazon EC2 AWS 的服務搭配使用，則必須將角色存放在執行個體描述檔中。執行個體設定檔是角色的容器。每個執行個體設定檔只能包含一個角色，並且無法增加該限制。如果您在 中建立角色 AWS 管理主控台，則會使用與角色相同的名稱為您建立執行個體描述檔。如需有關執行個體描述檔的詳細資訊，請參閱 [使用執行個體設定檔](id_roles_use_switch-role-ec2_instance-profiles.md)。如需有關如何使用角色啟動 Amazon EC2 執行個體的資訊，請參閱《Amazon EC2 使用者指南》**中的[控制對 Amazon EC2 資源的存取](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances)。

**建立執行個體描述檔並將角色存放在其中 (AWS API)**

1. 建立執行個體描述檔：[CreateInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html)

1. 將角色新增至執行個體描述檔：[AddRoleToInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html)

# 建立服務連結角色
<a name="id_roles_create-service-linked-role"></a>

服務連結角色是一種獨特的 IAM 角色類型，可直接連結到 AWS 服務。服務連結角色是由服務預先定義，並包含服務代表您呼叫其他 AWS 服務所需的所有許可。連結的服務也定義您如何建立、修改和刪除服務連結的角色。服務可能會自動建立或刪除角色。做為服務中精靈或程序一部分，它也許可讓您建立、修改或刪除角色。或者，它可能要求您使用 IAM 來建立或刪除角色。不論採用何種方式，服務連結角色可簡化設定服務流程，因為您不必手動新增服務許可，以代表您完成動作。

**注意**  
請記得，服務角色與服務連結角色不同。服務角色是服務擔任的 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)，可代您執行動作。IAM 管理員可以從 IAM 內建立、修改和刪除服務角色。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[建立角色以委派許可給 AWS 服務](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。服務連結角色是連結至 的一種服務角色 AWS 服務。服務可以擔任代表您執行動作的角色。服務連結角色會出現在您的 中 AWS 帳戶 ，並由服務擁有。IAM 管理員可以檢視，但不能編輯服務連結角色的許可。

連結的服務定義其服務連結角色的許可，除非另有定義，否則僅有該服務可以擔任其角色。定義的許可包括信任政策和許可政策，且該許可政策無法附加至其他 IAM 實體。

在您刪除角色之前，您必須首先刪除它們的相關資源。這有助於防止不小心移除資源存取許可。

**提示**  
如需哪些服務支援使用服務連結角色的資訊，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並尋找 **Service-Linked Role (服務連結角色)** 欄中顯示 **Yes (是)** 的服務。選擇具有連結的 **Yes (是)**，以檢視該服務的服務連結角色文件。

## 服務連結角色許可
<a name="service-linked-role-permissions"></a>

您必須設定 IAM 實體 (使用者或角色) 的許可，允許使用者或角色建立或編輯服務連結角色。

**注意**  
服務連結角色的 ARN 包括服務主體，這在下列政策中以 `SERVICE-NAME.amazonaws.com` 形式指出。請勿嘗試猜測服務委託人，因為它區分大小寫，而且格式可能因 AWS 服務而異。若要檢視服務的服務主體，請參閱該服務連結的角色文件。

**允許 IAM 實體建立特定服務連結角色**

將下列政策新增至需要建立服務連結角色的 IAM 實體。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "arn:aws:iam::*:role/aws-service-role/SERVICE-NAME.amazonaws.com/SERVICE-LINKED-ROLE-NAME-PREFIX*",
            "Condition": {"StringLike": {"iam:AWSServiceName": "SERVICE-NAME.amazonaws.com"}}
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/SERVICE-NAME.amazonaws.com/SERVICE-LINKED-ROLE-NAME-PREFIX*"
        }
    ]
}
```

------

**若要允許 IAM 實體建立任何服務連結角色**

將下列陳述式新增至需要建立服務連結角色的 IAM 實體的許可政策，或包含所需政策的任何服務角色。此政策陳述式不允許 IAM 實體連接政策到角色。

```
{
    "Effect": "Allow",
    "Action": "iam:CreateServiceLinkedRole",
    "Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
```

**若要允許 IAM 實體編輯任何服務連結角色的說明**

將下列陳述式新增至需要編輯服務連結角色說明或任何服務角色的 IAM 實體的許可政策。

```
{
    "Effect": "Allow",
    "Action": "iam:UpdateRoleDescription",
    "Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
```

**若要允許 IAM 實體刪除特定服務連結角色**

將下列陳述式新增至需要刪除服務連結角色的 IAM 實體的許可政策。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:DeleteServiceLinkedRole",
        "iam:GetServiceLinkedRoleDeletionStatus"
    ],
    "Resource": "arn:aws:iam::*:role/aws-service-role/SERVICE-NAME.amazonaws.com/SERVICE-LINKED-ROLE-NAME-PREFIX*"
}
```

**允許 IAM 實體刪除任何服務連結角色**

將下列陳述式新增至需要刪除服務連結角色 (但並非服務角色) 的 IAM 實體許可政策。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:DeleteServiceLinkedRole",
        "iam:GetServiceLinkedRoleDeletionStatus"
    ],
    "Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
```

**允許 IAM 實體將現有角色傳遞到服務**

有些 AWS 服務可讓您將現有角色傳遞給服務，而不是建立新的服務連結角色。若要執行此操作，使用者必須擁有*傳遞角色*給服務的許可。在需要傳遞角色之 IAM 實體的許可政策中，新增下列陳述式。透過這個政策陳述式，實體也可以檢視角色清單，並從中選擇要傳遞的角色。如需詳細資訊，請參閱[授予使用者將角色傳遞至 AWS 服務的許可](id_roles_use_passrole.md)。

```
{
  "Sid": "PolicyStatementToAllowUserToListRoles",
  "Effect": "Allow",
  "Action": ["iam:ListRoles"],
  "Resource": "*"
},
{
  "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
  "Effect": "Allow",
  "Action": [ "iam:PassRole" ],
  "Resource": "arn:aws:iam::account-id:role/my-role-for-XYZ"
}
```

## 具有服務連結角色的間接許可
<a name="create-service-linked-role-permissions-transfer"></a>

可將服務連結角色授予的許可間接轉移給其他使用者和角色。當 AWS 服務使用服務連結角色時，該服務連結角色可以使用自己的許可來呼叫其他 AWS 服務。這表示使用者和角色 (具有呼叫使用服務連結角色之服務的許可) 可能會間接存取該服務連結角色所能存取的服務。

例如，當您建立 Amazon RDS 資料庫執行個體時，[RDS 的服務連結角色](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAM.ServiceLinkedRoles.html)如果尚未存在，則會自動建立。此服務連結角色可讓 RDS 代您呼叫 Amazon EC2、Amazon SNS、Amazon SNS、Amazon CloudWatch Logs 和 Amazon Kinesis。如果您允許帳戶中的使用者和角色修改或建立 RDS 資料庫，則他們可能可以透過呼叫 RDS 的方式，與 Amazon EC2、Amazon SNS、Amazon CloudWatch Logs 日誌和 Amazon Kinesis 資源間接互動，因為 RDS 會使用其服務連結角色存取這些資源。

### 服務連結角色建立方法
<a name="create-service-linked-role"></a>

您用來建立服務連結角色的方法取決於服務。在某些情況下，您不需要手動建立一個服務連結角色。例如，當您在服務中完成特定動作 (例如建立資源)，該服務可能會為您建立服務連結角色。或者，您若在服務開始支援服務連結角色之前已在使用該服務，則服務可能已在您的帳戶中自動建立角色。如需進一步了解，請參閱 [我的 AWS 帳戶中出現新角色](troubleshoot_roles.md#troubleshoot_roles_new-role-appeared)。

在其他情況下，服務可能支援使用服務主控台、API 或 CLI 手動建立服務連結角色。如需哪些服務支援使用服務連結角色的資訊，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並尋找 **Service-Linked Role (服務連結角色)** 欄中顯示 **Yes (是)** 的服務。若要了解服務是否支援建立服務連結角色，請選擇**是**連結以檢視該服務的服務連結角色的文件。

如果服務不支援建立角色，則可以使用 IAM 來建立服務連結角色。

**重要**  
服務連結角色算作您的 [AWS 帳戶中的 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entities)限制，但是如果您已達到限制，仍然可以在您的帳戶中建立服務連結角色。只有服務連結角色可以超過限制。

### 建立服務連結角色 (主控台)
<a name="create-service-linked-role-iam-console"></a>

在 IAM 中建立服務連結角色之前，了解連結的服務是否自動建立服務連結角色，此外，了解是否您可以從服務主控台、API 或 CLI 建立角色。<a name="create-service-linked-role-iam-console"></a>

**建立服務連結角色 (主控台)**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在 IAM 主控台的導覽窗格中，選擇**角色**。然後，選擇 **Create role** (建立角色)。

1. 選擇 **AWS Service** (服務) 角色類型。

1. 選擇服務的使用案例。服務會定義使用案例，以包含服務所需的信任政策。然後選擇**下一步**。

1. 選擇一或多個許可政策以連接至角色。根據您選取的使用案例，服務可能可以執行下列任何操作：
   + 定義角色使用的許可。
   + 可讓您從有限的一組許可中進行選擇。
   + 可讓您從任何許可中進行選擇。
   + 可讓您目前無法選取政策、稍後建立政策，然後將它們連接至角色。

   選取可指派您希望角色擁有之許可政策旁的核取方塊，然後選擇**下一步**。
**注意**  
您指定的許可適用於任何使用角色的實體。角色預設沒有任何許可。

1. 針對 **Role name (角色名稱)**，服務會定義角色名稱自訂程度。如果服務定義角色的名稱，則此選項無法編輯。在其他情況下，服務可能會定義角色的字首，並且允許您輸入選用後綴。

   如果可能，輸入要新增至預設名稱的角色名稱後綴。此後綴可協助您識別此角色的用途。角色名稱在您的 AWS 帳戶內必須是獨一無二的。它們無法透過大小寫進行區分。例如，您無法建立名為 **<service-linked-role-name>\$1SAMPLE** 和 **<service-linked-role-name>\$1sample** 的角色。因為有各種實體可能會參照角色，所以您無法在建立角色之後編輯角色名稱。

1. (選用) 在 **Description** (說明) 中，編輯新服務連結角色的說明。

1. 您不能在建立角色時，將標籤連接至服務連結的角色。如需有關在 IAM 中使用標籤的詳細資訊，請參閱 [AWS Identity and Access Management 資源的標籤](id_tags.md)。

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

### 建立服務連結角色 (AWS CLI)
<a name="create-service-linked-role-iam-cli"></a>

在 IAM 中建立服務連結角色之前，了解連結的服務是否自動建立服務連結角色，並且了解是否您可以從服務的 CLI 建立角色。如果不支援服務 CLI，您可以使用 IAM 命令，使用服務擔任該角色所需的信任政策與內嵌政策來建立服務連結角色。

**建立服務連結角色 (AWS CLI)**

執行以下命令：

```
aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name SERVICE-NAME.amazonaws.com
```

### 建立服務連結角色 (AWS API)
<a name="create-service-linked-role-iam-api"></a>

在 IAM 中建立服務連結角色之前，了解連結的服務是否自動建立服務連結角色，並且了解是否您可以從服務的 API 建立角色。如果不支援服務 API，您可以使用 AWS API 來建立具有信任政策和內嵌政策的服務連結角色，該政策是服務擔任該角色所需的。

**建立服務連結角色 (AWS API)**

使用 [CreateServiceLinkedRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceLinkedRole.html) API 呼叫。在請求中指定 `SERVICE_NAME_URL.amazonaws.com` 的服務名稱。

例如，要建立 ** Lex Bots ** 服務連結的角色，使用 `lex.amazonaws.com`。

# 為第三方身分提供者建立角色
<a name="id_roles_create_for-idp"></a>

您可以使用身分提供者，而不是在 中建立 IAM 使用者 AWS 帳戶。使用身分提供者 (IdP)，您可以在 外部管理您的使用者身分， AWS 並授予這些外部使用者身分存取您帳戶中 AWS 資源的許可。如需有關聯合身分與身分提供者的詳細資訊，請參閱 [身分提供者和聯合身分 AWS](id_roles_providers.md)。

## 為 OIDC 和 SAML 聯合身分主體建立角色 (主控台)
<a name="roles-creatingrole-federated-users-console"></a>

建立角色的程序取決於所選擇的第三方提供者：
+ 如需 OpenID Connect (OIDC)，請參閱[為 OpenID Connect 聯合身分建立角色 (主控台)](id_roles_create_for-idp_oidc.md)。
+ 關於 SAML 2.0 的詳細資訊，請參閱[為 SAML 2.0 聯合身分建立角色 (主控台)](id_roles_create_for-idp_saml.md)。

## 為聯合存取建立角色 (AWS CLI)
<a name="roles-creatingrole-identityprovider-cli"></a>

從 AWS CLI 為支援的身分提供者 (OIDC 或 SAML) 建立角色的步驟是相同的。區別在於，您在先決條件步驟中建立的信任政策的內容不同。首先，遵循**先決條件**小節中針對您正在使用之提供者類型的步驟操作：
+ 關於 &OIDC; 提供者的詳細資訊，請參閱[建立適用於 OIDC 的角色的先決條件](id_roles_create_for-idp_oidc.md#idp_oidc_Prerequisites)。
+ 關於 &SAML; 提供者的詳細資訊，請參閱[建立適用於 SAML 的角色的先決條件](id_roles_create_for-idp_saml.md#idp_saml_Prerequisites)。

從 建立角色 AWS CLI 涉及多個步驟。當您使用 主控台建立角色時，會為您完成許多步驟，但您必須使用 自行 AWS CLI 明確執行每個步驟。您必須建立角色，然後為該角色指派許可政策。或者，您也可以設定角色的[許可界限](access_policies_boundaries.md)。

**若要建立角色 (AWS CLI)**

1. 建立角色：[aws iam create-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)

1. 將許可政策連接到角色：[aws iam attach-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-role-policy.html)

    或

   為角色建立內嵌許可政策：[aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

1. (選用) 透過連接標籤來將自訂屬性新增至該角色：[aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)

   如需詳細資訊，請參閱 [管理 IAM 角色 (AWS CLI 或 AWS API) 上的標籤](id_tags_roles.md#id_tags_roles_procs-cli-api)。

1. (選用) 設定角色的[許可界限](access_policies_boundaries.md)：[aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   許可界限控制角色可以擁有的許可上限。許可界限是一項進階 AWS 功能。

以下範例顯示前兩個最常見步驟，可在簡單的環境中建立一個身分提供者角色。此範例允許 `123456789012` 帳戶中的任何使用者擔任角色，並檢視 `example_bucket` Amazon S3 儲存貯體。此範例也假設您在執行 Windows AWS CLI 的電腦上執行 ，並已 AWS CLI 使用您的登入資料設定 。如需詳細資訊，請參閱[設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。

下列範例信任政策是針對使用者使用 Amazon Cognito 登入時的行動應用程式而設計。在此範例中，*us-east:12345678-ffff-ffff-ffff-123456* 代表由 Amazon Cognito 指派的身分集區 ID。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Sid": "RoleForCognito",
        "Effect": "Allow",
        "Principal": {"Federated": "cognito-identity.amazonaws.com"},
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
    }
}
```

------

下列許可政策允許任何擔任角色的人只對 `example_bucket` Amazon S3 儲存貯體執行 `ListBucket` 動作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::example_bucket"
  }
}
```

------

若要建立此 `Test-Cognito-Role` 角色，您必須先將之前的信任政策以名稱 `trustpolicyforcognitofederation.json` 和之前名為 `permspolicyforcognitofederation.json` 的許可政策儲存到您本機 `policies` 磁碟機的 `C:` 資料夾。然後，您可以使用以下命令來建立角色，並連接內嵌政策。

```
# Create the role and attach the trust policy that enables users in an account to assume the role.
$ aws iam create-role --role-name Test-Cognito-Role --assume-role-policy-document file://C:\policies\trustpolicyforcognitofederation.json

# Attach the permissions policy to the role to specify what it is allowed to do.
aws iam put-role-policy --role-name Test-Cognito-Role --policy-name Perms-Policy-For-CognitoFederation --policy-document file://C:\policies\permspolicyforcognitofederation.json
```

## 建立聯合存取 (AWS API) 的角色
<a name="roles-creatingrole-identityprovider-api"></a>

從 AWS CLI 為支援的身分提供者 (OIDC 或 SAML) 建立角色的步驟是相同的。區別在於，您在先決條件步驟中建立的信任政策的內容不同。首先，遵循**先決條件**小節中針對您正在使用之提供者類型的步驟操作：
+ 關於 &OIDC; 提供者的詳細資訊，請參閱[建立適用於 OIDC 的角色的先決條件](id_roles_create_for-idp_oidc.md#idp_oidc_Prerequisites)。
+ 關於 &SAML; 提供者的詳細資訊，請參閱[建立適用於 SAML 的角色的先決條件](id_roles_create_for-idp_saml.md#idp_saml_Prerequisites)。

**建立角色 (AWS API)**

1. 建立角色：[CreateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html)

1. 將許可政策連接到角色：[AttachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html)

    或

   為角色建立內嵌許可政策：[PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

1. (選用) 藉由連接標籤將自訂屬性新增至使用者：[TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

   如需詳細資訊，請參閱 [管理 IAM 使用者 (AWS CLI 或 AWS API) 上的標籤](id_tags_users.md#id_tags_users_procs-cli-api)。

1. (選用) 設定角色的[許可界限](access_policies_boundaries.md)：[PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   許可界限控制角色可以擁有的許可上限。許可界限是一項進階 AWS 功能。

# 為 OpenID Connect 聯合身分建立角色 (主控台)
<a name="id_roles_create_for-idp_oidc"></a>

您可以使用 OpenID Connect (OIDC) 聯合身分提供者，而不是在您的 中建立 AWS Identity and Access Management 使用者 AWS 帳戶。使用身分提供者 (IdP)，您可以在 外部管理您的使用者身分， AWS 並授予這些外部使用者身分存取 AWS 您帳戶中資源的許可。如需有關聯合身分與 IdP 的詳細資訊，請參閱 [身分提供者和聯合身分 AWS](id_roles_providers.md)。

## 建立適用於 OIDC 的角色的先決條件
<a name="idp_oidc_Prerequisites"></a>

您必須先完成以下先決條件步驟，然後才能建立用於 OIDC 聯合身分的角色。<a name="oidc-prereqs"></a>

**若要準備建立用於 OIDC 聯合身分的角色**

1. 使用一或多個提供聯合 OIDC 身分的服務進行註冊。如果您要建立需要存取 AWS 資源的應用程式，您也可以使用提供者資訊來設定應用程式。當您這麼做時，提供者會將應用程式唯一的 ID 提供給您的應用程式或對象。(不同的提供者可能使用不同的術語來表達此程序。本指南則使用術語*設定*來表示向提供者識別您應用程式的程序)。您可以在每個提供者設定多個應用程式，或在單一應用程式設定多個提供者。檢視有關使用身分提供者的相關資訊，如下所示：
   + [Login with Amazon 開發人員中心](https://login.amazon.com/)
   + Facebook 開發人員網站上的[新增 Facebook 登入到您的應用程式或網站](https://developers.facebook.com/docs/facebook-login/v2.1)。
   + Google 開發人員網站上的[登入時使用 OAuth 2.0 (OpenID Connect)](https://developers.google.com/accounts/docs/OAuth2Login)。

1. <a name="idpoidcstep2"></a>從 IdP 收到必要資訊後，請在 IAM 中建立 IdP。如需詳細資訊，請參閱[在 IAM 中建立 OpenID Connect (OIDC) 身分提供者](id_roles_providers_create_oidc.md)。
**重要**  
如果您正在使用來自 Google、Facebook 或 Amazon Cognito 的 OIDC IdP，請勿在 AWS 管理主控台中建立單獨的 IAM IdP。這些 OIDC 身分提供者已內建於 AWS ，可供您使用。略過此步驟，並在接下來的步驟中使用您的 IdP 建立新角色。

1. 為已進行 IdP 身分驗證的使用者要擔任的角色準備政策。正如任何角色一樣，手機應用程式的角色含有兩項政策。其中一項是信任政策，其指定擔任該角色的對象。另一項政策是許可政策，其指定行動應用程式被允許或拒絕存取的 AWS 動作和資源。

   對於 Web 身分提供者，我們建議您使用 [Amazon Cognito](https://aws.amazon.com/cognito/) 來管理身分。在這種情況下，請使用類似於這個範例的信任政策。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"Federated": "cognito-identity.amazonaws.com"},
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east-2:12345678-abcd-abcd-abcd-123456"},
               "ForAnyValue:StringLike": {"cognito-identity.amazonaws.com:amr": "unauthenticated"}
           }
       }
   }
   ```

------

   以 Amazon Cognito 指派給您的身分集區 ID 取代 `us-east-2:12345678-abcd-abcd-abcd-123456`。

   如果您手動設定 OIDC IdP，當您建立信任政策，您必須使用三個值，以確保只有您的應用程式可擔任該角色：
   + 對於 `Action` 元素，可使用 `sts:AssumeRoleWithWebIdentity` 動作。
   + 如需 `Principal` 元素，請使用字串 `{"Federated":providerUrl/providerArn}`。
     + 對於一些常見的 OIDC IdP，`providerUrl` 為 URL。以下範例包含多個方式，為部分常見 idP 指定主體：

       `"Principal":{"Federated":"cognito-identity.amazonaws.com"}`

       `"Principal":{"Federated":"www.amazon.com"}`

       `"Principal":{"Federated":"graph.facebook.com"}`

       `"Principal":{"Federated":"accounts.google.com"}`
     + 對於其他的 OIDC 提供者，請使用您在 [Step 2](#idpoidcstep2) 中建立的 OIDC 身分提供者的 Amazon Resource Name (ARN)，如以下範例所示：

       `"Principal":{"Federated":"arn:aws:iam::123456789012:oidc-provider/server.example.com"}`
   + 對於 `Condition` 元素，可使用 `StringEquals` 條件來限制許可。測試身分集區 ID (對於 Amazon Cognito) 或應用程式 ID (對於其他提供者)。身分集區 ID 應與您透過 IdP 配置應用程式時所收到的應用程式 ID 一致。ID 之間的比對可確保請求來自您的應用程式。
**注意**  
Amazon Cognito 身分集區的 IAM 角色信任服務主體 `cognito-identity.amazonaws.com` 擔任該角色。此類型的角色必須包含至少一個條件索引鍵，以限制可擔任該角色的主體。  
其他考量事項適用於擔任[跨帳戶 IAM 角色](access_policies-cross-account-resource-access.md)的 Amazon Cognito 身分集區。這些角色的信任政策必須接受 `cognito-identity.amazonaws.com` 服務主體，且必須包含 `aud` 條件索引鍵，以限制來自您預期身分集區的使用者擔任角色。如果不符合此條件，信任 Amazon Cognito 身分集區的政策會產生意外身分集區中的使用者可能擔任該角色的風險。如需詳細資訊，請參閱 *Amazon Cognito Developer Guide* 中的 [Trust policies for IAM roles in Basic (Classic) authentication](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#trust-policies)。

     建立類似以下其中一個範例的條件元素，其取決於您使用的 IdP：

     `"Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}`

     `"Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}`

     `"Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}`

     `"Condition": {"StringEquals": {"accounts.google.com:aud": "66677788899900pro0"}}`

     對於 OIDC 提供者，請將 OIDC IdP 的完全合格 URL 與 `aud` 內容索引鍵一起使用，如以下範例所示：

     `"Condition": {"StringEquals": {"server.example.com:aud": "appid_from_oidc_idp"}}`
**注意**  
角色的信任政策中的主體的值是 IdP 特有的。OIDC 的角色只能指定一個主體。因此，如果行動應用程式允許使用者從多個 IdP 登入，則為您要支援的每個 IdP 建立不同的角色。分別為每個 IdP 建立信任政策。

   如果使用者使用行動應用程式從 Login with Amazon 登入，則以下範例信任政策適用。在範例中，*amzn1.application-oa2-123456* 代表使用 Login with Amazon 設定應用程式時 Amazon 指派的應用程式 ID。

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

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForLoginWithAmazon",
             "Effect": "Allow",
             "Principal": {"Federated": "www.amazon.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"www.amazon.com:app_id": "amzn1.application-oa2-123456"}}
         }]
     }
   ```

------

   如果使用者使用行動應用程式從 Facebook 登入，則以下範例信任政策適用。在本範例中，*111222333444555* 代表 Facebook 指派的應用程式 ID。

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

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForFacebook",
             "Effect": "Allow",
             "Principal": {"Federated": "graph.facebook.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"graph.facebook.com:app_id": "111222333444555"}}
         }]
     }
   ```

------

   如果使用者使用行動應用程式從 Google 登入，則以下範例信任政策適用。在本範例中，*666777888999000* 代表由 Google 指派的應用程式 ID。

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

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForGoogle",
             "Effect": "Allow",
             "Principal": {"Federated": "accounts.google.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"accounts.google.com:aud": "666777888999000"}}
         }]
     }
   ```

------

   如果使用者使用行動應用程式從 Amazon Cognito 登入，則以下範例信任政策適用。在此範例中，*us-east:12345678-ffff-ffff-ffff-123456* 代表 Amazon Cognito 指派的身分集區 ID。

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

****  

   ```
   {
         "Version":"2012-10-17",		 	 	 
         "Statement": [{
             "Sid": "RoleForCognito",
             "Effect": "Allow",
             "Principal": {"Federated": "cognito-identity.amazonaws.com"},
             "Action": "sts:AssumeRoleWithWebIdentity",
             "Condition": {"StringEquals": {"cognito-identity.amazonaws.com:aud": "us-east:12345678-ffff-ffff-ffff-123456"}}
         }]
     }
   ```

------

## 為 OIDC 建立角色
<a name="idp_oidc_Create"></a>

完成先決條件後，您可在 IAM 建立角色。對於已辨識的共用 OpenID Connect (OIDC) 身分提供者 (IdP)，IAM 需要明確評估 JSON Web 權杖 (JWT) 中稱為*身分提供者控制項*的特定宣告。如需有關具有*身分提供者控制項*之 OIDC IdP 的詳細資訊，請參閱[共用 OIDC 提供者的身分提供者控制項](id_roles_providers_oidc_secure-by-default.md)。

下列程序介紹如何在 AWS 管理主控台中建立用於 OIDC 聯合身分的角色。若要從 AWS CLI 或 AWS API 建立角色，請參閱 中的程序[為第三方身分提供者建立角色](id_roles_create_for-idp.md)。

**重要**  
如果您使用 Amazon Cognito，請使用 Amazon Cognito 主控台來設定角色。否則，請使用 IAM 主控台來為 OIDC 聯合身分建立角色。

**若要為 OIDC 聯合身分建立 IAM 角色**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇 **Web 身分**作為信任的實體類型，然後選取**下一步**。

1. 針對 **Identity provider** (身分提供者)，選擇您角色的身分提供者：
   + 如果要為個別 Web 身分提供者建立角色，請選擇 **Login with Amazon**、**Facebook** 或 **Google**。
**注意**  
您必須為想要支援的每個身分提供者建立單獨的角色。
   + 如果想要為 Amazon Cognito 建立進階案例角色，請選擇 **Amazon Cognito**。
**注意**  
只有在處理進階案例時，必須手動建立與 Amazon Cognito 一起使用的角色。否則，Amazon Cognito 可以為您建立角色。如需 Amazon Cognito 的詳細資訊，請參閱《Amazon Cognito 開發人員指南》**中的[身分集區 (聯合身分) 外部身分提供者](https://docs.aws.amazon.com/cognito/latest/developerguide/external-identity-providers.html)。
   + 如果您想要為 GitHub Actions 建立角色，您必須先將 GitHub OIDC 提供者新增至 IAM。將 GitHub OIDC 提供者新增至 IAM 之後，請選擇 **token.actions.githubusercontent.com**。
**注意**  
如需如何設定 AWS 將 GitHub 的 OIDC 供應商信任為聯合身分的相關資訊，請參閱 [GitHub 文件 - 在 Amazon Web Services 中設定 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)。若要針對與 GitHub 的 IAM IdP 相關聯的角色限制存取權，最佳實務的相關資訊請見本頁的[設定 GitHub OIDC 身分提供者的角色](#idp_oidc_Create_GitHub)。
   + 如果想要為 HashiCorp Cloud Platform (HCP) Terraform 建立角色，您必須先將 Terraform OIDC 提供者新增至 IAM。將 Terraform OIDC 提供者新增至 IAM 之後，選擇 **app.terraform.io**。
**重要**  
HashiCorp Cloud Platform (HCP) Terraform OIDC 提供者的 IAM 角色必須在角色信任政策中評估 IAM 條件索引鍵 `app.terraform.io:sub`。此條件索引鍵會限制哪些 HCP Terraform 組織、專案、工作區或執行階段能夠擔任該角色。如果沒有此條件金鑰，您的信任政策會透過組織外部的身分授予對角色 AWS 和資源的存取權，這不符合最低權限原則。  
如果您為 AWS 帳戶中與 HCP Terraform OIDC 供應商相關聯的角色設定或修改角色信任政策，但未評估 IAM 條件金鑰 `app.terraform.io:sub`，您將會收到錯誤。此外，如果您的角色信任政策未評估此條件索引鍵， AWS STS 將拒絕授權請求。

1. 請求的資訊會根據所選擇的 OIDC 提供者而有所不同。
   + 輸入您的應用程式的識別碼。識別碼的標籤會因所選擇的提供者而改變：
     + 如果您要為 Login with Amazon 建立角色，請將應用程式 ID 輸入 **Application ID** (應用程式 ID) 方塊中。
     + 如果您要為 Facebook 建立角色，請將應用程式 ID 輸入 **Application ID** (應用程式 ID) 方塊中。
     + 如果您要為 Google 建立角色，請在 **Audience** (對象) 方塊中輸入對象名稱。
     + 如果您要為 Amazon Cognito 建立角色，請在 **Identity Pool ID** (身分集區 ID) 方塊中輸入您為 Amazon Cognito 應用程式建立的身分集區 ID。
   + 如果您想要為 GitHub Actions 建立角色，請輸入下列詳細資訊：
     + 針對 **Audience** (對象)，選擇 `sts.amazonaws.com`。
     + 針對 **GitHub 組織**，輸入 GitHub 組織名稱。GitHub 組織名稱是必要資訊，而且必須由包含破折號 (-) 的英數字元組成。您無法在 GitHub 組織名稱中使用萬用字元 (\$1 和 ?)。
     + (選用) 針對 **GitHub 儲存庫**，輸入 GitHub 儲存庫名稱。如果您不指定值，則會預設為萬用字元 (`*`)。
     + (選用) 針對 **GitHub 分支**，輸入 GitHub 分支名稱。如果您不指定值，則會預設為萬用字元 (`*`)。
   + 如果您想要為 HashiCorp Cloud Platform (HCP) Terraform 建立角色，請輸入下列詳細資訊：
     + 針對 **Audience** (對象)，選擇 `aws.workload.identity`。
     + 針對**組織**，輸入組織名稱。您可以為所有組織指定萬用字元 (`*`)。
     + 針對**專案**，輸入專案名稱。您可以為所有專案指定萬用字元 (`*`)。
     + 針對**工作區**，輸入工作區名稱。您可以為所有工作區指定萬用字元 (`*`)。
     + 針對**執行階段**，輸入執行階段名稱。您可以為所有執行階段指定萬用字元 (`*`)。

1. (選用) 針對**條件 (選用)**，選擇**新增條件**，以建立應用程式使用者在能夠使用角色所授予的許可之前所必須滿足的其他條件。例如，您可以新增僅針對特定 IAM 使用者 ID 授予 AWS 資源存取權的條件。您也可以在建立角色之後，將條件新增至信任政策。如需詳細資訊，請參閱[更新角色信任政策](id_roles_update-role-trust-policy.md)。

1. 檢閱您的 OIDC 資訊，然後選擇**下一步**。

1. IAM 包含您帳戶中 AWS 受管和客戶受管政策的清單。選取用於許可政策的政策，或者選擇 **Create policy** (建立政策) 以開啟新的瀏覽器標籤，並從頭建立新的政策。如需詳細資訊，請參閱[建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。在您建立政策後，關閉該標籤並返回您的原始標籤。選取您希望 OIDC 使用者具有的許可政策旁的核取方塊。如果您希望，您目前可以不選取政策，稍後再將政策連接到角色。角色預設沒有任何許可。

1. (選用) 設定[許可界限](access_policies_boundaries.md)。這是進階功能。

   開啟 **Permissions boundary** (許可界限) 區段，並選擇 **Use a permissions boundary to control the maximum role permissions** (使用許可界限來控制角色許可上限)。選取用於許可界限的政策。

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

1. 在 **Role name** (角色名稱) 中，輸入角色名稱。角色名稱在您的 中必須是唯一的 AWS 帳戶。它們不區分大小寫。例如，您無法建立名為 **PRODROLE** 和 **prodrole** 的角色。由於其他 AWS 資源可能會參考角色，因此您無法在建立角色之後編輯角色的名稱。

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

1. 如要編輯使用案例和角色許可，請在 **Step 1: Select trusted entities** (步驟 1：選取受信任的實體) 或者 **Step 2: Add permissions** (步驟 2：新增許可) 區段中選擇 **Edit** (編輯)。

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

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

## 設定 GitHub OIDC 身分提供者的角色
<a name="idp_oidc_Create_GitHub"></a>

如果您使用 GitHub 做為 OpenID Connect (OIDC) 身分提供者 (IdP)，最佳實務是限制可擔任與 IAM IdP 相關聯角色的實體。當您在信任政策中包含條件陳述式時，可以將角色限制到特定 GitHub 組織、儲存庫或分支。您可以使用具有字符條件運算子的條件索引鍵 `token.actions.githubusercontent.com:sub` 來限制存取權。建議您將條件限制為一組特定的儲存庫或 GitHub 組織內的分支。如需如何設定 AWS 將 GitHub 的 OIDC 信任為聯合身分的相關資訊，請參閱 [GitHub 文件 - 在 Amazon Web Services 中設定 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)。

如果您在動作工作流程或 OIDC 政策中使用 GitHub 環境，我們強烈建議將保護規則新增至環境，以提升安全性。使用部署分支和標籤來限制哪些分支和索引標籤可以部署至環境。如需有關使用保護規則設定環境的詳細資訊，請參閱 GitHub 的 *Using environments for deployment* 文章中的 [Deployment branches and tags](https://docs.github.com/en/actions/deployment/targeting-different-environments/using-environments-for-deployment#deployment-branches-and-tags)。

當 GitHub 的 OIDC IdP 是您角色的受信任主體時，IAM 會檢查角色信任政策條件以驗證條件索引鍵 `token.actions.githubusercontent.com:sub` 確實存在，且其值不單是萬用字元 (\$1 和 ?) 或 null。IAM 會在建立或更新信任政策時執行此檢查。如果條件索引鍵 `token.actions.githubusercontent.com:sub` 不存在，或者鍵值不滿足上述值標準，請求將失敗且會傳回錯誤。

**重要**  
如果您未將條件金鑰限制`token.actions.githubusercontent.com:sub`為特定組織或儲存庫，則來自您控制範圍之外的組織或儲存庫的 GitHub 動作可以擔任與您 AWS 帳戶中的 GitHub IAM IdP 相關聯的角色。

下列範例信任政策會限制存取已定義的 GitHub 組織、儲存庫和分支。下列範例中，條件索引鍵 `token.actions.githubusercontent.com:sub` 值是 GitHub 所記錄的預設主旨值格式。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::012345678910:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
          "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:ref:refs/heads/GitHubBranch"
        }
      }
    }
  ]
}
```

------

下列範例條件會限制存取已定義的 GitHub 組織和儲存庫，但會授予對儲存庫內任何分支的存取權。

```
"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {    
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/GitHubRepo:*"
  }
}
```

下列範例條件會限制存取已定義的 GitHub 組織中的任何儲存庫或分支。我們建議您將條件索引鍵 `token.actions.githubusercontent.com:sub` 限制為特定值，此特定值可限制從您的 GitHub 組織內部存取 GitHub 動作。

```
"Condition": {
  "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
  },
  "StringLike": {    
    "token.actions.githubusercontent.com:sub": "repo:GitHubOrg/*"
  }
}
```

如需有關可用於政策中條件檢查的 OIDC 聯合身分索引鍵的詳細資訊，請參閱[AWS OIDC 聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-wif)。

# 為 SAML 2.0 聯合身分建立角色 (主控台)
<a name="id_roles_create_for-idp_saml"></a>

 您可以使用 SAML 2.0 聯合，而不是在 中建立 IAM 使用者。 AWS 帳戶使用身分提供者 (IdP)，您可以在 外部管理您的使用者身分， AWS 並授予這些外部使用者身分存取您帳戶中 AWS 資源的許可。如需有關聯合身分與身分提供者的詳細資訊，請參閱 [身分提供者和聯合身分 AWS](id_roles_providers.md)。

**注意**  
若要改善聯合彈性，建議您將 IdP 和 AWS 聯合設定為支援多個 SAML 登入端點。如需詳細資訊，請參閱 AWS 安全部落格文章[如何使用區域 SAML 端點進行容錯移轉](https://aws.amazon.com/blogs//security/how-to-use-regional-saml-endpoints-for-failover)。

## 建立適用於 SAML 的角色的先決條件
<a name="idp_saml_Prerequisites"></a>

您必須先完成以下先決條件步驟，然後才能建立用於 SAML 2.0 聯合身分的角色。<a name="saml-prereqs"></a>

**準備建立用於 SAML 2.0 聯合身分的角色**

1. <a name="idpsamlstep1"></a>在為以 SAML 為基礎的聯合身分建立角色之前，必須在 IAM 中建立 SAML 提供者。如需詳細資訊，請參閱 [在 IAM 中建立 SAML 身分提供者](id_roles_providers_create_saml.md)。

1. 為已進行 SAML 2.0–身分驗證的使用者要擔任的角色準備政策。正如任何角色一樣，SAML 聯合身分的角色含有兩項政策。其中一項是角色信任政策，指定擔任該角色的對象。另一個是 IAM 許可政策，指定允許或拒絕 SAML 聯合主體存取 AWS 的動作和資源。

   當您為您的角色建立信任政策時，必須使用三個值，以確保只有您的應用程式可擔任該角色：
   + 對於 `Action` 元素，可使用 `sts:AssumeRoleWithSAML` 動作。
   + 如需 `Principal` 元素，請使用字串 `{"Federated":ARNofIdentityProvider}`。將 `ARNofIdentityProvider` 取代為您在 [Step 1](#idpsamlstep1) 中建立的 [SAML 身分提供者](id_roles_providers_saml.md) ARN。
   + 對於 `Condition` 元素，請使用 `StringEquals` 條件來測試 SAML 回應中的 `saml:aud` 屬性是否與登入主控台時瀏覽器顯示的 URL 相符。此登入端點 URL 是身分提供者的 SAML 收件人屬性。您可以在特定區域中包含登入 URLs。 AWS 建議使用區域端點而非全域端點來改善聯合彈性。對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。

     如果需要 SAML 加密，登入 URL 必須包含指派給 SAML 提供者的唯一識別碼 AWS 。可以透過在 IAM 主控台中選取身分提供者來顯示詳細資訊頁面，以檢視唯一識別碼。

     `https://region-code.signin.aws.amazon.com/saml/acs/IdP-ID`

   以下範例信任政策是專為 SAML 聯合身分使用者設計的政策：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRoleWithSAML",
           "Principal": {
               "Federated": "arn:aws:iam::111122223333:saml-provider/PROVIDER-NAME"
           },
           "Condition": {
               "StringEquals": {
                   "SAML:aud": "https://region-code.signin.aws.amazon.com/saml"
               }
           }
       }
   }
   ```

------

   將主體 ARN 取代為您在 IAM 中所建立的 SAML 提供者的實際 ARN。它會有自己的帳戶 ID 和提供者名稱。

## 建立 SAML 的角色
<a name="idp_saml_Create"></a>

完成必要步驟後，您可以建立以 SAML 為基礎的聯合身分角色。

**若要為以 SAML 為基礎的聯合身分建立角色**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇 **SAML 2.0 federation (SAML 2.0 聯合身分)** 角色類型。

1. 針對 **Select a SAML provider** (選擇 SAML 提供者)，選擇您角色的提供者。

1. 選擇 SAML 2.0 存取層級的方法。
   + 選擇**僅允許程式設計存取**，以建立可從 AWS API 或 以程式設計方式擔任的角色 AWS CLI。
   + 選擇**允許程式設計和 AWS 管理主控台 存取**，以建立可以程式設計方式從 擔任的角色 AWS 管理主控台。

   同時建立類似的角色，但也可以從主控台所擔任的角色包括具有特定條件的信任政策。該條件明確確保可將 SAML 對象 (`SAML:aud` 屬性) 設定為 SAML 提供者的 AWS 登入端點。

1. 定義屬性的程序因存取類型而異。
   + 如果要為程式設計存取建立角色，請從 **Attribute (屬性)** 清單選取屬性。然後，在 **Value** (值) 方塊中，輸入包含在角色中的值。這會限制從身分提供者存取使用者的角色，其身分提供者的 SAML 身分驗證回應 (聲明) 包括您指定的屬性。您必須至少指定一個屬性，以確保您的角色僅限於組織中的一部分使用者。
   + 如果您要為程式設計和 AWS 管理主控台 存取建立角色，**登入端點**區段會定義您的瀏覽器在登入主控台時顯示的 URL。此端點是身分提供者的 SAML 收件人屬性，會映射至 [`saml:aud`](reference_policies_iam-condition-keys.md#condition-keys-saml) 內容索引鍵。如需詳細資訊，請參閱[為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

     1. 選擇**區域端點**或**非區域端點**。建議使用多個區域 SAML 登入端點，以便改善聯合身分彈性。

     1. 針對**區域**，選擇 SAML 供應商支援 AWS 登入的區域。

     1.  若要**讓登入 URLs 包含唯一識別符**，請選取登入端點是否包含 AWS 指派給 SAML 身分提供者的唯一識別符。加密 SAML 聲明需要此選項。如需詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。

1. 若要向信任政策新增更多與屬性相關的條件，請選擇 **Condition (optional)** (條件 (選用))，並選取其他條件，然後指定值。
**注意**  
該清單包含最常用的 SAML 屬性。IAM 支援可用於建立條件的其他屬性。如需所支援屬性的清單，請參閱 [SAML 聯合身分的可用金鑰](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-saml)。如果您需要不在清單中的受支援 SAML 屬性的條件，您可以手動新增該條件。若要這麼做，請在建立角色後編輯信任政策。

1.  檢閱您的 SAML 2.0 信任資訊，然後選擇 **Next** (下一步)。

1. IAM 包含您帳戶中 AWS 受管和客戶受管政策的清單。選取用於許可政策的政策，或者選擇 **Create policy** (建立政策) 以開啟新的瀏覽器標籤，並從頭建立新的政策。如需詳細資訊，請參閱[建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。在您建立政策後，關閉該標籤並返回您的原始標籤。選取您希望 SAML 聯合身分使用者具有之許可政策旁的核取方塊。如果您希望，您目前可以不選取政策，稍後再將政策連接到角色。角色預設沒有任何許可。

1. (選用) 設定[許可界限](access_policies_boundaries.md)。這是進階功能。

   開啟 **Permissions boundary** (許可界限) 區段，並選擇 **Use a permissions boundary to control the maximum role permissions** (使用許可界限來控制角色許可上限)。選取用於許可界限的政策。

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

1. 選擇下**一步：檢閱**。

1. 在 **Role name** (角色名稱) 中，輸入角色名稱。角色名稱在您的 中必須是唯一的 AWS 帳戶。它們不區分大小寫。例如，您無法建立名為 **PRODROLE** 和 **prodrole** 的角色。由於其他 AWS 資源可能會參考角色，因此您無法在建立角色之後編輯角色的名稱。

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

1. 在 **Step 1: Select trusted entities** (步驟 1：選取受信任的實體) 或者 **Step 2: Add permissions** (步驟 2：新增許可) 區段中選擇 **Edit** (編輯)，可編輯使用案例和角色許可。

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

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

在您建立角色之後，您透過 AWS的相關資訊設定您的身分提供者軟體來完成 SAML 信任。此資訊包含您希望 SAML 聯合身分使用者使用的角色。這是指在您的 IdP 和 AWS之間設定依賴方信任。如需詳細資訊，請參閱[使用依賴方信任設定您的 SAML 2.0 IdP 並新增宣告](id_roles_providers_create_saml_relying-party.md)。

# 使用自訂信任政策建立角色
<a name="id_roles_create_for-custom"></a>

您可以建立自訂信任政策來委派存取權，並允許其他人在您的 中執行動作 AWS 帳戶。如需詳細資訊，請參閱[建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。

如需有關如何使用角色委派許可的資訊，請參閱[角色術語和概念](id_roles.md#id_roles_terms-and-concepts)。

## 使用自訂信任政策 (主控台) 建立 IAM 角色
<a name="roles-creatingrole-custom-trust-policy-console"></a>

您可以使用 AWS 管理主控台 來建立 IAM 使用者可以擔任的角色。例如，假設您的組織有多個 AWS 帳戶 來隔離開發環境與生產環境。如需有關建立可讓開發帳戶中的使用者存取生產帳戶中資源的角色的高階資訊，請參閱[使用不同的開發和生產帳戶的範例方案](id_roles_common-scenarios_aws-accounts.md#id_roles_common-scenarios_aws-accounts-example)。

**使用自訂信任政策 (主控台) 建立角色**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇 **Custom trust policy** (自訂信任政策) 角色類型。

1. 在 **Custom trust policy** (自訂信任政策) 區段中，輸入或貼上角色的自訂信任政策。如需詳細資訊，請參閱[建立 IAM 政策](access_policies_create-console.md#access_policies_create-start)。

1. 解決[政策驗證](access_policies_policy-validator.md)期間產生的任何安全性警告、錯誤或一般性警告，然後選擇 **Next** (下一步)。

1. (選用) 設定[許可界限](access_policies_boundaries.md)。這是進階功能，可用於服務角色，而不是服務連結的角色。

   開啟 **Permissions boundary** (許可界限) 區段，並選擇 **Use a permissions boundary to control the maximum role permissions** (使用許可界限來控制角色許可上限)。IAM 包含您帳戶中 AWS 受管和客戶受管政策的清單。選取用於許可界限的政策。

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

1. 針對 **Role name (角色名稱)**，服務會定義角色名稱自訂程度。如果服務定義角色名稱，則無法編輯此選項。在其他情況下，服務可能會定義角色的字首，並且可允許您輸入選用後綴。有些服務可讓您指定角色的完整名稱。

   如有可能，請輸入角色名稱或角色名稱後綴。角色名稱在您的 中必須是唯一的 AWS 帳戶。它們不區分大小寫。例如，您無法建立名為 **PRODROLE** 和 **prodrole** 的角色。由於其他 AWS 資源可能會參考角色，因此您無法在建立角色之後編輯角色的名稱。

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

1. (選用) 在**步驟 1：選取信任的實體**或**步驟 2：新增許可**區段中選擇**編輯**，以編輯角色的自訂政策和許可。

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

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

# 委派存取權限的政策範例
<a name="id_roles_create_policy-examples"></a>

下列範例示範如何允許或授予 AWS 帳戶 存取另一個 中的資源 AWS 帳戶。若要了解如何使用這些範例 JSON 政策文件來建立 IAM 政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

**Topics**
+ [使用 角色將存取權委派給另一個資源的資源 AWS 帳戶](#example-delegate-xaccount-rolesapi)
+ [使用政策將存取權限委託給服務](#id_roles_create_policy-examples-access-to-services)
+ [使用以資源為基礎的政策來指派存取另一個帳戶中的 Amazon S3 儲存貯體的權限。](#example-delegate-xaccount-S3)
+ [使用以資源為基礎的政策來指派存取另一個帳戶中的 Amazon SQS 佇列的權限。](#example-delegate-xaccount-SQS)
+ [當拒絕存取帳戶時，不得委託存取](#example-delegate-xaccount-SQS-denied)

## 使用 角色將存取權委派給另一個資源的資源 AWS 帳戶
<a name="example-delegate-xaccount-rolesapi"></a>

 如需示範如何使用 IAM 角色授予某個帳戶中使用者存取另一個帳戶中 AWS 資源的教學課程，請參閱 [IAM 教學課程：使用 IAM 角色在 AWS 帳戶之間委派存取權](tutorial_cross-account-with-roles.md)。

**重要**  
您可以在角色信任政策的 `Principal` 元素中包含特定角色或使用者的 ARN。當您儲存政策時， 會將 ARN AWS 轉換為唯一的委託人 ID。如果有人希望藉由刪除並重新建立角色或使用者來提升特權，這麼做可有助於減輕此類風險。您通常不會在主控台中看到此 ID，因為在顯示信任政策時還會反向轉換回 ARN。不過，如果您刪除角色或使用者，則關係會中斷。即使重新建立使用者或角色，您的政策都不再適用，因為它不符合信任政策中所儲存的主體 ID。發生這種情況時，主體 ID 會顯示在主控台中，因為 AWS 無法再將其對應回 ARN。結果是，如果您刪除並重新建立了信任政策的 `Principal` 元素所引用的使用者或角色，您必須編輯角色來替換 ARN。當您儲存政策時，它會轉換為新的主體 ID。

## 使用政策將存取權限委託給服務
<a name="id_roles_create_policy-examples-access-to-services"></a>

以下範例顯示一個可以連接到角色的政策。此政策可讓 Amazon EMR 和 這兩個服務 AWS Data Pipeline擔任該角色。然後服務可以執行指派給角色的許可政策所授予的任何任務 (不顯示)。若要指定多個服務主體，不用指定兩個 `Service` 元素；您可以只使用一個該元素。實際上，您可以將一組多個服務主體做為單一 `Service` 元素的值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "elasticmapreduce.amazonaws.com",
          "datapipeline.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

## 使用以資源為基礎的政策來指派存取另一個帳戶中的 Amazon S3 儲存貯體的權限。
<a name="example-delegate-xaccount-S3"></a>

在本範例中，帳戶 A 使用資源類型政策 (一個 Amazon S3 [儲存貯體政策](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingBucketPolicies.html)) 授予帳戶 B 完全存取帳戶 A 的 S3 儲存貯體。然後，帳戶 B 建立一個 IAM 使用者政策，向帳戶 B 中的一個使用者授予針對帳戶 A 的儲存貯體的存取權限。

帳戶 A 中的 S3 儲存貯體政策可能與以下政策類似。在本範例中，帳戶 A 的 S3 儲存貯體的名稱為 *amzn-s3-demo-bucket*，而帳戶 B 的帳戶號碼為 111122223333。它在帳戶 B 中未指定任何單一使用者或群組，僅指定帳戶本身。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Sid": "AccountBAccess1",
    "Effect": "Allow",
    "Principal": {"AWS": "111122223333"},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket",
      "arn:aws:s3:::amzn-s3-demo-bucket/*"
    ]
  }
}
```

------

或者，帳戶 A 可使用 Amazon S3 [存取控制清單 (ACL)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3_ACLs_UsingACLs.html) 來授予帳戶 B 存取 S3 儲存貯體或某個儲存貯體內的單一物件。這種情況下，唯一改變的是帳戶 A 授權存取帳戶 B 的方式。如此範例的下一個部分所述，帳戶 B 仍使用一個政策委託針對帳戶 B 中的 IAM 群組的存取許可。如需有關對 S3 儲存貯體和物件實施控制存取的詳細資訊，請前往*Amazon Simple Storage Service 使用者指南*中的[存取控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingAuthAccess.html)。

帳戶 B 的管理員可能建立以下政策範例。該政策向帳戶 B 中的群組或使用者授予讀取存取許可。前一政策向帳戶 B 授予存取許可。但是，除非組或使用者政策明確授予資源存取許可，否則帳戶 B 中的單個群組和使用者不能存取資源。此政策中的許可只能是上述跨帳戶政策中的許可的一個子集。相比於帳戶 A 在第一個政策中授予帳戶 B 的許可，帳戶 B 無法向其群組和使用者授予更多許可。在此政策中，將明確定義 `Action` 元素以僅允許 `List` 操作，而且此政策的 `Resource` 元素與由帳戶 A 執行的儲存貯體政策的 `Resource` 配對。

為執行此政策，帳戶 B 使用 IAM 將其連接到帳戶 B 中的適用使用者 (或群組)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "s3:List*",
    "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket",
      "arn:aws:s3:::amzn-s3-demo-bucket/*"
    ]
  }
}
```

------

## 使用以資源為基礎的政策來指派存取另一個帳戶中的 Amazon SQS 佇列的權限。
<a name="example-delegate-xaccount-SQS"></a>

在下列範例中，帳戶 A 具有 Amazon SQS 佇列，而此佇列使用連接至佇列的資源類型政策向帳戶 B 授予佇列存取權。然後，帳戶 B 使用 IAM 群組原則委派帳戶 B 中群組的存取權。

以下範例佇列政策為帳戶 B 授予許可，以對帳戶 A 中名為 *queue1* 的佇列執行 `SendMessage` 和 `ReceiveMessage` 動作，但只能在 2014 年 11 月 30 日中午 12:00 至下午 3:00 之間執行該動作。Account B 的帳戶編號為 1111-2222-3333。帳戶 A 使用 Amazon SQS 執行此政策。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {"AWS": "111122223333"},
    "Action": [
      "sqs:SendMessage",
      "sqs:ReceiveMessage"
    ],
    "Resource": ["arn:aws:sqs:*:123456789012:queue1"],
    "Condition": {
      "DateGreaterThan": {"aws:CurrentTime": "2014-11-30T12:00Z"},
      "DateLessThan": {"aws:CurrentTime": "2014-11-30T15:00Z"}
    }
  }
}
```

------

帳戶 B 向帳戶 B 中的組委託存取許可的政策可能類似於以下範例。帳戶 B 使用 IAM 將此政策連接到群組 (或使用者)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": "sqs:*",
    "Resource": "arn:aws:sqs:*:123456789012:queue1"
  }
}
```

------

在前述 IAM 使用者政策範例中，帳戶 B 使用萬用字元授權其使用者存取針對帳戶 A 的佇列的所有 Amazon SQS 操作。但是帳戶 B 可委託的範圍僅限於帳戶 B 被授權存取的範圍。擁有第二個政策的帳戶 B 群組只能在 2014 年 11 月 30 日中午至下午 3:00 之間存取該佇列。根據帳戶 A 的 Amazon SQS 佇列政策的定義，使用者只能執行 `SendMessage` 與 `ReceiveMessage` 操作。

## 當拒絕存取帳戶時，不得委託存取
<a name="example-delegate-xaccount-SQS-denied"></a>

如果另一個帳戶明確拒絕存取使用者的父帳戶，則 AWS 帳戶 無法將存取權委派給另一個帳戶的 資源。拒絕將傳播到該帳戶內的所有使用者，無論使用者的現有政策是否授予這些使用者存取許可。

例如，帳戶 A 編寫了一個針對其帳戶中 S3 儲存貯體的儲存貯體政策，其中明確拒絕了帳戶 B 存取帳戶 A 的儲存貯體。但帳戶 B 編寫了一個 IAM 使用者政策，其中對帳戶 B 中的一個使用者授予了對帳戶 A 的儲存貯體的存取權限。應用於帳戶 A 的 S3 儲存貯體的「明確拒絕」將傳播到帳戶 B 中的使用者。它會覆蓋用於對帳戶 B 中使用者授予存取權限的 IAM 使用者政策 (有關如何計算許可的詳細資訊，請參閱 [政策評估邏輯](reference_policies_evaluation-logic.md))。

帳戶 A 的儲存貯體政策可能與下列政策類似。在本範例中，帳戶 A 的 S3 儲存貯體的名稱為 *amzn-s3-demo-bucket*，而帳戶 B 的帳戶號碼為 1111-2222-3333。帳戶 A 使用 Amazon S3 執行此政策。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Sid": "AccountBDeny",
    "Effect": "Deny",
    "Principal": {"AWS": "111122223333"},
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
  }
}
```

------

此「明確拒絕」將覆蓋帳戶 B 中所有提供帳戶 A 中 S3 儲存貯體存取許可的政策。

# IAM 角色管理
<a name="id_roles_manage"></a>

在使用者、應用程式或服務可以使用您建立的角色之前，您必須授予切換到該角色的許可。您可以使用連接至群組或使用者的任何政策，來授予必要的許可。本節說明如何授予使用者使用角色的許可。它還說明使用者如何從 AWS 管理主控台、Tools for Windows PowerShell、 AWS Command Line Interface (AWS CLI) 和 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 切換到角色。

**重要**  
當您以程式設計方式而不是在 IAM 主控台中建立角色時，則除了 `RoleName` 之外，您還可以選擇新增高達 512 個字元的 `Path`，該字元長度最多 64 個字元。不過，如果您想要在 中使用具有**切換角色**功能的角色 AWS 管理主控台，則合併的 `Path`和 `RoleName`不得超過 64 個字元。

**Topics**
+ [檢視角色存取](#roles-modify_prerequisites)
+ [根據存取資訊產生政策](#roles-modify_gen-policy)
+ [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)
+ [授予使用者將角色傳遞至 AWS 服務的許可](id_roles_use_passrole.md)
+ [撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)
+ [更新服務連結角色](id_roles_update-service-linked-role.md)
+ [更新角色信任政策](id_roles_update-role-trust-policy.md)
+ [更新角色的許可](id_roles_update-role-permissions.md)
+ [更新角色的設定](id_roles_update-role-settings.md)
+ [刪除角色或執行個體設定檔](id_roles_manage_delete.md)

## 檢視角色存取
<a name="roles-modify_prerequisites"></a>

變更角色的許可之前，您應該檢閱其最近的服務層級活動。這很重要，因為您不希望從正在使用該許可的主體 (人員或應用程式) 中移除存取。如需有關檢視上次存取的資訊的詳細資訊，請參閱 [AWS 使用上次存取的資訊在 中精簡許可](access_policies_last-accessed.md)。

## 根據存取資訊產生政策
<a name="roles-modify_gen-policy"></a>

您有時可能會對 IAM 實體 (使用者或角色) 授予超出其要求的許可。為了協助您精簡所授予的許可，您可以根據實體的存取活動產生 IAM 政策。IAM Access Analyzer 會檢閱您的 AWS CloudTrail 日誌，並產生政策範本，其中包含實體在指定日期範圍內已使用的許可。您可以使用範本建立具有精細許可的受管政策，然後將其連接至 IAM 實體。如此一來，您只會授予使用者或角色與特定使用案例 AWS 的資源互動所需的許可。若要進一步了解，請參閱 [IAM Access Analyzer 政策產生](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)。

# 向使用者授予切換角色的許可
<a name="id_roles_use_permissions-to-switch"></a>

當管理員[建立用於跨帳戶存取的角色](id_roles_create_for-user.md)時，他們會在擁有角色和資源的帳戶 (信任帳戶) 和包含使用者的帳戶 (可信帳戶) 之間建立信任。若要執行此操作，信任帳戶的系統管理員要在角色的信任政策中將可信的帳戶編號指定為 `Principal`。這*可能*會允許可信帳戶中的任何使用者擔任該角色。要完成設定，信任帳戶的管理員必須為該帳戶中的特定群組或使用者提供切換到該角色的許可。

**要授予許可以切換到角色**

1. 身為可信帳戶的管理員，請為使用者建立新政策，或編輯現有政策來新增必要元素。如需詳細資訊，請參閱[建立或編輯政策](#roles-usingrole-createpolicy)。

1. 然後，選擇您想要如何共享角色資訊：
   + **角色連結：**向使用者傳送連結，讓他們進入已填寫所有詳細資訊的 **Switch Role** (切換角色) 頁面。
   + **帳戶 ID 或別名：**為每個使用者提供角色名稱以及帳戶 ID 號碼或帳戶別名。使用者接著前往 **Switch Role (切換角色)** 頁面，然後手動新增詳細資訊。

   如需詳細資訊，請參閱[提供資訊給使用者](#roles-usingrole-giveuser)。

請注意，只有當您做為 IAM 使用者、SAML 聯合角色或 Web 聯合身分角色登入時，才能切換角色。如果您以 AWS 帳戶根使用者登入，則無法切換角色。

**重要**  
您無法將 中的角色切換 AWS 管理主控台 為需要 [ExternalId](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) 值的角色。您只能透過呼叫支援 `ExternalId` 參數的 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 來切換到此類角色。

**備註**  
本主題討論*使用者*的政策，因為您最終會向使用者授予完成任務的許可。不過，我們不建議您直接向個別使用者授予許可。當使用者擔任角色時，他們會被指派得到與該角色關聯的許可。
當您在 中切換角色時 AWS 管理主控台，主控台一律會使用您的原始登入資料來授權切換。無論您作為 IAM 使用者、SAML 聯合角色還是 Web 聯合身分角色登入，上述情形均適用。例如，如果您切換到 RoleA，IAM 會使用您的原始使用者或聯合角色憑證確定是否允許您擔任 RoleA。如果您*在使用 RoleA 時*嘗試切換到 RoleB，仍會使用您的**原始**使用者或聯合身分角色憑證對您切換到 RoleB 的嘗試進行授權。RoleA 的憑證不會用於此動作。

**Topics**
+ [建立或編輯政策](#roles-usingrole-createpolicy)
+ [提供資訊給使用者](#roles-usingrole-giveuser)

## 建立或編輯政策
<a name="roles-usingrole-createpolicy"></a>

授予使用者擔任角色的許可政策必須包含在下列項目中擁有 `Allow` 效果的陳述式：
+ `sts:AssumeRole` 動作
+ 在 `Resource` 元素中的角色的 Amazon Resource Name (ARN)。

取得政策的使用者被允許在所列資源上切換角色 (無論是透過群組成員還是直接連接)。

**注意**  
如果 `Resource` 已設定為 `*`，則使用者可以在信任使用者帳戶的任何帳戶中擔任任何角色。(換句話說，角色的信任政策會將使用者的帳戶指定為 `Principal`)。最佳實務是建議您遵循[最低權限原則](http://en.wikipedia.org/wiki/Principle_of_least_privilege)，並且僅為使用者所需的角色指定完整的 ARN。

以下範例顯示一個政策，該政策僅允許使用者擔任一個帳戶中的角色。此外，政策使用萬用字元 (\$1) 指定，如果角色名稱以字元 `Test` 開頭並後跟任何其他字元組合，則使用者只能切換到該帳戶中的角色。

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

****  

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

------

**注意**  
角色向使用者授予的許可不會新增到使用者已獲得的許可。當使用者切換到某個角色時，使用者可臨時放棄其原始許可以換取由該角色授予的許可。使用者退出該角色時，將自動恢復原始使用者許可。例如，如果使用者的許可允許使用 Amazon EC2 執行個體，但是角色的許可政策未授予這些許可。在這種情況下，在使用角色的同時，使用者不能使用在主控台中的 Amazon EC2 執行個體。此外，透過 `AssumeRole` 取得的暫時憑證不可透過程式設計方式使用 Amazon EC2 執行個體。

## 提供資訊給使用者
<a name="roles-usingrole-giveuser"></a>

建立一個角色並向使用者授予切換為該角色的許可後，您必須提供使用者下列項目：
+ 角色的名稱
+ 包含角色的帳戶 ID 或別名

您可以向使用者發送使用帳戶 ID 和角色名稱預先配置的連結，以簡化他們的存取操作。完成**建立角色**精靈後，您可以選取**檢視角色**橫幅，或在任何跨帳戶啟用之角色的**角色摘要**頁面上查看角色連結。

您還可使用以下格式來手動建構連結。請用您的帳戶 ID 或別名及角色名稱來替換下列範例中的兩個參數：

`https://signin.aws.amazon.com/switchrole?account=your_account_ID_or_alias&roleName=optional_path/role_name`

我們建議您將使用者導向到 [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)，以便向他們演練該過程。若要排除您在擔任角色時可能遇到的常見問題，請參閱 [我無法擔任角色](troubleshoot_roles.md#troubleshoot_roles_cant-assume-role)。

**考量事項**
+ 如果您以程式設計方式建立角色，則可使用路徑以及名稱來建立角色。如果您這麼做，則必須為您的使用者提供完整的路徑和角色名稱以便在 AWS 管理主控台的 **Switch Role** (切換角色) 頁面上輸入。例如：`division_abc/subdivision_efg/role_XYZ`。
+ 如果您以程式設計方式建立角色，則除了 `RoleName` 外，您還可以新增最長 512 個字元的 `Path`。角色名稱長度上限為 64 個字元。不過，若要搭配 中的**切換角色**功能使用角色 AWS 管理主控台，合併 `Path`和 `RoleName`不得超過 64 個字元。
+ 基於安全考量，您可以[檢閱 AWS CloudTrail 日誌](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)，以了解在其中執行動作的人員 AWS。您可以使用角色信任政策中的 `sts:SourceIdentity` 條件金鑰，請求使用者在擔任角色時指定身分。例如，您可以請求 IAM 使用者將自己的使用者名稱指定為其來源身分。這可以協助您判斷哪位使用者在 AWS中執行了特定動作。如需詳細資訊，請參閱[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)。您亦可以使用 [`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)，請求使用者在擔任角色時指定工作階段名稱。當不同的主體使用角色時，這可協助您區分角色工作階段。

# 授予使用者將角色傳遞至 AWS 服務的許可
<a name="id_roles_use_passrole"></a>

若要設定許多 AWS 服務，您必須將 IAM 角色*傳遞*給服務。這樣可讓該服務擔任該角色，並代表您執行動作。對於大多數服務，您只需在設定期間將角色傳遞服務一次，該服務不需要每次都要擔任角色。例如，假設您的應用程式正在 Amazon EC2 執行個體上執行。該應用程式需要暫時性憑證進行身分驗證，需要許可來授權應用程式在 AWS中執行動作。當設定應用程式時，您必須將角色傳遞到 Amazon EC2，與提供使些憑證的執行個體搭配使用。您為在執行個體上執行的應用程式定義許可，做法是將 IAM 政策連接到角色。應用程式在每次需要時擔任該角色，並在角色允許下執行動作。

若要將角色 （及其許可） 傳遞給 AWS 服務，使用者必須具有*將角色傳遞*給 服務的許可。這可幫助管理員確定只有核准的使用者可以透過授予許可的角色來設定服務。若要允許使用者將角色傳遞至 AWS 服務，您必須將 `PassRole` 許可授予使用者的 IAM 使用者、角色或群組。

**警告**  
您只能使用 `PassRole`許可將 IAM 角色傳遞至共用相同 AWS 帳戶的服務。若要將帳戶 A 中的角色傳遞給帳戶 B 中的服務，您必須先在帳戶 B 中建立可從帳戶 A 擔任該角色的 IAM 角色，接著帳戶 B 中的角色才可以傳遞至該服務。如需詳細資訊，請參閱[IAM 中的跨帳戶資源存取](access_policies-cross-account-resource-access.md)。
請勿嘗試透過標記角色，然後使用政策中的 `ResourceTag` 條件金鑰搭配 `iam:PassRole` 動作來控制誰可以傳遞角色。這種方法所產生的結果並不可靠。

設定 `PassRole` 許可時，您應確保使用者傳遞的角色不會具有比您希望使用者具有之許可更多的許可。例如，可能不允許 Alice 執行任何 Amazon S3 動作。如果 Alice 可以將角色傳遞給允許 Amazon S3 動作的服務，則該服務可以在執行任務時代表 Alice 執行 Amazon S3 動作。

當您指定服務連結角色時，您也必須擁有將該角色傳遞到服務的許可。有些服務會自動在您在該服務中執行動作時，在您的帳戶中建立服務連結角色。例如，Amazon EC2 Auto Scaling 會在您第一次建立 Auto Scaling 群組時，為您建立 `AWSServiceRoleForAutoScaling` 服務連結角色。如果您在建立 Auto Scaling 群組時，嘗試指定服務連結角色並且您沒有 `iam:PassRole` 許可，則會收到錯誤。如果您沒有明確指定角色，則不需要 `iam:PassRole` 許可，預設情況下，對該群組執行的所有操作都使用 `AWSServiceRoleForAutoScaling` 角色。若要了解哪些服務支援服務連結角色，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。若要了解哪些服務在您於服務中執行動作時會自動建立服務連結角色，請選擇 **Yes (是)** 連結，並檢視該服務的服務連結角色文件。

使用者可以在任何 API 操作中，以參數方式傳遞角色 ARN，而該操作便是使用角色將許可指派給服務。然後，該服務會檢查該使用者是否擁有 `iam:PassRole` 許可。若要限制使用者只傳遞核准的角色，您可以使用 IAM 政策陳述式的 `Resources` 元素來篩選 `iam:PassRole` 許可。

您可以使用 JSON 政策中的 `Condition`元素來測試包含在所有請求請求內容中的金鑰值 AWS 。若要進一步了解如何在政策中使用條件索引鍵，請參閱 [IAM JSON 政策元素：Condition](reference_policies_elements_condition.md)。`iam:PassedToService` 條件索引鍵可用來指定能傳遞角色之服務的服務主體。若要進一步了解如何在政策中使用 `iam:PassedToService` 條件金鑰，請參閱 [iam:PassedToService](reference_policies_iam-condition-keys.md#ck_PassedToService)。

**範例 1**  
假設您想要授予使用者在啟動執行個體時，能夠將任何已核准的一組角色傳遞到 Amazon EC2 服務。您需要三種元素：
+ 連接到角色的 IAM *許可政策*，其決定角色可以做什麼。將許可侷限在角色必須執行的動作，以及角色針對那些動作所需的資源。您可以使用 AWS 受管或客戶建立的 IAM 許可政策。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": {
          "Effect": "Allow",
          "Action": [ "A list of the permissions the role is allowed to use" ],
          "Resource": [ "A list of the resources the role is allowed to access" ]
      }
  }
  ```

------
+ 角色的「信任政策」**，其允許服務擔任角色。例如，您可以將以下信任政策連接到角色及 `UpdateAssumeRolePolicy` 動作。此信任政策可讓 Amazon EC2 使用角色和連接到該角色的許可。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": {
          "Sid": "TrustPolicyStatementThatAllowsEC2ServiceToAssumeTheAttachedRole",
          "Effect": "Allow",
          "Principal": { "Service": "ec2.amazonaws.com" },
         "Action": "sts:AssumeRole"
      }
  }
  ```

------
+ 連接到 IAM 使用者的 IAM *許可政策*，其允許使用者僅傳遞已核准的角色。通常是將 `iam:GetRole` 新增至 `iam:PassRole`，讓使用者可以取得要傳遞之角色的詳細資訊。在這個範例中，使用者可以僅傳遞存在於指定的帳戶，名稱開頭為 `EC2-roles-for-XYZ-` 的角色：

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "iam:GetRole",
                  "iam:PassRole"
              ],
              "Resource": "arn:aws:iam::111122223333:role/EC2-roles-for-XYZ-*"
          }
      ]
  }
  ```

------

現在，使用者可以使用已指派的角色來啟動 Amazon EC2 執行個體。在執行個體上執行的應用程式，可透過執行個體設定檔中繼資料來存取角色的暫時性憑證。連接到該角色的許可政策決定了執行個體可以執行哪些操作。

**範例 2**  
Amazon Relational Database Service (Amazon RDS) 支援**增強型監控**功能。此功能可讓 Amazon RDS 使用代理程式來監控資料庫執行個體。同時也允許 Amazon RDS 將指標記錄到 Amazon CloudWatch Logs。若要啟用此功能，您必須建立服務角色以提供 Amazon RDS 許可來監控和寫入指標到您的日誌。

**為 Amazon RDS 增強型監控建立角色**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 選擇 **Roles (角色)**，然後選擇 **Create role (建立角色)**。

1. 選擇**AWS 服務**角色類型，然後針對**其他 的使用案例 AWS 服務**，選擇 **RDS** 服務。選擇 **RDS – Enhanced Monitoring** (RDS – 增強型監控)，然後選擇 **Next** (下一步)。

1. 選擇 **AmazonRDSEnhancedMonitoringRole** 許可政策。

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

1. 針對 **Role name** (角色名稱)，輸入可協助您識別此角色用途的角色名稱。角色名稱在您的 中必須是唯一的 AWS 帳戶。角色名稱用在政策中或作為 ARN 的一部分時，角色名稱區分大小寫。當主控台中的客戶顯示角色名稱時 (例如在登入程序期間)，角色名稱不區分大小寫。因為有各種實體可能會參考此角色，所以建立角色之後，您就無法編輯其名稱。

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

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

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

角色會自動取得信任政策，授予 `monitoring.rds.amazonaws.com` 服務許可以擔任角色。在那之後，Amazon RDS 可以執行 `AmazonRDSEnhancedMonitoringRole` 政策允許的所有動作。

您想要存取增強型監控的使用者需要的政策是包含一個可讓使用者列出 RDS 角色的陳述式，以及傳遞角色的陳述式，如下所示。使用您的帳號並將角色名稱取代為您在步驟 6 提供的名稱。

```
    {
      "Sid": "PolicyStatementToAllowUserToListRoles",
      "Effect": "Allow",
      "Action": ["iam:ListRoles"],
      "Resource": "*"
    },
    {
        "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
        "Effect": "Allow",
        "Action": [ "iam:PassRole" ],
        "Resource": "arn:aws:iam::account-id:role/RDS-Monitoring-Role"
    }
```

您可以將此陳述式與在另一個政策中的陳述式併在一起，或是將它放在它自己的政策中。若要改為指定使用者可以傳遞任何開頭為 `RDS-` 的角色，您可以將資源 ARN 中的角色名稱取代為萬用字元，如下所示。

```
        "Resource": "arn:aws:iam::account-id:role/RDS-*"
```

## `iam:PassRole` AWS CloudTrail 日誌中的 動作
<a name="id_roles_use_passrole_logs"></a>

 `PassRole` 不是 API 呼叫。`PassRole` 是一項許可，表示沒有為 IAM `PassRole` 產生 CloudTrail 日誌。若要檢閱在 CloudTrail AWS 服務 中傳遞哪些角色，您必須檢閱建立或修改接收角色之 AWS 資源的 CloudTrail 日誌。例如，角色會在建立時傳遞至 AWS Lambda 函數。`CreateFunction` 動作的日誌顯示有關被傳遞到函數之角色的記錄。

# 撤銷 IAM 角色臨時安全憑證
<a name="id_roles_use_revoke-sessions"></a>

**警告**  
如果您遵循此頁面上的步驟，則擔任角色所建立目前工作階段的所有使用者都會被拒絕存取所有 AWS 動作和資源。這會導致使用者遺失未儲存的工作。

當您允許使用者 AWS 管理主控台 以較長的工作階段持續時間 （例如 12 小時） 存取 時，其暫時登入資料不會快速過期。如果使用者不慎將他們的憑證向未經授權的第三方公開，該方在工作階段的持續時間均有權存取。不過，您可以立即撤銷所有在某個時間點前授予該角色的憑證許可，如果需要的話。該角色在指定時間點前發出的所有暫時性憑證變成無效。這會強迫所有使用者重新驗證和請求新的憑證。

 

**注意**  
您無法撤銷[服務連結角色](id_roles.md#iam-term-service-linked-role)**的工作階段。

當您使用此主題中的程序撤銷角色的許可時， 會將新的內嵌政策 AWS 連接到拒絕所有動作的所有許可的角色。如果使用者在您撤銷許可的時間點「之前」**擔任該角色，則它只會包含套用限制條件的情況。如果使用者在撤銷許可「之後」**擔任該角色，則拒絕政策不會套用至該使用者。

如需拒絕存取的詳細資訊，請參閱 [停用臨時安全性憑證的許可](id_credentials_temp_control-access_disable-perms.md)。

**重要**  
此拒絕政策適用於指定角色的所有使用者，而不只是具主控台工作階段較長持續時間的角色。

## 從角色撤銷工作階段許可的最低許可
<a name="revoke-session-permissions"></a>

若要從角色成功地撤銷工作階段許可，您必須擁有該角色的 `PutRolePolicy` 許可。這可讓您將 `AWSRevokeOlderSessions` 內嵌政策連接至該角色。

## 撤銷工作階段許可
<a name="revoke-session"></a>

您可以從角色撤銷工作階段許可，以拒絕擔任該角色之任何使用者的所有許可。

**注意**  
您無法在 IAM 中編輯從 IAM Identity Center 許可集建立的角色。您必須撤銷 IAM Identity Center 中使用者的作用中許可集工作階段。如需詳細資訊，請參閱 *IAM Identity Center User Guide* 中的 [Revoke active IAM role sessions created by permission sets](https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#revoke-user-permissions)。

**立即拒絕對任何目前使用者的角色憑證的所有許可**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇**角色**，然後選擇您想要撤銷其許可的角色名稱 (不是核取方塊)。

1. 在所選取角色的 **Summary (摘要)** 頁面上，選擇 **Revoke sessions (工作階段)** 標籤。

1. 在 **Revoke sessions (撤銷工作階段)** 標籤上，選擇 **Revoke active sessions (撤銷作用中的工作階段)**。

1. AWS 會要求您確認動作。選取**我確認我將撤銷此角色的所有作用中工作階段。**核取方塊，然後在對話方塊中選擇**撤銷作用中工作階段**。

   然後，IAM 將名為 `AWSRevokeOlderSessions` 的政策連接至角色。在您選擇**撤銷作用中工作階段**後，政策會拒絕過去以及未來約 30 秒內擔任該角色的使用者的所有存取權。此未來時間選擇考量政策的傳播延遲，以便處理在更新的政策在指定區域中生效之前取得或續約的新工作階段。在您選擇「撤銷作用中的工作階段」後，擔任該角色超過大約 30 秒的任何使用者都不會受影響。若要了解變更不一定會立即顯示的原因，請參閱 [我所做的變更不一定都會立刻生效](troubleshoot.md#troubleshoot_general_eventual-consistency)。

**注意**  
如果您稍後再次選擇**撤銷工作階段**，則會重新整理政策中的日期和時間戳記，而且它會再次拒絕在新指定的時間之前擔任該角色之任何使用者的許可。

以這種方式呼叫工作階段的有效使用者必須獲得臨時憑證，新工作階段才能繼續運作。會 AWS CLI 快取登入資料，直到過期為止。若要強制 CLI 刪除並重新整理已失效的快取憑證，請執行以下命令之一：

**Linux、macOS 或 Unix**

```
$ rm -r ~/.aws/cli/cache
```

**Windows**

```
C:\> del /s /q %UserProfile%\.aws\cli\cache
```

## 在指定時間之前撤銷工作階段許可
<a name="revoke-session-policy"></a>

 您也可以使用 AWS CLI 或 SDK 隨時撤銷您選擇的工作階段許可，在政策的條件元素中指定`aws:TokenIssueTime`金鑰的值。

在 `aws:TokenIssueTime` 的值早於指定的日期和時間時，此政策會拒絕所有許可。`aws:TokenIssueTime` 的值對應於臨時安全性憑證的確切建立時間。該`aws:TokenIssueTime`值僅存在於使用臨時安全登入資料簽署的 AWS 請求內容中，因此政策中的拒絕陳述式不會影響使用 IAM 使用者的長期登入資料簽署的請求。

此政策也可連接至角色。在這種情況下，該政策只會影響由該角色在指定日期和時間之前建立的臨時安全性憑證。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Deny",
    "Action": "*",
    "Resource": "*",
    "Condition": {
      "DateLessThan": {"aws:TokenIssueTime": "2014-05-07T23:47:00Z"}
    }
  }
}
```

------

以這種方式呼叫工作階段的有效使用者必須獲得臨時憑證，新工作階段才能繼續運作。會 AWS CLI 快取登入資料，直到過期為止。若要強制 CLI 刪除並重新整理已失效的快取憑證，請執行以下命令之一：

**Linux、macOS 或 Unix**

```
$ rm -r ~/.aws/cli/cache
```

**Windows**

```
C:\> del /s /q %UserProfile%\.aws\cli\cache
```

# 更新服務連結角色
<a name="id_roles_update-service-linked-role"></a>

您用來編輯服務連結角色的方法取決於服務。有些服務也許可讓您從服務主控台、API 或 CLI 編輯服務連結角色的許可。不過，因為有各種實體可能會參考服務連結角色，所以您無法在建立角色之後變更角色名稱。您可以從 IAM 主控台、API 或 CLI 編輯任何角色的說明。

如需哪些服務支援使用服務連結角色的資訊，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並尋找 **Service-Linked Role (服務連結角色)** 欄中顯示 **Yes (是)** 的服務。若要了解服務是否支援編輯服務連結角色，請選擇**是**連結以檢視該服務的服務連結角色的文件。

## 編輯服務連結角色描述 (主控台)
<a name="edit-service-linked-role-iam-console"></a>

您可以使用 IAM 主控台來編輯服務連結角色的說明。

**編輯服務連結角色的說明 (主控台)**

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

1. 選擇要修改之角色的名稱。

1. 在 **Role description** (角色說明) 的最右邊，選擇 **Edit** (編輯)。

1. 在方塊中輸入新的描述，然後選擇 **Save (儲存)**。

## 編輯服務連結角色描述 (AWS CLI)
<a name="edit-service-linked-role-iam-cli"></a>

您可以使用 的 IAM 命令 AWS CLI 來編輯服務連結角色的描述。

**變更服務連結角色的說明 (AWS CLI)**

1. (選用) 若要檢視角色的目前說明，請執行下列命令：

   ```
   aws iam [get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html) --role-name ROLE-NAME
   ```

   透過 CLI 命令，使用角色名稱 (而非 ARN) 來參照角色。例如，如果角色具有下列 ARN：`arn:aws:iam::123456789012:role/myrole`，請將角色參照為 **myrole**。

1. 若要更新服務連結角色的說明，請執行下列命令：

   ```
   aws iam [update-role](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html) --role-name ROLE-NAME --description OPTIONAL-DESCRIPTION
   ```

## 編輯服務連結角色描述 (AWS API)
<a name="edit-service-linked-role-iam-api"></a>

您可以使用 AWS API 編輯服務連結角色的描述。

**變更服務連結角色 (AWS API) 的描述**

1. (選用) 若要檢視角色的目前說明，請呼叫以下操作並指定角色的名稱：

   AWS API：[GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. (選用) 若要更新角色的說明，請呼叫以下操作並指定角色的名稱 (和選用描述)：

   AWS API：[UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html) 

# 更新角色信任政策
<a name="id_roles_update-role-trust-policy"></a>

若要變更誰可擔任該角色，您必須修改角色的信任政策。您無法修改[服務連結角色](id_roles.md#iam-term-service-linked-role)**的信任政策。

**備註**  
如果使用者已於角色信任政策中列為主體，卻無法擔任該角色，請檢查該使用者的[許可界限](access_policies_boundaries.md)。如果已經設定使用者的許可界限，則其必須允許 `sts:AssumeRole` 動作。
若要允許使用者在角色工作階段中再次擔任目前角色，請在角色信任政策中將角色 ARN 或 AWS 帳戶 ARN 指定為主體。 AWS 服務 提供運算資源，例如 Amazon EC2、Amazon ECS、Amazon EKS 和 Lambda，可提供臨時登入資料並自動更新這些登入資料。此可確保您始終擁有一組有效的憑證。對於這些服務，不需要再次擔任目前的角色即可取得臨時憑證。但是，如果您想要傳遞[工作階段標籤](id_session-tags.md)或一個[工作階段政策](access_policies.md#policies_session)，則需要再次擔任目前的角色。


## 更新角色信任政策 (主控台)
<a name="id_roles_update-trust-policy-console"></a>

**在 中變更角色信任政策 AWS 管理主控台**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 在您帳戶的角色清單中，選擇您想要修改的角色名稱。

1. 選擇 **Trust Relationships** (信任關係) 標籤，然後選擇 **Edit Trust Relationship** (編輯信任政策)。

1. 視需要編輯信任政策。若要新增其他可擔任該角色的主體，請在 `Principal` 元素中指定它們。例如，下列政策程式碼片段示範如何在 `Principal`元素 AWS 帳戶 中參考兩個：

   ```
   "Principal": {
     "AWS": [
       "arn:aws:iam::111122223333:root",
       "arn:aws:iam::444455556666:root"
     ]
   },
   ```

   如果您指定在另一個帳戶中的主體，這時在角色的信任政策中新增帳戶，只能建立一半的跨帳戶信任關係。根據預設，信任帳戶中沒有任何使用者可擔任該角色。剛信任的帳戶管理員必須授予新的使用者擔任該角色的許可。為了這樣做，管理員必須建立或編輯連接於使用者的政策，以允許使用者存取 `sts:AssumeRole` 動作。如需詳細資訊，請參閱下列程序或 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

   下列政策程式碼片段示範如何在 `Principal`元素中參考兩項 AWS 服務：

   ```
   "Principal": {
     "Service": [
       "opsworks.amazonaws.com",
       "ec2.amazonaws.com"
     ]
   },
   ```

1. 當您完成編輯您的信任政策，請選擇 **Update policy** (更新政策) 來儲存您的變更。

   如需有關政策結構和語法的詳細資訊，請參閱 [中的政策和許可 AWS Identity and Access Management](access_policies.md) 和 [IAM JSON 政策元素參考](reference_policies_elements.md)。

**允許信任外部帳戶中的使用者使用該角色 (主控台)**

如需有關此程序的更多資訊和詳細資訊，請參閱 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

1. 登入受信任的外部 AWS 帳戶。

1. 決定是否將許可連接到使用者或群組。在 IAM 主控台的導覽窗格中，相應地選擇 **Users** (使用者) 或 **User groups** (使用者群組)。

1. 選擇要授予其存取許可的使用者或群組的名稱，然後選擇 **Permissions (許可)** 標籤。

1. 執行下列任一步驟：
   + 若要編輯客戶受管政策，請選擇政策名稱，並選擇 **Edit policy (編輯政策)**，然後選擇 **JSON** 標籤。您無法編輯具有 AWS 圖示 (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/policy_icon.png)) 的 受 AWS 管 AWS 政策。如需有關 AWS 受管政策與客戶受管政策之間差異的詳細資訊，請參閱 [受管政策與內嵌政策](access_policies_managed-vs-inline.md)。
   + 若要編輯內嵌政策，請選擇政策名稱旁的箭頭，然後選擇 **Edit policy (編輯政策)**。

1. 在政策編輯器中，新增一個指定以下內容的新 `Statement` 元素：

   ```
   {
     "Effect": "Allow",
     "Action": "sts:AssumeRole",
     "Resource": "arn:aws:iam::ACCOUNT-ID:role/ROLE-NAME"
   }
   ```

   將陳述式中的 ARN 取代為使用者可擔任的角色的 ARN。

1. 按照螢幕上的提示來完成政策編輯。

## 更新角色信任政策 (AWS CLI)
<a name="id_roles-update-trust-policy-cli"></a>

您可以使用 AWS CLI 來變更誰可以擔任角色。

**修改角色信任政策 (AWS CLI)**

1. (選用) 如果您不知道要修改的角色的名稱，請執行以下命令列出您帳戶中的角色：
   + [aws iam list-roles](https://docs.aws.amazon.com/cli/latest/reference/iam/list-roles.html)

1. (選用) 若要檢視角色的目前信任政策，請執行下列命令：
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. 若要修改可以存取角色的信任主體，請使用更新的信任政策建立文字檔案。您可以使用任何文字編輯器來建構政策。

   例如，下列信任政策顯示如何在 `Principal` 元素中參考兩個 AWS 帳戶 。這可讓兩個不同 內的使用者 AWS 帳戶 擔任此角色。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"AWS": [
               "arn:aws:iam::111122223333:root",
               "arn:aws:iam::444455556666:root"
           ]},
           "Action": "sts:AssumeRole"
       }
   }
   ```

------

   如果您指定在另一個帳戶中的主體，這時在角色的信任政策中新增帳戶，只能建立一半的跨帳戶信任關係。根據預設，信任帳戶中沒有任何使用者可擔任該角色。剛信任的帳戶管理員必須授予新的使用者擔任該角色的許可。為了這樣做，管理員必須建立或編輯連接於使用者的政策，以允許使用者存取 `sts:AssumeRole` 動作。如需詳細資訊，請參閱下列程序或 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

1. 若要使用剛建立的檔案更新信任政策，請執行下列命令：
   + [aws iam update-assume-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/update-assume-role-policy.html)

**若要允許信任外部帳戶中的使用者使用該角色 (AWS CLI)**

如需有關此程序的更多資訊和詳細資訊，請參閱 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

1. 建立 JSON 檔案，其中包含擔任該角色所需的許可的許可政策。例如，以下政策包含最低必要許可：

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

****  

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

------

   將陳述式中的 ARN 取代為使用者可擔任的角色的 ARN。

1. 執行以下命令以上傳 JSON 檔案 (其中包含的信任政策) 至 IAM：
   + [aws iam create-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy.html)

   此命令的輸出結果含有該政策的 ARN。記下此 ARN，因為您需要在稍後的步驟中使用。

1. 決定將政策到連接哪位使用者或群組。如果您不知道適用的使用者或群組的名稱，請使用下列其中一個命令來列出帳戶中的使用者或群組：
   + [aws iam list-users](https://docs.aws.amazon.com/cli/latest/reference/iam/list-users.html)
   + [aws iam list-groups](https://docs.aws.amazon.com/cli/latest/reference/iam/list-groups.html)

1. 使用下列命令之一將您在之前的步驟中建立的政策連接到使用者或群組：
   + [aws iam attach-user-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-user-policy.html)
   + [aws iam attach-group-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/attach-group-policy.html)

## 更新角色信任政策 (AWS API)
<a name="id_roles-update-trust-policy-api"></a>

您可以使用 AWS API 來變更誰可以擔任角色。

**修改角色信任政策 (AWS API)**

1. (選用) 如果您不知道要修改的角色的名稱，請呼叫以下操作列出您帳戶中的角色：
   + [ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)

1. (選用) 若要檢視角色的目前信任政策，請呼叫下列操作：
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)

1. 若要修改可以存取角色的信任主體，請使用更新的信任政策建立文字檔案。您可以使用任何文字編輯器來建構政策。

   例如，下列信任政策顯示如何在 `Principal` 元素中參考兩個 AWS 帳戶 。這可讓兩個不同 內的使用者 AWS 帳戶 擔任此角色。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Principal": {"AWS": [
               "arn:aws:iam::111122223333:root",
               "arn:aws:iam::444455556666:root"
           ]},
           "Action": "sts:AssumeRole"
       }
   }
   ```

------

   如果您指定在另一個帳戶中的主體，這時在角色的信任政策中新增帳戶，只能建立一半的跨帳戶信任關係。根據預設，信任帳戶中沒有任何使用者可擔任該角色。剛信任的帳戶管理員必須授予新的使用者擔任該角色的許可。為了這樣做，管理員必須建立或編輯連接於使用者的政策，以允許使用者存取 `sts:AssumeRole` 動作。如需詳細資訊，請參閱下列程序或 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

1. 若要使用剛建立的檔案更新信任政策，請呼叫下列操作：
   + [UpdateAssumeRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAssumeRolePolicy.html)

**允許受信任外部帳戶中的使用者使用該角色 (AWS API)**

如需有關此程序的更多資訊和詳細資訊，請參閱 [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。

1. 建立 JSON 檔案，其中包含擔任該角色所需的許可的許可政策。例如，以下政策包含最低必要許可：

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

****  

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

------

   將陳述式中的 ARN 取代為使用者可擔任的角色的 ARN。

1. 呼叫以下操作，以上傳 JSON 檔案 (其中包含的信任政策) 至 IAM：
   + [CreatePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html)

   此操作的輸出結果含有該政策的 ARN。記下此 ARN，因為您需要在稍後的步驟中使用。

1. 決定將政策到連接哪位使用者或群組。如果您不知道適用的使用者或群組的名稱，請呼叫下列其中一個操作來列出帳戶中的使用者或群組：
   + [ListUsers](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html)
   + [ListGroups](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroups.html)

1. 呼叫下列操作之一將您在之前的步驟中建立的政策連接到使用者或群組：
   +  API: [AttachUserPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachUserPolicy.html)
   + [AttachGroupPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachGroupPolicy.html)

# 更新角色的許可
<a name="id_roles_update-role-permissions"></a>

使用下列程序來更新角色的許可政策和許可界限。

## 先決條件：檢視角色存取
<a name="roles-modify_prerequisites"></a>

變更角色的許可之前，您應該檢閱其最近的服務層級活動。這很重要，因為您不希望從正在使用該許可的主體 (人員或應用程式) 中移除存取。如需有關檢視上次存取的資訊的詳細資訊，請參閱 [AWS 使用上次存取的資訊在 中精簡許可](access_policies_last-accessed.md)。

## 更新角色的許可政策
<a name="id_roles_update-role-permissions-policy"></a>

若要變更角色允許的許可，請修改角色的許可政策 (或政策)。您無法修改 IAM 中*[服務連結角色](id_roles.md#iam-term-service-linked-role)*的許可政策。您也許可以修改該服務 (取決於角色) 內的許可政策。若要檢查服務是否支援這項功能，請參閱[AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並且尋找 **Service-linked roles (服務連結的角色)** 資料列為 **Yes (是)** 的服務。選擇具有連結的 **Yes (是)**，以檢視該服務的服務連結角色文件。

### 更新角色許可政策 (主控台)
<a name="id_roles_update-role-permissions-policy-console"></a>

**變更角色允許的許可 (主控台)**

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

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

1. 選擇您要修改的角色的名稱，然後選擇 **Permissions (許可)** 標籤。

1. 執行下列任一步驟：
   + 若要編輯現有客戶受管政策，請選擇政策名稱，然後選擇 **Edit policy (編輯政策)**。
**注意**  
您無法編輯具有 AWS 圖示 (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/policy_icon.png)) 的 受 AWS 管 AWS 政策。如需 AWS 受管政策與客戶受管政策之間差異的詳細資訊，請參閱 [受管政策與內嵌政策](access_policies_managed-vs-inline.md)。
   + 若要將現有受管政策連接至角色，請選擇 **Add permissions** (新增許可)，然後選擇 **Attach policies** (連接政策)。
   + 若要編輯現有內嵌政策，請展開政策，然後選擇 **Edit** (編輯)。
   + 若要嵌入新的內嵌政策，請選擇 **Add permissions** (新增許可)，然後選擇 **Create inline policy** (建立內嵌政策)。
   + 若要從角色移除現有政策，請選取政策名稱旁的核取方塊，然後選擇**移除**。

### 更新角色許可政策 (AWS CLI)
<a name="id_roles_update_permissions-policy-cli"></a>

若要變更角色允許的許可，請修改角色的許可政策 (或政策)。您無法修改 IAM 中*[服務連結角色](id_roles.md#iam-term-service-linked-role)*的許可政策。您也許可以修改該服務 (取決於角色) 內的許可政策。若要檢查服務是否支援這項功能，請參閱[AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並且尋找 **Service-linked roles (服務連結的角色)** 資料列為 **Yes (是)** 的服務。選擇具有連結的 **Yes (是)**，以檢視該服務的服務連結角色文件。

**若要變更角色允許的許可 (AWS CLI)**

1. (選用) 若要檢視與角色關聯的目前許可，請執行下列命令：

   1. [aws iam list-role-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-role-policies.html) 列出內嵌政策

   1. [aws iam list-attached-role-policies](https://docs.aws.amazon.com/cli/latest/reference/iam/list-attached-role-policies.html) 列出受管政策

1. 更新角色許可的命令會有所不同，具體取決於您是要更新受管政策還是內嵌政策。

   若要更新受管政策，請執行下列命令來建立新版本的受管政策：
   + [aws iam create-policy-version](https://docs.aws.amazon.com/cli/latest/reference/iam/create-policy-version.html)

   若要更新內嵌政策，請執行下列命令：
   + [aws iam put-role-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-policy.html)

### 更新角色許可政策 (AWS API)
<a name="id_roles_update_permissions-policy-api"></a>

若要變更角色允許的許可，請修改角色的許可政策 (或政策)。您無法修改 IAM 中*[服務連結角色](id_roles.md#iam-term-service-linked-role)*的許可政策。您也許可以修改該服務 (取決於角色) 內的許可政策。若要檢查服務是否支援這項功能，請參閱[AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)，並且尋找 **Service-linked roles (服務連結的角色)** 資料列為 **Yes (是)** 的服務。選擇具有連結的 **Yes (是)**，以檢視該服務的服務連結角色文件。

**變更角色允許的許可 (AWS API)**

1. (選用) 若要檢視與角色關聯的目前許可，請呼叫下列操作：

   1. [ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html) 列出內嵌政策

   1. [ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html) 列出受管政策

1. 更新角色許可的操作會有所不同，具體取決於您是要更新受管政策還是內嵌政策。

   若要更新受管政策，請呼叫下列操作來建立新版本的受管政策：
   + [CreatePolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html)

   若要更新內嵌政策，請呼叫下列操作：
   + [PutRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html)

## 更新角色的許可界限
<a name="id_roles_update-role-permissions-boundary"></a>

若要變更角色適用的許可上限，請修改角色的[許可界限](access_policies_boundaries.md)。

### 更新角色許可界限 (主控台)
<a name="id_roles_update-permissions-boundary-console"></a>

**變更用於設定角色許可界限的政策**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇您想要為其變更[許可界限](access_policies_boundaries.md)的角色名稱。

1. 選擇 **Permissions (許可)** 標籤。如有必要，開啟 **許可界限** 區段，然後選擇 **變更界限**。

1. 選擇要用於許可界限的政策。

1. 選擇 **Change boundary (變更界限)**。

   在下次有人擔任此角色之前，您的變更不會生效。

### 更新角色許可界限 (AWS CLI)
<a name="id_roles_update_permissions-boundary-cli"></a>

**變更用於設定角色許可界限的受管政策 (AWS CLI)**

1. (選用) 若要檢視角色的目前[許可界限](access_policies_boundaries.md)，請執行下列命令：
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. 若要使用不同的受管政策來更新角色的許可界限，請執行下列命令：
   + [aws iam put-role-permissions-boundary](https://docs.aws.amazon.com/cli/latest/reference/iam/put-role-permissions-boundary.html)

   角色只能有一個受管政策設定為許可界限。您若變更許可界限，您會變更角色適用的許可上限。

### 更新角色許可界限 (AWS API)
<a name="id_roles_update-permissions-boundary-api"></a>

**變更用於設定角色 (AWS API) 許可界限的受管政策**

1. (選用) 若要檢視角色的目前[許可界限](access_policies_boundaries.md)，請呼叫下列操作：
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)

1. 若要使用不同的受管政策來更新角色的許可界限，請呼叫下列操作：
   + [PutRolePermissionsBoundary](https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePermissionsBoundary.html)

   角色只能有一個受管政策設定為許可界限。您若變更許可界限，您會變更角色適用的許可上限。

# 更新角色的設定
<a name="id_roles_update-role-settings"></a>

使用下列程序來更新角色的描述，或者，變更角色的工作階段持續時間上限。

## 更新角色描述
<a name="id_roles_update-description"></a>

若要變更描述的描述，請修改描述文字。

### 更新角色描述 (主控台)
<a name="id_roles_update-description-console"></a>

**變更角色的說明 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇要修改之角色的名稱。

1. 在 **Summary** (摘要) 區段中，選擇 **Edit** (編輯)。

1. 在方塊中輸入新說明，然後選擇 **Save changes** (儲存變更)。

### 更新角色描述 (AWS CLI)
<a name="id_roles_update-description-cli"></a>

**變更角色的說明 (AWS CLI)**

1. (選用) 若要檢視角色的目前說明，請執行下列命令：
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. 若要更新角色的說明，請使用說明參數執行下列命令：
   + [aws iam update-role](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html)

### 更新角色描述 (AWS API)
<a name="id_roles_update-description-api"></a>

**變更角色的描述 (AWS API)**

1. (選用) 若要檢視角色的目前說明，請呼叫下列操作：
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. 若要更新角色的說明，請使用說明參數呼叫下列操作：
   + [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html)

## 更新角色的最大工作階段持續時間
<a name="id_roles_update-session-duration"></a>

若要為使用主控台 AWS CLI、 或 AWS API 擔任的角色指定工作階段持續時間上限設定，請修改工作階段持續時間上限設定值。此設定的值可介於 1 小時至 12 小時。如果未指定值，則套用預設最大值 1 小時。此設定不會限制 AWS 服務所擔任的工作階段。

### 更新最大角色工作階段持續時間 (主控台)
<a name="id_roles_update-session-duration-console"></a><a name="id_roles_modify_max-session"></a>

**變更使用主控台 AWS CLI或 AWS API （主控台） 擔任之角色的工作階段持續時間上限設定**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 選擇要修改之角色的名稱。

1. 在 **Summary** (摘要) 區段中，選擇 **Edit** (編輯)。

1. 在 **Maximum session duration** (最大工作階段持續時間) 中，選擇一個值。或者，選擇 **Custom duration** (自訂持續時間) 並輸入一個值 (以秒為單位)。

1. 選擇**儲存變更**。

   在下次有人擔任此角色之前，您的變更不會生效。若要了解如何撤銷此角色的現有工作階段，請參閱[撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

在 中 AWS 管理主控台，IAM 使用者工作階段預設為 12 小時。在主控台中切換角色的 IAM 使用者會被授予角色最長工作階段持續時間或使用者工作階段中的剩餘時間，以較短者為準。

從 AWS CLI 或 AWS API 擔任角色的任何人都可以請求更長的工作階段，最高可達此上限。`MaxSessionDuration` 設定決定可以請求之角色工作階段的最大持續時間。
+ 若要使用 指定工作階段持續時間， AWS CLI 請使用 `duration-seconds` 參數。如需詳細資訊，請參閱 [切換到 IAM 角色 (AWS CLI)](id_roles_use_switch-role-cli.md)。
+ 若要使用 AWS API 指定工作階段持續時間，請使用 `DurationSeconds` 參數。如需詳細資訊，請參閱 [切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)。

### 更新角色工作階段持續時間上限 (AWS CLI)
<a name="id_roles_update-session-duration-cli"></a>

**注意**  
從 AWS CLI 或 API 擔任角色的任何人都可以使用 `duration-seconds` CLI 參數或 `DurationSeconds` API 參數來請求更長的工作階段。`MaxSessionDuration` 設定決定可以使用`DurationSeconds` 參數請求的角色工作階段的最大持續時間。如果使用者不為 `DurationSeconds` 參數指定一個值，則使用者的安全憑證有效期為 1 小時。

**使用 AWS CLI (AWS CLI) 變更所擔任角色的工作階段持續時間上限設定**

1. (選用) 若要檢視角色的目前最大工作階段持續時間設定，請執行下列命令：
   + [aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)

1. 若要更新角色的工作階段持續時間設定，請使用 `max-session-duration` CLI 參數或 `MaxSessionDuration` API 參數執行以下命令：
   + [aws iam update-role](https://docs.aws.amazon.com/cli/latest/reference/iam/update-role.html)

   在下次有人擔任此角色之前，您的變更不會生效。若要了解如何撤銷此角色的現有工作階段，請參閱[撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

### 更新角色工作階段持續時間上限 (AWS API)
<a name="id_roles_update-session-duration-api"></a>

**注意**  
從 AWS CLI 或 API 擔任角色的任何人都可以使用 `duration-seconds` CLI 參數或 `DurationSeconds` API 參數來請求更長的工作階段。`MaxSessionDuration` 設定決定可以使用`DurationSeconds` 參數請求的角色工作階段的最大持續時間。如果使用者不為 `DurationSeconds` 參數指定一個值，則使用者的安全憑證有效期為 1 小時。

**變更使用 API (AWS API) 擔任之角色的工作階段持續時間上限設定**

1. (選用) 若要檢視角色的目前最大工作階段持續時間設定，請呼叫下列操作：
   + [GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html) 

1. 若要更新角色的工作階段持續時間設定，請使用 `max-sessionduration` CLI 參數或 `MaxSessionDuration` API 參數呼叫以下操作：
   + [UpdateRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html)

   在下次有人擔任此角色之前，您的變更不會生效。若要了解如何撤銷此角色的現有工作階段，請參閱[撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

# 刪除角色或執行個體設定檔
<a name="id_roles_manage_delete"></a>

如果您不再需要角色，建議您刪除角色及其關聯的許可。如此一來，您就沒有未主動監控或維護的未使用實體。

如果角色與 EC2 執行個體相關聯，您也可以從執行個體設定檔中移除角色，然後刪除執行個體設定檔。

**警告**  
確保您沒有任何 Amazon EC2 執行個體與您即將刪除的角色或執行個體描述檔一起執行。若刪除與執行中的執行個體相關聯的角色或執行個體描述檔，將會中斷執行個體上執行的所有應用程式。

如果您不想永久刪除某個角色，則可以停用該角色。若要執行此操作，請變更角色的政策，然後撤銷所有目前的工作階段。例如，您可以將政策新增至拒絕存取所有 的角色 AWS。您也可以編輯信任政策，以拒絕任何嘗試擔任該角色的人存取。如需有關撤銷工作階段的詳細資訊，請參閱 [撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

**Topics**
+ [檢視角色存取](#roles-delete_prerequisites)
+ [刪除服務連結角色](#id_roles_manage_delete_slr)
+ [刪除 IAM 角色 (主控台)](#roles-managingrole-deleting-console)
+ [刪除 IAM 角色 (AWS CLI)](#roles-managingrole-deleting-cli)
+ [刪除 IAM 角色 (AWS API)](#roles-managingrole-deleting-api)
+ [相關資訊](#roles-managingrole-deleting-related-info)

## 檢視角色存取
<a name="roles-delete_prerequisites"></a>

刪除角色之前，建議您先檢閱上次使用角色的時間。您可以使用 AWS 管理主控台、 AWS CLI或 AWS API 來執行此操作。您應該檢視此資訊，因為您不想移除正在使用該角色之某個使用者的存取權。

角色上次活動的日期可能與**上次存取**索引標籤中報告的上次使用日期不符。[**上次存取**](access_policies_last-accessed-view-data.md)索引標籤僅報告角色許可政策允許服務的活動。角色上次活動的日期包括上次嘗試存取其中任何服務的日期 AWS。

**注意**  
角色上次活動和「上次存取」資料的追蹤期間為過去 400 天。如果您的區域在過去一年內已開始支援這些功能，此期間可能會縮短。該角色的上次使用時間可能已經超過 400 天。如需有關追蹤期間的詳細資訊，請參閱 [其中 會 AWS 追蹤上次存取的資訊](access_policies_last-accessed.md#last-accessed_tracking-period)。

**檢視上次使用角色的時間 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 尋找具有您要檢視活動之角色的資料列。您可以使用搜尋欄位縮減結果。檢視 **Last activity (上次活動)** 欄，查看自上次使用該角色後的天數。如果在追蹤期間內未曾使用該角色，資料表會顯示 **None (無)**。

1. 選擇角色名稱以查看詳細資訊。角色的 **Summary** (摘要) 頁面也包含 **Last activity** (上次活動)，會顯示角色上次使用的日期。如果過去 400 天內未使用過該角色，則 **Last activity (上次活動)** 會顯示 **Not accessed in the tracking period (在追蹤期間內未存取)**。

**檢視上次使用角色的時間 (AWS CLI)**  
`[aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)` - 執行此命令以傳回角色的資訊，包括 `RoleLastUsed` 物件。此物件包含 `LastUsedDate` 和上次使用角色的 `Region`。如有 `RoleLastUsed` 但不包含值，即表示未在追蹤期間內使用過該角色。

**檢視上次使用角色的時間 (AWS API)**  
`[GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/GetRole.html)` - 呼叫此操作以傳回角色的資訊，包括 `RoleLastUsed` 物件。此物件包含 `LastUsedDate` 和上次使用角色的 `Region`。如有 `RoleLastUsed` 但不包含值，即表示未在追蹤期間內使用過該角色。

## 刪除服務連結角色
<a name="id_roles_manage_delete_slr"></a>

您用來刪除服務連結角色的方法取決於服務。在某些情況下，您不需要手動刪除一個服務連結角色。例如，當您在服務中完成特定動作 (例如移除資源)，該服務可能會為您刪除服務連結角色。在其他情況下，服務可能支援從服務主控台、API 或 AWS CLI手動刪除服務連結角色。

請檢閱連結服務中*[服務連結角色](id_roles.md#iam-term-service-linked-role)*的文件，以了解如何刪除該角色。您可以前往主控台的 IAM **Roles** (角色) 頁面，檢視您帳戶中的服務連結角色。服務連結角色會在表格的 **Trusted entities (受信任實體)** 欄中以 **(Service-linked role) ((服務連結角色))** 顯示。在 **Summary** (摘要) 頁面上的橫幅，也會指出角色是一個服務連結角色。

如果服務不包含刪除服務連結角色的文件，您可以使用 IAM 主控台 AWS CLI或 API 來刪除角色。

## 刪除 IAM 角色 (主控台)
<a name="roles-managingrole-deleting-console"></a>

當您使用 AWS 管理主控台 刪除角色時，IAM 會自動分離與該角色相關聯的受管政策。它還會自動刪除與該角色關聯的內嵌政策，以及包含該角色的任何 Amazon EC2 執行個體設定檔。

**重要**  
在某些情況下，角色可能會與 Amazon EC2 執行個體描述檔相關聯，而且角色和執行個體描述檔的名稱可能完全相同。在這種情況下，您可以使用 AWS 管理主控台 來刪除角色和執行個體描述檔。此連結就會自動為您在主控台建立的角色和執行個體設定檔。如果您從 AWS CLI、Tools for Windows PowerShell 或 AWS API 建立角色，則角色和執行個體描述檔可能有不同的名稱。在該情況下，您無法使用主控台將它們刪除。反之，您必須使用 AWS CLI Tools for Windows PowerShell 或 AWS API，先從執行個體描述檔中移除角色。然後，您必須採取不同步驟刪除該角色。

**刪除角色 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，選擇 **Roles (角色)**，然後勾選您要刪除之角色名稱旁的核取方塊。

1. 在頁面頂端，選擇 **Delete (刪除)**。

1. 在確認對話方塊中，檢閱上次存取的資訊，其中顯示每個所選角色上次存取 AWS 服務的時間。這可協助您確認角色目前是否在作用中。如果您要繼續，請在文字輸入欄位中輸入角色的名稱，並選擇 **Delete** (刪除)。如果您確定，可以繼續刪除，即使上次存取的資訊仍持續載入。

**注意**  
除非執行個體設定檔和角色同名，否則您不能使用主控台刪除執行個體設定檔。作為刪除角色的過程的一部分，執行個體描述檔會被刪除，如前面的程序中所述。若要刪除執行個體描述檔而不同時刪除角色，您必須使用 AWS CLI 或 AWS API。如需詳細資訊，請參閱下列區段。

## 刪除 IAM 角色 (AWS CLI)
<a name="roles-managingrole-deleting-cli"></a>

當您使用 AWS CLI 刪除角色時，您必須先刪除與該角色相關聯的內嵌政策。您還必須分離與該角色關聯的受管政策。如果您要刪除包含角色的相關聯執行個體設定檔，您必須分開刪除。

**刪除角色 (AWS CLI)**

1. 如果您不知道想要刪除的角色名稱，請輸入以下命令列出帳戶中的角色：

   ```
   aws iam list-roles
   ```

   此清單包含每個角色的 Amazon Resource Name (ARN)。透過 CLI 命令，使用角色名稱 (而非 ARN) 來參照角色。例如，如果角色具有下列 ARN：`arn:aws:iam::123456789012:role/myrole`，請將角色參照為 **myrole**。

1. 從角色關聯的所有執行個體設定檔移除該角色。

   1. 若要列出所有與角色相關聯的執行個體設定檔，請輸入下列命令：

      ```
      aws iam list-instance-profiles-for-role --role-name role-name
      ```

   1. 若要從執行個體設定檔中移除該角色，請針對每個執行個體設定檔輸入下列命令：

      ```
      aws iam remove-role-from-instance-profile --instance-profile-name instance-profile-name --role-name role-name
      ```

1. 刪除所有與該角色相關聯的政策。

   1. 若要列出角色中所有的內嵌政策，請輸入下列命令：

      ```
      aws iam list-role-policies --role-name role-name
      ```

   1. 若要刪除角色中的每個內嵌政策，請針對每個政策輸入下列命令：

      ```
      aws iam delete-role-policy --role-name role-name --policy-name policy-name
      ```

   1. 若要列出連接至角色的所有受管政策，請輸入下列命令：

      ```
      aws iam list-attached-role-policies --role-name role-name
      ```

   1. 若要從角色分離每個受管政策，請針對每個政策輸入下列命令：

      ```
      aws iam detach-role-policy --role-name role-name --policy-arn policy-arn
      ```

1. 輸入下列命令以刪除角色：

   ```
   aws iam delete-role --role-name role-name
   ```

1. 如果您不打算重複使用曾與角色相關聯的執行個體設定檔，您可以輸入下列命令予以刪除：

   ```
   aws iam delete-instance-profile --instance-profile-name instance-profile-name
   ```

## 刪除 IAM 角色 (AWS API)
<a name="roles-managingrole-deleting-api"></a>

當您使用 IAM API 刪除該角色，您必須先刪除與該角色關聯的內嵌政策。您還必須分離與該角色關聯的受管政策。如果您要刪除包含角色的相關聯執行個體設定檔，您必須分開刪除。

**刪除角色 (AWS API)**

1. 若要列出角色關聯的所有執行個體設定檔，請呼叫 [ListInstanceProfilesForRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html)。

   若要從執行個體設定檔移除角色，請呼叫 [RemoveRoleFromInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html)。您必須傳遞角色名稱和執行個體設定檔名稱。

   如果您不打算重複使用曾與角色相關聯的執行個體描述檔，請呼叫 [DeleteInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html) 予以刪除。

1. 若要列出角色的所有內嵌政策，請呼叫 [ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html)。

   若要刪除與角色建立關聯的所有內嵌政策，請呼叫 [DeleteRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRolePolicy.html)。您必須傳遞角色名稱和內嵌政策名稱。

1. 若要列出連接至角色的所有受管政策，請呼叫 [ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html)。

   若要分離連接至該角色的受管政策，請呼叫 [DetachRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html)。您必須傳遞角色名稱和受管政策 ARN。

1. 呼叫 [DeleteRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRole.html) 以刪除該角色。

## 相關資訊
<a name="roles-managingrole-deleting-related-info"></a>

如需有關執行個體設定檔的一般資訊，請參閱[使用執行個體設定檔](id_roles_use_switch-role-ec2_instance-profiles.md)。

如需服務連結角色的一般資訊，請參閱 [建立服務連結角色](id_roles_create-service-linked-role.md)。

# 擔任角色的方法
<a name="id_roles_manage-assume"></a>

在使用者、應用程式或服務可以使用您建立的角色之前，您必須[授予切換到該角色的許可](id_roles_use_permissions-to-switch.md)。您可以使用連接至群組或使用者的任何政策，來授予必要的許可。授予許可後，使用者可以從 AWS 管理主控台、Tools for Windows PowerShell、 AWS Command Line Interface (AWS CLI) 和 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 擔任角色。

**重要**  
當您以程式設計方式而不是在 IAM 主控台中建立角色時，則除了 `RoleName` 之外，您還可以選擇新增高達 512 個字元的 `Path`，該字元長度最多 64 個字元。不過，如果您想要在 中使用具有**切換角色**功能的角色 AWS 管理主控台，則合併的 `Path`和 `RoleName`不得超過 64 個字元。

用於擔任角色的方法決定誰可以擔任該角色以及角色工作階段可以持續多久。使用 `AssumeRole*` API 操作時，您擔任的 IAM 角色是資源。呼叫 `AssumeRole*` API 操作的使用者或角色是主體。

下表比較擔任角色的方法。


|  擔任角色的方法 |  **誰可以擔任這個角色**  | **指定憑證生命週期的方法** |  **憑證存留期 (最小 \$1 最大 \$1 預設)**  | 
| --- | --- | --- | --- | 
| AWS 管理主控台 | 使用者或角色¹ (透過[切換角色](id_roles_use_switch-role-console.md)) | Role (角色) 摘要頁面上的 Maximum session duration (最大工作階段持續時間) | 15 分鐘 \$1 最大工作階段持續時間設定² \$1 1 小時 | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作 |  使用者或角色¹ | duration-seconds CLI 或 DurationSeconds API 參數 | 15 分鐘 \$1 最大工作階段持續時間設定² \$1 1 小時  | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-saml.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-saml.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作 | 任何使用 SAML 驗證的使用者 | duration-seconds CLI 或 DurationSeconds API 參數 | 15 分鐘 \$1 最大工作階段持續時間設定² \$1 1 小時  | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作 | 使用 OIDC 提供者進行身分驗證的任何使用者 | duration-seconds CLI 或 DurationSeconds API 參數 | 15 分鐘 \$1 最大工作階段持續時間設定² \$1 1 小時  | 
| 使用 [ 建構的](id_roles_providers_enable-console-custom-url.md)主控台 URLAssumeRole  | 使用者或角色 | SessionDuration URL 中的 HTML 參數 | 15 分鐘 \$1 12 小時 \$1 1 小時  | 
| 使用 [ 建構的](id_roles_providers_enable-console-custom-url.md)主控台 URLAssumeRoleWithSAML  | 任何使用 SAML 驗證的使用者 | SessionDuration URL 中的 HTML 參數 | 15 分鐘 \$1 12 小時 \$1 1 小時 | 
| 使用 [ 建構的](id_roles_providers_enable-console-custom-url.md)主控台 URLAssumeRoleWithWebIdentity  | 使用 OIDC 提供者進行身分驗證的任何使用者 | SessionDuration URL 中的 HTML 參數 | 15 分鐘 \$1 12 小時 \$1 1 小時  | 

¹ 使用來自一個角色的憑證來擔任不同的角色稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。當您使用角色鏈結時，角色的工作階段持續時間限制為一小時。這適用於 AWS 管理主控台 角色切換 AWS CLI和 API 操作。此限制不適用於從使用者憑證初始擔任角色，也不適用於在使用執行個體設定檔的 Amazon EC2 執行個體上執行的應用程式。

² 此設定的值可介於 1 小時至 12 小時。有關修改最大工作階段持續時間設定的詳細資訊，請參閱 [IAM 角色管理](id_roles_manage.md)。此設定決定取得角色憑證時可以請求的最大工作階段持續時間。例如，當您使用 [AssumeRole\$1](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作來擔任角色時，可以使用 `DurationSeconds` 參數指定工作階段長度。使用此參數指定 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定之間的角色工作階段長度。在主控台中切換角色的 IAM 使用者會被授予最長工作階段持續時間或使用者工作階段中的剩餘時間，以較短者為準。假設您在角色上設定 5 小時的最大持續時間。已登入主控台 10 小時的 IAM 使用者 (超出預設最大值 12 小時) 會切換至角色。可用的角色工作階段持續時間為 2 小時。如要了解如何查看角色的最大值，請參閱本頁後述的 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。

**備註**  
工作階段持續時間設定上限不會限制由 AWS 服務擔任的工作階段。
Amazon EC2 IAM 角色憑證不受角色中設定的工作階段持續時間上限的限制。
若要允許使用者在角色工作階段中再次擔任目前角色，請在角色信任政策中將角色 ARN 或 AWS 帳戶 ARN 指定為主體。 AWS 服務 會提供運算資源，例如 Amazon EC2、Amazon ECS、Amazon EKS 和 Lambda，可提供臨時登入資料並自動更新這些登入資料。此可確保您始終擁有一組有效的憑證。對於這些服務，不需要再次擔任目前的角色即可取得臨時憑證。但是，如果您想要傳遞[工作階段標籤](id_session-tags.md)或一個[工作階段政策](access_policies.md#policies_session)，則需要再次擔任目前的角色。若要了解如何修改角色信任政策以新增主要角色 ARN 或 AWS 帳戶 ARN，請參閱 [更新角色信任政策](id_roles_update-role-trust-policy.md)。

**Topics**
+ [從使用者切換至 IAM 角色 (主控台)](id_roles_use_switch-role-console.md)
+ [切換到 IAM 角色 (AWS CLI)](id_roles_use_switch-role-cli.md)
+ [切換至 IAM 角色 (Tools for Windows PowerShell)](id_roles_use_switch-role-twp.md)
+ [切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)
+ [使用 IAM 角色為在 Amazon EC2 執行個體上執行的應用程式授予許可](id_roles_use_switch-role-ec2.md)
+ [使用執行個體設定檔](id_roles_use_switch-role-ec2_instance-profiles.md)

# 從使用者切換至 IAM 角色 (主控台)
<a name="id_roles_use_switch-role-console"></a>

當您做為 IAM 使用者、IAM Identity Center 中的使用者、SAML 聯合角色或 Web 聯合身分角色登入時，才能切換角色。*角色*會指定一組許可，您可以使用這些許可來存取您需要 AWS 的資源。不過，您不登入角色，但一旦以 IAM 使用者身分登入後，就可以切換到 IAM 角色。這會暫時擱置了原始使用者許可，而不是為您提供指派給該角色的許可。該角色可以在您自己的帳戶或任何其他 AWS 帳戶中。如需有關角色、其優勢以及建立方式的詳細資訊，請參閱 [IAM 角色](id_roles.md) 和 [IAM 角色建立](id_roles_create.md)。

您的使用者以及您切換到任何角色的許可都不會累計。每次只有一組許可是作用中。當您切換角色時，您會暫時放棄使用者許可並使用指派給該角色的許可。當您退出角色後，您的使用者許可會自動恢復。

當您在 中切換角色時 AWS 管理主控台，主控台一律會使用您的原始登入資料來授權切換。例如，如果您切換到 RoleA，IAM 會使用您的原始憑證確定是否允許您擔任 RoleA。如果您接著*在使用 RoleA* RoleA 時切換到 RoleB， AWS 仍然會使用**原始**登入資料來授權切換，而不是 RoleA 的登入資料。

**注意**  
以 IAM Identity Center 中的使用者、SAML 聯合角色或 Web 聯合身分角色登入時，您將在啟動工作階段時擔任 IAM 角色。例如，當 IAM Identity Center 中的使用者登入 AWS 存取入口網站時，他們必須先選擇與角色相關的許可集，才能存取 AWS 資源。

## 角色工作階段
<a name="id_roles_iam_user-switch-role-sessions"></a>

當您切換角色時，您的 AWS 管理主控台 工作階段預設會持續 1 小時。IAM 使用者工作階段預設為 12 小時，其他使用者可能已定義不同的工作階段持續時間。在主控台中切換角色時，您會取得角色工作階段持續時間上限或使用者工作階段中的剩餘時間 (以較短者為準)。您無法透過擔任角色來延長工作階段持續時間。

例如，假設為角色設定的最大工作階段持續時間為 10 小時。您決定切換至該角色時，已登入主控台 8 小時。使用者工作階段還剩餘 4 小時，因此允許的角色工作階段持續時間為 4 小時，而不是工作階段持續時間上限 10 小時。下表顯示在主控台中切換角色時如何判斷 IAM 使用者的工作階段持續時間。


| IAM 使用者工作階段剩餘時間為... | 角色工作階段持續時間為… | 
| --- | --- | 
| 小於角色最大工作階段持續時間 | 使用者工作階段中的剩餘時間 | 
| 大於角色最大工作階段持續時間 | 最大工作階段持續時間值 | 
| 等於角色最大工作階段持續時間 | 最大工作階段持續時間值 (近似值) | 

使用來自一個角色的憑證來擔任不同的角色稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。使用角色鏈結時，無論為個別角色設定的工作階段持續時間上限為何，工作階段持續時間都將限制為一小時。這適用於 AWS 管理主控台 角色切換 AWS CLI和 API 操作。

**注意**  
有些 AWS 服務主控台可以在角色工作階段過期時自動續約，而無需您採取任何動作。有些主控台可能會提示您重新載入瀏覽器頁面以重新驗證您的工作階段。

## 考量事項
<a name="id_roles_iam_user-switch-role-considerations"></a>
+ 如果您以 身分登入，則無法切換角色 AWS 帳戶根使用者。
+ 必須授予使用者依政策切換角色的許可。如需說明，請參閱[向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)。
+ 您無法將 中的角色切換 AWS 管理主控台 為需要 [ExternalId](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id) 值的角色。您只能透過呼叫支援 `ExternalId` 參數的 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 來切換到此類角色。

## 若要切換至角色
<a name="id_roles_iam_user-switch-role-console-procedure"></a>

1. 按照 *AWS 登入 User Guide* 中的 [Sign in to the AWS 管理主控台](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 中適合使用者類型的登入程序操作。

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

1. 選取下列其中一種方法來切換角色：
   + 選擇**切換角色**。
   + 若已選擇加入多工作階段支援，請選擇**新增工作階段**，然後選取**切換角色**。
**注意**  
您可以在 AWS 管理主控台中的單一 Web 瀏覽器中同時登入最多五個不同的身分。如需詳細資訊，請參閱 *AWS 管理主控台 Getting Started Guide* 中的 [Signing in to multiple accounts](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/multisession.html)。

1. 在 **Switch Role (切換角色)** 頁面上，輸入帳戶 ID 號碼或帳戶別名以及管理員提供的角色名稱。
**注意**  
如果管理員已使用路徑 (例如 `division_abc/subdivision_efg/roleToDoX`) 建立角色，則必須在 **Role (角色)** ）方塊中輸入該完整路徑和名稱。如果僅輸入角色名稱，或者組合的 `Path` 和 `RoleName` 超過 64 個字元，則角色切換失敗。這是存放角色名稱的瀏覽器 cookie 的限制。如果發生這種情況，請聯絡您的管理員，並要求他們減小路徑和角色名稱的大小。

1. (選用) 您可以輸入顯示名稱，然後選取在主控台導覽列中反白顯示角色的顯示顏色。
   + 在**顯示名稱**欄位中，鍵入當此角色處於作用中時，要在導覽列上顯示之用以取代使用者名稱的文字。根據帳戶和角色資訊建議使用名稱，但您可以將其變更為對您有意義的任何名稱。
   + 在**顯示顏色**欄位中，選取顏色以反白顯示顯示名稱。

   名稱和顏色有助於在此角色處於作用中時提醒您，這會變更您的許可。例如，對於允許您存取測試環境的角色，您可以指定 **Test** 的 **Display name** (顯示名稱) 並在 **Color** (顏色)中選擇綠色。對於允許您存取生產的角色，您可以指定 **Production** 的 **Display name** (顯示名稱) 並在 **Color** (顏色)中選擇紅色。

1. 選擇 **Switch Role** (切換角色)。顯示名稱和顏色將替換導覽列上的使用者名稱，您可以開始使用該角色授予您的許可。

1. 完成需要 IAM 角色的任務後，您可以切換回原始工作階段。這將移除角色提供的額外許可，並讓您返回標準許可。

   1. 在 IAM 主控台中，選擇導覽列右上角的角色 **Display Name** (顯示名稱)。

   1. 選擇**切換回**。

      例如，假設您使用使用者名稱 `123456789012` 登入到帳戶編號 `Richard`。使用過 `admin-role` 角色後，您想要停止使用該角色並傳回您的原始許可。若要停止使用角色，請選擇 **admin-role @ 123456789012**，然後選擇**切換回**。  
![\[圖形定位切「換返回」函數，可停止使用 IAM 角色並返回原始使用者。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/role-stop-using.png)

**提示**  
您使用的最後幾個角色會顯示在選單。下次想要切換到其中一個角色時，您只需選擇所需的角色。如果角色未顯示在功能表上，則只需手動鍵入帳戶和角色資訊。

## 其他資源
<a name="id_roles_use_switch-role-console_additional_resources"></a>
+ [向使用者授予切換角色的許可](id_roles_use_permissions-to-switch.md)
+ [授予使用者將角色傳遞至 AWS 服務的許可](id_roles_use_passrole.md)
+ [建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)
+ [建立角色以將許可委派給 AWS 服務](id_roles_create_for-service.md)
+ [IAM 角色疑難排解](troubleshoot_roles.md)

# 切換到 IAM 角色 (AWS CLI)
<a name="id_roles_use_switch-role-cli"></a>

「角色」**指定一組許可，您可以使用它來存取所需的 AWS 資源。從這個意義上說，類似於 [AWS Identity and Access Management中的使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) (IAM)。當您以使用者身分登入時，您將取得一組特定的許可。不過，您不登入角色，但以使用者身分登入後，就可以切換角色。這會暫時擱置了原始使用者許可，而不是為您提供指派給該角色的許可。該角色可以在您自己的帳戶或任何其他 AWS 帳戶中。如需有關角色、其優勢以及建立和設定方式的詳細資訊，請參閱 [IAM 角色](id_roles.md) 和 [IAM 角色建立](id_roles_create.md)。要了解在擔任角色時使用的各種方法，請參閱 [擔任角色的方法](id_roles_manage-assume.md)。

**重要**  
您的 IAM 使用者以及您擔任的任何角色的許可都不會累計。每次只有一組許可是作用中。當您擔任角色時，您會暫時放棄以前的使用者或角色許可，並使用指派給該角色的許可。當您退出角色後，您的使用者許可會自動恢復。

當您以 IAM 使用者身分登入時，您可以使用角色來執行 AWS CLI 命令。當您以已使用角色的[外部身分驗證使用者 ](id_roles_providers.md)([SAML](id_roles_providers_saml.md) 或 [OIDC](id_roles_providers_oidc.md)) 登入時，您也可以使用角色來執行 AWS CLI 命令。此外，您可以使用角色從 Amazon EC2 執行個體執行 AWS CLI 命令，而該執行個體透過執行個體描述檔連接到角色。當您以 AWS 帳戶根使用者身分登入時，則無法擔任該角色。

[**角色鏈結**](id_roles.md#iam-term-role-chaining) – 您也可以使用角色鏈結，以使用角色的許可來存取第二個角色。

在預設情況下，您的角色工作階段持續一小時。使用 `assume-role*` CLI 操作擔任此角色時，可以為 `duration-seconds` 參數指定值。此值的範圍可以從 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定的值。如果在主控台中切換角色，您工作階段的持續時間會限制為最多一小時。若要了解如何檢視角色的最大值，請參閱 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。

如果使用角色鏈結時，則工作階段持續時間最多限制為一小時。如果您隨後使用 `duration-seconds` 參數提供大於一小時的值，則操作會失敗。

## 範例案例：切換到生產角色
<a name="switch-role-cli-scenario-prod-env"></a>

假設您是在開發環境中工作的 IAM 使用者。在此情況下，您偶爾需要透過 [AWS CLI](https://aws.amazon.com/cli/) 在命令列中使用生產環境。您已經有存取金鑰憑證組可供您使用。這可以是指派給標準 IAM 使用者的存取金鑰對。或者，如果您以 SAML 或 OIDC 聯合身分主體的身分登入，則它可以是最初指派給您的角色的存取金鑰對。如果您目前的許可授予您擔任特定 IAM 角色的能力，則可以在 AWS CLI 組態檔案中的「設定檔」中識別該角色。然後使用指定 IAM 角色的許可來執行該命令，而不是原始身分。請注意，當您在 AWS CLI 命令中指定該設定檔時，您正在使用新角色。在這種情況下，您無法同時在開發帳戶中使用原始許可。原因是一次只有一組許可有效。

**注意**  
基於安全考量，管理員可以[檢閱 AWS CloudTrail 日誌](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)，以了解在其中執行動作的人員 AWS。當您擔任角色時，系統管理員可能需要您指定來源身分或角色工作階段名稱 。如需詳細資訊，請參閱[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)及[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)。

**切換到生產角色 (AWS CLI)**

1. <a name="step-configure-default"></a>如果您從未使用 AWS CLI，則必須先設定預設的 CLI 設定檔。開啟命令提示字元並設定您的 AWS CLI 安裝，以使用來自 IAM 使用者或聯合角色的存取金鑰。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration)。

   執行 [aws configure](https://docs.aws.amazon.com/cli/latest/reference/configure/) 命令，如下所示：

   ```
   aws configure
   ```

   當出現提示時，請提供下列資訊：

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-east-2
   Default output format [None]: json
   ```

1. 在 Unix 或 Linux `.aws/config` 檔案中，或在 Windows `C:\Users\USERNAME\.aws\config` 檔案中建立角色的新描述檔。下列範例會建立稱為 `prodaccess` 的描述檔，以切換到 `ProductionAccessRole` 帳戶中的角色 `123456789012`。您從建立角色的帳戶管理員處取得角色 ARN。叫用此設定檔時， AWS CLI 會使用 的登入資料`source_profile`來請求角色的登入資料。因此，做為 `source_profile` 參考的身分必須具有 `sts:AssumeRole` 中指定角色的 `role_arn` 許可。

   ```
   [profile prodaccess]
       role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
       source_profile = default
   ```

1. 建立新設定檔之後，指定 參數的任何 AWS CLI 命令都會在連接到 IAM 角色的許可下`--profile prodaccess`執行，`ProductionAccessRole`而不是預設使用者。

   ```
   aws iam list-users --profile prodaccess
   ```

   如果指派給 `ProductionAccessRole` 的許可啟用列出目前 AWS 帳戶中的使用者，則此命令有效。

1. 若要傳回原始憑證授予的許可，請執行不帶 `--profile` 參數的命令。會使用您在 中設定的預設設定檔中的登入資料 AWS CLI 還原至 [Step 1](#step-configure-default)。

如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[擔任角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html)。

## 範例案例：允許執行個體描述檔角色來切換到另一個帳戶中的角色
<a name="switch-role-cli-scenario-ec2-instance"></a>

假設您使用兩個 AWS 帳戶，並且您想要允許在 Amazon EC2 執行個體上執行的應用程式在兩個帳戶中執行[AWS CLI](https://aws.amazon.com/cli/)命令。假設 EC2 執行個體存在於帳戶 `111111111111`。該執行個體包含 `abcd` 執行個體描述檔角色，該角色會允許應用程式在相同 `111111111111` 帳戶中對 `amzn-s3-demo-bucket1` 儲存貯體執行唯讀 Amazon S3 任務。不過，也必須允許應用程式擔任 `efgh` 跨帳戶角色來在帳戶 `222222222222` 中執行任務。若要執行此操作，`abcd` EC2 執行個體描述檔角色必須有以下許可政策：

***帳戶 111111111111 `abcd` 角色許可政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1/*",
                "arn:aws:s3:::amzn-s3-demo-bucket1"
            ]
        },
        {
            "Sid": "AllowIPToAssumeCrossAccountRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::222222222222:role/efgh"
        }
    ]
}
```

------

假設 `efgh` 跨帳戶角色允許在相同 `222222222222` 帳戶中對 `amzn-s3-demo-bucket2` 儲存貯體的唯讀 Amazon S3 任務。若要執行此操作，`efgh` 跨帳戶角色必須有以下許可政策：

***帳戶 222222222222 `efgh` 角色許可政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket2/*",
                "arn:aws:s3:::amzn-s3-demo-bucket2"
            ]
        }
    ]
}
```

------

`efgh` 角色必須允許 `abcd` 執行個體設定檔角色擔任該角色。若要執行此操作，`efgh` 角色必須有以下信任政策：

***帳戶 222222222222 `efgh` 角色信任政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

若要接著在帳戶 中執行 AWS CLI 命令`222222222222`，您必須更新 CLI 組態檔案。在 AWS CLI 組態檔案中，將 `efgh` 角色識別為「描述檔」且 `abcd` EC2 執行個體描述檔角色識別為「憑證來源」。然後，使用 `efgh` 角色 (而不是原始 `abcd` 角色) 的許可執行 CLI 命令。

**注意**  
基於安全考量，您可以使用 AWS CloudTrail 來稽核帳戶中角色的使用。若要在 CloudTrail 日誌中的不同主體使用角色時區分角色工作階段，您可以使用角色工作階段名稱。當 依本主題所述代表使用者 AWS CLI 擔任角色時，角色工作階段名稱會自動建立為 `AWS-CLI-session-nnnnnnnn`。以下 *nnnnnnnn* 是整數，代表 [Unix epoch 時間](http://wikipedia.org/wiki/Unix_time)中的時間 (自 1970 年 1 月 1 日午夜 UTC 的秒數)。如需詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的 [CloudTrail 事件參考](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html)。

**讓 EC2 執行個體設定檔角色切換到跨帳戶角色 (AWS CLI)**

1. 您不需要設定預設 CLI 描述檔。您反而可以從 EC2 執行個體描述檔中繼資料載入憑證。在 `.aws/config` 檔案中為角色建立新的設定檔。下列範例會建立 `instancecrossaccount` 的描述檔，以切換到 `efgh` 帳戶中的角色 `222222222222`。呼叫此描述檔時， AWS CLI 會使用 EC2 執行個體描述檔中繼資料的憑證來請求角色的憑證。因此，EC2 執行個體設定檔角色必須具有在 `sts:AssumeRole` 中指定角色的 `role_arn` 許可。

   ```
   [profile instancecrossaccount]
   role_arn = arn:aws:iam::222222222222:role/efgh
   credential_source = Ec2InstanceMetadata
   ```

1. 建立新設定檔之後，指定 參數的任何 AWS CLI 命令都會在連接到帳戶 中`efgh`角色的許可下`--profile instancecrossaccount`執行`222222222222`。

   ```
   aws s3 ls amzn-s3-demo-bucket2 --profile instancecrossaccount
   ```

   如果指派給 `efgh` 角色的許可允許列出目前 AWS 帳戶中的使用者，則此命令有效。

1. 若要在帳戶 `111111111111` 中返回原始 EC2 執行個體設定檔許可，在不使用 `--profile` 參數的情形下執行 CLI 命令。

如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》**中的[擔任角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html)。

# 切換至 IAM 角色 (Tools for Windows PowerShell)
<a name="id_roles_use_switch-role-twp"></a>

「角色」**指定一組許可，您可以使用它來存取所需的 AWS 資源。從這個意義上說，類似於 [AWS Identity and Access Management中的使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) (IAM)。當您以使用者身分登入時，您將取得一組特定的許可。不過，您不登入角色，但一旦登入後就可以切換角色。這會暫時擱置了原始使用者許可，而不是為您提供指派給該角色的許可。該角色可以在您自己的帳戶或任何其他 AWS 帳戶中。如需有關角色、其優勢以及建立和設定方式的詳細資訊，請參閱 [IAM 角色](id_roles.md) 和 [IAM 角色建立](id_roles_create.md)。

**重要**  
您的 IAM 使用者以及您切換到任何角色的許可都不會累計。每次只有一組許可是作用中。當您切換角色時，您會暫時放棄使用者許可並使用指派給該角色的許可。當您退出角色後，您的使用者許可會自動恢復。

本節說明在 AWS Tools for Windows PowerShell命令列中如何切換角色。

假設您在開發環境中有一個帳戶，偶爾需要使用 [Tools for Windows PowerShell](https://aws.amazon.com/powershell/) 在命令列中使用生產環境。您已經有一個存取金鑰憑證組可供您使用。這些可以是指派給標準 IAM 使用者的存取金鑰對。或者，如果您以 SAML 或 OIDC 聯合身分主體身分登入，則它們可以是最初指派給您的角色的存取金鑰對。您可以使用這些憑證來執行 `Use-STSRole` cmdlet，該 cmdlet 將新角色的 ARN 做為參數傳送。該命令傳回所請求角色的臨時安全憑證。然後，您可以在後續 PowerShell 命令中使用這些憑證，並使用角色的許可存取生產中的資源。使用該角色時，您無法在開發帳戶中使用您的使用者許可，因為一次只能有一組許可有效。

**注意**  
基於安全考量，管理員可以[檢閱 AWS CloudTrail 日誌](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)，以了解在其中執行動作的人員 AWS。當您擔任角色時，系統管理員可能需要您指定來源身分或角色工作階段名稱 。如需詳細資訊，請參閱[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)及[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)。

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

**切換至角色 (Tools for Windows PowerShell)**

1. 開啟 PowerShell 命令提示字元並設定預設設定檔以使用來自目前 IAM 使用者或聯合身分角色的存取金鑰。如果您之前已使用 Tools for Windows PowerShell，則可能已經完成。請注意，只有在以 IAM 使用者身分 (而非 AWS 帳戶根使用者) 登入時才能切換角色。

   ```
   PS C:\> Set-AWSCredentials -AccessKey AKIAIOSFODNN7EXAMPLE -SecretKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -StoreAs MyMainUserProfile
   PS C:\> Initialize-AWSDefaults -ProfileName MyMainUserProfile -Region us-east-2
   ```

   如需詳細資訊，請參閱*AWS Tools for PowerShell 《 使用者指南*》中的[使用 AWS 登入](https://docs.aws.amazon.com/powershell/latest/userguide/specifying-your-aws-credentials.html)資料。

1. 若要擷取新角色的憑證，請執行下列命令以切換到 123456789012 帳戶中的 `RoleName` 角色。您從建立角色的帳戶管理員處取得角色 ARN。此命令還需要您提供工作階段名稱。您可以為此選擇任何文字。以下命令請求憑證，然後從傳回的結果物件中擷取 `Credentials` 屬性物件，並將其存放在 `$Creds` 變數中。

   ```
   PS C:\> $Creds = (Use-STSRole -RoleArn "arn:aws:iam::123456789012:role/RoleName" -RoleSessionName "MyRoleSessionName").Credentials
   ```

   `$Creds` 是一個物件，現在包含您在下列步驟中所需的 `AccessKeyId`、 `SecretAccessKey` 和 `SessionToken` 元素。以下範例命令說明典型的值：

   ```
   PS C:\> $Creds.AccessKeyId
   AKIAIOSFODNN7EXAMPLE
   
   PS C:\> $Creds.SecretAccessKey
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   
   PS C:\> $Creds.SessionToken
   AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLECvSRyh0FW7jEXAMPLEW+vE/7s1HRp
   XviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDyEXAMPLE9/g7QRUhZp4bqbEXAMPLENwGPy
   Oj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3UuysgsKdEXAMPLE1TVastU1A0SKFEXAMPLEiywCC/C
   s8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLEsnf87eNhyDHq6ikBQ==
   
   PS C:\> $Creds.Expiration
   Thursday, June 18, 2018 2:28:31 PM
   ```

1. 若要將這些憑證用於任何後續命令，請將它們包含在 `-Credential` 參數中。例如，以下命令使用角色中的憑證，僅在角色被授予 `iam:ListRoles` 許可且因此可以執行 `Get-IAMRoles` cmdlet 時才起作用：

   ```
           PS C:\> get-iamroles -Credential $Creds
   ```

1. 若要傳回原始憑證，只需停止使用 `-Credentials $Creds` 參數，並允許 PowerShell 恢復存放在預設設定檔中的憑證。

# 切換到 IAM 角色 (AWS API)
<a name="id_roles_use_switch-role-api"></a>

「角色」**指定一組許可，您可以使用它來存取 AWS 資源。從這個意義上說，類似於 [IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html)。委託人 （人員或應用程式） 擔任角色來接收臨時許可，以執行必要的任務並與 AWS 資源互動。該角色可以在您自己的帳戶或任何其他 AWS 帳戶中。如需有關角色、其優勢以及建立和設定方式的詳細資訊，請參閱 [IAM 角色](id_roles.md) 和 [IAM 角色建立](id_roles_create.md)。要了解在擔任角色時使用的各種方法，請參閱 [擔任角色的方法](id_roles_manage-assume.md)。

**重要**  
您的 IAM 使用者以及您擔任的任何角色的許可都不會累計。每次只有一組許可是作用中。當您擔任角色時，您會暫時放棄以前的使用者或角色許可，並使用指派給該角色的許可。當您退出角色後，原本的許可會自動恢復。

若要擔任角色，應用程式會 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)呼叫 API 操作，並傳遞要使用的角色 ARN。此操作會建立使用臨時憑證的新工作階段。此工作階段的許可，即為以身分為基礎的政策指派給角色的許可。

當您呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 時，您可以選擇性地傳遞內嵌或受管[工作階段政策](access_policies.md#policies_session)。工作階段政策是一種進階政策，且您會在以程式設計方式建立角色或聯合身分使用者工作階段的臨時憑證工作階段時，以參數方式傳遞。您可以使用 `Policy` 參數傳遞單一 JSON 內嵌工作階段政策文件。您可以使用 `PolicyArns` 參數，指定多達 10 個受管工作階段政策。所產生工作階段的許可會是實體的身分類型政策和工作階段政策的交集。當您需要將角色的臨時憑證提供給某人時，工作階段政策便可派上用場。他們可以在後續 AWS API 呼叫中，使用角色的臨時憑證來存取擁有該角色的帳戶中的資源。您無法使用工作階段政策來授予超出即將以身分為基礎政策所允許的許可。若要進一步了解 如何 AWS 決定角色的有效許可，請參閱 [政策評估邏輯](reference_policies_evaluation-logic.md)。

![\[PermissionsWhenPassingRoles_Diagram\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/role_passed_policy_permissions.png)


當您以 IAM 使用者身分登入，或者作為已使用角色的[外部身分驗證使用者](id_roles_providers.md) ([SAML](id_roles_providers_saml.md) 或 [OIDC](id_roles_providers_oidc.md)) 登入時，可以呼叫 `AssumeRole`。您還可以使用[*角色鏈結*](id_roles.md#iam-term-role-chaining)，它使用角色來擔任第二個角色。當您以 AWS 帳戶根使用者身分登入時，則無法擔任該角色。

在預設情況下，您的角色工作階段持續一小時。當您使用 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作擔任此角色時，您可以指定 `DurationSeconds` 參數的值。此值的範圍可以從 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定的值。若要了解如何檢視角色的最大值，請參閱 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。

如果使用角色鏈結時，則工作階段最多限制為一小時。如果您隨後使用 `DurationSeconds` 參數提供大於一小時的值，則操作會失敗。

**注意**  
基於安全考量，管理員可以[檢閱 AWS CloudTrail 日誌](cloudtrail-integration.md#cloudtrail-integration_signin-tempcreds)，以了解在其中執行動作的人員 AWS。當您擔任角色時，系統管理員可能需要您指定來源身分或角色工作階段名稱 。如需詳細資訊，請參閱[`sts:SourceIdentity`](reference_policies_iam-condition-keys.md#ck_sourceidentity)及[`sts:RoleSessionName`](reference_policies_iam-condition-keys.md#ck_rolesessionname)。

下列程式碼範例示範如何建立使用者並擔任角色。

**警告**  
為避免安全風險，在開發專用軟體或使用真實資料時，請勿使用 IAM 使用者進行身分驗證。相反地，搭配使用聯合功能和身分提供者，例如 [AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。
+ 建立沒有許可的使用者。
+ 建立一個可授予許可的角色，以列出帳戶的 Amazon S3 儲存貯體。
+ 新增政策，讓使用者擔任該角色。
+ 使用暫時憑證，擔任角色並列出 S3 儲存貯體，然後清理資源。

------
#### [ .NET ]

**適用於 .NET 的 SDK**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/IAM#code-examples)中設定和執行。

```
global using Amazon.IdentityManagement;
global using Amazon.S3;
global using Amazon.SecurityToken;
global using IAMActions;
global using IamScenariosCommon;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using Microsoft.Extensions.Logging;
global using Microsoft.Extensions.Logging.Console;
global using Microsoft.Extensions.Logging.Debug;


namespace IAMActions;

public class IAMWrapper
{
    private readonly IAmazonIdentityManagementService _IAMService;

    /// <summary>
    /// Constructor for the IAMWrapper class.
    /// </summary>
    /// <param name="IAMService">An IAM client object.</param>
    public IAMWrapper(IAmazonIdentityManagementService IAMService)
    {
        _IAMService = IAMService;
    }

    /// <summary>
    /// Attach an IAM policy to a role.
    /// </summary>
    /// <param name="policyArn">The policy to attach.</param>
    /// <param name="roleName">The role that the policy will be attached to.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> AttachRolePolicyAsync(string policyArn, string roleName)
    {
        var response = await _IAMService.AttachRolePolicyAsync(new AttachRolePolicyRequest
        {
            PolicyArn = policyArn,
            RoleName = roleName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Create an IAM access key for a user.
    /// </summary>
    /// <param name="userName">The username for which to create the IAM access
    /// key.</param>
    /// <returns>The AccessKey.</returns>
    public async Task<AccessKey> CreateAccessKeyAsync(string userName)
    {
        var response = await _IAMService.CreateAccessKeyAsync(new CreateAccessKeyRequest
        {
            UserName = userName,
        });

        return response.AccessKey;

    }


    /// <summary>
    /// Create an IAM policy.
    /// </summary>
    /// <param name="policyName">The name to give the new IAM policy.</param>
    /// <param name="policyDocument">The policy document for the new policy.</param>
    /// <returns>The new IAM policy object.</returns>
    public async Task<ManagedPolicy> CreatePolicyAsync(string policyName, string policyDocument)
    {
        var response = await _IAMService.CreatePolicyAsync(new CreatePolicyRequest
        {
            PolicyDocument = policyDocument,
            PolicyName = policyName,
        });

        return response.Policy;
    }


    /// <summary>
    /// Create a new IAM role.
    /// </summary>
    /// <param name="roleName">The name of the IAM role.</param>
    /// <param name="rolePolicyDocument">The name of the IAM policy document
    /// for the new role.</param>
    /// <returns>The Amazon Resource Name (ARN) of the role.</returns>
    public async Task<string> CreateRoleAsync(string roleName, string rolePolicyDocument)
    {
        var request = new CreateRoleRequest
        {
            RoleName = roleName,
            AssumeRolePolicyDocument = rolePolicyDocument,
        };

        var response = await _IAMService.CreateRoleAsync(request);
        return response.Role.Arn;
    }


    /// <summary>
    /// Create an IAM service-linked role.
    /// </summary>
    /// <param name="serviceName">The name of the AWS Service.</param>
    /// <param name="description">A description of the IAM service-linked role.</param>
    /// <returns>The IAM role that was created.</returns>
    public async Task<Role> CreateServiceLinkedRoleAsync(string serviceName, string description)
    {
        var request = new CreateServiceLinkedRoleRequest
        {
            AWSServiceName = serviceName,
            Description = description
        };

        var response = await _IAMService.CreateServiceLinkedRoleAsync(request);
        return response.Role;
    }


    /// <summary>
    /// Create an IAM user.
    /// </summary>
    /// <param name="userName">The username for the new IAM user.</param>
    /// <returns>The IAM user that was created.</returns>
    public async Task<User> CreateUserAsync(string userName)
    {
        var response = await _IAMService.CreateUserAsync(new CreateUserRequest { UserName = userName });
        return response.User;
    }


    /// <summary>
    /// Delete an IAM user's access key.
    /// </summary>
    /// <param name="accessKeyId">The Id for the IAM access key.</param>
    /// <param name="userName">The username of the user that owns the IAM
    /// access key.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteAccessKeyAsync(string accessKeyId, string userName)
    {
        var response = await _IAMService.DeleteAccessKeyAsync(new DeleteAccessKeyRequest
        {
            AccessKeyId = accessKeyId,
            UserName = userName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM policy.
    /// </summary>
    /// <param name="policyArn">The Amazon Resource Name (ARN) of the policy to
    /// delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeletePolicyAsync(string policyArn)
    {
        var response = await _IAMService.DeletePolicyAsync(new DeletePolicyRequest { PolicyArn = policyArn });
        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM role.
    /// </summary>
    /// <param name="roleName">The name of the IAM role to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteRoleAsync(string roleName)
    {
        var response = await _IAMService.DeleteRoleAsync(new DeleteRoleRequest { RoleName = roleName });
        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM role policy.
    /// </summary>
    /// <param name="roleName">The name of the IAM role.</param>
    /// <param name="policyName">The name of the IAM role policy to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteRolePolicyAsync(string roleName, string policyName)
    {
        var response = await _IAMService.DeleteRolePolicyAsync(new DeleteRolePolicyRequest
        {
            PolicyName = policyName,
            RoleName = roleName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM user.
    /// </summary>
    /// <param name="userName">The username of the IAM user to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteUserAsync(string userName)
    {
        var response = await _IAMService.DeleteUserAsync(new DeleteUserRequest { UserName = userName });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Delete an IAM user policy.
    /// </summary>
    /// <param name="policyName">The name of the IAM policy to delete.</param>
    /// <param name="userName">The username of the IAM user.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteUserPolicyAsync(string policyName, string userName)
    {
        var response = await _IAMService.DeleteUserPolicyAsync(new DeleteUserPolicyRequest { PolicyName = policyName, UserName = userName });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Detach an IAM policy from an IAM role.
    /// </summary>
    /// <param name="policyArn">The Amazon Resource Name (ARN) of the IAM policy.</param>
    /// <param name="roleName">The name of the IAM role.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DetachRolePolicyAsync(string policyArn, string roleName)
    {
        var response = await _IAMService.DetachRolePolicyAsync(new DetachRolePolicyRequest
        {
            PolicyArn = policyArn,
            RoleName = roleName,
        });

        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }


    /// <summary>
    /// Gets the IAM password policy for an AWS account.
    /// </summary>
    /// <returns>The PasswordPolicy for the AWS account.</returns>
    public async Task<PasswordPolicy> GetAccountPasswordPolicyAsync()
    {
        var response = await _IAMService.GetAccountPasswordPolicyAsync(new GetAccountPasswordPolicyRequest());
        return response.PasswordPolicy;
    }


    /// <summary>
    /// Get information about an IAM policy.
    /// </summary>
    /// <param name="policyArn">The IAM policy to retrieve information for.</param>
    /// <returns>The IAM policy.</returns>
    public async Task<ManagedPolicy> GetPolicyAsync(string policyArn)
    {

        var response = await _IAMService.GetPolicyAsync(new GetPolicyRequest { PolicyArn = policyArn });
        return response.Policy;
    }


    /// <summary>
    /// Get information about an IAM role.
    /// </summary>
    /// <param name="roleName">The name of the IAM role to retrieve information
    /// for.</param>
    /// <returns>The IAM role that was retrieved.</returns>
    public async Task<Role> GetRoleAsync(string roleName)
    {
        var response = await _IAMService.GetRoleAsync(new GetRoleRequest
        {
            RoleName = roleName,
        });

        return response.Role;
    }


    /// <summary>
    /// Get information about an IAM user.
    /// </summary>
    /// <param name="userName">The username of the user.</param>
    /// <returns>An IAM user object.</returns>
    public async Task<User> GetUserAsync(string userName)
    {
        var response = await _IAMService.GetUserAsync(new GetUserRequest { UserName = userName });
        return response.User;
    }


    /// <summary>
    /// List the IAM role policies that are attached to an IAM role.
    /// </summary>
    /// <param name="roleName">The IAM role to list IAM policies for.</param>
    /// <returns>A list of the IAM policies attached to the IAM role.</returns>
    public async Task<List<AttachedPolicyType>> ListAttachedRolePoliciesAsync(string roleName)
    {
        var attachedPolicies = new List<AttachedPolicyType>();
        var attachedRolePoliciesPaginator = _IAMService.Paginators.ListAttachedRolePolicies(new ListAttachedRolePoliciesRequest { RoleName = roleName });

        await foreach (var response in attachedRolePoliciesPaginator.Responses)
        {
            attachedPolicies.AddRange(response.AttachedPolicies);
        }

        return attachedPolicies;
    }


    /// <summary>
    /// List IAM groups.
    /// </summary>
    /// <returns>A list of IAM groups.</returns>
    public async Task<List<Group>> ListGroupsAsync()
    {
        var groupsPaginator = _IAMService.Paginators.ListGroups(new ListGroupsRequest());
        var groups = new List<Group>();

        await foreach (var response in groupsPaginator.Responses)
        {
            groups.AddRange(response.Groups);
        }

        return groups;
    }


    /// <summary>
    /// List IAM policies.
    /// </summary>
    /// <returns>A list of the IAM policies.</returns>
    public async Task<List<ManagedPolicy>> ListPoliciesAsync()
    {
        var listPoliciesPaginator = _IAMService.Paginators.ListPolicies(new ListPoliciesRequest());
        var policies = new List<ManagedPolicy>();

        await foreach (var response in listPoliciesPaginator.Responses)
        {
            policies.AddRange(response.Policies);
        }

        return policies;
    }


    /// <summary>
    /// List IAM role policies.
    /// </summary>
    /// <param name="roleName">The IAM role for which to list IAM policies.</param>
    /// <returns>A list of IAM policy names.</returns>
    public async Task<List<string>> ListRolePoliciesAsync(string roleName)
    {
        var listRolePoliciesPaginator = _IAMService.Paginators.ListRolePolicies(new ListRolePoliciesRequest { RoleName = roleName });
        var policyNames = new List<string>();

        await foreach (var response in listRolePoliciesPaginator.Responses)
        {
            policyNames.AddRange(response.PolicyNames);
        }

        return policyNames;
    }


    /// <summary>
    /// List IAM roles.
    /// </summary>
    /// <returns>A list of IAM roles.</returns>
    public async Task<List<Role>> ListRolesAsync()
    {
        var listRolesPaginator = _IAMService.Paginators.ListRoles(new ListRolesRequest());
        var roles = new List<Role>();

        await foreach (var response in listRolesPaginator.Responses)
        {
            roles.AddRange(response.Roles);
        }

        return roles;
    }


    /// <summary>
    /// List SAML authentication providers.
    /// </summary>
    /// <returns>A list of SAML providers.</returns>
    public async Task<List<SAMLProviderListEntry>> ListSAMLProvidersAsync()
    {
        var response = await _IAMService.ListSAMLProvidersAsync(new ListSAMLProvidersRequest());
        return response.SAMLProviderList;
    }


    /// <summary>
    /// List IAM users.
    /// </summary>
    /// <returns>A list of IAM users.</returns>
    public async Task<List<User>> ListUsersAsync()
    {
        var listUsersPaginator = _IAMService.Paginators.ListUsers(new ListUsersRequest());
        var users = new List<User>();

        await foreach (var response in listUsersPaginator.Responses)
        {
            users.AddRange(response.Users);
        }

        return users;
    }


    /// <summary>
    /// Update the inline policy document embedded in a role.
    /// </summary>
    /// <param name="policyName">The name of the policy to embed.</param>
    /// <param name="roleName">The name of the role to update.</param>
    /// <param name="policyDocument">The policy document that defines the role.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> PutRolePolicyAsync(string policyName, string roleName, string policyDocument)
    {
        var request = new PutRolePolicyRequest
        {
            PolicyName = policyName,
            RoleName = roleName,
            PolicyDocument = policyDocument
        };

        var response = await _IAMService.PutRolePolicyAsync(request);
        return response.HttpStatusCode == HttpStatusCode.OK;
    }


    /// <summary>
    /// Add or update an inline policy document that is embedded in an IAM user.
    /// </summary>
    /// <param name="userName">The name of the IAM user.</param>
    /// <param name="policyName">The name of the IAM policy.</param>
    /// <param name="policyDocument">The policy document defining the IAM policy.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> PutUserPolicyAsync(string userName, string policyName, string policyDocument)
    {
        var request = new PutUserPolicyRequest
        {
            UserName = userName,
            PolicyName = policyName,
            PolicyDocument = policyDocument
        };

        var response = await _IAMService.PutUserPolicyAsync(request);
        return response.HttpStatusCode == System.Net.HttpStatusCode.OK;
    }

    /// <summary>
    /// Wait for a new access key to be ready to use.
    /// </summary>
    /// <param name="accessKeyId">The Id of the access key.</param>
    /// <returns>A boolean value indicating the success of the action.</returns>
    public async Task<bool> WaitUntilAccessKeyIsReady(string accessKeyId)
    {
        var keyReady = false;

        do
        {
            try
            {
                var response = await _IAMService.GetAccessKeyLastUsedAsync(
                    new GetAccessKeyLastUsedRequest { AccessKeyId = accessKeyId });
                if (response.UserName is not null)
                {
                    keyReady = true;
                }
            }
            catch (NoSuchEntityException)
            {
                keyReady = false;
            }
        } while (!keyReady);

        return keyReady;
    }
}



using Microsoft.Extensions.Configuration;

namespace IAMBasics;

public class IAMBasics
{
    private static ILogger logger = null!;

    static async Task Main(string[] args)
    {
        // Set up dependency injection for the AWS service.
        using var host = Host.CreateDefaultBuilder(args)
            .ConfigureLogging(logging =>
                logging.AddFilter("System", LogLevel.Debug)
                    .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information)
                    .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace))
            .ConfigureServices((_, services) =>
            services.AddAWSService<IAmazonIdentityManagementService>()
            .AddTransient<IAMWrapper>()
            .AddTransient<UIWrapper>()
            )
            .Build();

        logger = LoggerFactory.Create(builder => { builder.AddConsole(); })
            .CreateLogger<IAMBasics>();


        IConfiguration configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("settings.json") // Load test settings from .json file.
            .AddJsonFile("settings.local.json",
                true) // Optionally load local settings.
            .Build();

        // Values needed for user, role, and policies.
        string userName = configuration["UserName"]!;
        string s3PolicyName = configuration["S3PolicyName"]!;
        string roleName = configuration["RoleName"]!;


        var iamWrapper = host.Services.GetRequiredService<IAMWrapper>();
        var uiWrapper = host.Services.GetRequiredService<UIWrapper>();

        uiWrapper.DisplayBasicsOverview();
        uiWrapper.PressEnter();

        // First create a user. By default, the new user has
        // no permissions.
        uiWrapper.DisplayTitle("Create User");
        Console.WriteLine($"Creating a new user with user name: {userName}.");
        var user = await iamWrapper.CreateUserAsync(userName);
        var userArn = user.Arn;

        Console.WriteLine($"Successfully created user: {userName} with ARN: {userArn}.");
        uiWrapper.WaitABit(15, "Now let's wait for the user to be ready for use.");

        // Define a role policy document that allows the new user
        // to assume the role.
        string assumeRolePolicyDocument = "{" +
          "\"Version\": \"2012-10-17\"," +
          "\"Statement\": [{" +
              "\"Effect\": \"Allow\"," +
              "\"Principal\": {" +
              $"	\"AWS\": \"{userArn}\"" +
              "}," +
              "\"Action\": \"sts:AssumeRole\"" +
          "}]" +
        "}";

        // Permissions to list all buckets.
        string policyDocument = "{" +
            "\"Version\": \"2012-10-17\"," +
            "	\"Statement\" : [{" +
                "	\"Action\" : [\"s3:ListAllMyBuckets\"]," +
                "	\"Effect\" : \"Allow\"," +
                "	\"Resource\" : \"*\"" +
            "}]" +
        "}";

        // Create an AccessKey for the user.
        uiWrapper.DisplayTitle("Create access key");
        Console.WriteLine("Now let's create an access key for the new user.");
        var accessKey = await iamWrapper.CreateAccessKeyAsync(userName);

        var accessKeyId = accessKey.AccessKeyId;
        var secretAccessKey = accessKey.SecretAccessKey;

        Console.WriteLine($"We have created the access key with Access key id: {accessKeyId}.");

        Console.WriteLine("Now let's wait until the IAM access key is ready to use.");
        var keyReady = await iamWrapper.WaitUntilAccessKeyIsReady(accessKeyId);

        // Now try listing the Amazon Simple Storage Service (Amazon S3)
        // buckets. This should fail at this point because the user doesn't
        // have permissions to perform this task.
        uiWrapper.DisplayTitle("Try to display Amazon S3 buckets");
        Console.WriteLine("Now let's try to display a list of the user's Amazon S3 buckets.");
        var s3Client1 = new AmazonS3Client(accessKeyId, secretAccessKey);
        var stsClient1 = new AmazonSecurityTokenServiceClient(accessKeyId, secretAccessKey);

        var s3Wrapper = new S3Wrapper(s3Client1, stsClient1);
        var buckets = await s3Wrapper.ListMyBucketsAsync();

        Console.WriteLine(buckets is null
            ? "As expected, the call to list the buckets has returned a null list."
            : "Something went wrong. This shouldn't have worked.");

        uiWrapper.PressEnter();

        uiWrapper.DisplayTitle("Create IAM role");
        Console.WriteLine($"Creating the role: {roleName}");

        // Creating an IAM role to allow listing the S3 buckets. A role name
        // is not case sensitive and must be unique to the account for which it
        // is created.
        var roleArn = await iamWrapper.CreateRoleAsync(roleName, assumeRolePolicyDocument);

        uiWrapper.PressEnter();

        // Create a policy with permissions to list S3 buckets.
        uiWrapper.DisplayTitle("Create IAM policy");
        Console.WriteLine($"Creating the policy: {s3PolicyName}");
        Console.WriteLine("with permissions to list the Amazon S3 buckets for the account.");
        var policy = await iamWrapper.CreatePolicyAsync(s3PolicyName, policyDocument);

        // Wait 15 seconds for the IAM policy to be available.
        uiWrapper.WaitABit(15, "Waiting for the policy to be available.");

        // Attach the policy to the role you created earlier.
        uiWrapper.DisplayTitle("Attach new IAM policy");
        Console.WriteLine("Now let's attach the policy to the role.");
        await iamWrapper.AttachRolePolicyAsync(policy.Arn, roleName);

        // Wait 15 seconds for the role to be updated.
        Console.WriteLine();
        uiWrapper.WaitABit(15, "Waiting for the policy to be attached.");

        // Use the AWS Security Token Service (AWS STS) to have the user
        // assume the role we created.
        var stsClient2 = new AmazonSecurityTokenServiceClient(accessKeyId, secretAccessKey);

        // Wait for the new credentials to become valid.
        uiWrapper.WaitABit(10, "Waiting for the credentials to be valid.");

        var assumedRoleCredentials = await s3Wrapper.AssumeS3RoleAsync("temporary-session", roleArn);

        // Try again to list the buckets using the client created with
        // the new user's credentials. This time, it should work.
        var s3Client2 = new AmazonS3Client(assumedRoleCredentials);

        s3Wrapper.UpdateClients(s3Client2, stsClient2);

        buckets = await s3Wrapper.ListMyBucketsAsync();

        uiWrapper.DisplayTitle("List Amazon S3 buckets");
        Console.WriteLine("This time we should have buckets to list.");
        if (buckets is not null)
        {
            buckets.ForEach(bucket =>
            {
                Console.WriteLine($"{bucket.BucketName} created: {bucket.CreationDate}");
            });
        }

        uiWrapper.PressEnter();

        // Now clean up all the resources used in the example.
        uiWrapper.DisplayTitle("Clean up resources");
        Console.WriteLine("Thank you for watching. The IAM Basics demo is complete.");
        Console.WriteLine("Please wait while we clean up the resources we created.");

        await iamWrapper.DetachRolePolicyAsync(policy.Arn, roleName);

        await iamWrapper.DeletePolicyAsync(policy.Arn);

        await iamWrapper.DeleteRoleAsync(roleName);

        await iamWrapper.DeleteAccessKeyAsync(accessKeyId, userName);

        await iamWrapper.DeleteUserAsync(userName);

        uiWrapper.PressEnter();

        Console.WriteLine("All done cleaning up our resources. Thank you for your patience.");
    }
}


namespace IamScenariosCommon;

using System.Net;

/// <summary>
/// A class to perform Amazon Simple Storage Service (Amazon S3) actions for
/// the IAM Basics scenario.
/// </summary>
public class S3Wrapper
{
    private IAmazonS3 _s3Service;
    private IAmazonSecurityTokenService _stsService;

    /// <summary>
    /// Constructor for the S3Wrapper class.
    /// </summary>
    /// <param name="s3Service">An Amazon S3 client object.</param>
    /// <param name="stsService">An AWS Security Token Service (AWS STS)
    /// client object.</param>
    public S3Wrapper(IAmazonS3 s3Service, IAmazonSecurityTokenService stsService)
    {
        _s3Service = s3Service;
        _stsService = stsService;
    }

    /// <summary>
    /// Assumes an AWS Identity and Access Management (IAM) role that allows
    /// Amazon S3 access for the current session.
    /// </summary>
    /// <param name="roleSession">A string representing the current session.</param>
    /// <param name="roleToAssume">The name of the IAM role to assume.</param>
    /// <returns>Credentials for the newly assumed IAM role.</returns>
    public async Task<Credentials> AssumeS3RoleAsync(string roleSession, string roleToAssume)
    {
        // Create the request to use with the AssumeRoleAsync call.
        var request = new AssumeRoleRequest()
        {
            RoleSessionName = roleSession,
            RoleArn = roleToAssume,
        };

        var response = await _stsService.AssumeRoleAsync(request);

        return response.Credentials;
    }


    /// <summary>
    /// Delete an S3 bucket.
    /// </summary>
    /// <param name="bucketName">Name of the S3 bucket to delete.</param>
    /// <returns>A Boolean value indicating the success of the action.</returns>
    public async Task<bool> DeleteBucketAsync(string bucketName)
    {
        var result = await _s3Service.DeleteBucketAsync(new DeleteBucketRequest { BucketName = bucketName });
        return result.HttpStatusCode == HttpStatusCode.OK;
    }

    /// <summary>
    /// List the buckets that are owned by the user's account.
    /// </summary>
    /// <returns>Async Task.</returns>
    public async Task<List<S3Bucket>?> ListMyBucketsAsync()
    {
        try
        {
            // Get the list of buckets accessible by the new user.
            var response = await _s3Service.ListBucketsAsync();

            return response.Buckets;
        }
        catch (AmazonS3Exception ex)
        {
            // Something else went wrong. Display the error message.
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }

    /// <summary>
    /// Create a new S3 bucket.
    /// </summary>
    /// <param name="bucketName">The name for the new bucket.</param>
    /// <returns>A Boolean value indicating whether the action completed
    /// successfully.</returns>
    public async Task<bool> PutBucketAsync(string bucketName)
    {
        var response = await _s3Service.PutBucketAsync(new PutBucketRequest { BucketName = bucketName });
        return response.HttpStatusCode == HttpStatusCode.OK;
    }

    /// <summary>
    /// Update the client objects with new client objects. This is available
    /// because the scenario uses the methods of this class without and then
    /// with the proper permissions to list S3 buckets.
    /// </summary>
    /// <param name="s3Service">The Amazon S3 client object.</param>
    /// <param name="stsService">The AWS STS client object.</param>
    public void UpdateClients(IAmazonS3 s3Service, IAmazonSecurityTokenService stsService)
    {
        _s3Service = s3Service;
        _stsService = stsService;
    }
}


namespace IamScenariosCommon;

public class UIWrapper
{
    public readonly string SepBar = new('-', Console.WindowWidth);

    /// <summary>
    /// Show information about the IAM Groups scenario.
    /// </summary>
    public void DisplayGroupsOverview()
    {
        Console.Clear();

        DisplayTitle("Welcome to the IAM Groups Demo");
        Console.WriteLine("This example application does the following:");
        Console.WriteLine("\t1. Creates an Amazon Identity and Access Management (IAM) group.");
        Console.WriteLine("\t2. Adds an IAM policy to the IAM group giving it full access to Amazon S3.");
        Console.WriteLine("\t3. Creates a new IAM user.");
        Console.WriteLine("\t4. Creates an IAM access key for the user.");
        Console.WriteLine("\t5. Adds the user to the IAM group.");
        Console.WriteLine("\t6. Lists the buckets on the account.");
        Console.WriteLine("\t7. Proves that the user has full Amazon S3 access by creating a bucket.");
        Console.WriteLine("\t8. List the buckets again to show the new bucket.");
        Console.WriteLine("\t9. Cleans up all the resources created.");
    }

    /// <summary>
    /// Show information about the IAM Basics scenario.
    /// </summary>
    public void DisplayBasicsOverview()
    {
        Console.Clear();

        DisplayTitle("Welcome to IAM Basics");
        Console.WriteLine("This example application does the following:");
        Console.WriteLine("\t1. Creates a user with no permissions.");
        Console.WriteLine("\t2. Creates a role and policy that grant s3:ListAllMyBuckets permission.");
        Console.WriteLine("\t3. Grants the user permission to assume the role.");
        Console.WriteLine("\t4. Creates an S3 client object as the user and tries to list buckets (this will fail).");
        Console.WriteLine("\t5. Gets temporary credentials by assuming the role.");
        Console.WriteLine("\t6. Creates a new S3 client object with the temporary credentials and lists the buckets (this will succeed).");
        Console.WriteLine("\t7. Deletes all the resources.");
    }

    /// <summary>
    /// Display a message and wait until the user presses enter.
    /// </summary>
    public void PressEnter()
    {
        Console.Write("\nPress <Enter> to continue. ");
        _ = Console.ReadLine();
        Console.WriteLine();
    }

    /// <summary>
    /// Pad a string with spaces to center it on the console display.
    /// </summary>
    /// <param name="strToCenter">The string to be centered.</param>
    /// <returns>The padded string.</returns>
    public string CenterString(string strToCenter)
    {
        var padAmount = (Console.WindowWidth - strToCenter.Length) / 2;
        var leftPad = new string(' ', padAmount);
        return $"{leftPad}{strToCenter}";
    }

    /// <summary>
    /// Display a line of hyphens, the centered text of the title, and another
    /// line of hyphens.
    /// </summary>
    /// <param name="strTitle">The string to be displayed.</param>
    public void DisplayTitle(string strTitle)
    {
        Console.WriteLine(SepBar);
        Console.WriteLine(CenterString(strTitle));
        Console.WriteLine(SepBar);
    }

    /// <summary>
    /// Display a countdown and wait for a number of seconds.
    /// </summary>
    /// <param name="numSeconds">The number of seconds to wait.</param>
    public void WaitABit(int numSeconds, string msg)
    {
        Console.WriteLine(msg);

        // Wait for the requested number of seconds.
        for (int i = numSeconds; i > 0; i--)
        {
            System.Threading.Thread.Sleep(1000);
            Console.Write($"{i}...");
        }

        PressEnter();
    }
}
```
+ 如需 API 詳細資訊，請參閱《*適用於 .NET 的 AWS SDK API 參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/DotNetSDKV3/iam-2010-05-08/PutUserPolicy)

------
#### [ Bash ]

**AWS CLI 使用 Bash 指令碼**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/iam#code-examples)中設定和執行。

```
###############################################################################
# function iam_create_user_assume_role
#
# Scenario to create an IAM user, create an IAM role, and apply the role to the user.
#
#     "IAM access" permissions are needed to run this code.
#     "STS assume role" permissions are needed to run this code. (Note: It might be necessary to
#           create a custom policy).
#
# Returns:
#       0 - If successful.
#       1 - If an error occurred.
###############################################################################
function iam_create_user_assume_role() {
  {
    if [ "$IAM_OPERATIONS_SOURCED" != "True" ]; then

      source ./iam_operations.sh
    fi
  }

  echo_repeat "*" 88
  echo "Welcome to the IAM create user and assume role demo."
  echo
  echo "This demo will create an IAM user, create an IAM role, and apply the role to the user."
  echo_repeat "*" 88
  echo

  echo -n "Enter a name for a new IAM user: "
  get_input
  user_name=$get_input_result

  local user_arn
  user_arn=$(iam_create_user -u "$user_name")

  # shellcheck disable=SC2181
  if [[ ${?} == 0 ]]; then
    echo "Created demo IAM user named $user_name"
  else
    errecho "$user_arn"
    errecho "The user failed to create. This demo will exit."
    return 1
  fi

  local access_key_response
  access_key_response=$(iam_create_user_access_key -u "$user_name")
  # shellcheck disable=SC2181
  if [[ ${?} != 0 ]]; then
    errecho "The access key failed to create. This demo will exit."
    clean_up "$user_name"
    return 1
  fi

  IFS=$'\t ' read -r -a access_key_values <<<"$access_key_response"
  local key_name=${access_key_values[0]}
  local key_secret=${access_key_values[1]}

  echo "Created access key named $key_name"

  echo "Wait 10 seconds for the user to be ready."
  sleep 10
  echo_repeat "*" 88
  echo

  local iam_role_name
  iam_role_name=$(generate_random_name "test-role")
  echo "Creating a role named $iam_role_name with user $user_name as the principal."

  local assume_role_policy_document="{
    \"Version\": \"2012-10-17\",
    \"Statement\": [{
        \"Effect\": \"Allow\",
        \"Principal\": {\"AWS\": \"$user_arn\"},
        \"Action\": \"sts:AssumeRole\"
        }]
    }"

  local role_arn
  role_arn=$(iam_create_role -n "$iam_role_name" -p "$assume_role_policy_document")

  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    echo "Created IAM role named $iam_role_name"
  else
    errecho "The role failed to create. This demo will exit."
    clean_up "$user_name" "$key_name"
    return 1
  fi

  local policy_name
  policy_name=$(generate_random_name "test-policy")
  local policy_document="{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"s3:ListAllMyBuckets\",
                    \"Resource\": \"arn:aws:s3:::*\"}]}"

  local policy_arn
  policy_arn=$(iam_create_policy -n "$policy_name" -p "$policy_document")
  # shellcheck disable=SC2181
  if [[ ${?} == 0 ]]; then
    echo "Created  IAM policy named $policy_name"
  else
    errecho "The policy failed to create."
    clean_up "$user_name" "$key_name" "$iam_role_name"
    return 1
  fi

  if (iam_attach_role_policy -n "$iam_role_name" -p "$policy_arn"); then
    echo "Attached policy $policy_arn to role $iam_role_name"
  else
    errecho "The policy failed to attach."
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn"
    return 1
  fi

  local assume_role_policy_document="{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"sts:AssumeRole\",
                    \"Resource\": \"$role_arn\"}]}"

  local assume_role_policy_name
  assume_role_policy_name=$(generate_random_name "test-assume-role-")

  # shellcheck disable=SC2181
  local assume_role_policy_arn
  assume_role_policy_arn=$(iam_create_policy -n "$assume_role_policy_name" -p "$assume_role_policy_document")
  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    echo "Created  IAM policy named $assume_role_policy_name for sts assume role"
  else
    errecho "The policy failed to create."
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn"
    return 1
  fi

  echo "Wait 10 seconds to give AWS time to propagate these new resources and connections."
  sleep 10
  echo_repeat "*" 88
  echo

  echo "Try to list buckets without the new user assuming the role."
  echo_repeat "*" 88
  echo

  # Set the environment variables for the created user.
  # bashsupport disable=BP2001
  export AWS_ACCESS_KEY_ID=$key_name
  # bashsupport disable=BP2001
  export AWS_SECRET_ACCESS_KEY=$key_secret

  local buckets
  buckets=$(s3_list_buckets)

  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    local bucket_count
    bucket_count=$(echo "$buckets" | wc -w | xargs)
    echo "There are $bucket_count buckets in the account. This should not have happened."
  else
    errecho "Because the role with permissions has not been assumed, listing buckets failed."
  fi

  echo
  echo_repeat "*" 88
  echo "Now assume the role $iam_role_name and list the buckets."
  echo_repeat "*" 88
  echo

  local credentials

  credentials=$(sts_assume_role -r "$role_arn" -n "AssumeRoleDemoSession")
  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    echo "Assumed role $iam_role_name"
  else
    errecho "Failed to assume role."
    export AWS_ACCESS_KEY_ID=""
    export AWS_SECRET_ACCESS_KEY=""
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn" "$assume_role_policy_arn"
    return 1
  fi

  IFS=$'\t ' read -r -a credentials <<<"$credentials"

  export AWS_ACCESS_KEY_ID=${credentials[0]}
  export AWS_SECRET_ACCESS_KEY=${credentials[1]}
  # bashsupport disable=BP2001
  export AWS_SESSION_TOKEN=${credentials[2]}

  buckets=$(s3_list_buckets)

  # shellcheck disable=SC2181
  if [ ${?} == 0 ]; then
    local bucket_count
    bucket_count=$(echo "$buckets" | wc -w | xargs)
    echo "There are $bucket_count buckets in the account. Listing buckets succeeded because of "
    echo "the assumed role."
  else
    errecho "Failed to list buckets. This should not happen."
    export AWS_ACCESS_KEY_ID=""
    export AWS_SECRET_ACCESS_KEY=""
    export AWS_SESSION_TOKEN=""
    clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn" "$assume_role_policy_arn"
    return 1
  fi

  local result=0
  export AWS_ACCESS_KEY_ID=""
  export AWS_SECRET_ACCESS_KEY=""

  echo
  echo_repeat "*" 88
  echo "The created resources will now be deleted."
  echo_repeat "*" 88
  echo

  clean_up "$user_name" "$key_name" "$iam_role_name" "$policy_arn" "$policy_arn" "$assume_role_policy_arn"

  # shellcheck disable=SC2181
  if [[ ${?} -ne 0 ]]; then
    result=1
  fi

  return $result
}
```
此案例中使用的 IAM 函數。  

```
###############################################################################
# function iam_user_exists
#
# This function checks to see if the specified AWS Identity and Access Management (IAM) user already exists.
#
# Parameters:
#       $1 - The name of the IAM user to check.
#
# Returns:
#       0 - If the user already exists.
#       1 - If the user doesn't exist.
###############################################################################
function iam_user_exists() {
  local user_name
  user_name=$1

  # Check whether the IAM user already exists.
  # We suppress all output - we're interested only in the return code.

  local errors
  errors=$(aws iam get-user \
    --user-name "$user_name" 2>&1 >/dev/null)

  local error_code=${?}

  if [[ $error_code -eq 0 ]]; then
    return 0 # 0 in Bash script means true.
  else
    if [[ $errors != *"error"*"(NoSuchEntity)"* ]]; then
      aws_cli_error_log $error_code
      errecho "Error calling iam get-user $errors"
    fi

    return 1 # 1 in Bash script means false.
  fi
}

###############################################################################
# function iam_create_user
#
# This function creates the specified IAM user, unless
# it already exists.
#
# Parameters:
#       -u user_name  -- The name of the user to create.
#
# Returns:
#       The ARN of the user.
#     And:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_user() {
  local user_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_user"
    echo "Creates an AWS Identity and Access Management (IAM) user. You must supply a username:"
    echo "  -u user_name    The name of the user. It must be unique within the account."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    User name:   $user_name"
  iecho ""

  # If the user already exists, we don't want to try to create it.
  if (iam_user_exists "$user_name"); then
    errecho "ERROR: A user with that name already exists in the account."
    return 1
  fi

  response=$(aws iam create-user --user-name "$user_name" \
    --output text \
    --query 'User.Arn')

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-user operation failed.$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_create_user_access_key
#
# This function creates an IAM access key for the specified user.
#
# Parameters:
#       -u user_name -- The name of the IAM user.
#       [-f file_name] -- The optional file name for the access key output.
#
# Returns:
#       [access_key_id access_key_secret]
#     And:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_user_access_key() {
  local user_name file_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_user_access_key"
    echo "Creates an AWS Identity and Access Management (IAM) key pair."
    echo "  -u user_name   The name of the IAM user."
    echo "  [-f file_name]   Optional file name for the access key output."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:f:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      f) file_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  response=$(aws iam create-access-key \
    --user-name "$user_name" \
    --output text)

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-access-key operation failed.$response"
    return 1
  fi

  if [[ -n "$file_name" ]]; then
    echo "$response" >"$file_name"
  fi

  local key_id key_secret
  # shellcheck disable=SC2086
  key_id=$(echo $response | cut -f 2 -d ' ')
  # shellcheck disable=SC2086
  key_secret=$(echo $response | cut -f 4 -d ' ')

  echo "$key_id $key_secret"

  return 0
}

###############################################################################
# function iam_create_role
#
# This function creates an IAM role.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#       -p policy_json -- The assume role policy document.
#
# Returns:
#       The ARN of the role.
#     And:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_role() {
  local role_name policy_document response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_user_access_key"
    echo "Creates an AWS Identity and Access Management (IAM) role."
    echo "  -n role_name   The name of the IAM role."
    echo "  -p policy_json -- The assume role policy document."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      p) policy_document="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_document" ]]; then
    errecho "ERROR: You must provide a policy document with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam create-role \
    --role-name "$role_name" \
    --assume-role-policy-document "$policy_document" \
    --output text \
    --query Role.Arn)

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-role operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_create_policy
#
# This function creates an IAM policy.
#
# Parameters:
#       -n policy_name -- The name of the IAM policy.
#       -p policy_json -- The policy document.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_create_policy() {
  local policy_name policy_document response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_create_policy"
    echo "Creates an AWS Identity and Access Management (IAM) policy."
    echo "  -n policy_name   The name of the IAM policy."
    echo "  -p policy_json -- The policy document."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) policy_name="${OPTARG}" ;;
      p) policy_document="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$policy_name" ]]; then
    errecho "ERROR: You must provide a policy name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_document" ]]; then
    errecho "ERROR: You must provide a policy document with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam create-policy \
    --policy-name "$policy_name" \
    --policy-document "$policy_document" \
    --output text \
    --query Policy.Arn)

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-policy operation failed.\n$response"
    return 1
  fi

  echo "$response"
}

###############################################################################
# function iam_attach_role_policy
#
# This function attaches an IAM policy to a tole.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#       -p policy_ARN -- The IAM policy document ARN..
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_attach_role_policy() {
  local role_name policy_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_attach_role_policy"
    echo "Attaches an AWS Identity and Access Management (IAM) policy to an IAM role."
    echo "  -n role_name   The name of the IAM role."
    echo "  -p policy_ARN -- The IAM policy document ARN."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      p) policy_arn="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_arn" ]]; then
    errecho "ERROR: You must provide a policy ARN with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam attach-role-policy \
    --role-name "$role_name" \
    --policy-arn "$policy_arn")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports attach-role-policy operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_detach_role_policy
#
# This function detaches an IAM policy to a tole.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#       -p policy_ARN -- The IAM policy document ARN..
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_detach_role_policy() {
  local role_name policy_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_detach_role_policy"
    echo "Detaches an AWS Identity and Access Management (IAM) policy to an IAM role."
    echo "  -n role_name   The name of the IAM role."
    echo "  -p policy_ARN -- The IAM policy document ARN."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:p:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      p) policy_arn="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  if [[ -z "$policy_arn" ]]; then
    errecho "ERROR: You must provide a policy ARN with the -p parameter."
    usage
    return 1
  fi

  response=$(aws iam detach-role-policy \
    --role-name "$role_name" \
    --policy-arn "$policy_arn")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports detach-role-policy operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}

###############################################################################
# function iam_delete_policy
#
# This function deletes an IAM policy.
#
# Parameters:
#       -n policy_arn -- The name of the IAM policy arn.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_policy() {
  local policy_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_policy"
    echo "Deletes an AWS Identity and Access Management (IAM) policy"
    echo "  -n policy_arn -- The name of the IAM policy arn."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:h" option; do
    case "${option}" in
      n) policy_arn="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$policy_arn" ]]; then
    errecho "ERROR: You must provide a policy arn with the -n parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    Policy arn:  $policy_arn"
  iecho ""

  response=$(aws iam delete-policy \
    --policy-arn "$policy_arn")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-policy operation failed.\n$response"
    return 1
  fi

  iecho "delete-policy response:$response"
  iecho

  return 0
}

###############################################################################
# function iam_delete_role
#
# This function deletes an IAM role.
#
# Parameters:
#       -n role_name -- The name of the IAM role.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_role() {
  local role_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_role"
    echo "Deletes an AWS Identity and Access Management (IAM) role"
    echo "  -n role_name -- The name of the IAM role."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "n:h" option; do
    case "${option}" in
      n) role_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  echo "role_name:$role_name"
  if [[ -z "$role_name" ]]; then
    errecho "ERROR: You must provide a role name with the -n parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    Role name:  $role_name"
  iecho ""

  response=$(aws iam delete-role \
    --role-name "$role_name")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-role operation failed.\n$response"
    return 1
  fi

  iecho "delete-role response:$response"
  iecho

  return 0
}

###############################################################################
# function iam_delete_access_key
#
# This function deletes an IAM access key for the specified IAM user.
#
# Parameters:
#       -u user_name  -- The name of the user.
#       -k access_key -- The access key to delete.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_access_key() {
  local user_name access_key response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_access_key"
    echo "Deletes an AWS Identity and Access Management (IAM) access key for the specified IAM user"
    echo "  -u user_name    The name of the user."
    echo "  -k access_key   The access key to delete."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:k:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      k) access_key="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  if [[ -z "$access_key" ]]; then
    errecho "ERROR: You must provide an access key with the -k parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    Username:   $user_name"
  iecho "    Access key:   $access_key"
  iecho ""

  response=$(aws iam delete-access-key \
    --user-name "$user_name" \
    --access-key-id "$access_key")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-access-key operation failed.\n$response"
    return 1
  fi

  iecho "delete-access-key response:$response"
  iecho

  return 0
}

###############################################################################
# function iam_delete_user
#
# This function deletes the specified IAM user.
#
# Parameters:
#       -u user_name  -- The name of the user to create.
#
# Returns:
#       0 - If successful.
#       1 - If it fails.
###############################################################################
function iam_delete_user() {
  local user_name response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function iam_delete_user"
    echo "Deletes an AWS Identity and Access Management (IAM) user. You must supply a username:"
    echo "  -u user_name    The name of the user."
    echo ""
  }

  # Retrieve the calling parameters.
  while getopts "u:h" option; do
    case "${option}" in
      u) user_name="${OPTARG}" ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done
  export OPTIND=1

  if [[ -z "$user_name" ]]; then
    errecho "ERROR: You must provide a username with the -u parameter."
    usage
    return 1
  fi

  iecho "Parameters:\n"
  iecho "    User name:   $user_name"
  iecho ""

  # If the user does not exist, we don't want to try to delete it.
  if (! iam_user_exists "$user_name"); then
    errecho "ERROR: A user with that name does not exist in the account."
    return 1
  fi

  response=$(aws iam delete-user \
    --user-name "$user_name")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports delete-user operation failed.$response"
    return 1
  fi

  iecho "delete-user response:$response"
  iecho

  return 0
}
```
+ 如需 API 詳細資訊，請參閱《*AWS CLI 命令參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/aws-cli/iam-2010-05-08/PutUserPolicy)

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/iam#code-examples)中設定和執行。

```
namespace AwsDoc {
    namespace IAM {
  
        //! Cleanup by deleting created entities.
        /*!
          \sa DeleteCreatedEntities
          \param client: IAM client.
          \param role: IAM role.
          \param user: IAM user.
          \param policy: IAM policy.
        */
        static bool DeleteCreatedEntities(const Aws::IAM::IAMClient &client,
                                          const Aws::IAM::Model::Role &role,
                                          const Aws::IAM::Model::User &user,
                                          const Aws::IAM::Model::Policy &policy);
    }

    static const int LIST_BUCKETS_WAIT_SEC = 20;

    static const char ALLOCATION_TAG[] = "example_code";
}

//! Scenario to create an IAM user, create an IAM role, and apply the role to the user.
// "IAM access" permissions are needed to run this code.
// "STS assume role" permissions are needed to run this code. (Note: It might be necessary to
//    create a custom policy).
/*!
  \sa iamCreateUserAssumeRoleScenario
  \param clientConfig: Aws client configuration.
  \return bool: Successful completion.
*/
bool AwsDoc::IAM::iamCreateUserAssumeRoleScenario(
        const Aws::Client::ClientConfiguration &clientConfig) {

    Aws::IAM::IAMClient client(clientConfig);
    Aws::IAM::Model::User user;
    Aws::IAM::Model::Role role;
    Aws::IAM::Model::Policy policy;

    // 1. Create a user.
    {
        Aws::IAM::Model::CreateUserRequest request;
        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String userName = "iam-demo-user-" +
                               Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetUserName(userName);

        Aws::IAM::Model::CreateUserOutcome outcome = client.CreateUser(request);
        if (!outcome.IsSuccess()) {
            std::cout << "Error creating IAM user " << userName << ":" <<
                      outcome.GetError().GetMessage() << std::endl;
            return false;
        }
        else {
            std::cout << "Successfully created IAM user " << userName << std::endl;
        }

        user = outcome.GetResult().GetUser();
    }

    // 2. Create a role.
    {
        // Get the IAM user for the current client in order to access its ARN.
        Aws::String iamUserArn;
        {
            Aws::IAM::Model::GetUserRequest request;
            Aws::IAM::Model::GetUserOutcome outcome = client.GetUser(request);
            if (!outcome.IsSuccess()) {
                std::cerr << "Error getting Iam user. " <<
                          outcome.GetError().GetMessage() << std::endl;

                DeleteCreatedEntities(client, role, user, policy);
                return false;
            }
            else {
                std::cout << "Successfully retrieved Iam user "
                          << outcome.GetResult().GetUser().GetUserName()
                          << std::endl;
            }

            iamUserArn = outcome.GetResult().GetUser().GetArn();
        }

        Aws::IAM::Model::CreateRoleRequest request;

        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String roleName = "iam-demo-role-" +
                               Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetRoleName(roleName);

        // Build policy document for role.
        Aws::Utils::Document jsonStatement;
        jsonStatement.WithString("Effect", "Allow");

        Aws::Utils::Document jsonPrincipal;
        jsonPrincipal.WithString("AWS", iamUserArn);
        jsonStatement.WithObject("Principal", jsonPrincipal);
        jsonStatement.WithString("Action", "sts:AssumeRole");
        jsonStatement.WithObject("Condition", Aws::Utils::Document());

        Aws::Utils::Document policyDocument;
        policyDocument.WithString("Version", "2012-10-17");

        Aws::Utils::Array<Aws::Utils::Document> statements(1);
        statements[0] = jsonStatement;
        policyDocument.WithArray("Statement", statements);

        std::cout << "Setting policy for role\n   "
                  << policyDocument.View().WriteCompact() << std::endl;

        // Set role policy document as JSON string.
        request.SetAssumeRolePolicyDocument(policyDocument.View().WriteCompact());

        Aws::IAM::Model::CreateRoleOutcome outcome = client.CreateRole(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error creating role. " <<
                      outcome.GetError().GetMessage() << std::endl;

            DeleteCreatedEntities(client, role, user, policy);
            return false;
        }
        else {
            std::cout << "Successfully created a role with name " << roleName
                      << std::endl;
        }

        role = outcome.GetResult().GetRole();
    }

    // 3. Create an IAM policy.
    {
        Aws::IAM::Model::CreatePolicyRequest request;
        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String policyName = "iam-demo-policy-" +
                                 Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetPolicyName(policyName);

        // Build IAM policy document.
        Aws::Utils::Document jsonStatement;
        jsonStatement.WithString("Effect", "Allow");
        jsonStatement.WithString("Action", "s3:ListAllMyBuckets");
        jsonStatement.WithString("Resource", "arn:aws:s3:::*");

        Aws::Utils::Document policyDocument;
        policyDocument.WithString("Version", "2012-10-17");

        Aws::Utils::Array<Aws::Utils::Document> statements(1);
        statements[0] = jsonStatement;
        policyDocument.WithArray("Statement", statements);

        std::cout << "Creating a policy.\n   " << policyDocument.View().WriteCompact()
                  << std::endl;

        // Set IAM policy document as JSON string.
        request.SetPolicyDocument(policyDocument.View().WriteCompact());

        Aws::IAM::Model::CreatePolicyOutcome outcome = client.CreatePolicy(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error creating policy. " <<
                      outcome.GetError().GetMessage() << std::endl;

            DeleteCreatedEntities(client, role, user, policy);
            return false;
        }
        else {
            std::cout << "Successfully created a policy with name, " << policyName <<
                      "." << std::endl;
        }

        policy = outcome.GetResult().GetPolicy();
    }

    // 4. Assume the new role using the AWS Security Token Service (STS).
    Aws::STS::Model::Credentials credentials;
    {
        Aws::STS::STSClient stsClient(clientConfig);

        Aws::STS::Model::AssumeRoleRequest request;
        request.SetRoleArn(role.GetArn());
        Aws::String uuid = Aws::Utils::UUID::RandomUUID();
        Aws::String roleSessionName = "iam-demo-role-session-" +
                                      Aws::Utils::StringUtils::ToLower(uuid.c_str());
        request.SetRoleSessionName(roleSessionName);

        Aws::STS::Model::AssumeRoleOutcome assumeRoleOutcome;

        // Repeatedly call AssumeRole, because there is often a delay
        // before the role is available to be assumed.
        // Repeat at most 20 times when access is denied.
        int count = 0;
        while (true) {
            assumeRoleOutcome = stsClient.AssumeRole(request);
            if (!assumeRoleOutcome.IsSuccess()) {
                if (count > 20 ||
                    assumeRoleOutcome.GetError().GetErrorType() !=
                    Aws::STS::STSErrors::ACCESS_DENIED) {
                    std::cerr << "Error assuming role after 20 tries. " <<
                              assumeRoleOutcome.GetError().GetMessage() << std::endl;

                    DeleteCreatedEntities(client, role, user, policy);
                    return false;
                }
                std::this_thread::sleep_for(std::chrono::seconds(1));
            }
            else {
                std::cout << "Successfully assumed the role after " << count
                          << " seconds." << std::endl;
                break;
            }
            count++;
        }

        credentials = assumeRoleOutcome.GetResult().GetCredentials();
    }


    // 5. List objects in the bucket (This should fail).
    {
        Aws::S3::S3Client s3Client(
                Aws::Auth::AWSCredentials(credentials.GetAccessKeyId(),
                                          credentials.GetSecretAccessKey(),
                                          credentials.GetSessionToken()),
                Aws::MakeShared<Aws::S3::S3EndpointProvider>(ALLOCATION_TAG),
                clientConfig);
        Aws::S3::Model::ListBucketsOutcome listBucketsOutcome = s3Client.ListBuckets();
        if (!listBucketsOutcome.IsSuccess()) {
            if (listBucketsOutcome.GetError().GetErrorType() !=
                Aws::S3::S3Errors::ACCESS_DENIED) {
                std::cerr << "Could not lists buckets. " <<
                          listBucketsOutcome.GetError().GetMessage() << std::endl;
            }
            else {
                std::cout
                        << "Access to list buckets denied because privileges have not been applied."
                        << std::endl;
            }
        }
        else {
            std::cerr
                    << "Successfully retrieved bucket lists when this should not happen."
                    << std::endl;
        }
    }

    // 6. Attach the policy to the role.
    {
        Aws::IAM::Model::AttachRolePolicyRequest request;
        request.SetRoleName(role.GetRoleName());
        request.WithPolicyArn(policy.GetArn());

        Aws::IAM::Model::AttachRolePolicyOutcome outcome = client.AttachRolePolicy(
                request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error creating policy. " <<
                      outcome.GetError().GetMessage() << std::endl;

            DeleteCreatedEntities(client, role, user, policy);
            return false;
        }
        else {
            std::cout << "Successfully attached the policy with name, "
                      << policy.GetPolicyName() <<
                      ", to the role, " << role.GetRoleName() << "." << std::endl;
        }
    }

    int count = 0;
    // 7. List objects in the bucket (this should succeed).
    // Repeatedly call ListBuckets, because there is often a delay
    // before the policy with ListBucket permissions has been applied to the role.
    // Repeat at most LIST_BUCKETS_WAIT_SEC times when access is denied.
    while (true) {
        Aws::S3::S3Client s3Client(
                Aws::Auth::AWSCredentials(credentials.GetAccessKeyId(),
                                          credentials.GetSecretAccessKey(),
                                          credentials.GetSessionToken()),
                Aws::MakeShared<Aws::S3::S3EndpointProvider>(ALLOCATION_TAG),
                clientConfig);
        Aws::S3::Model::ListBucketsOutcome listBucketsOutcome = s3Client.ListBuckets();
        if (!listBucketsOutcome.IsSuccess()) {
            if ((count > LIST_BUCKETS_WAIT_SEC) ||
                listBucketsOutcome.GetError().GetErrorType() !=
                Aws::S3::S3Errors::ACCESS_DENIED) {
                std::cerr << "Could not lists buckets after " << LIST_BUCKETS_WAIT_SEC << " seconds. " <<
                          listBucketsOutcome.GetError().GetMessage() << std::endl;
                DeleteCreatedEntities(client, role, user, policy);
                return false;
            }

            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
        else {

            std::cout << "Successfully retrieved bucket lists after " << count
                      << " seconds." << std::endl;
            break;
        }
        count++;
    }

    // 8. Delete all the created resources.
    return DeleteCreatedEntities(client, role, user, policy);
}

bool AwsDoc::IAM::DeleteCreatedEntities(const Aws::IAM::IAMClient &client,
                                        const Aws::IAM::Model::Role &role,
                                        const Aws::IAM::Model::User &user,
                                        const Aws::IAM::Model::Policy &policy) {
    bool result = true;
    if (policy.ArnHasBeenSet()) {
        // Detach the policy from the role.
        {
            Aws::IAM::Model::DetachRolePolicyRequest request;
            request.SetPolicyArn(policy.GetArn());
            request.SetRoleName(role.GetRoleName());

            Aws::IAM::Model::DetachRolePolicyOutcome outcome = client.DetachRolePolicy(
                    request);
            if (!outcome.IsSuccess()) {
                std::cerr << "Error Detaching policy from roles. " <<
                          outcome.GetError().GetMessage() << std::endl;
                result = false;
            }
            else {
                std::cout << "Successfully detached the policy with arn "
                          << policy.GetArn()
                          << " from role " << role.GetRoleName() << "." << std::endl;
            }
        }

        // Delete the policy.
        {
            Aws::IAM::Model::DeletePolicyRequest request;
            request.WithPolicyArn(policy.GetArn());

            Aws::IAM::Model::DeletePolicyOutcome outcome = client.DeletePolicy(request);
            if (!outcome.IsSuccess()) {
                std::cerr << "Error deleting policy. " <<
                          outcome.GetError().GetMessage() << std::endl;
                result = false;
            }
            else {
                std::cout << "Successfully deleted the policy with arn "
                          << policy.GetArn() << std::endl;
            }
        }

    }

    if (role.RoleIdHasBeenSet()) {
        // Delete the role.
        Aws::IAM::Model::DeleteRoleRequest request;
        request.SetRoleName(role.GetRoleName());

        Aws::IAM::Model::DeleteRoleOutcome outcome = client.DeleteRole(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error deleting role. " <<
                      outcome.GetError().GetMessage() << std::endl;
            result = false;
        }
        else {
            std::cout << "Successfully deleted the role with name "
                      << role.GetRoleName() << std::endl;
        }
    }

    if (user.ArnHasBeenSet()) {
        // Delete the user.
        Aws::IAM::Model::DeleteUserRequest request;
        request.WithUserName(user.GetUserName());

        Aws::IAM::Model::DeleteUserOutcome outcome = client.DeleteUser(request);
        if (!outcome.IsSuccess()) {
            std::cerr << "Error deleting user. " <<
                      outcome.GetError().GetMessage() << std::endl;
            result = false;
        }
        else {
            std::cout << "Successfully deleted the user with name "
                      << user.GetUserName() << std::endl;
        }
    }

    return result;
}
```
+ 如需 API 詳細資訊，請參閱《*適用於 C\$1\$1 的 AWS SDK API 參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForCpp/iam-2010-05-08/PutUserPolicy)

------
#### [ Go ]

**SDK for Go V2**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/gov2/iam#code-examples)中設定和執行。
在命令提示中執行互動式案例。  

```
import (
	"context"
	"errors"
	"fmt"
	"log"
	"math/rand"
	"strings"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/credentials"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/service/sts"
	"github.com/aws/smithy-go"
	"github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools"
	"github.com/awsdocs/aws-doc-sdk-examples/gov2/iam/actions"
)

// AssumeRoleScenario shows you how to use the AWS Identity and Access Management (IAM)
// service to perform the following actions:
//
//  1. Create a user who has no permissions.
//  2. Create a role that grants permission to list Amazon Simple Storage Service
//     (Amazon S3) buckets for the account.
//  3. Add a policy to let the user assume the role.
//  4. Try and fail to list buckets without permissions.
//  5. Assume the role and list S3 buckets using temporary credentials.
//  6. Delete the policy, role, and user.
type AssumeRoleScenario struct {
	sdkConfig      aws.Config
	accountWrapper actions.AccountWrapper
	policyWrapper  actions.PolicyWrapper
	roleWrapper    actions.RoleWrapper
	userWrapper    actions.UserWrapper
	questioner     demotools.IQuestioner
	helper         IScenarioHelper
	isTestRun      bool
}

// NewAssumeRoleScenario constructs an AssumeRoleScenario instance from a configuration.
// It uses the specified config to get an IAM client and create wrappers for the actions
// used in the scenario.
func NewAssumeRoleScenario(sdkConfig aws.Config, questioner demotools.IQuestioner,
	helper IScenarioHelper) AssumeRoleScenario {
	iamClient := iam.NewFromConfig(sdkConfig)
	return AssumeRoleScenario{
		sdkConfig:      sdkConfig,
		accountWrapper: actions.AccountWrapper{IamClient: iamClient},
		policyWrapper:  actions.PolicyWrapper{IamClient: iamClient},
		roleWrapper:    actions.RoleWrapper{IamClient: iamClient},
		userWrapper:    actions.UserWrapper{IamClient: iamClient},
		questioner:     questioner,
		helper:         helper,
	}
}

// addTestOptions appends the API options specified in the original configuration to
// another configuration. This is used to attach the middleware stubber to clients
// that are constructed during the scenario, which is needed for unit testing.
func (scenario AssumeRoleScenario) addTestOptions(scenarioConfig *aws.Config) {
	if scenario.isTestRun {
		scenarioConfig.APIOptions = append(scenarioConfig.APIOptions, scenario.sdkConfig.APIOptions...)
	}
}

// Run runs the interactive scenario.
func (scenario AssumeRoleScenario) Run(ctx context.Context) {
	defer func() {
		if r := recover(); r != nil {
			log.Printf("Something went wrong with the demo.\n")
			log.Println(r)
		}
	}()

	log.Println(strings.Repeat("-", 88))
	log.Println("Welcome to the AWS Identity and Access Management (IAM) assume role demo.")
	log.Println(strings.Repeat("-", 88))

	user := scenario.CreateUser(ctx)
	accessKey := scenario.CreateAccessKey(ctx, user)
	role := scenario.CreateRoleAndPolicies(ctx, user)
	noPermsConfig := scenario.ListBucketsWithoutPermissions(ctx, accessKey)
	scenario.ListBucketsWithAssumedRole(ctx, noPermsConfig, role)
	scenario.Cleanup(ctx, user, role)

	log.Println(strings.Repeat("-", 88))
	log.Println("Thanks for watching!")
	log.Println(strings.Repeat("-", 88))
}

// CreateUser creates a new IAM user. This user has no permissions.
func (scenario AssumeRoleScenario) CreateUser(ctx context.Context) *types.User {
	log.Println("Let's create an example user with no permissions.")
	userName := scenario.questioner.Ask("Enter a name for the example user:", demotools.NotEmpty{})
	user, err := scenario.userWrapper.GetUser(ctx, userName)
	if err != nil {
		panic(err)
	}
	if user == nil {
		user, err = scenario.userWrapper.CreateUser(ctx, userName)
		if err != nil {
			panic(err)
		}
		log.Printf("Created user %v.\n", *user.UserName)
	} else {
		log.Printf("User %v already exists.\n", *user.UserName)
	}
	log.Println(strings.Repeat("-", 88))
	return user
}

// CreateAccessKey creates an access key for the user.
func (scenario AssumeRoleScenario) CreateAccessKey(ctx context.Context, user *types.User) *types.AccessKey {
	accessKey, err := scenario.userWrapper.CreateAccessKeyPair(ctx, *user.UserName)
	if err != nil {
		panic(err)
	}
	log.Printf("Created access key %v for your user.", *accessKey.AccessKeyId)
	log.Println("Waiting a few seconds for your user to be ready...")
	scenario.helper.Pause(10)
	log.Println(strings.Repeat("-", 88))
	return accessKey
}

// CreateRoleAndPolicies creates a policy that grants permission to list S3 buckets for
// the current account and attaches the policy to a newly created role. It also adds an
// inline policy to the specified user that grants the user permission to assume the role.
func (scenario AssumeRoleScenario) CreateRoleAndPolicies(ctx context.Context, user *types.User) *types.Role {
	log.Println("Let's create a role and policy that grant permission to list S3 buckets.")
	scenario.questioner.Ask("Press Enter when you're ready.")
	listBucketsRole, err := scenario.roleWrapper.CreateRole(ctx, scenario.helper.GetName(), *user.Arn)
	if err != nil {
		panic(err)
	}
	log.Printf("Created role %v.\n", *listBucketsRole.RoleName)
	listBucketsPolicy, err := scenario.policyWrapper.CreatePolicy(
		ctx, scenario.helper.GetName(), []string{"s3:ListAllMyBuckets"}, "arn:aws:s3:::*")
	if err != nil {
		panic(err)
	}
	log.Printf("Created policy %v.\n", *listBucketsPolicy.PolicyName)
	err = scenario.roleWrapper.AttachRolePolicy(ctx, *listBucketsPolicy.Arn, *listBucketsRole.RoleName)
	if err != nil {
		panic(err)
	}
	log.Printf("Attached policy %v to role %v.\n", *listBucketsPolicy.PolicyName,
		*listBucketsRole.RoleName)
	err = scenario.userWrapper.CreateUserPolicy(ctx, *user.UserName, scenario.helper.GetName(),
		[]string{"sts:AssumeRole"}, *listBucketsRole.Arn)
	if err != nil {
		panic(err)
	}
	log.Printf("Created an inline policy for user %v that lets the user assume the role.\n",
		*user.UserName)
	log.Println("Let's give AWS a few seconds to propagate these new resources and connections...")
	scenario.helper.Pause(10)
	log.Println(strings.Repeat("-", 88))
	return listBucketsRole
}

// ListBucketsWithoutPermissions creates an Amazon S3 client from the user's access key
// credentials and tries to list buckets for the account. Because the user does not have
// permission to perform this action, the action fails.
func (scenario AssumeRoleScenario) ListBucketsWithoutPermissions(ctx context.Context, accessKey *types.AccessKey) *aws.Config {
	log.Println("Let's try to list buckets without permissions. This should return an AccessDenied error.")
	scenario.questioner.Ask("Press Enter when you're ready.")
	noPermsConfig, err := config.LoadDefaultConfig(ctx,
		config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
			*accessKey.AccessKeyId, *accessKey.SecretAccessKey, ""),
		))
	if err != nil {
		panic(err)
	}

	// Add test options if this is a test run. This is needed only for testing purposes.
	scenario.addTestOptions(&noPermsConfig)

	s3Client := s3.NewFromConfig(noPermsConfig)
	_, err = s3Client.ListBuckets(ctx, &s3.ListBucketsInput{})
	if err != nil {
		// The SDK for Go does not model the AccessDenied error, so check ErrorCode directly.
		var ae smithy.APIError
		if errors.As(err, &ae) {
			switch ae.ErrorCode() {
			case "AccessDenied":
				log.Println("Got AccessDenied error, which is the expected result because\n" +
					"the ListBuckets call was made without permissions.")
			default:
				log.Println("Expected AccessDenied, got something else.")
				panic(err)
			}
		}
	} else {
		log.Println("Expected AccessDenied error when calling ListBuckets without permissions,\n" +
			"but the call succeeded. Continuing the example anyway...")
	}
	log.Println(strings.Repeat("-", 88))
	return &noPermsConfig
}

// ListBucketsWithAssumedRole performs the following actions:
//
//  1. Creates an AWS Security Token Service (AWS STS) client from the config created from
//     the user's access key credentials.
//  2. Gets temporary credentials by assuming the role that grants permission to list the
//     buckets.
//  3. Creates an Amazon S3 client from the temporary credentials.
//  4. Lists buckets for the account. Because the temporary credentials are generated by
//     assuming the role that grants permission, the action succeeds.
func (scenario AssumeRoleScenario) ListBucketsWithAssumedRole(ctx context.Context, noPermsConfig *aws.Config, role *types.Role) {
	log.Println("Let's assume the role that grants permission to list buckets and try again.")
	scenario.questioner.Ask("Press Enter when you're ready.")
	stsClient := sts.NewFromConfig(*noPermsConfig)
	tempCredentials, err := stsClient.AssumeRole(ctx, &sts.AssumeRoleInput{
		RoleArn:         role.Arn,
		RoleSessionName: aws.String("AssumeRoleExampleSession"),
		DurationSeconds: aws.Int32(900),
	})
	if err != nil {
		log.Printf("Couldn't assume role %v.\n", *role.RoleName)
		panic(err)
	}
	log.Printf("Assumed role %v, got temporary credentials.\n", *role.RoleName)
	assumeRoleConfig, err := config.LoadDefaultConfig(ctx,
		config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(
			*tempCredentials.Credentials.AccessKeyId,
			*tempCredentials.Credentials.SecretAccessKey,
			*tempCredentials.Credentials.SessionToken),
		),
	)
	if err != nil {
		panic(err)
	}

	// Add test options if this is a test run. This is needed only for testing purposes.
	scenario.addTestOptions(&assumeRoleConfig)

	s3Client := s3.NewFromConfig(assumeRoleConfig)
	result, err := s3Client.ListBuckets(ctx, &s3.ListBucketsInput{})
	if err != nil {
		log.Println("Couldn't list buckets with assumed role credentials.")
		panic(err)
	}
	log.Println("Successfully called ListBuckets with assumed role credentials, \n" +
		"here are some of them:")
	for i := 0; i < len(result.Buckets) && i < 5; i++ {
		log.Printf("\t%v\n", *result.Buckets[i].Name)
	}
	log.Println(strings.Repeat("-", 88))
}

// Cleanup deletes all resources created for the scenario.
func (scenario AssumeRoleScenario) Cleanup(ctx context.Context, user *types.User, role *types.Role) {
	if scenario.questioner.AskBool(
		"Do you want to delete the resources created for this example? (y/n)", "y",
	) {
		policies, err := scenario.roleWrapper.ListAttachedRolePolicies(ctx, *role.RoleName)
		if err != nil {
			panic(err)
		}
		for _, policy := range policies {
			err = scenario.roleWrapper.DetachRolePolicy(ctx, *role.RoleName, *policy.PolicyArn)
			if err != nil {
				panic(err)
			}
			err = scenario.policyWrapper.DeletePolicy(ctx, *policy.PolicyArn)
			if err != nil {
				panic(err)
			}
			log.Printf("Detached policy %v from role %v and deleted the policy.\n",
				*policy.PolicyName, *role.RoleName)
		}
		err = scenario.roleWrapper.DeleteRole(ctx, *role.RoleName)
		if err != nil {
			panic(err)
		}
		log.Printf("Deleted role %v.\n", *role.RoleName)

		userPols, err := scenario.userWrapper.ListUserPolicies(ctx, *user.UserName)
		if err != nil {
			panic(err)
		}
		for _, userPol := range userPols {
			err = scenario.userWrapper.DeleteUserPolicy(ctx, *user.UserName, userPol)
			if err != nil {
				panic(err)
			}
			log.Printf("Deleted policy %v from user %v.\n", userPol, *user.UserName)
		}
		keys, err := scenario.userWrapper.ListAccessKeys(ctx, *user.UserName)
		if err != nil {
			panic(err)
		}
		for _, key := range keys {
			err = scenario.userWrapper.DeleteAccessKey(ctx, *user.UserName, *key.AccessKeyId)
			if err != nil {
				panic(err)
			}
			log.Printf("Deleted access key %v from user %v.\n", *key.AccessKeyId, *user.UserName)
		}
		err = scenario.userWrapper.DeleteUser(ctx, *user.UserName)
		if err != nil {
			panic(err)
		}
		log.Printf("Deleted user %v.\n", *user.UserName)
		log.Println(strings.Repeat("-", 88))
	}

}

// IScenarioHelper abstracts input and wait functions from a scenario so that they
// can be mocked for unit testing.
type IScenarioHelper interface {
	GetName() string
	Pause(secs int)
}

const rMax = 100000

type ScenarioHelper struct {
	Prefix string
	Random *rand.Rand
}

// GetName returns a unique name formed of a prefix and a random number.
func (helper *ScenarioHelper) GetName() string {
	return fmt.Sprintf("%v%v", helper.Prefix, helper.Random.Intn(rMax))
}

// Pause waits for the specified number of seconds.
func (helper ScenarioHelper) Pause(secs int) {
	time.Sleep(time.Duration(secs) * time.Second)
}
```
定義包裝帳號動作的結構。  

```
import (
	"context"
	"log"

	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// AccountWrapper encapsulates AWS Identity and Access Management (IAM) account actions
// used in the examples.
// It contains an IAM service client that is used to perform account actions.
type AccountWrapper struct {
	IamClient *iam.Client
}



// GetAccountPasswordPolicy gets the account password policy for the current account.
// If no policy has been set, a NoSuchEntityException is error is returned.
func (wrapper AccountWrapper) GetAccountPasswordPolicy(ctx context.Context) (*types.PasswordPolicy, error) {
	var pwPolicy *types.PasswordPolicy
	result, err := wrapper.IamClient.GetAccountPasswordPolicy(ctx,
		&iam.GetAccountPasswordPolicyInput{})
	if err != nil {
		log.Printf("Couldn't get account password policy. Here's why: %v\n", err)
	} else {
		pwPolicy = result.PasswordPolicy
	}
	return pwPolicy, err
}



// ListSAMLProviders gets the SAML providers for the account.
func (wrapper AccountWrapper) ListSAMLProviders(ctx context.Context) ([]types.SAMLProviderListEntry, error) {
	var providers []types.SAMLProviderListEntry
	result, err := wrapper.IamClient.ListSAMLProviders(ctx, &iam.ListSAMLProvidersInput{})
	if err != nil {
		log.Printf("Couldn't list SAML providers. Here's why: %v\n", err)
	} else {
		providers = result.SAMLProviderList
	}
	return providers, err
}
```
定義包裝政策動作的結構。  

```
import (
	"context"
	"encoding/json"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// PolicyWrapper encapsulates AWS Identity and Access Management (IAM) policy actions
// used in the examples.
// It contains an IAM service client that is used to perform policy actions.
type PolicyWrapper struct {
	IamClient *iam.Client
}



// ListPolicies gets up to maxPolicies policies.
func (wrapper PolicyWrapper) ListPolicies(ctx context.Context, maxPolicies int32) ([]types.Policy, error) {
	var policies []types.Policy
	result, err := wrapper.IamClient.ListPolicies(ctx, &iam.ListPoliciesInput{
		MaxItems: aws.Int32(maxPolicies),
	})
	if err != nil {
		log.Printf("Couldn't list policies. Here's why: %v\n", err)
	} else {
		policies = result.Policies
	}
	return policies, err
}



// PolicyDocument defines a policy document as a Go struct that can be serialized
// to JSON.
type PolicyDocument struct {
	Version   string
	Statement []PolicyStatement
}

// PolicyStatement defines a statement in a policy document.
type PolicyStatement struct {
	Effect    string
	Action    []string
	Principal map[string]string `json:",omitempty"`
	Resource  *string           `json:",omitempty"`
}

// CreatePolicy creates a policy that grants a list of actions to the specified resource.
// PolicyDocument shows how to work with a policy document as a data structure and
// serialize it to JSON by using Go's JSON marshaler.
func (wrapper PolicyWrapper) CreatePolicy(ctx context.Context, policyName string, actions []string,
	resourceArn string) (*types.Policy, error) {
	var policy *types.Policy
	policyDoc := PolicyDocument{
		Version: "2012-10-17",
		Statement: []PolicyStatement{{
			Effect:   "Allow",
			Action:   actions,
			Resource: aws.String(resourceArn),
		}},
	}
	policyBytes, err := json.Marshal(policyDoc)
	if err != nil {
		log.Printf("Couldn't create policy document for %v. Here's why: %v\n", resourceArn, err)
		return nil, err
	}
	result, err := wrapper.IamClient.CreatePolicy(ctx, &iam.CreatePolicyInput{
		PolicyDocument: aws.String(string(policyBytes)),
		PolicyName:     aws.String(policyName),
	})
	if err != nil {
		log.Printf("Couldn't create policy %v. Here's why: %v\n", policyName, err)
	} else {
		policy = result.Policy
	}
	return policy, err
}



// GetPolicy gets data about a policy.
func (wrapper PolicyWrapper) GetPolicy(ctx context.Context, policyArn string) (*types.Policy, error) {
	var policy *types.Policy
	result, err := wrapper.IamClient.GetPolicy(ctx, &iam.GetPolicyInput{
		PolicyArn: aws.String(policyArn),
	})
	if err != nil {
		log.Printf("Couldn't get policy %v. Here's why: %v\n", policyArn, err)
	} else {
		policy = result.Policy
	}
	return policy, err
}



// DeletePolicy deletes a policy.
func (wrapper PolicyWrapper) DeletePolicy(ctx context.Context, policyArn string) error {
	_, err := wrapper.IamClient.DeletePolicy(ctx, &iam.DeletePolicyInput{
		PolicyArn: aws.String(policyArn),
	})
	if err != nil {
		log.Printf("Couldn't delete policy %v. Here's why: %v\n", policyArn, err)
	}
	return err
}
```
定義包裝角色動作的結構。  

```
import (
	"context"
	"encoding/json"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// RoleWrapper encapsulates AWS Identity and Access Management (IAM) role actions
// used in the examples.
// It contains an IAM service client that is used to perform role actions.
type RoleWrapper struct {
	IamClient *iam.Client
}



// ListRoles gets up to maxRoles roles.
func (wrapper RoleWrapper) ListRoles(ctx context.Context, maxRoles int32) ([]types.Role, error) {
	var roles []types.Role
	result, err := wrapper.IamClient.ListRoles(ctx,
		&iam.ListRolesInput{MaxItems: aws.Int32(maxRoles)},
	)
	if err != nil {
		log.Printf("Couldn't list roles. Here's why: %v\n", err)
	} else {
		roles = result.Roles
	}
	return roles, err
}



// CreateRole creates a role that trusts a specified user. The trusted user can assume
// the role to acquire its permissions.
// PolicyDocument shows how to work with a policy document as a data structure and
// serialize it to JSON by using Go's JSON marshaler.
func (wrapper RoleWrapper) CreateRole(ctx context.Context, roleName string, trustedUserArn string) (*types.Role, error) {
	var role *types.Role
	trustPolicy := PolicyDocument{
		Version: "2012-10-17",
		Statement: []PolicyStatement{{
			Effect:    "Allow",
			Principal: map[string]string{"AWS": trustedUserArn},
			Action:    []string{"sts:AssumeRole"},
		}},
	}
	policyBytes, err := json.Marshal(trustPolicy)
	if err != nil {
		log.Printf("Couldn't create trust policy for %v. Here's why: %v\n", trustedUserArn, err)
		return nil, err
	}
	result, err := wrapper.IamClient.CreateRole(ctx, &iam.CreateRoleInput{
		AssumeRolePolicyDocument: aws.String(string(policyBytes)),
		RoleName:                 aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't create role %v. Here's why: %v\n", roleName, err)
	} else {
		role = result.Role
	}
	return role, err
}



// GetRole gets data about a role.
func (wrapper RoleWrapper) GetRole(ctx context.Context, roleName string) (*types.Role, error) {
	var role *types.Role
	result, err := wrapper.IamClient.GetRole(ctx,
		&iam.GetRoleInput{RoleName: aws.String(roleName)})
	if err != nil {
		log.Printf("Couldn't get role %v. Here's why: %v\n", roleName, err)
	} else {
		role = result.Role
	}
	return role, err
}



// CreateServiceLinkedRole creates a service-linked role that is owned by the specified service.
func (wrapper RoleWrapper) CreateServiceLinkedRole(ctx context.Context, serviceName string, description string) (
	*types.Role, error) {
	var role *types.Role
	result, err := wrapper.IamClient.CreateServiceLinkedRole(ctx, &iam.CreateServiceLinkedRoleInput{
		AWSServiceName: aws.String(serviceName),
		Description:    aws.String(description),
	})
	if err != nil {
		log.Printf("Couldn't create service-linked role %v. Here's why: %v\n", serviceName, err)
	} else {
		role = result.Role
	}
	return role, err
}



// DeleteServiceLinkedRole deletes a service-linked role.
func (wrapper RoleWrapper) DeleteServiceLinkedRole(ctx context.Context, roleName string) error {
	_, err := wrapper.IamClient.DeleteServiceLinkedRole(ctx, &iam.DeleteServiceLinkedRoleInput{
		RoleName: aws.String(roleName)},
	)
	if err != nil {
		log.Printf("Couldn't delete service-linked role %v. Here's why: %v\n", roleName, err)
	}
	return err
}



// AttachRolePolicy attaches a policy to a role.
func (wrapper RoleWrapper) AttachRolePolicy(ctx context.Context, policyArn string, roleName string) error {
	_, err := wrapper.IamClient.AttachRolePolicy(ctx, &iam.AttachRolePolicyInput{
		PolicyArn: aws.String(policyArn),
		RoleName:  aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't attach policy %v to role %v. Here's why: %v\n", policyArn, roleName, err)
	}
	return err
}



// ListAttachedRolePolicies lists the policies that are attached to the specified role.
func (wrapper RoleWrapper) ListAttachedRolePolicies(ctx context.Context, roleName string) ([]types.AttachedPolicy, error) {
	var policies []types.AttachedPolicy
	result, err := wrapper.IamClient.ListAttachedRolePolicies(ctx, &iam.ListAttachedRolePoliciesInput{
		RoleName: aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't list attached policies for role %v. Here's why: %v\n", roleName, err)
	} else {
		policies = result.AttachedPolicies
	}
	return policies, err
}



// DetachRolePolicy detaches a policy from a role.
func (wrapper RoleWrapper) DetachRolePolicy(ctx context.Context, roleName string, policyArn string) error {
	_, err := wrapper.IamClient.DetachRolePolicy(ctx, &iam.DetachRolePolicyInput{
		PolicyArn: aws.String(policyArn),
		RoleName:  aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't detach policy from role %v. Here's why: %v\n", roleName, err)
	}
	return err
}



// ListRolePolicies lists the inline policies for a role.
func (wrapper RoleWrapper) ListRolePolicies(ctx context.Context, roleName string) ([]string, error) {
	var policies []string
	result, err := wrapper.IamClient.ListRolePolicies(ctx, &iam.ListRolePoliciesInput{
		RoleName: aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't list policies for role %v. Here's why: %v\n", roleName, err)
	} else {
		policies = result.PolicyNames
	}
	return policies, err
}



// DeleteRole deletes a role. All attached policies must be detached before a
// role can be deleted.
func (wrapper RoleWrapper) DeleteRole(ctx context.Context, roleName string) error {
	_, err := wrapper.IamClient.DeleteRole(ctx, &iam.DeleteRoleInput{
		RoleName: aws.String(roleName),
	})
	if err != nil {
		log.Printf("Couldn't delete role %v. Here's why: %v\n", roleName, err)
	}
	return err
}
```
定義包裝使用者動作的結構。  

```
import (
	"context"
	"encoding/json"
	"errors"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
	"github.com/aws/smithy-go"
)

// UserWrapper encapsulates user actions used in the examples.
// It contains an IAM service client that is used to perform user actions.
type UserWrapper struct {
	IamClient *iam.Client
}



// ListUsers gets up to maxUsers number of users.
func (wrapper UserWrapper) ListUsers(ctx context.Context, maxUsers int32) ([]types.User, error) {
	var users []types.User
	result, err := wrapper.IamClient.ListUsers(ctx, &iam.ListUsersInput{
		MaxItems: aws.Int32(maxUsers),
	})
	if err != nil {
		log.Printf("Couldn't list users. Here's why: %v\n", err)
	} else {
		users = result.Users
	}
	return users, err
}



// GetUser gets data about a user.
func (wrapper UserWrapper) GetUser(ctx context.Context, userName string) (*types.User, error) {
	var user *types.User
	result, err := wrapper.IamClient.GetUser(ctx, &iam.GetUserInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		var apiError smithy.APIError
		if errors.As(err, &apiError) {
			switch apiError.(type) {
			case *types.NoSuchEntityException:
				log.Printf("User %v does not exist.\n", userName)
				err = nil
			default:
				log.Printf("Couldn't get user %v. Here's why: %v\n", userName, err)
			}
		}
	} else {
		user = result.User
	}
	return user, err
}



// CreateUser creates a new user with the specified name.
func (wrapper UserWrapper) CreateUser(ctx context.Context, userName string) (*types.User, error) {
	var user *types.User
	result, err := wrapper.IamClient.CreateUser(ctx, &iam.CreateUserInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't create user %v. Here's why: %v\n", userName, err)
	} else {
		user = result.User
	}
	return user, err
}



// CreateUserPolicy adds an inline policy to a user. This example creates a policy that
// grants a list of actions on a specified role.
// PolicyDocument shows how to work with a policy document as a data structure and
// serialize it to JSON by using Go's JSON marshaler.
func (wrapper UserWrapper) CreateUserPolicy(ctx context.Context, userName string, policyName string, actions []string,
	roleArn string) error {
	policyDoc := PolicyDocument{
		Version: "2012-10-17",
		Statement: []PolicyStatement{{
			Effect:   "Allow",
			Action:   actions,
			Resource: aws.String(roleArn),
		}},
	}
	policyBytes, err := json.Marshal(policyDoc)
	if err != nil {
		log.Printf("Couldn't create policy document for %v. Here's why: %v\n", roleArn, err)
		return err
	}
	_, err = wrapper.IamClient.PutUserPolicy(ctx, &iam.PutUserPolicyInput{
		PolicyDocument: aws.String(string(policyBytes)),
		PolicyName:     aws.String(policyName),
		UserName:       aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't create policy for user %v. Here's why: %v\n", userName, err)
	}
	return err
}



// ListUserPolicies lists the inline policies for the specified user.
func (wrapper UserWrapper) ListUserPolicies(ctx context.Context, userName string) ([]string, error) {
	var policies []string
	result, err := wrapper.IamClient.ListUserPolicies(ctx, &iam.ListUserPoliciesInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't list policies for user %v. Here's why: %v\n", userName, err)
	} else {
		policies = result.PolicyNames
	}
	return policies, err
}



// DeleteUserPolicy deletes an inline policy from a user.
func (wrapper UserWrapper) DeleteUserPolicy(ctx context.Context, userName string, policyName string) error {
	_, err := wrapper.IamClient.DeleteUserPolicy(ctx, &iam.DeleteUserPolicyInput{
		PolicyName: aws.String(policyName),
		UserName:   aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't delete policy from user %v. Here's why: %v\n", userName, err)
	}
	return err
}



// DeleteUser deletes a user.
func (wrapper UserWrapper) DeleteUser(ctx context.Context, userName string) error {
	_, err := wrapper.IamClient.DeleteUser(ctx, &iam.DeleteUserInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't delete user %v. Here's why: %v\n", userName, err)
	}
	return err
}



// CreateAccessKeyPair creates an access key for a user. The returned access key contains
// the ID and secret credentials needed to use the key.
func (wrapper UserWrapper) CreateAccessKeyPair(ctx context.Context, userName string) (*types.AccessKey, error) {
	var key *types.AccessKey
	result, err := wrapper.IamClient.CreateAccessKey(ctx, &iam.CreateAccessKeyInput{
		UserName: aws.String(userName)})
	if err != nil {
		log.Printf("Couldn't create access key pair for user %v. Here's why: %v\n", userName, err)
	} else {
		key = result.AccessKey
	}
	return key, err
}



// DeleteAccessKey deletes an access key from a user.
func (wrapper UserWrapper) DeleteAccessKey(ctx context.Context, userName string, keyId string) error {
	_, err := wrapper.IamClient.DeleteAccessKey(ctx, &iam.DeleteAccessKeyInput{
		AccessKeyId: aws.String(keyId),
		UserName:    aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't delete access key %v. Here's why: %v\n", keyId, err)
	}
	return err
}



// ListAccessKeys lists the access keys for the specified user.
func (wrapper UserWrapper) ListAccessKeys(ctx context.Context, userName string) ([]types.AccessKeyMetadata, error) {
	var keys []types.AccessKeyMetadata
	result, err := wrapper.IamClient.ListAccessKeys(ctx, &iam.ListAccessKeysInput{
		UserName: aws.String(userName),
	})
	if err != nil {
		log.Printf("Couldn't list access keys for user %v. Here's why: %v\n", userName, err)
	} else {
		keys = result.AccessKeyMetadata
	}
	return keys, err
}
```
+ 如需 API 詳細資訊，請參閱《*適用於 Go 的 AWS SDK API 參考*》中的下列主題。
  + [AttachRolePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.AttachRolePolicy)
  + [CreateAccessKey](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreateAccessKey)
  + [CreatePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreatePolicy)
  + [CreateRole](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreateRole)
  + [CreateUser](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.CreateUser)
  + [DeleteAccessKey](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteAccessKey)
  + [DeletePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeletePolicy)
  + [DeleteRole](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteRole)
  + [DeleteUser](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteUser)
  + [DeleteUserPolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DeleteUserPolicy)
  + [DetachRolePolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.DetachRolePolicy)
  + [PutUserPolicy](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/service/iam#Client.PutUserPolicy)

------
#### [ Java ]

**SDK for Java 2.x**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/iam#code-examples)中設定和執行。
建立可包裝 IAM 使用者動作的函數。  

```
/*
  To run this Java V2 code example, set up your development environment, including your credentials.

  For information, see this documentation topic:

  https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html

  This example performs these operations:

  1. Creates a user that has no permissions.
  2. Creates a role and policy that grants Amazon S3 permissions.
  3. Creates a role.
  4. Grants the user permissions.
  5. Gets temporary credentials by assuming the role.  Creates an Amazon S3 Service client object with the temporary credentials.
  6. Deletes the resources.
 */

public class IAMScenario {
    public static final String DASHES = new String(new char[80]).replace("\0", "-");
    public static final String PolicyDocument = "{" +
            "  \"Version\": \"2012-10-17\"," +
            "  \"Statement\": [" +
            "    {" +
            "        \"Effect\": \"Allow\"," +
            "        \"Action\": [" +
            "            \"s3:*\"" +
            "       ]," +
            "       \"Resource\": \"*\"" +
            "    }" +
            "   ]" +
            "}";

    public static String userArn;

    public static void main(String[] args) throws Exception {

        final String usage = """

                Usage:
                    <username> <policyName> <roleName> <roleSessionName> <bucketName>\s

                Where:
                    username - The name of the IAM user to create.\s
                    policyName - The name of the policy to create.\s
                    roleName - The name of the role to create.\s
                    roleSessionName - The name of the session required for the assumeRole operation.\s
                    bucketName - The name of the Amazon S3 bucket from which objects are read.\s
                """;

        if (args.length != 5) {
            System.out.println(usage);
            System.exit(1);
        }

        String userName = args[0];
        String policyName = args[1];
        String roleName = args[2];
        String roleSessionName = args[3];
        String bucketName = args[4];

        Region region = Region.AWS_GLOBAL;
        IamClient iam = IamClient.builder()
                .region(region)
                .build();

        System.out.println(DASHES);
        System.out.println("Welcome to the AWS IAM example scenario.");
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println(" 1. Create the IAM user.");
        User createUser = createIAMUser(iam, userName);

        System.out.println(DASHES);
        userArn = createUser.arn();

        AccessKey myKey = createIAMAccessKey(iam, userName);
        String accessKey = myKey.accessKeyId();
        String secretKey = myKey.secretAccessKey();
        String assumeRolePolicyDocument = "{" +
                "\"Version\": \"2012-10-17\"," +
                "\"Statement\": [{" +
                "\"Effect\": \"Allow\"," +
                "\"Principal\": {" +
                "	\"AWS\": \"" + userArn + "\"" +
                "}," +
                "\"Action\": \"sts:AssumeRole\"" +
                "}]" +
                "}";

        System.out.println(assumeRolePolicyDocument);
        System.out.println(userName + " was successfully created.");
        System.out.println(DASHES);
        System.out.println("2. Creates a policy.");
        String polArn = createIAMPolicy(iam, policyName);
        System.out.println("The policy " + polArn + " was successfully created.");
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("3. Creates a role.");
        TimeUnit.SECONDS.sleep(30);
        String roleArn = createIAMRole(iam, roleName, assumeRolePolicyDocument);
        System.out.println(roleArn + " was successfully created.");
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("4. Grants the user permissions.");
        attachIAMRolePolicy(iam, roleName, polArn);
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("*** Wait for 30 secs so the resource is available");
        TimeUnit.SECONDS.sleep(30);
        System.out.println("5. Gets temporary credentials by assuming the role.");
        System.out.println("Perform an Amazon S3 Service operation using the temporary credentials.");
        assumeRole(roleArn, roleSessionName, bucketName, accessKey, secretKey);
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("6 Getting ready to delete the AWS resources");
        deleteKey(iam, userName, accessKey);
        deleteRole(iam, roleName, polArn);
        deleteIAMUser(iam, userName);
        System.out.println(DASHES);

        System.out.println(DASHES);
        System.out.println("This IAM Scenario has successfully completed");
        System.out.println(DASHES);
    }

    public static AccessKey createIAMAccessKey(IamClient iam, String user) {
        try {
            CreateAccessKeyRequest request = CreateAccessKeyRequest.builder()
                    .userName(user)
                    .build();

            CreateAccessKeyResponse response = iam.createAccessKey(request);
            return response.accessKey();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return null;
    }

    public static User createIAMUser(IamClient iam, String username) {
        try {
            // Create an IamWaiter object
            IamWaiter iamWaiter = iam.waiter();
            CreateUserRequest request = CreateUserRequest.builder()
                    .userName(username)
                    .build();

            // Wait until the user is created.
            CreateUserResponse response = iam.createUser(request);
            GetUserRequest userRequest = GetUserRequest.builder()
                    .userName(response.user().userName())
                    .build();

            WaiterResponse<GetUserResponse> waitUntilUserExists = iamWaiter.waitUntilUserExists(userRequest);
            waitUntilUserExists.matched().response().ifPresent(System.out::println);
            return response.user();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return null;
    }

    public static String createIAMRole(IamClient iam, String rolename, String json) {

        try {
            CreateRoleRequest request = CreateRoleRequest.builder()
                    .roleName(rolename)
                    .assumeRolePolicyDocument(json)
                    .description("Created using the AWS SDK for Java")
                    .build();

            CreateRoleResponse response = iam.createRole(request);
            System.out.println("The ARN of the role is " + response.role().arn());
            return response.role().arn();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }

    public static String createIAMPolicy(IamClient iam, String policyName) {
        try {
            // Create an IamWaiter object.
            IamWaiter iamWaiter = iam.waiter();
            CreatePolicyRequest request = CreatePolicyRequest.builder()
                    .policyName(policyName)
                    .policyDocument(PolicyDocument).build();

            CreatePolicyResponse response = iam.createPolicy(request);
            GetPolicyRequest polRequest = GetPolicyRequest.builder()
                    .policyArn(response.policy().arn())
                    .build();

            WaiterResponse<GetPolicyResponse> waitUntilPolicyExists = iamWaiter.waitUntilPolicyExists(polRequest);
            waitUntilPolicyExists.matched().response().ifPresent(System.out::println);
            return response.policy().arn();

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
        return "";
    }

    public static void attachIAMRolePolicy(IamClient iam, String roleName, String policyArn) {
        try {
            ListAttachedRolePoliciesRequest request = ListAttachedRolePoliciesRequest.builder()
                    .roleName(roleName)
                    .build();

            ListAttachedRolePoliciesResponse response = iam.listAttachedRolePolicies(request);
            List<AttachedPolicy> attachedPolicies = response.attachedPolicies();
            String polArn;
            for (AttachedPolicy policy : attachedPolicies) {
                polArn = policy.policyArn();
                if (polArn.compareTo(policyArn) == 0) {
                    System.out.println(roleName + " policy is already attached to this role.");
                    return;
                }
            }

            AttachRolePolicyRequest attachRequest = AttachRolePolicyRequest.builder()
                    .roleName(roleName)
                    .policyArn(policyArn)
                    .build();

            iam.attachRolePolicy(attachRequest);
            System.out.println("Successfully attached policy " + policyArn + " to role " + roleName);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }

    // Invoke an Amazon S3 operation using the Assumed Role.
    public static void assumeRole(String roleArn, String roleSessionName, String bucketName, String keyVal,
            String keySecret) {

        // Use the creds of the new IAM user that was created in this code example.
        AwsBasicCredentials credentials = AwsBasicCredentials.create(keyVal, keySecret);
        StsClient stsClient = StsClient.builder()
                .region(Region.US_EAST_1)
                .credentialsProvider(StaticCredentialsProvider.create(credentials))
                .build();

        try {
            AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                    .roleArn(roleArn)
                    .roleSessionName(roleSessionName)
                    .build();

            AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
            Credentials myCreds = roleResponse.credentials();
            String key = myCreds.accessKeyId();
            String secKey = myCreds.secretAccessKey();
            String secToken = myCreds.sessionToken();

            // List all objects in an Amazon S3 bucket using the temp creds retrieved by
            // invoking assumeRole.
            Region region = Region.US_EAST_1;
            S3Client s3 = S3Client.builder()
                    .credentialsProvider(
                            StaticCredentialsProvider.create(AwsSessionCredentials.create(key, secKey, secToken)))
                    .region(region)
                    .build();

            System.out.println("Created a S3Client using temp credentials.");
            System.out.println("Listing objects in " + bucketName);
            ListObjectsRequest listObjects = ListObjectsRequest.builder()
                    .bucket(bucketName)
                    .build();

            ListObjectsResponse res = s3.listObjects(listObjects);
            List<S3Object> objects = res.contents();
            for (S3Object myValue : objects) {
                System.out.println("The name of the key is " + myValue.key());
                System.out.println("The owner is " + myValue.owner());
            }

        } catch (StsException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }

    public static void deleteRole(IamClient iam, String roleName, String polArn) {

        try {
            // First the policy needs to be detached.
            DetachRolePolicyRequest rolePolicyRequest = DetachRolePolicyRequest.builder()
                    .policyArn(polArn)
                    .roleName(roleName)
                    .build();

            iam.detachRolePolicy(rolePolicyRequest);

            // Delete the policy.
            DeletePolicyRequest request = DeletePolicyRequest.builder()
                    .policyArn(polArn)
                    .build();

            iam.deletePolicy(request);
            System.out.println("*** Successfully deleted " + polArn);

            // Delete the role.
            DeleteRoleRequest roleRequest = DeleteRoleRequest.builder()
                    .roleName(roleName)
                    .build();

            iam.deleteRole(roleRequest);
            System.out.println("*** Successfully deleted " + roleName);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }

    public static void deleteKey(IamClient iam, String username, String accessKey) {
        try {
            DeleteAccessKeyRequest request = DeleteAccessKeyRequest.builder()
                    .accessKeyId(accessKey)
                    .userName(username)
                    .build();

            iam.deleteAccessKey(request);
            System.out.println("Successfully deleted access key " + accessKey +
                    " from user " + username);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }

    public static void deleteIAMUser(IamClient iam, String userName) {
        try {
            DeleteUserRequest request = DeleteUserRequest.builder()
                    .userName(userName)
                    .build();

            iam.deleteUser(request);
            System.out.println("*** Successfully deleted " + userName);

        } catch (IamException e) {
            System.err.println(e.awsErrorDetails().errorMessage());
            System.exit(1);
        }
    }
}
```
+ 如需 API 詳細資訊，請參閱《*AWS SDK for Java 2.x API 參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForJavaV2/iam-2010-05-08/PutUserPolicy)

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/iam#code-examples)中設定和執行。
建立一個可授予許可的 IAM 使用者和角色，以列出 Amazon S3 儲存貯體。使用者只有擔任該角色的權利。擔任角色後，請使用暫時性憑證列出該帳戶的儲存貯體。  

```
import {
  CreateUserCommand,
  GetUserCommand,
  CreateAccessKeyCommand,
  CreatePolicyCommand,
  CreateRoleCommand,
  AttachRolePolicyCommand,
  DeleteAccessKeyCommand,
  DeleteUserCommand,
  DeleteRoleCommand,
  DeletePolicyCommand,
  DetachRolePolicyCommand,
  IAMClient,
} from "@aws-sdk/client-iam";
import { ListBucketsCommand, S3Client } from "@aws-sdk/client-s3";
import { AssumeRoleCommand, STSClient } from "@aws-sdk/client-sts";
import { retry } from "@aws-doc-sdk-examples/lib/utils/util-timers.js";
import { ScenarioInput } from "@aws-doc-sdk-examples/lib/scenario/index.js";

// Set the parameters.
const iamClient = new IAMClient({});
const userName = "iam_basic_test_username";
const policyName = "iam_basic_test_policy";
const roleName = "iam_basic_test_role";

/**
 * Create a new IAM user. If the user already exists, give
 * the option to delete and re-create it.
 * @param {string} name
 */
export const createUser = async (name, confirmAll = false) => {
  try {
    const { User } = await iamClient.send(
      new GetUserCommand({ UserName: name }),
    );
    const input = new ScenarioInput(
      "deleteUser",
      "Do you want to delete and remake this user?",
      { type: "confirm" },
    );
    const deleteUser = await input.handle({}, { confirmAll });
    // If the user exists, and you want to delete it, delete the user
    // and then create it again.
    if (deleteUser) {
      await iamClient.send(new DeleteUserCommand({ UserName: User.UserName }));
      await iamClient.send(new CreateUserCommand({ UserName: name }));
    } else {
      console.warn(
        `${name} already exists. The scenario may not work as expected.`,
      );
      return User;
    }
  } catch (caught) {
    // If there is no user by that name, create one.
    if (caught instanceof Error && caught.name === "NoSuchEntityException") {
      const { User } = await iamClient.send(
        new CreateUserCommand({ UserName: name }),
      );
      return User;
    }
    throw caught;
  }
};

export const main = async (confirmAll = false) => {
  // Create a user. The user has no permissions by default.
  const User = await createUser(userName, confirmAll);

  if (!User) {
    throw new Error("User not created");
  }

  // Create an access key. This key is used to authenticate the new user to
  // Amazon Simple Storage Service (Amazon S3) and AWS Security Token Service (AWS STS).
  // It's not best practice to use access keys. For more information, see https://aws.amazon.com/iam/resources/best-practices/.
  const createAccessKeyResponse = await iamClient.send(
    new CreateAccessKeyCommand({ UserName: userName }),
  );

  if (
    !createAccessKeyResponse.AccessKey?.AccessKeyId ||
    !createAccessKeyResponse.AccessKey?.SecretAccessKey
  ) {
    throw new Error("Access key not created");
  }

  const {
    AccessKey: { AccessKeyId, SecretAccessKey },
  } = createAccessKeyResponse;

  let s3Client = new S3Client({
    credentials: {
      accessKeyId: AccessKeyId,
      secretAccessKey: SecretAccessKey,
    },
  });

  // Retry the list buckets operation until it succeeds. InvalidAccessKeyId is
  // thrown while the user and access keys are still stabilizing.
  await retry({ intervalInMs: 1000, maxRetries: 300 }, async () => {
    try {
      return await listBuckets(s3Client);
    } catch (err) {
      if (err instanceof Error && err.name === "InvalidAccessKeyId") {
        throw err;
      }
    }
  });

  // Retry the create role operation until it succeeds. A MalformedPolicyDocument error
  // is thrown while the user and access keys are still stabilizing.
  const { Role } = await retry(
    {
      intervalInMs: 2000,
      maxRetries: 60,
    },
    () =>
      iamClient.send(
        new CreateRoleCommand({
          AssumeRolePolicyDocument: JSON.stringify({
            Version: "2012-10-17",
            Statement: [
              {
                Effect: "Allow",
                Principal: {
                  // Allow the previously created user to assume this role.
                  AWS: User.Arn,
                },
                Action: "sts:AssumeRole",
              },
            ],
          }),
          RoleName: roleName,
        }),
      ),
  );

  if (!Role) {
    throw new Error("Role not created");
  }

  // Create a policy that allows the user to list S3 buckets.
  const { Policy: listBucketPolicy } = await iamClient.send(
    new CreatePolicyCommand({
      PolicyDocument: JSON.stringify({
        Version: "2012-10-17",
        Statement: [
          {
            Effect: "Allow",
            Action: ["s3:ListAllMyBuckets"],
            Resource: "*",
          },
        ],
      }),
      PolicyName: policyName,
    }),
  );

  if (!listBucketPolicy) {
    throw new Error("Policy not created");
  }

  // Attach the policy granting the 's3:ListAllMyBuckets' action to the role.
  await iamClient.send(
    new AttachRolePolicyCommand({
      PolicyArn: listBucketPolicy.Arn,
      RoleName: Role.RoleName,
    }),
  );

  // Assume the role.
  const stsClient = new STSClient({
    credentials: {
      accessKeyId: AccessKeyId,
      secretAccessKey: SecretAccessKey,
    },
  });

  // Retry the assume role operation until it succeeds.
  const { Credentials } = await retry(
    { intervalInMs: 2000, maxRetries: 60 },
    () =>
      stsClient.send(
        new AssumeRoleCommand({
          RoleArn: Role.Arn,
          RoleSessionName: `iamBasicScenarioSession-${Math.floor(
            Math.random() * 1000000,
          )}`,
          DurationSeconds: 900,
        }),
      ),
  );

  if (!Credentials?.AccessKeyId || !Credentials?.SecretAccessKey) {
    throw new Error("Credentials not created");
  }

  s3Client = new S3Client({
    credentials: {
      accessKeyId: Credentials.AccessKeyId,
      secretAccessKey: Credentials.SecretAccessKey,
      sessionToken: Credentials.SessionToken,
    },
  });

  // List the S3 buckets again.
  // Retry the list buckets operation until it succeeds. AccessDenied might
  // be thrown while the role policy is still stabilizing.
  await retry({ intervalInMs: 2000, maxRetries: 120 }, () =>
    listBuckets(s3Client),
  );

  // Clean up.
  await iamClient.send(
    new DetachRolePolicyCommand({
      PolicyArn: listBucketPolicy.Arn,
      RoleName: Role.RoleName,
    }),
  );

  await iamClient.send(
    new DeletePolicyCommand({
      PolicyArn: listBucketPolicy.Arn,
    }),
  );

  await iamClient.send(
    new DeleteRoleCommand({
      RoleName: Role.RoleName,
    }),
  );

  await iamClient.send(
    new DeleteAccessKeyCommand({
      UserName: userName,
      AccessKeyId,
    }),
  );

  await iamClient.send(
    new DeleteUserCommand({
      UserName: userName,
    }),
  );
};

/**
 *
 * @param {S3Client} s3Client
 */
const listBuckets = async (s3Client) => {
  const { Buckets } = await s3Client.send(new ListBucketsCommand({}));

  if (!Buckets) {
    throw new Error("Buckets not listed");
  }

  console.log(Buckets.map((bucket) => bucket.Name).join("\n"));
};
```
+ 如需 API 詳細資訊，請參閱《*適用於 JavaScript 的 AWS SDK API 參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/AttachRolePolicyCommand)
  + [CreateAccessKey](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreateAccessKeyCommand)
  + [CreatePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreatePolicyCommand)
  + [CreateRole](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreateRoleCommand)
  + [CreateUser](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/CreateUserCommand)
  + [DeleteAccessKey](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteAccessKeyCommand)
  + [DeletePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeletePolicyCommand)
  + [DeleteRole](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteRoleCommand)
  + [DeleteUser](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteUserCommand)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DeleteUserPolicyCommand)
  + [DetachRolePolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/DetachRolePolicyCommand)
  + [PutUserPolicy](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/iam/command/PutUserPolicyCommand)

------
#### [ Kotlin ]

**SDK for Kotlin**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/kotlin/services/iam#code-examples)中設定和執行。
建立可包裝 IAM 使用者動作的函數。  

```
suspend fun main(args: Array<String>) {
    val usage = """
    Usage:
        <username> <policyName> <roleName> <roleSessionName> <fileLocation> <bucketName> 

    Where:
        username - The name of the IAM user to create. 
        policyName - The name of the policy to create. 
        roleName - The name of the role to create. 
        roleSessionName - The name of the session required for the assumeRole operation. 
        fileLocation - The file location to the JSON required to create the role (see Readme). 
        bucketName - The name of the Amazon S3 bucket from which objects are read. 
    """

    if (args.size != 6) {
        println(usage)
        exitProcess(1)
    }

    val userName = args[0]
    val policyName = args[1]
    val roleName = args[2]
    val roleSessionName = args[3]
    val fileLocation = args[4]
    val bucketName = args[5]

    createUser(userName)
    println("$userName was successfully created.")

    val polArn = createPolicy(policyName)
    println("The policy $polArn was successfully created.")

    val roleArn = createRole(roleName, fileLocation)
    println("$roleArn was successfully created.")
    attachRolePolicy(roleName, polArn)

    println("*** Wait for 1 MIN so the resource is available.")
    delay(60000)
    assumeGivenRole(roleArn, roleSessionName, bucketName)

    println("*** Getting ready to delete the AWS resources.")
    deleteRole(roleName, polArn)
    deleteUser(userName)
    println("This IAM Scenario has successfully completed.")
}

suspend fun createUser(usernameVal: String?): String? {
    val request =
        CreateUserRequest {
            userName = usernameVal
        }

    IamClient { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.createUser(request)
        return response.user?.userName
    }
}

suspend fun createPolicy(policyNameVal: String?): String {
    val policyDocumentValue = """
    {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:*"
                ],
                "Resource": "*"
            }
        ]
    }
    """.trimIndent()

    val request =
        CreatePolicyRequest {
            policyName = policyNameVal
            policyDocument = policyDocumentValue
        }

    IamClient.fromEnvironment { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.createPolicy(request)
        return response.policy?.arn.toString()
    }
}

suspend fun createRole(
    rolenameVal: String?,
    fileLocation: String?,
): String? {
    val jsonObject = fileLocation?.let { readJsonSimpleDemo(it) } as JSONObject

    val request =
        CreateRoleRequest {
            roleName = rolenameVal
            assumeRolePolicyDocument = jsonObject.toJSONString()
            description = "Created using the AWS SDK for Kotlin"
        }

    IamClient { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.createRole(request)
        return response.role?.arn
    }
}

suspend fun attachRolePolicy(
    roleNameVal: String,
    policyArnVal: String,
) {
    val request =
        ListAttachedRolePoliciesRequest {
            roleName = roleNameVal
        }

    IamClient.fromEnvironment { region = "AWS_GLOBAL" }.use { iamClient ->
        val response = iamClient.listAttachedRolePolicies(request)
        val attachedPolicies = response.attachedPolicies

        // Ensure that the policy is not attached to this role.
        val checkStatus: Int
        if (attachedPolicies != null) {
            checkStatus = checkMyList(attachedPolicies, policyArnVal)
            if (checkStatus == -1) {
                return
            }
        }

        val policyRequest =
            AttachRolePolicyRequest {
                roleName = roleNameVal
                policyArn = policyArnVal
            }
        iamClient.attachRolePolicy(policyRequest)
        println("Successfully attached policy $policyArnVal to role $roleNameVal")
    }
}

fun checkMyList(
    attachedPolicies: List<AttachedPolicy>,
    policyArnVal: String,
): Int {
    for (policy in attachedPolicies) {
        val polArn = policy.policyArn.toString()

        if (polArn.compareTo(policyArnVal) == 0) {
            println("The policy is already attached to this role.")
            return -1
        }
    }
    return 0
}

suspend fun assumeGivenRole(
    roleArnVal: String?,
    roleSessionNameVal: String?,
    bucketName: String,
) {
    val stsClient = StsClient.fromEnvironment { region = "us-east-1" }
    val roleRequest =
        AssumeRoleRequest {
            roleArn = roleArnVal
            roleSessionName = roleSessionNameVal
        }

    val roleResponse = stsClient.assumeRole(roleRequest)
    val myCreds = roleResponse.credentials
    val key = myCreds?.accessKeyId
    val secKey = myCreds?.secretAccessKey
    val secToken = myCreds?.sessionToken

    val staticCredentials = StaticCredentialsProvider {
        accessKeyId = key
        secretAccessKey = secKey
        sessionToken = secToken
    }

    // List all objects in an Amazon S3 bucket using the temp creds.
    val s3 = S3Client.fromEnvironment {
        region = "us-east-1"
        credentialsProvider = staticCredentials
    }

    println("Created a S3Client using temp credentials.")
    println("Listing objects in $bucketName")

    val listObjects =
        ListObjectsRequest {
            bucket = bucketName
        }

    val response = s3.listObjects(listObjects)
    response.contents?.forEach { myObject ->
        println("The name of the key is ${myObject.key}")
        println("The owner is ${myObject.owner}")
    }
}

suspend fun deleteRole(
    roleNameVal: String,
    polArn: String,
) {
    val iam = IamClient.fromEnvironment { region = "AWS_GLOBAL" }

    // First the policy needs to be detached.
    val rolePolicyRequest =
        DetachRolePolicyRequest {
            policyArn = polArn
            roleName = roleNameVal
        }

    iam.detachRolePolicy(rolePolicyRequest)

    // Delete the policy.
    val request =
        DeletePolicyRequest {
            policyArn = polArn
        }

    iam.deletePolicy(request)
    println("*** Successfully deleted $polArn")

    // Delete the role.
    val roleRequest =
        DeleteRoleRequest {
            roleName = roleNameVal
        }

    iam.deleteRole(roleRequest)
    println("*** Successfully deleted $roleNameVal")
}

suspend fun deleteUser(userNameVal: String) {
    val iam = IamClient.fromEnvironment { region = "AWS_GLOBAL" }
    val request =
        DeleteUserRequest {
            userName = userNameVal
        }

    iam.deleteUser(request)
    println("*** Successfully deleted $userNameVal")
}

@Throws(java.lang.Exception::class)
fun readJsonSimpleDemo(filename: String): Any? {
    val reader = FileReader(filename)
    val jsonParser = JSONParser()
    return jsonParser.parse(reader)
}
```
+ 如需 API 詳細資訊，請參閱 *AWS SDK for Kotlin API reference* 中的下列主題。
  + [AttachRolePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreateAccessKey](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreatePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreateRole](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [CreateUser](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteAccessKey](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeletePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteRole](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteUser](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DeleteUserPolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [DetachRolePolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)
  + [PutUserPolicy](https://sdk.amazonaws.com/kotlin/api/latest/index.html)

------
#### [ PHP ]

**SDK for PHP**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code/iam#code-examples)中設定和執行。

```
namespace Iam\Basics;

require 'vendor/autoload.php';

use Aws\Credentials\Credentials;
use Aws\S3\Exception\S3Exception;
use Aws\S3\S3Client;
use Aws\Sts\StsClient;
use Iam\IAMService;

echo("\n");
echo("--------------------------------------\n");
print("Welcome to the IAM getting started demo using PHP!\n");
echo("--------------------------------------\n");

$uuid = uniqid();
$service = new IAMService();

$user = $service->createUser("iam_demo_user_$uuid");
echo "Created user with the arn: {$user['Arn']}\n";

$key = $service->createAccessKey($user['UserName']);
$assumeRolePolicyDocument = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Principal\": {\"AWS\": \"{$user['Arn']}\"},
                    \"Action\": \"sts:AssumeRole\"
                }]
            }";
$assumeRoleRole = $service->createRole("iam_demo_role_$uuid", $assumeRolePolicyDocument);
echo "Created role: {$assumeRoleRole['RoleName']}\n";

$listAllBucketsPolicyDocument = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"s3:ListAllMyBuckets\",
                    \"Resource\": \"arn:aws:s3:::*\"}]
}";
$listAllBucketsPolicy = $service->createPolicy("iam_demo_policy_$uuid", $listAllBucketsPolicyDocument);
echo "Created policy: {$listAllBucketsPolicy['PolicyName']}\n";

$service->attachRolePolicy($assumeRoleRole['RoleName'], $listAllBucketsPolicy['Arn']);

$inlinePolicyDocument = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"sts:AssumeRole\",
                    \"Resource\": \"{$assumeRoleRole['Arn']}\"}]
}";
$inlinePolicy = $service->createUserPolicy("iam_demo_inline_policy_$uuid", $inlinePolicyDocument, $user['UserName']);
//First, fail to list the buckets with the user
$credentials = new Credentials($key['AccessKeyId'], $key['SecretAccessKey']);
$s3Client = new S3Client(['region' => 'us-west-2', 'version' => 'latest', 'credentials' => $credentials]);
try {
    $s3Client->listBuckets([
    ]);
    echo "this should not run";
} catch (S3Exception $exception) {
    echo "successfully failed!\n";
}

$stsClient = new StsClient(['region' => 'us-west-2', 'version' => 'latest', 'credentials' => $credentials]);
sleep(10);
$assumedRole = $stsClient->assumeRole([
    'RoleArn' => $assumeRoleRole['Arn'],
    'RoleSessionName' => "DemoAssumeRoleSession_$uuid",
]);
$assumedCredentials = [
    'key' => $assumedRole['Credentials']['AccessKeyId'],
    'secret' => $assumedRole['Credentials']['SecretAccessKey'],
    'token' => $assumedRole['Credentials']['SessionToken'],
];
$s3Client = new S3Client(['region' => 'us-west-2', 'version' => 'latest', 'credentials' => $assumedCredentials]);
try {
    $s3Client->listBuckets([]);
    echo "this should now run!\n";
} catch (S3Exception $exception) {
    echo "this should now not fail\n";
}

$service->detachRolePolicy($assumeRoleRole['RoleName'], $listAllBucketsPolicy['Arn']);
$deletePolicy = $service->deletePolicy($listAllBucketsPolicy['Arn']);
echo "Delete policy: {$listAllBucketsPolicy['PolicyName']}\n";
$deletedRole = $service->deleteRole($assumeRoleRole['Arn']);
echo "Deleted role: {$assumeRoleRole['RoleName']}\n";
$deletedKey = $service->deleteAccessKey($key['AccessKeyId'], $user['UserName']);
$deletedUser = $service->deleteUser($user['UserName']);
echo "Delete user: {$user['UserName']}\n";
```
+ 如需 API 詳細資訊，請參閱《*適用於 PHP 的 AWS SDK API 參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForPHPV3/iam-2010-05-08/PutUserPolicy)

------
#### [ Python ]

**SDK for Python (Boto3)**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/iam#code-examples)中設定和執行。
建立一個可授予許可的 IAM 使用者和角色，以列出 Amazon S3 儲存貯體。使用者只有擔任該角色的權利。擔任角色後，請使用暫時性憑證列出該帳戶的儲存貯體。  

```
import json
import sys
import time
from uuid import uuid4

import boto3
from botocore.exceptions import ClientError


def progress_bar(seconds):
    """Shows a simple progress bar in the command window."""
    for _ in range(seconds):
        time.sleep(1)
        print(".", end="")
        sys.stdout.flush()
    print()


def setup(iam_resource):
    """
    Creates a new user with no permissions.
    Creates an access key pair for the user.
    Creates a role with a policy that lets the user assume the role.
    Creates a policy that allows listing Amazon S3 buckets.
    Attaches the policy to the role.
    Creates an inline policy for the user that lets the user assume the role.

    :param iam_resource: A Boto3 AWS Identity and Access Management (IAM) resource
                         that has permissions to create users, roles, and policies
                         in the account.
    :return: The newly created user, user key, and role.
    """
    try:
        user = iam_resource.create_user(UserName=f"demo-user-{uuid4()}")
        print(f"Created user {user.name}.")
    except ClientError as error:
        print(
            f"Couldn't create a user for the demo. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        user_key = user.create_access_key_pair()
        print(f"Created access key pair for user.")
    except ClientError as error:
        print(
            f"Couldn't create access keys for user {user.name}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    print(f"Wait for user to be ready.", end="")
    progress_bar(10)

    try:
        role = iam_resource.create_role(
            RoleName=f"demo-role-{uuid4()}",
            AssumeRolePolicyDocument=json.dumps(
                {
                    "Version":"2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {"AWS": user.arn},
                            "Action": "sts:AssumeRole",
                        }
                    ],
                }
            ),
        )
        print(f"Created role {role.name}.")
    except ClientError as error:
        print(
            f"Couldn't create a role for the demo. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        policy = iam_resource.create_policy(
            PolicyName=f"demo-policy-{uuid4()}",
            PolicyDocument=json.dumps(
                {
                    "Version":"2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Action": "s3:ListAllMyBuckets",
                            "Resource": "arn:aws:s3:::*",
                        }
                    ],
                }
            ),
        )
        role.attach_policy(PolicyArn=policy.arn)
        print(f"Created policy {policy.policy_name} and attached it to the role.")
    except ClientError as error:
        print(
            f"Couldn't create a policy and attach it to role {role.name}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        user.create_policy(
            PolicyName=f"demo-user-policy-{uuid4()}",
            PolicyDocument=json.dumps(
                {
                    "Version":"2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Action": "sts:AssumeRole",
                            "Resource": role.arn,
                        }
                    ],
                }
            ),
        )
        print(
            f"Created an inline policy for {user.name} that lets the user assume "
            f"the role."
        )
    except ClientError as error:
        print(
            f"Couldn't create an inline policy for user {user.name}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    print("Give AWS time to propagate these new resources and connections.", end="")
    progress_bar(10)

    return user, user_key, role


def show_access_denied_without_role(user_key):
    """
    Shows that listing buckets without first assuming the role is not allowed.

    :param user_key: The key of the user created during setup. This user does not
                     have permission to list buckets in the account.
    """
    print(f"Try to list buckets without first assuming the role.")
    s3_denied_resource = boto3.resource(
        "s3", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret
    )
    try:
        for bucket in s3_denied_resource.buckets.all():
            print(bucket.name)
        raise RuntimeError("Expected to get AccessDenied error when listing buckets!")
    except ClientError as error:
        if error.response["Error"]["Code"] == "AccessDenied":
            print("Attempt to list buckets with no permissions: AccessDenied.")
        else:
            raise


def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name):
    """
    Assumes a role that grants permission to list the Amazon S3 buckets in the account.
    Uses the temporary credentials from the role to list the buckets that are owned
    by the assumed role's account.

    :param user_key: The access key of a user that has permission to assume the role.
    :param assume_role_arn: The Amazon Resource Name (ARN) of the role that
                            grants access to list the other account's buckets.
    :param session_name: The name of the STS session.
    """
    sts_client = boto3.client(
        "sts", aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret
    )
    try:
        response = sts_client.assume_role(
            RoleArn=assume_role_arn, RoleSessionName=session_name
        )
        temp_credentials = response["Credentials"]
        print(f"Assumed role {assume_role_arn} and got temporary credentials.")
    except ClientError as error:
        print(
            f"Couldn't assume role {assume_role_arn}. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    # Create an S3 resource that can access the account with the temporary credentials.
    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )
    print(f"Listing buckets for the assumed role's account:")
    try:
        for bucket in s3_resource.buckets.all():
            print(bucket.name)
    except ClientError as error:
        print(
            f"Couldn't list buckets for the account. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise




def teardown(user, role):
    """
    Removes all resources created during setup.

    :param user: The demo user.
    :param role: The demo role.
    """
    try:
        for attached in role.attached_policies.all():
            policy_name = attached.policy_name
            role.detach_policy(PolicyArn=attached.arn)
            attached.delete()
            print(f"Detached and deleted {policy_name}.")
        role.delete()
        print(f"Deleted {role.name}.")
    except ClientError as error:
        print(
            "Couldn't detach policy, delete policy, or delete role. Here's why: "
            f"{error.response['Error']['Message']}"
        )
        raise

    try:
        for user_pol in user.policies.all():
            user_pol.delete()
            print("Deleted inline user policy.")
        for key in user.access_keys.all():
            key.delete()
            print("Deleted user's access key.")
        user.delete()
        print(f"Deleted {user.name}.")
    except ClientError as error:
        print(
            "Couldn't delete user policy or delete user. Here's why: "
            f"{error.response['Error']['Message']}"
        )


def usage_demo():
    """Drives the demonstration."""
    print("-" * 88)
    print(f"Welcome to the IAM create user and assume role demo.")
    print("-" * 88)
    iam_resource = boto3.resource("iam")
    user = None
    role = None
    try:
        user, user_key, role = setup(iam_resource)
        print(f"Created {user.name} and {role.name}.")
        show_access_denied_without_role(user_key)
        list_buckets_from_assumed_role(user_key, role.arn, "AssumeRoleDemoSession")
    except Exception:
        print("Something went wrong!")
    finally:
        if user is not None and role is not None:
            teardown(user, role)
        print("Thanks for watching!")


if __name__ == "__main__":
    usage_demo()
```
+ 如需 API 的詳細資訊，請參閱 *AWS SDK for Python (Boto3) API Reference* 中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/boto3/iam-2010-05-08/PutUserPolicy)

------
#### [ Ruby ]

**SDK for Ruby**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/iam#code-examples)中設定和執行。
建立一個可授予許可的 IAM 使用者和角色，以列出 Amazon S3 儲存貯體。使用者只有擔任該角色的權利。擔任角色後，請使用暫時性憑證列出該帳戶的儲存貯體。  

```
# Wraps the scenario actions.
class ScenarioCreateUserAssumeRole
  attr_reader :iam_client

  # @param [Aws::IAM::Client] iam_client: The AWS IAM client.
  def initialize(iam_client, logger: Logger.new($stdout))
    @iam_client = iam_client
    @logger = logger
  end

  # Waits for the specified number of seconds.
  #
  # @param duration [Integer] The number of seconds to wait.
  def wait(duration)
    puts('Give AWS time to propagate resources...')
    sleep(duration)
  end

  # Creates a user.
  #
  # @param user_name [String] The name to give the user.
  # @return [Aws::IAM::User] The newly created user.
  def create_user(user_name)
    user = @iam_client.create_user(user_name: user_name).user
    @logger.info("Created demo user named #{user.user_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info('Tried and failed to create demo user.')
    @logger.info("\t#{e.code}: #{e.message}")
    @logger.info("\nCan't continue the demo without a user!")
    raise
  else
    user
  end

  # Creates an access key for a user.
  #
  # @param user [Aws::IAM::User] The user that owns the key.
  # @return [Aws::IAM::AccessKeyPair] The newly created access key.
  def create_access_key_pair(user)
    user_key = @iam_client.create_access_key(user_name: user.user_name).access_key
    @logger.info("Created accesskey pair for user #{user.user_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create access keys for user #{user.user_name}.")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  else
    user_key
  end

  # Creates a role that can be assumed by a user.
  #
  # @param role_name [String] The name to give the role.
  # @param user [Aws::IAM::User] The user who is granted permission to assume the role.
  # @return [Aws::IAM::Role] The newly created role.
  def create_role(role_name, user)
    trust_policy = {
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Principal: { 'AWS': user.arn },
        Action: 'sts:AssumeRole'
      }]
    }.to_json
    role = @iam_client.create_role(
      role_name: role_name,
      assume_role_policy_document: trust_policy
    ).role
    @logger.info("Created role #{role.role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create a role for the demo. Here's why: ")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  else
    role
  end

  # Creates a policy that grants permission to list S3 buckets in the account, and
  # then attaches the policy to a role.
  #
  # @param policy_name [String] The name to give the policy.
  # @param role [Aws::IAM::Role] The role that the policy is attached to.
  # @return [Aws::IAM::Policy] The newly created policy.
  def create_and_attach_role_policy(policy_name, role)
    policy_document = {
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Action: 's3:ListAllMyBuckets',
        Resource: 'arn:aws:s3:::*'
      }]
    }.to_json
    policy = @iam_client.create_policy(
      policy_name: policy_name,
      policy_document: policy_document
    ).policy
    @iam_client.attach_role_policy(
      role_name: role.role_name,
      policy_arn: policy.arn
    )
    @logger.info("Created policy #{policy.policy_name} and attached it to role #{role.role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create a policy and attach it to role #{role.role_name}. Here's why: ")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  end

  # Creates an inline policy for a user that lets the user assume a role.
  #
  # @param policy_name [String] The name to give the policy.
  # @param user [Aws::IAM::User] The user that owns the policy.
  # @param role [Aws::IAM::Role] The role that can be assumed.
  # @return [Aws::IAM::UserPolicy] The newly created policy.
  def create_user_policy(policy_name, user, role)
    policy_document = {
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Action: 'sts:AssumeRole',
        Resource: role.arn
      }]
    }.to_json
    @iam_client.put_user_policy(
      user_name: user.user_name,
      policy_name: policy_name,
      policy_document: policy_document
    )
    puts("Created an inline policy for #{user.user_name} that lets the user assume role #{role.role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't create an inline policy for user #{user.user_name}. Here's why: ")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  end

  # Creates an Amazon S3 resource with specified credentials. This is separated into a
  # factory function so that it can be mocked for unit testing.
  #
  # @param credentials [Aws::Credentials] The credentials used by the Amazon S3 resource.
  def create_s3_resource(credentials)
    Aws::S3::Resource.new(client: Aws::S3::Client.new(credentials: credentials))
  end

  # Lists the S3 buckets for the account, using the specified Amazon S3 resource.
  # Because the resource uses credentials with limited access, it may not be able to
  # list the S3 buckets.
  #
  # @param s3_resource [Aws::S3::Resource] An Amazon S3 resource.
  def list_buckets(s3_resource)
    count = 10
    s3_resource.buckets.each do |bucket|
      @logger.info "\t#{bucket.name}"
      count -= 1
      break if count.zero?
    end
  rescue Aws::Errors::ServiceError => e
    if e.code == 'AccessDenied'
      puts('Attempt to list buckets with no permissions: AccessDenied.')
    else
      @logger.info("Couldn't list buckets for the account. Here's why: ")
      @logger.info("\t#{e.code}: #{e.message}")
      raise
    end
  end

  # Creates an AWS Security Token Service (AWS STS) client with specified credentials.
  # This is separated into a factory function so that it can be mocked for unit testing.
  #
  # @param key_id [String] The ID of the access key used by the STS client.
  # @param key_secret [String] The secret part of the access key used by the STS client.
  def create_sts_client(key_id, key_secret)
    Aws::STS::Client.new(access_key_id: key_id, secret_access_key: key_secret)
  end

  # Gets temporary credentials that can be used to assume a role.
  #
  # @param role_arn [String] The ARN of the role that is assumed when these credentials
  #                          are used.
  # @param sts_client [AWS::STS::Client] An AWS STS client.
  # @return [Aws::AssumeRoleCredentials] The credentials that can be used to assume the role.
  def assume_role(role_arn, sts_client)
    credentials = Aws::AssumeRoleCredentials.new(
      client: sts_client,
      role_arn: role_arn,
      role_session_name: 'create-use-assume-role-scenario'
    )
    @logger.info("Assumed role '#{role_arn}', got temporary credentials.")
    credentials
  end

  # Deletes a role. If the role has policies attached, they are detached and
  # deleted before the role is deleted.
  #
  # @param role_name [String] The name of the role to delete.
  def delete_role(role_name)
    @iam_client.list_attached_role_policies(role_name: role_name).attached_policies.each do |policy|
      @iam_client.detach_role_policy(role_name: role_name, policy_arn: policy.policy_arn)
      @iam_client.delete_policy(policy_arn: policy.policy_arn)
      @logger.info("Detached and deleted policy #{policy.policy_name}.")
    end
    @iam_client.delete_role({ role_name: role_name })
    @logger.info("Role deleted: #{role_name}.")
  rescue Aws::Errors::ServiceError => e
    @logger.info("Couldn't detach policies and delete role #{role.name}. Here's why:")
    @logger.info("\t#{e.code}: #{e.message}")
    raise
  end

  # Deletes a user. If the user has inline policies or access keys, they are deleted
  # before the user is deleted.
  #
  # @param user [Aws::IAM::User] The user to delete.
  def delete_user(user_name)
    user = @iam_client.list_access_keys(user_name: user_name).access_key_metadata
    user.each do |key|
      @iam_client.delete_access_key({ access_key_id: key.access_key_id, user_name: user_name })
      @logger.info("Deleted access key #{key.access_key_id} for user '#{user_name}'.")
    end

    @iam_client.delete_user(user_name: user_name)
    @logger.info("Deleted user '#{user_name}'.")
  rescue Aws::IAM::Errors::ServiceError => e
    @logger.error("Error deleting user '#{user_name}': #{e.message}")
  end
end

# Runs the IAM create a user and assume a role scenario.
def run_scenario(scenario)
  puts('-' * 88)
  puts('Welcome to the IAM create a user and assume a role demo!')
  puts('-' * 88)
  user = scenario.create_user("doc-example-user-#{Random.uuid}")
  user_key = scenario.create_access_key_pair(user)
  scenario.wait(10)
  role = scenario.create_role("doc-example-role-#{Random.uuid}", user)
  scenario.create_and_attach_role_policy("doc-example-role-policy-#{Random.uuid}", role)
  scenario.create_user_policy("doc-example-user-policy-#{Random.uuid}", user, role)
  scenario.wait(10)
  puts('Try to list buckets with credentials for a user who has no permissions.')
  puts('Expect AccessDenied from this call.')
  scenario.list_buckets(
    scenario.create_s3_resource(Aws::Credentials.new(user_key.access_key_id, user_key.secret_access_key))
  )
  puts('Now, assume the role that grants permission.')
  temp_credentials = scenario.assume_role(
    role.arn, scenario.create_sts_client(user_key.access_key_id, user_key.secret_access_key)
  )
  puts('Here are your buckets:')
  scenario.list_buckets(scenario.create_s3_resource(temp_credentials))
  puts("Deleting role '#{role.role_name}' and attached policies.")
  scenario.delete_role(role.role_name)
  puts("Deleting user '#{user.user_name}', policies, and keys.")
  scenario.delete_user(user.user_name)
  puts('Thanks for watching!')
  puts('-' * 88)
rescue Aws::Errors::ServiceError => e
  puts('Something went wrong with the demo.')
  puts("\t#{e.code}: #{e.message}")
end

run_scenario(ScenarioCreateUserAssumeRole.new(Aws::IAM::Client.new)) if $PROGRAM_NAME == __FILE__
```
+ 如需 API 詳細資訊，請參閱《*適用於 Ruby 的 AWS SDK API 參考*》中的下列主題。
  + [AttachRolePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/AttachRolePolicy)
  + [CreateAccessKey](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreateAccessKey)
  + [CreatePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreatePolicy)
  + [CreateRole](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreateRole)
  + [CreateUser](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/CreateUser)
  + [DeleteAccessKey](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteAccessKey)
  + [DeletePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeletePolicy)
  + [DeleteRole](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteRole)
  + [DeleteUser](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteUser)
  + [DeleteUserPolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DeleteUserPolicy)
  + [DetachRolePolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/DetachRolePolicy)
  + [PutUserPolicy](https://docs.aws.amazon.com/goto/SdkForRubyV3/iam-2010-05-08/PutUserPolicy)

------
#### [ Rust ]

**SDK for Rust**  
 GitHub 上提供更多範例。尋找完整範例，並了解如何在 [AWS 程式碼範例儲存庫](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/iam#code-examples)中設定和執行。

```
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_iam::Error as iamError;
use aws_sdk_iam::{config::Credentials as iamCredentials, config::Region, Client as iamClient};
use aws_sdk_s3::Client as s3Client;
use aws_sdk_sts::Client as stsClient;
use tokio::time::{sleep, Duration};
use uuid::Uuid;

#[tokio::main]
async fn main() -> Result<(), iamError> {
    let (client, uuid, list_all_buckets_policy_document, inline_policy_document) =
        initialize_variables().await;

    if let Err(e) = run_iam_operations(
        client,
        uuid,
        list_all_buckets_policy_document,
        inline_policy_document,
    )
    .await
    {
        println!("{:?}", e);
    };

    Ok(())
}

async fn initialize_variables() -> (iamClient, String, String, String) {
    let region_provider = RegionProviderChain::first_try(Region::new("us-west-2"));

    let shared_config = aws_config::from_env().region(region_provider).load().await;
    let client = iamClient::new(&shared_config);
    let uuid = Uuid::new_v4().to_string();

    let list_all_buckets_policy_document = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"s3:ListAllMyBuckets\",
                    \"Resource\": \"arn:aws:s3:::*\"}]
    }"
    .to_string();
    let inline_policy_document = "{
                \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Action\": \"sts:AssumeRole\",
                    \"Resource\": \"{}\"}]
    }"
    .to_string();

    (
        client,
        uuid,
        list_all_buckets_policy_document,
        inline_policy_document,
    )
}

async fn run_iam_operations(
    client: iamClient,
    uuid: String,
    list_all_buckets_policy_document: String,
    inline_policy_document: String,
) -> Result<(), iamError> {
    let user = iam_service::create_user(&client, &format!("{}{}", "iam_demo_user_", uuid)).await?;
    println!("Created the user with the name: {}", user.user_name());
    let key = iam_service::create_access_key(&client, user.user_name()).await?;

    let assume_role_policy_document = "{
        \"Version\": \"2012-10-17\",
                \"Statement\": [{
                    \"Effect\": \"Allow\",
                    \"Principal\": {\"AWS\": \"{}\"},
                    \"Action\": \"sts:AssumeRole\"
                }]
            }"
    .to_string()
    .replace("{}", user.arn());

    let assume_role_role = iam_service::create_role(
        &client,
        &format!("{}{}", "iam_demo_role_", uuid),
        &assume_role_policy_document,
    )
    .await?;
    println!("Created the role with the ARN: {}", assume_role_role.arn());

    let list_all_buckets_policy = iam_service::create_policy(
        &client,
        &format!("{}{}", "iam_demo_policy_", uuid),
        &list_all_buckets_policy_document,
    )
    .await?;
    println!(
        "Created policy: {}",
        list_all_buckets_policy.policy_name.as_ref().unwrap()
    );

    let attach_role_policy_result =
        iam_service::attach_role_policy(&client, &assume_role_role, &list_all_buckets_policy)
            .await?;
    println!(
        "Attached the policy to the role: {:?}",
        attach_role_policy_result
    );

    let inline_policy_name = format!("{}{}", "iam_demo_inline_policy_", uuid);
    let inline_policy_document = inline_policy_document.replace("{}", assume_role_role.arn());
    iam_service::create_user_policy(&client, &user, &inline_policy_name, &inline_policy_document)
        .await?;
    println!("Created inline policy.");

    //First, fail to list the buckets with the user.
    let creds = iamCredentials::from_keys(key.access_key_id(), key.secret_access_key(), None);
    let fail_config = aws_config::from_env()
        .credentials_provider(creds.clone())
        .load()
        .await;
    println!("Fail config: {:?}", fail_config);
    let fail_client: s3Client = s3Client::new(&fail_config);
    match fail_client.list_buckets().send().await {
        Ok(e) => {
            println!("This should not run. {:?}", e);
        }
        Err(e) => {
            println!("Successfully failed with error: {:?}", e)
        }
    }

    let sts_config = aws_config::from_env()
        .credentials_provider(creds.clone())
        .load()
        .await;
    let sts_client: stsClient = stsClient::new(&sts_config);
    sleep(Duration::from_secs(10)).await;
    let assumed_role = sts_client
        .assume_role()
        .role_arn(assume_role_role.arn())
        .role_session_name(format!("iam_demo_assumerole_session_{uuid}"))
        .send()
        .await;
    println!("Assumed role: {:?}", assumed_role);
    sleep(Duration::from_secs(10)).await;

    let assumed_credentials = iamCredentials::from_keys(
        assumed_role
            .as_ref()
            .unwrap()
            .credentials
            .as_ref()
            .unwrap()
            .access_key_id(),
        assumed_role
            .as_ref()
            .unwrap()
            .credentials
            .as_ref()
            .unwrap()
            .secret_access_key(),
        Some(
            assumed_role
                .as_ref()
                .unwrap()
                .credentials
                .as_ref()
                .unwrap()
                .session_token
                .clone(),
        ),
    );

    let succeed_config = aws_config::from_env()
        .credentials_provider(assumed_credentials)
        .load()
        .await;
    println!("succeed config: {:?}", succeed_config);
    let succeed_client: s3Client = s3Client::new(&succeed_config);
    sleep(Duration::from_secs(10)).await;
    match succeed_client.list_buckets().send().await {
        Ok(_) => {
            println!("This should now run successfully.")
        }
        Err(e) => {
            println!("This should not run. {:?}", e);
            panic!()
        }
    }

    //Clean up.
    iam_service::detach_role_policy(
        &client,
        assume_role_role.role_name(),
        list_all_buckets_policy.arn().unwrap_or_default(),
    )
    .await?;
    iam_service::delete_policy(&client, list_all_buckets_policy).await?;
    iam_service::delete_role(&client, &assume_role_role).await?;
    println!("Deleted role {}", assume_role_role.role_name());
    iam_service::delete_access_key(&client, &user, &key).await?;
    println!("Deleted key for {}", key.user_name());
    iam_service::delete_user_policy(&client, &user, &inline_policy_name).await?;
    println!("Deleted inline user policy: {}", inline_policy_name);
    iam_service::delete_user(&client, &user).await?;
    println!("Deleted user {}", user.user_name());

    Ok(())
}
```
+ 如需 API 詳細資訊，請參閱 *AWS SDK for Rust API reference* 中的下列主題。
  + [AttachRolePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.attach_role_policy)
  + [CreateAccessKey](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_access_key)
  + [CreatePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_policy)
  + [CreateRole](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_role)
  + [CreateUser](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.create_user)
  + [DeleteAccessKey](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_access_key)
  + [DeletePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_policy)
  + [DeleteRole](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_role)
  + [DeleteUser](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_user)
  + [DeleteUserPolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.delete_user_policy)
  + [DetachRolePolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.detach_role_policy)
  + [PutUserPolicy](https://docs.rs/aws-sdk-iam/latest/aws_sdk_iam/client/struct.Client.html#method.put_user_policy)

------

# 使用 IAM 角色為在 Amazon EC2 執行個體上執行的應用程式授予許可
<a name="id_roles_use_switch-role-ec2"></a>

在 Amazon EC2 執行個體上執行的應用程式必須在 AWS API 請求中包含 AWS 登入資料。您可以讓您的開發人員直接將 AWS 登入資料存放在 Amazon EC2 執行個體中，並允許該執行個體中的應用程式使用這些登入資料。不過，開發人員將必須管理憑證，並確實將憑證安全地傳遞給每個執行個體，並在需要更新憑證時更新每個 Amazon EC2 執行個體。這是許多額外的工作。

與其這麼做，您可以 (也應該) 使用 IAM 角色來管理 Amazon EC2 執行個體上所執行應用程式的*臨時*憑證。使用角色時，您不必將長期憑證 (例如登入憑證或存取金鑰) 分發給 Amazon EC2 執行個體。相反地，該角色會提供暫時許可，供應用程式在呼叫其他 AWS 資源時使用。啟動 Amazon EC2 執行個體時，指定要與執行個體相關聯的 IAM 角色。然後，在執行個體上執行的應用程式可以使用角色提供的暫時憑證來簽署 API 請求。

如要透過角色為 Amazon EC2 執行個體上執行的應用程式授予許可，需搭配一些額外的組態。在 Amazon EC2 執行個體上執行的應用程式是由 AWS 虛擬化作業系統從 抽象化。由於此額外區隔，您需要額外的步驟，才能將 AWS 角色及其相關許可指派給 Amazon EC2 執行個體，並將其提供給其應用程式。此額外步驟是建立連接到執行個體的*[執行個體設定檔](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html)*。執行個體描述檔包含角色，可以將角色的臨時憑證提供給在執行個體上執行的應用程式。然後，可以在應用程式的 API 呼叫中使用這些臨時憑證來存取資源，並限制僅存取角色指定的那些資源。

**注意**  
一次只能指派一個角色給 Amazon EC2 執行個體，執行個體上的所有應用程式會共用相同的角色和許可。當您利用 Amazon ECS 來管理 Amazon EC2 執行個體時，您可以向 Amazon ECS 任務指派角色，這些角色和執行 Amazon EC2 執行個體所使用的角色有所區別。為每項任務指派一個角色的做法符合最低權限存取原則，並且允許對動作和資源進行更精細的控制。  
如需詳細資訊，請參閱《Amazon Elastic Container Service 最佳實務指南》**中的[對 Amazon ECS 任務使用 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/security-iam-roles.html)。

以這種方式使用角色有幾個好處。由於角色憑證是臨時的並且是自動更新的，因此您不需要管理憑證，也不必擔心長期的安全風險。此外，如果對多個執行個體使用單一角色，則可以對該角色進行變更，並將變更自動傳播到所有執行個體。

**注意**  
雖然在啟動角色時通常就會將角色指派給 Amazon EC2 執行個體，但角色也可以與目前執行的 Amazon EC2 執行個體連接。若要了解如何將角色連接到正在執行的執行個體，請參閱 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)。

**Topics**
+ [適用於 Amazon EC2 執行個體的角色如何運作？](#roles-usingrole-ec2instance-roles)
+ [使用 Amazon EC2 角色所需的許可](#roles-usingrole-ec2instance-permissions)
+ [我該如何開始？](#roles-usingrole-ec2instance-get-started)
+ [相關資訊](#roles-usingrole-ec2instance-related-info)

## 適用於 Amazon EC2 執行個體的角色如何運作？
<a name="roles-usingrole-ec2instance-roles"></a>

下圖中，開發人員在 Amazon EC2 執行個體上執行應用程式，該應用程式需要存取名為 `amzn-s3-demo-bucket-photos` 的 S3 儲存貯體。管理員建立 `Get-pics` 服務角色，並將角色連接到 Amazon EC2 執行個體。該角色包括許可政策，該政策授予對指定的 S3 儲存貯體的唯讀存取許可。角色還包含信任政策，該政策可允許 Amazon EC2 執行個體擔任角色並擷取臨時憑證。當應用程式在執行個體上執行時，它可以使用角色的臨時憑證來存取照片儲存貯體。管理員不必授予開發人員存取照片儲存貯體的許可，開發人員也不必共用或管理憑證。

![\[存取 AWS 資源的 Amazon EC2 執行個體上的應用程式\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/roles-usingrole-ec2roleinstance.png)


1. 管理員使用 IAM 建立 **Get-pics** 角色。在角色的信任政策中，管理員指定只有 Amazon EC2 執行個體可以擔任該角色。在角色的許可政策中，管理員為 `amzn-s3-demo-bucket-photos` 儲存貯體指定唯讀許可。

1. 開發人員啟動 Amazon EC2 執行個體，並將 `Get-pics` 角色指派給該執行個體。
**注意**  
如果您使用 IAM 主控台，則會為您管理執行個體描述檔，並且對您來說幾乎是透明的。不過，如果您使用 AWS CLI 或 API 來建立和管理角色和 Amazon EC2 執行個體，則必須建立執行個體描述檔，並將角色指派為個別步驟。然後，當您啟動執行個體時，必須指定執行個體設定檔名稱，而不是角色名稱。

1. 應用程式執行時，會從 Amazon EC2 [執行個體中繼資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)中取得暫時安全憑證，如[從執行個體中繼資料中擷取安全憑證](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials)中所述。這些是代表角色的[暫時安全憑證](id_credentials_temp.md)，並且在有限的時間段內有效。

   透過一些 [AWS 開發套件](https://aws.amazon.com/tools/)，開發人員可以使用透明地管理暫時安全憑證的提供者。( AWS SDKs的文件說明該 SDK 支援用於管理登入資料的功能。)

   或者，應用程式可以直接從 Amazon EC2 執行個體的執行個體中繼資料中取得臨時憑證。您可以從中繼資料的 `iam/security-credentials/role-name` 類別 (在本例中為 `iam/security-credentials/Get-pics`) 中取得憑證和相關的值。如果應用程式從執行個體中繼資料取得憑證，則可以快取憑證。

1. 使用擷取到的臨時憑證，應用程式存取照片儲存貯體。基於連接至 **Get-pics** 角色的政策，應用程式具有唯讀許可。

   在執行個體上提供的臨時安全憑證在到期之前會自動更新，以便有效設定為永久可用。應用程式只需要確保在目前中繼資料到期之前，它從執行個體中繼資料中取得一組新的憑證。您可以使用 AWS SDK 來管理登入資料，因此應用程式不需要包含額外的邏輯來重新整理登入資料。例如，使用執行個體描述檔憑證提供者建立用戶端。不過，如果應用程式從執行個體中繼資料取得臨時安全憑證並快取它們，則應每小時或在目前設定過期之前至少 15 分鐘取得重新整理的憑證集。過期時間包含在 `iam/security-credentials/role-name` 類別中所傳回的資訊。

## 使用 Amazon EC2 角色所需的許可
<a name="roles-usingrole-ec2instance-permissions"></a>

若要使用角色啟動執行個體，開發人員必須具有啟動 Amazon EC2 執行個體的許可，以及傳遞 IAM 角色的許可。

下列範例政策允許使用者使用 AWS 管理主控台 來啟動具有 角色的執行個體。此政策包含萬用字元 (`*`)，以允許使用者傳遞任何角色，並執行列出的 Amazon EC2 動作。`ListInstanceProfiles` 動作讓使用者查看 AWS 帳戶中可用的所有角色。

**Example 範例政策，授予使用者使用 Amazon EC2 主控台啟動具有任何角色的執行個體的許可**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "IamPassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "ec2.amazonaws.com"
                }
            }
        },
        {
            "Sid": "ListEc2AndListInstanceProfiles",
            "Effect": "Allow",
            "Action": [
                "iam:ListInstanceProfiles",
                "ec2:Describe*",
                "ec2:Search*",
                "ec2:Get*"
            ],
            "Resource": "*"
        }
    ]
}
```

### 限制哪些角色可以傳遞給 Amazon EC2 執行個體 (使用 PassRole)
<a name="roles-usingrole-ec2instance-passrole"></a>

您可以使用 `PassRole` 許可，限制使用者在啟動執行個體時可以將哪個角色傳遞給 Amazon EC2 執行個體。這有助於防止使用者執行具有比授予使用者更多許可的應用程式，也就是說，能夠獲得更高的許可。例如，假設使用者 Alice 只擁有啟動 Amazon EC2 執行個體以及使用 Amazon S3 儲存貯體的許可，但她傳遞給 Amazon EC2 執行個體的角色具有使用 IAM 和 Amazon DynamoDB 的許可。在這種情況下，Alice 或許可以啟動執行個體、登入執行個體、取得暫時安全憑證，然後執行她未授權的 IAM 或 DynamoDB 動作。

若要限制使用者可以將哪些角色傳遞給 Amazon EC2 執行個體，則要建立允許 `PassRole` 動作的政策。然後，您需要將政策連接到預計啟動 Amazon EC2 執行個體的使用者 (或使用者所屬的 IAM 群組)。在政策的 `Resource` 元素中，您需列出允許使用者傳遞給 Amazon EC2 執行個體的角色。當使用者啟動執行個體並將角色與其關聯時，Amazon EC2 檢查是否允許使用者傳送該角色。當然，您也應當確保使用者可以傳遞的角色不包含比使用者應具有的許可更多的許可。

**注意**  
`PassRole` 不是與`RunInstances` 或 `ListInstanceProfiles` 相同的 API 動作。反之，它是一種許可，每當角色 ARN 做為參數傳遞至 API 時 （或主控台會代表使用者執行此操作），就會進行 AWS 檢查。它可協助管理員控制哪些使用者可以傳遞哪些角色。在這種情況下，它確保允許使用者將特定角色連接到 Amazon EC2 執行個體。

**Example 此範例政策授予使用者許可，使其可以啟動具有特定角色的 Amazon EC2 執行個體**  
以下範例政策可允許使用者使用 Amazon EC2 API 來啟動具有角色的執行個體。`Resource` 元素指定角色的 Amazon Resource Name (ARN)。透過指定 ARN，政策授予使用者僅傳遞 `Get-pics` 角色的許可。如果使用者在啟動執行個體時嘗試指定不同的角色，則動作會失敗。使用者沒有執行任何執行個體的許可，無論其是否有傳遞角色。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/Get-pics"
        }
    ]
}
```

### 允許執行個體設定檔角色切換到另一個帳戶中的角色
<a name="switch-role-ec2-another-account"></a>

您可以允許在 Amazon EC2 執行個體上執行的應用程式在另一個帳戶中執行命令。若要執行此操作，您必須允許將第一個帳戶中的 Amazon EC2 執行個體角色切換到第二個帳戶中的角色。

假設您使用兩個 ， AWS 帳戶 而且您想要允許在 Amazon EC2 執行個體上執行的應用程式在兩個帳戶中執行[AWS CLI](https://aws.amazon.com/cli/)命令。假設 Amazon EC2 執行個體存在於帳戶 `111111111111`。該執行個體包含 `abcd` 執行個體描述檔角色，該角色會允許應用程式在相同 `111111111111` 帳戶中對 `amzn-s3-demo-bucket1` 儲存貯體執行唯讀 Amazon S3 任務。不過，也必須允許應用程式擔任 `efgh` 跨帳戶角色來在帳戶 `222222222222` 中存取 `amzn-s3-demo-bucket2`Amazon S3 儲存貯體。

![\[此圖表顯示開發人員如何啟動具有該角色的 Amazon EC2 執行個體，以存取 Amazon S3 儲存貯體中的相片。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/roles-instance-profile-cross-account.png)


`abcd` Amazon EC2 執行個體設定檔角色必須具有以下許可政策，以允許應用程式存取 `amzn-s3-demo-bucket1` Amazon S3 儲存貯體：

***帳戶 111111111111 `abcd` 角色許可政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket1/*",
                "arn:aws:s3:::amzn-s3-demo-bucket1"
            ]
        },
        {
            "Sid": "AllowIPToAssumeCrossAccountRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::222222222222:role/efgh"
        }
    ]
}
```

------

`abcd` 角色必須信任 Amazon EC2 服務擔任該角色。若要執行此操作，`abcd` 角色必須有以下信任政策：

***帳戶 111111111111 `abcd` 角色信任政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "abcdTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"Service": "ec2.amazonaws.com"}
        }
    ]
}
```

------

假設 `efgh` 跨帳戶角色允許在相同 `222222222222` 帳戶中對 `amzn-s3-demo-bucket2` 儲存貯體的唯讀 Amazon S3 任務。若要執行此操作，`efgh` 跨帳戶角色必須有以下許可政策：

***帳戶 222222222222 `efgh` 角色許可政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowAccountLevelS3Actions",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowListAndReadS3ActionOnMyBucket",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket2/*",
                "arn:aws:s3:::amzn-s3-demo-bucket2"
            ]
        }
    ]
}
```

------

`efgh` 角色必須信任 `abcd` 執行個體設定檔角色擔任該角色。若要執行此操作，`efgh` 角色必須有以下信任政策：

***帳戶 222222222222 `efgh` 角色信任政策***

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "efghTrustPolicy",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::111111111111:role/abcd"}
        }
    ]
}
```

------

## 我該如何開始？
<a name="roles-usingrole-ec2instance-get-started"></a>

若要了解角色如何使用 Amazon EC2 執行個體，您需要使用 IAM 主控台建立角色，啟動使用該角色的 Amazon EC2 執行個體，然後檢查正在執行的執行個體。您可以檢查[執行個體中繼資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)以查看角色的暫時憑證如何可用於執行個體。您還可以查看在執行個體上執行的應用程式如何使用該角色。使用以下資源以進一步了解。
+ [「在 Amazon EC2 執行個體上使用 IAM 角色」教學課程](https://www.youtube.com/watch?v=TlCuOjviOhk)。連結的影片會說明如何將 IAM 角色與 Amazon EC2 執行個體一起使用，以控制應用程式在執行個體上執行時可以執行的操作。影片顯示應用程式 （在 AWS SDK 中撰寫） 如何透過 角色取得臨時安全登入資料。
+ SDK 演練。軟體 AWS 開發套件文件包含逐步解說，顯示在 Amazon EC2 執行個體上執行的應用程式，該執行個體使用角色的臨時登入資料來讀取 Amazon S3 儲存貯體。以下每個演練都使用不同的程式設計語言提供類似的步驟：
  + 《適用於 Java 的 AWS SDK 開發人員指南》**中的[使用 SDK for Java 設定 Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html) 
  + *《適用於 .NET 的 AWS SDK 開發人員指南》*中的[使用適用於 .NET 的開發套件啟動 Amazon EC2 執行個體](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/run-instance.html)
  + 《適用於 Ruby 的 AWS SDK 開發人員指南》**中的[使用 SDK for Ruby 建立 Amazon EC2 執行個體](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/ec2-example-create-instance.html)

## 相關資訊
<a name="roles-usingrole-ec2instance-related-info"></a>

如需建立角色或為 Amazon EC2 執行個體建立角色的詳細資訊，請參閱以下資訊：
+ 如需有關[搭配 Amazon EC2 執行個體使用 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) 的詳細資訊，請前往《Amazon EC2 使用者指南》**。
+ 若要建立角色，請參閱 [IAM 角色建立](id_roles_create.md)
+ 如需有關使用暫時安全憑證的詳細資訊，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。
+ 如果使用 IAM API 或 CLI，則必須建立和管理 IAM 執行個體描述檔。如需有關執行個體設定檔的詳細資訊，請參閱 [使用執行個體設定檔](id_roles_use_switch-role-ec2_instance-profiles.md)。
+ 如需有關執行個體中繼資料中角色之臨時安全憑證的詳細資訊，請參閱《Amazon EC2 使用者指南》**中的 [Retrieving Security Credentials from Instance Metadata](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials)。

# 使用執行個體設定檔
<a name="id_roles_use_switch-role-ec2_instance-profiles"></a>

使用執行個體描述檔將 IAM 角色傳遞給 EC2 執行個體。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [IAM roles for Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

## 管理執行個體設定檔 (主控台)
<a name="instance-profiles-manage-console"></a>

如果您使用 AWS 管理主控台 為 Amazon EC2 建立角色，主控台會自動建立執行個體描述檔，並為其提供與該角色相同的名稱。然後，當您使用 Amazon EC2 主控台啟動具有 IAM 角色的執行個體時，可以選擇要與執行個體關聯的角色。在主控台中，顯示的清單實際上是執行個體設定檔名稱的清單。主控台不會為與 Amazon EC2 無關的角色建立執行個體描述檔。

如果角色和執行個體描述檔具有相同的名稱，您可以使用 AWS 管理主控台 刪除 Amazon EC2 的 IAM 角色和執行個體描述檔。若要進一步了解刪除執行個體描述檔，請參閱 [刪除角色或執行個體設定檔](id_roles_manage_delete.md)。

**注意**  
若要更新執行個體的許可，請取代其執行個體設定檔。不建議從執行個體設定檔中移除角色，因為最多需要延遲一小時，此變更才生效。

## 管理執行個體描述檔 (AWS CLI 或 AWS API)
<a name="instance-profiles-manage-cli-api"></a>

如果您從 AWS CLI 或 AWS API 管理您的角色，您可以將角色和執行個體描述檔建立為個別動作。由於角色和執行個體描述檔可以有不同的名稱，因此您必須知道執行個體描述檔的名稱以及它們包含的角色的名稱。這樣，您可以在啟動 EC2 執行個體時選擇正確的執行個體描述檔。

您可以將標籤連接至 IAM 資源 (包括執行個體描述檔)，以識別、整理和控制其存取。您只能在使用 AWS CLI 或 AWS API 時標記執行個體描述檔。

**注意**  
執行個體描述檔只能包含一個 IAM 角色，但角色可以包含在多個執行個體描述檔中。每個執行個體設定檔的一個角色的限制無法增加。您可以移除現有角色，然後將不同角色新增到執行個體描述檔。然後 AWS ，由於[最終一致性](https://en.wikipedia.org/wiki/Eventual_consistency)，您必須等待變更出現在所有 中。若要強制變更，必須[取消關聯執行個體描述檔](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html)，然後[關聯執行個體描述檔](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html)，或者可以停止執行個體，然後重新啟動它。

### 管理執行個體設定檔 (AWS CLI)
<a name="instance-profiles-manage-cli"></a>

您可以使用下列 AWS CLI 命令來使用 帳戶中的 AWS 執行個體描述檔。
+ 建立執行個體描述檔: [https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-instance-profile.html)
+ 標記執行個體描述檔：[https://docs.aws.amazon.com/cli/latest/reference/iam/tag-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-instance-profile.html)
+ 列出執行個體描述檔的標籤：[https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profile-tags.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profile-tags.html)
+ 取消標記執行個體描述檔：[https://docs.aws.amazon.com/cli/latest/reference/iam/untag-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-instance-profile.html)
+ 將角色新增至執行個體描述檔: [https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/add-role-to-instance-profile.html) 
+ 列出執行個體描述檔: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html), [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles-for-role.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles-for-role.html) 
+ 取得有關執行個體描述檔的資訊: [https://docs.aws.amazon.com/cli/latest/reference/iam/get-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-instance-profile.html) 
+ 從執行個體描述檔中移除角色: [https://docs.aws.amazon.com/cli/latest/reference/iam/remove-role-from-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/remove-role-from-instance-profile.html)
+ 刪除執行個體描述檔: [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-instance-profile.html) 

您還可以使用以下命令將角色連接到已在執行的 EC2 執行個體。如需詳細資訊，請參閱 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)。
+ 將具有角色的執行個體描述檔連接至已停止或正在執行的 EC2 執行個體: [https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-iam-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/associate-iam-instance-profile.html) 
+ 取得有關連接至 EC2 執行個體的執行個體描述檔的資訊: [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-iam-instance-profile-associations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-iam-instance-profile-associations.html) 
+ 使用已停止或正在執行的 EC2 執行個體中的角色分開執行個體描述檔：[https://docs.aws.amazon.com/cli/latest/reference/ec2/disassociate-iam-instance-profile.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/disassociate-iam-instance-profile.html)

### 管理執行個體描述檔 (AWS API)
<a name="instance-profiles-manage-api"></a>

您可以呼叫下列 AWS API 操作，以在 中使用執行個體描述檔 AWS 帳戶。
+ 建立執行個體描述檔: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html) 
+ 標記執行個體描述檔：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html)
+ 列出執行個體描述檔的標籤：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html)
+ 取消標記執行個體描述檔：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html)
+ 將角色新增至執行個體描述檔: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddRoleToInstanceProfile.html) 
+ 列出執行個體描述檔: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfiles.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfiles.html), [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html) 
+ 取得有關執行個體描述檔的資訊: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html) 
+ 從執行個體描述檔中移除角色: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html) 
+ 刪除執行個體描述檔: [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html) 

您還可以呼叫以下操作將角色連接到已在執行的 EC2 執行個體。如需詳細資訊，請參閱 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)。
+ 將具有角色的執行個體描述檔連接至已停止或正在執行的 EC2 執行個體: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html) 
+ 取得有關連接至 EC2 執行個體的執行個體描述檔的資訊: [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeIamInstanceProfileAssociations.html) 
+ 使用已停止或正在執行的 EC2 執行個體中的角色分開執行個體描述檔：[https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html)

# 身分提供者和聯合身分 AWS
<a name="id_roles_providers"></a>

最佳實務是，建議您要求人類使用者使用聯合身分提供者來存取 AWS 資源，而不是在您的 中建立個別的 IAM 使用者 AWS 帳戶。使用身分提供者 (IdP)，您可以在 外部管理您的使用者身分， AWS 並提供這些外部使用者身分許可，以使用您帳戶中 AWS 的資源。如果您的組織已有自己的身分系統，例如公司使用者目錄，這個方式便很管用。如果您要建立需要存取 AWS 資源的行動應用程式或 Web 應用程式，這也很有用。

**注意**  
您也可以使用外部 SAML 身分提供者 (而不是在 IAM 中使用 SAML 聯合身分)，在 [IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/what-is.html) 中管理人類使用者。IAM Identity Center 與身分提供者聯合可讓您讓人員存取組織中的多個 AWS 帳戶和多個 AWS 應用程式。若要了解需要 IAM 使用者的特定情形，請參閱[建立 IAM 使用者 (而非角色) 的時機](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_which-to-choose)。

如果您偏好使用單一 AWS 帳戶而不啟用 IAM Identity Center，您可以使用 IAM 搭配外部 IdP，該 IdP AWS 會使用 [OpenID Connect (OIDC)](http://openid.net/connect/) 或 [SAML 2.0 （安全性聲明標記語言 2.0) 來提供身分資訊給](https://wiki.oasis-open.org/security) 。OIDC 會將未在 AWS AWS 資源上執行的應用程式，例如 GitHub Actions。知名 SAML 身分提供者的範例包含 Shibboleth 和 Active Directory Federation Services。

當您使用 身分提供者時，您不需要建立自訂登入代碼或管理自己的使用者身分，IdP 會為您處理這些工作。IdP 會為您提供這些功能。您的外部使用者透過 IdP 登入，您可以授予這些外部身分許可，以使用您帳戶中 AWS 的資源。身分提供者有助於保護您的 AWS 帳戶 安全，因為您不必在應用程式中分發或嵌入長期安全登入資料，例如存取金鑰。

檢閱下表，以協助判斷哪種 IAM 聯合身分類型最適合您的使用案例：IAM、IAM Identity Center 或 Amazon Cognito。下列摘要和資料表提供 方法的概觀，您的使用者可用來取得 AWS 資源的聯合存取。


| IAM 聯合身分類型 | Account type (帳戶類型) | 存取管理… | 支援的身分來源 | 
| --- | --- | --- | --- | 
|  使用 IAM Identity Center 的聯合  |  由 管理的多個帳戶 AWS Organizations  |  員工的人類使用者  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_roles_providers.html)  | 
|  使用 IAM 的聯合  |  單一獨立帳戶  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_roles_providers.html)  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_roles_providers.html)  | 
|  使用 Amazon Cognito 身分池的聯合  |  任何  |  需要 IAM 授權才能存取資源的應用程式使用者  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_roles_providers.html)  | 

## 使用 IAM Identity Center 的聯合
<a name="id_roles_providers_identity-center"></a>

如需人類使用者的集中式存取管理，我們建議您使用 [IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) 管理您帳戶的存取權和這些帳戶內的許可。IAM Identity Center 中的使用者會獲得 AWS 資源的短期憑證。您可以使用 Active Directory、外部身分提供者 (IdP) 或 IAM Identity Center 目錄做為使用者和群組的身分來源，以指派 AWS 資源的存取權。

IAM Identity Center 支援與 SAML （安全性聲明標記語言） 2.0 的聯合身分，為有權在存取入口網站內使用應用程式的使用者提供聯合單一登入 AWS 存取。然後，使用者可以單一登入支援 SAML 的服務，包括 AWS 管理主控台 和第三方應用程式，例如 Microsoft 365、SAP Concur 和 Salesforce。

## 使用 IAM 的聯合
<a name="id_roles_providers_iam"></a>

雖然我們強烈建議在 IAM Identity Center 中管理人類使用者，但您可以在短期、小規模部署中為人類使用者啟用使用 IAM 的聯合身分主體存取權。IAM 可讓您使用個別的 SAML 2.0 和 Open ID Connect (OIDC) IdP，並使用聯合身分主體屬性進行存取控制。透過 IAM，您可以將使用者屬性，例如成本中心、標題或地區設定，從您的 IdPs 傳遞至 AWS，並根據這些屬性實作精細的存取許可。

*工作負載*是可提供商業價值的資源和程式碼的集合，例如應用程式或後端程序。您的工作負載可能需要 IAM 身分才能向 AWS 服務、應用程式、操作工具和元件提出請求。這些身分包括在 AWS 環境中執行的機器，例如 Amazon EC2 執行個體或 AWS Lambda 函數。

您可以管理需要存取權的外部當事人的機器身分。若要將存取權授予機器身分，您可以使用 IAM 角色。IAM 角色具有特定許可，並透過使用角色工作階段 AWS 依賴臨時安全登入資料來提供存取的方法。此外，您可能在 外部有需要存取您 AWS 環境 AWS 的機器。對於在 外部執行的機器 AWS ，您可以使用 [IAM Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html)。如需角色的詳細資訊，請參閱[IAM 角色](id_roles.md)。如需如何使用角色來委派跨 存取的詳細資訊 AWS 帳戶，請參閱 [IAM 教學課程：使用 IAM 角色在 AWS 帳戶之間委派存取權](tutorial_cross-account-with-roles.md)。

若要將 IdP 直接連結至 IAM，您可以建立身分提供者實體，以在 AWS 帳戶 和 IdP 之間建立信任關係。IAM 支援 IdP，其與 [OpenID Connect (OIDC)](http://openid.net/connect/) 或 [SAML 2.0 (安全性聲明標記語言 2.0)](https://wiki.oasis-open.org/security) 相容。如需搭配 使用其中一個 IdPs 的詳細資訊 AWS，請參閱下列各節：
+ [OIDC 聯合身分](id_roles_providers_oidc.md)
+ [SAML 2.0 聯合身分](id_roles_providers_saml.md)

## 使用 Amazon Cognito 身分池的聯合
<a name="id_roles_providers_cognito"></a>

Amazon Cognito 專為想要在行動應用程式和 Web 應用程式中為使用者進行驗證和授權的開發人員而設計。Amazon Cognito 使用者集區會在應用程式中新增登入和註冊功能，而身分池則提供 IAM 憑證，讓使用者可以存取您在 AWS中管理的受保護資源。身分池會透過 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作取得臨時工作階段的憑證。

Amazon Cognito 可與支援 SAML 和 OpenID Connect 的外部身分提供者以及社交身分提供者 (如 Facebook、Google 和 Amazon) 搭配運作。應用程式可以使用使用者集區或外部 IdP 登入使用者，然後透過 IAM 角色中的自訂臨時工作階段代表使用者擷取資源。

## 其他資源
<a name="id_roles_providers_additional_resources"></a>
+ 如需如何使用 AWS 管理主控台 組織的身分驗證系統建立啟用單一登入 (SSO) 的自訂聯合代理的示範，請參閱 [啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。

# 常用案例
<a name="id_federation_common_scenarios"></a>

**注意**  
我們建議您要求人類使用者在存取時使用臨時登入資料 AWS。您是否考慮過使用 AWS IAM Identity Center？ 您可以使用 IAM Identity Center 集中管理對多個 的存取， AWS 帳戶 並為使用者提供受 MFA 保護的單一登入存取，可從單一位置存取其所有指派的帳戶。使用 IAM Identity Center，您可以在 IAM Identity Center 中建立和管理使用者身分，或輕鬆連線至您現有的 SAML 2.0 相容身分提供者。如需詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

您可以使用外部身分提供者 (IdP) 來管理 AWS 和外部 IdP 以外的使用者身分。外部 IdP 可以使用 AWS OpenID Connect (OIDC) 或安全聲明標記語言 (SAML) 將身分資訊提供給 。當未在 上執行的應用程式 AWS 需要存取 AWS 資源時，通常會使用 OIDC。

當您想要使用外部 IdP 設定聯合時，您可以建立 IAM *身分提供者*，以通知 AWS 外部 IdP 及其組態。這會在您的 AWS 帳戶 和外部 IdP 之間建立信任。下列主題提供使用 IAM 身分提供者的常見案例。

**Topics**
+ [用於行動應用程式的 Amazon Cognito](#id_roles_providers_oidc_cognito)
+ [行動應用程式的 OIDC 聯合身分](#id_roles_providers_oidc_manual)

## 用於行動應用程式的 Amazon Cognito
<a name="id_roles_providers_oidc_cognito"></a>

使用 OIDC 聯合身分的偏好方式是使用 [Amazon Cognito](https://aws.amazon.com/cognito/)。例如，開發人員 Adele 正在為行動裝置建置遊戲，其中分數和描述檔這類使用者資料都存放在 Amazon S3 和 Amazon DynamoDB 中。Adele 也會將此資料存放在裝置本機，並使用 Amazon Cognito 跨多個裝置保持同步。她了解為了安全和維護之故，長期的 AWS 安全憑證不應隨遊戲發散。她也了解遊戲可能有大量的使用者。針對所有這些原因，她不想要針對每個玩家在 IAM 建立新的使用者身分。反之，她會設計遊戲，讓使用者可以使用他們透過知名的外部身分提供者 (IdP) 建立的身分登入，例如 **Login with Amazon**、**Facebook**、**Google** 或任何 **OpenID Connect** (OIDC) 相容的 IdP。她的遊戲可善用其中一個提供者的身分驗證機制，藉以驗證使用者的身分。

為了讓行動應用程式能夠存取她的 AWS 資源，Adele 首先會使用她選擇的 IdPs 註冊開發人員 ID。她也會使用這些提供者的每一個來設定應用程式。在包含遊戲的 Amazon S3 儲存貯體和 DynamoDB 資料表 AWS 帳戶 的她中，Adele 會使用 Amazon Cognito 來建立 IAM 角色，以精確定義遊戲所需的許可。如果她使用 OIDC IdP，她也會建立 IAM OIDC 身分提供者實體，以在她 AWS 帳戶 和 IdP 中的 [Amazon Cognito 身分集區](https://docs.aws.amazon.com/cognito/latest/developerguide/external-identity-providers.html)之間建立信任。

在應用程式的程式碼中，Adele 呼叫用於之前設定的 IdP 的登入介面。IdP 會處理讓使用者登入的所有詳細資訊，而應用程式會從提供者取得 OAuth 存取權杖或 OIDC ID 權杖。Adele 的應用程式可以將此身分驗證資訊交換為一組臨時安全登入資料，其中包含 AWS 存取金鑰 ID、私密存取金鑰和工作階段字符。然後，應用程式可以使用這些登入資料來存取 提供的 Web 服務 AWS。該應用程式僅限於許可，其定義於其擔任的角色。

下圖使用 Login with Amazon 做為 IdP，顯示一個有關如何運作的簡化流程。對於步驟 2，應用程式也可使用 Facebook、Google 或任何 OIDC 相容的 IdP，但此處未顯示。

![\[使用 Amazon Cognito 的範例工作流程來聯合行動應用程式的使用者\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/mobile-app-web-identity-federation.diagram.png)


 

1. 客戶在行動裝置啟動您的應用程式。該應用程式要求使用者登入。

1. 該應用程式會使用 Login with Amazon 資源來接受使用者的憑證。

1. 應用程式使用 Amazon Cognito API 操作 `GetId` 和 `GetCredentialsForIdentity`，用 Login with Amazon 字符交換 Amazon Cognito ID 字符。Amazon Cognito 已設定為信任您的 Login with Amazon 專案，會產生一個權杖，它與 AWS STS交換暫存工作階段憑證。

1. 該應用程序從 Amazon Cognito 接收暫時安全憑證。您的應用程式也可以使用 Amazon Cognito 中的基本 （傳統） 工作流程，從 AWS STS 使用 擷取字符`AssumeRoleWithWebIdentity`。如需詳細資訊，請參閱《Amazon Cognito 開發人員指南》中的[身分集區 (聯合身分) 驗證流程](https://docs.aws.amazon.com/cognito/latest/developerguide/authentication-flow.html)。

1. 透過應用程式可使用暫時性安全憑證存取操作應用程式所需的任何 AWS 資源。與暫時性安全憑證相關聯的角色及指派政策，決定了可以存取哪些內容。

使用下列程序來設定您的應用程式以使用 Amazon Cognito 來驗證使用者，並讓應用程式存取 AWS 資源。如需關於完成此案例的特定步驟，請參閱 Amazon Cognito 的說明文件。

1. (選用) 使用 Login with Amazon、Facebook、Google 或其他任何 OpenID Connect (OIDC) 相容的 IdP 註冊為開發人員，並使用提供者設定一個或多個應用程式。此步驟是可選的，因為 Amazon Cognito 也支援未經驗證的使用者存取權 (訪客)。

1. 前往 [中的 Amazon Cognito AWS 管理主控台](https://console.aws.amazon.com/cognito/home)。使用 Amazon Cognito 精靈來建立身分集區，而該集區是一種容器，可讓 Amazon Cognito 用於為您的應用程式整理最終使用者身分。您可以在應用程式之間分享身分集區。當您設定身分集區時，Amazon Cognito 會建立一或兩個 IAM 角色 (一個用於已驗證的身分，一個用於未經驗證的「訪客」身分)，其為 Amazon Cognito 使用者定義許可。

1. 將 [AWS](https://docs.amplify.aws) Amplify 與您的應用程式整合，並匯入所需檔案以使用 Amazon Cognito。

1. 建立 Amazon Cognito 憑證提供者的執行個體，並傳遞身分集區 ID、您的 AWS 帳戶 號碼，以及與身分集區建立關聯之角色的 Amazon Resource Name (ARN)。中的 Amazon Cognito 精靈 AWS 管理主控台 提供範例程式碼，協助您開始使用。

1. 當您的應用程式存取 AWS 資源時， 會將登入資料提供者執行個體傳遞至用戶端物件，該物件會將臨時安全登入資料傳遞至用戶端。憑證的許可是根據您稍早定義的一個或多個角色。

如需詳細資訊，請參閱下列內容：
+  AWS Amplify 架構文件中的[登入 (Android)](https://docs.amplify.aws/lib/auth/signin/q/platform/android/)。
+  AWS Amplify 架構文件中的[登入 (iOS)](https://docs.amplify.aws/lib/auth/signin/q/platform/ios/)。

## 行動應用程式的 OIDC 聯合身分
<a name="id_roles_providers_oidc_manual"></a>

為獲得最佳效果，請使用 Amazon Cognito 作為幾乎所有 OIDC 聯合身分方案的身分經紀人。Amazon Cognito 易於使用，並提供額外功能，如匿名 (未經身分驗證) 存取，以及跨裝置和提供者的同步使用者資料。但是，如果您已經透過手動呼叫 `AssumeRoleWithWebIdentity` API 建立了一個使用 OIDC 聯合身分的應用程式，則可以繼續使用它，您的應用程式仍然可以正常工作。

***在沒有*** Amazon Cognito 的情況下使用 OIDC 聯合身分的程序遵循下列一般概述：

1. 使用 IdP 註冊為開發人員，並使用外部身分提供者 (IdP) 設定您的應用程式，IdP 為您的應用程式提供唯一 ID。(不同的 IdP 可能使用不同的術語來表達此程序。此大綱則使用術語*設定*來表示向 IdP 識別您應用程式的程序)。每個 IdP 均提供一個對於該 IdP 來說是獨有的應用程式 ID，因此如果根據多個 IdP 的要求設定同一應用程式，則該應用程式將會有多個應用程式 ID。可依照每個提供商的要求配置多個應用程式。

   下列外部連結提供有關使用其中一些常用身分提供者 (IdP) 的資訊：
   + [Login with Amazon 開發人員中心](https://login.amazon.com/) 
   + Facebook 開發人員網站上的[新增 Facebook 登入到您的應用程式或網站](https://developers.facebook.com/docs/facebook-login/v2.1)。
   + Google 開發人員網站上的[登入時使用 OAuth 2.0 (OpenID Connect)](https://developers.google.com/accounts/docs/OAuth2Login)。
**重要**  
如果您使用 Google、Facebook 或 Amazon Cognito 的 OIDC 身分提供者，請勿在 中建立個別的 IAM 身分提供者 AWS 管理主控台。 AWS 內建這些 OIDC 身分提供者，可供您使用。略過下列步驟，並直接移至使用您的身分提供者建立新角色。

1. 如果您使用與 OIDC 相容的 Google、Facebook 或 Amazon Cognito 以外的 IdP，請為其建立 IAM 身分提供者實體。

1. 在 IAM 中，[建立一或多個角色](id_roles_create_for-idp.md)。對於每個角色，定義可以擔任角色的人員 (信任政策) 以及應用程式使用者擁有的許可 (許可政策)。一般而言，您可以為應用程式所支援的每個 IdP 建立一個角色。例如，您可以建立使用者透過 Login with Amazon 登入之應用程式可擔任的角色，使用者透過 Facebook 登入之相同應用程式可擔任的次要角色，以及使用者透過 Google 登入之應用程式可擔任的第三個角色。對於信任關係，請將 IdP (像是 Amazon.com) 指定為`Principal` (信任實體) 和包含符合 IdP 指派的應用程式 ID 的 `Condition` 。[為第三方身分提供者建立角色](id_roles_create_for-idp.md) 中會說明不同提供者的角色範例。

1. 在您的應用程式中，使用 IdP 對您的使用者進行身分驗證。有關如何執行此動作的具體情況會根據您所使用的 IdP (Login with Amazon、Facebook 或 Google) 以及您的應用程式執行的平台而有所不同。例如，Android 應用程式的身分驗證方法可能與 iOS 應用程式或以 JavaScript 為基礎的 Web 應用程式不同。

   一般而言，如果使用者尚未登入，則 IdP 會負責顯示登入頁面。在 IdP 驗證使用者之後，IdP 會向您的應用程式傳回帶有使用者資訊的身分驗證權杖。所包含的資訊取決於 IdP 公開的內容和使用者願意共用的資訊。您可以在您的應用程式中使用此資訊。

1. 在您的應用程式中，對 `AssumeRoleWithWebIdentity` 動作進行*未簽署*呼叫以請求臨時安全性憑證。在請求中，您會傳遞 IdP 的身分驗證字符，並指定您為該 IdP 建立之 IAM 角色的 Amazon Resource Name (ARN)。 會 AWS 驗證字符是否受信任且有效，如果是， 會將臨時安全登入資料傳回至具有您在請求中指定之角色許可的應用程式。回應還包含來自 IdP 的有關使用者的中繼資料，例如 IdP 與使用者關聯的唯一使用者 ID。

1. 使用`AssumeRoleWithWebIdentity`回應中的臨時安全登入資料，您的應用程式會向 AWS API 操作提出簽章請求。來自 IdP 的使用者 ID 資訊可以區分應用程式中的使用者。例如，您可以將物件放入包含使用者 ID 作為字首或尾碼的 Amazon S3 資料夾。這可讓您建立鎖定該資料夾的存取控制政策，以便只有具有該 ID 的使用者才能存取它。如需詳細資訊，請參閱[AWS STS 聯合身分使用者主體](reference_policies_elements_principal.md#sts-session-principals)。

1. 您的應用程式必須快取臨時安全憑證，如此每次應用程式需要向 AWS發出請求時都不必取得新的憑證。在預設情況下，憑證可以使用一小時。當憑證過期 (或在此之前)，您再次呼叫 `AssumeRoleWithWebIdentity` 以取得一組新的臨時安全憑證。根據 IdP 以及如何管理權杖，您可能需要在對 `AssumeRoleWithWebIdentity` 進行新呼叫之前重新整理 IdP 的權杖，因為 IdP 的權杖通常也會在固定時間後過期。如果您使用適用於 iOS 的 AWS SDK 或適用於 Android 的 AWS SDK，您可以使用 [AmazonSTSCredentialsProvider](https://aws.amazon.com/blogs/mobile/using-the-amazoncredentialsprovider-protocol-in-the-aws-sdk-for-ios) 動作來管理 IAM 臨時憑證，包括視需要重新整理憑證。

# OIDC 聯合身分
<a name="id_roles_providers_oidc"></a>

假設您正在建立存取 AWS 資源的應用程式，例如使用工作流程存取 Amazon S3 和 DynamoDB 的 GitHub 動作。

當您使用這些工作流程時，您可以向必須使用 AWS 存取金鑰簽署的 AWS 服務提出請求。不過，我們**強烈建議**您**不要**將 AWS 登入資料長期存放在 以外的應用程式中 AWS。反之，請設定您的應用程式，在需要時使用 *OIDC 聯合*動態請求臨時 AWS 安全登入資料。提供的臨時登入資料會對應至只有執行應用程式所需任務所需許可 AWS 的角色。

有了 OIDC 聯合身分，您就不需要建立自訂登入代碼，或管理您自己的使用者身分。相反，您可以在 GitHub Actions 或任何其他 [OpenID Connect (OIDC)](http://openid.net/connect/) 相容 IdP 等應用程式中使用 OIDC，以透過 AWS進行驗證。他們會收到稱為 JSON Web 權杖 (JWT) 的身分驗證權杖，然後將該權杖交換為 中的臨時安全登入資料 AWS ，該登入資料對應至具有在您的 中使用特定資源許可的 IAM 角色 AWS 帳戶。使用 IdP 可協助您保持 AWS 帳戶 安全，因為您不必將長期安全登入資料與應用程式一起嵌入和分發。

OIDC 聯合身分支援機器對機器身分驗證 (例如 CI/CD 管道、自動化指令碼和無伺服器應用程式) 和人類使用者身分驗證。對於需要管理使用者註冊、登入和使用者設定檔的人類使用者身分驗證案例，請考慮使用 [Amazon Cognito](https://aws.amazon.com/cognito/) 作為身分經紀人。如需有關將 Amazon Cognito 與 OIDC 搭配使用的詳細資訊，請參閱[用於行動應用程式的 Amazon Cognito](id_federation_common_scenarios.md#id_roles_providers_oidc_cognito)。

**注意**  
OpenID Connect (OIDC) 身分提供者發行的 JSON Web 權杖 (JWT) 在 `exp` 宣告中包含過期時間，指定權杖何時過期。IAM 提供超過 JWT 中所指定過期時間的五分鐘時段，以考量 [OpenID Connect (OIDC) Core 1.0 標準](https://openid.net/specs/openid-connect-core-1_0.html)允許的時鐘誤差。這意味著 IAM 在過期時間後，但在此五分鐘時段內收到的 OIDC JWT 被接受，以進行進一步評估和處理。

**Topics**
+ [OIDC 聯合身分的其他資源](#id_roles_providers_oidc_resources)
+ [在 IAM 中建立 OpenID Connect (OIDC) 身分提供者](id_roles_providers_create_oidc.md)
+ [取得 OpenID Connect 身分提供者的指紋](id_roles_providers_create_oidc_verify-thumbprint.md)
+ [共用 OIDC 提供者的身分提供者控制項](id_roles_providers_oidc_secure-by-default.md)

## OIDC 聯合身分的其他資源
<a name="id_roles_providers_oidc_resources"></a>

下列資源可協助您進一步了解 OIDC 聯合身分：
+ 透過[在 Amazon Web Services 中設定 OpenID Connect](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)，在 GitHub 工作流程內使用 OpenID Connect
+ *適用於 Android 的 Amplify 程式庫指南*中的 [Amazon Cognito 身分](https://docs.amplify.aws/lib/auth/advanced/q/platform/android/)和*適用於 Swift 的 Amplify 程式庫指南*中的 [Amazon Cognito 身分](https://docs.amplify.aws/lib/auth/advanced/q/platform/ios/)。
+ 如何在*AWS 安全部落格*上[授予 AWS 資源的存取權時使用外部 ID](https://aws.amazon.com/blogs/security/how-to-use-external-id-when-granting-access-to-your-aws-resources/)，提供安全設定跨帳戶存取和外部聯合身分的指導。

# 在 IAM 中建立 OpenID Connect (OIDC) 身分提供者
<a name="id_roles_providers_create_oidc"></a>

*IAM OIDC 身分提供者*是 IAM 中的實體，負責描述可支援 [OpenID Connect](http://openid.net/connect/) (OIDC) 標準的外部身分提供者 (IdP) 服務，例如，Google 或 Salesforce。如果想要在 OIDC 相容的 IdP 和您的 AWS 帳戶之間建立信任，請使用 IAM OIDC 身分提供者。這在建立需要存取 AWS 資源的行動應用程式或 Web 應用程式時非常有用，但您不想建立自訂登入碼或管理自己的使用者身分。如需有關此案例的詳細資訊，請參閱 [OIDC 聯合身分](id_roles_providers_oidc.md)。

您可以使用 AWS 管理主控台、 AWS Command Line Interface、Tools for Windows PowerShell 或 IAM API 來建立和管理 IAM OIDC 身分提供者。

在您建立 IAM OIDC 身分提供者之後，您必須建立一個或多個 IAM 角色。角色是 中的身分 AWS ，沒有自己的登入資料 （與使用者相同）。但在此情況中，角色會動態指派給 OIDC 聯合身分主體，而該主體由組織的 IdP 進行驗證。角色可允許您組織的 IdP 請求暫時性安全憑證以存取 AWS。指派給角色的政策會決定允許使用者在其中執行的操作 AWS。若要為第三方身分提供者建立角色，請參閱 [為第三方身分提供者建立角色](id_roles_create_for-idp.md)。

**重要**  
當您針對支援 `oidc-provider` 資源的動作設定以身分識別型原則時，IAM 會評估完整的 OIDC 身分識別提供者 URL，包含任何指定的路徑。如果您的 OIDC 身分識別提供者 URL 具有路徑，請務必在 `oidc-provider` ARN 中包含該路徑作為 `Resource` 要素值。您也可以選擇在 URL 路徑中的任何位置附加正斜線和萬用字元 (`/*`) 至 URL 網域，或使用萬用字元 (`*` 和 `?`)。如果要求中的 OIDC 身分識別提供者 URL 與政策的 `Resource` 要素中設定的值不相符，則請求會失敗。

若要疑難排解 IAM OIDC 聯合的常見問題，請參閱[解決 re：Post 上的 OIDC 相關錯誤](https://repost.aws/knowledge-center/iam-oidc-idp-federation)。 AWS 

**Topics**
+ [先決條件：驗證身分提供者的組態](#manage-oidc-provider-prerequisites)
+ [建立及管理 OIDC 提供者 (主控台)](#manage-oidc-provider-console)
+ [建立及管理 IAM OIDC 身分提供者 (AWS CLI)](#manage-oidc-provider-cli)
+ [建立和管理 OIDC Identity Provider (AWS API)](#manage-oidc-provider-api)

## 先決條件：驗證身分提供者的組態
<a name="manage-oidc-provider-prerequisites"></a>

您必須從 IdP 取得下列資訊，然後才能建立 IAM OIDC 身分提供者。如需有關取得 OIDC 提供者組態資訊的詳細資訊，請參閱 IdP 的文件。

1. 判斷 OIDC 身分提供者的公開可用的 URL。URL 必須以 https:// 開頭。根據 OIDC 標準，允許路徑元件，但不允許查詢參數。通常，URL 僅包含主機名稱，例如 https://server.example.org 或 https://example.com。URL 不應包含連接埠號碼。

1. 將 **/.well-known/openid-configuration** 新增至 OIDC 身分提供者 URL 的結尾，以查看提供者的公開可用的組態文件和中繼資料。您必須具有 JSON 格式的探索文件，其中包含提供者的組態文件和中繼資料，這些文件可從 [OpenID Connect 提供者探索端點 URL](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig) 擷取。

1. 確認下列值包含在提供者的組態資訊中。如果 openid-configuration 遺失其中任何欄位，您必須更新探索文件。此程序可能會因您的身分提供者而有所不同，因此請遵循 IdP 的文件來完成此任務。
   + 發行者：網域的 URL。
   + jwks\$1uri：IAM 取得公有金鑰的 JSON Web 金鑰集 (JWKS) 端點。您的身分提供者必須在 openid-configuration 中包含 JSON Web 金鑰集 (JWKS) 端點。此 URI 會定義從何處取得您的公有金鑰，這些金鑰用於驗證身分提供者簽署的權杖。
**注意**  
JSON Web 金鑰集 (JWKS) 必須包含至少一個金鑰，且最多可以有 100 個 RSA 金鑰和 100 個 EC 金鑰。如果 OIDC 身分提供者的 JWKS 包含超過 100 個 RSA 金鑰或 100 個 EC 金鑰，則在將 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作與由超過 100 個金鑰限制的金鑰類型簽署的 JWT 搭配使用時，將傳回 `InvalidIdentityToken` 例外狀況。例如，如果使用 RSA 演算法簽署 JWT，且提供者的 JWKS 中有超過 100 個 RSA 金鑰，則將傳回 `InvalidIdentityToken` 例外狀況。
   + claims\$1supported：使用者的相關資訊，可協助您確保來自 IdP 的 OIDC 身分驗證回應包含 IAM 政策中 AWS 用於檢查 OIDC 聯合主體許可的必要屬性。如需可用於宣告的 IAM 條件索引鍵清單，請參閱[AWS OIDC 聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-wif)。
     + aud：您必須確定 IdP 在 JSON Web 權杖 (JWT) 中發出的對象宣告值。對象 (aud) 宣告是應用程式特定的，並識別權杖的預期收件人。當您向 OpenID Connect 提供者註冊行動或 Web 應用程式時，其會建立一個用於識別該應用程式的用戶端 ID。用戶端 ID 是應用程式的唯一識別碼，會在 aud 宣告中傳遞以進行身分驗證。建立 IAM OIDC 身分提供者時，aud 宣告必須與對象值相符。
     + iat：宣告必須包含 `iat` 的值，表示發出 ID 權杖的時間。
     + iss：身分提供者的 URL。URL 必須以 https:// 開頭，且應對應至提供給 IAM 的提供者 URL。根據 OIDC 標準，允許路徑元件，但不允許查詢參數。通常，URL 僅包含主機名稱，例如 https://server.example.org 或 https://example.com。URL 不應包含連接埠號碼。
   + response\$1types\$1supported：id\$1token
   + subject\$1types\$1supported：公有
   + id\$1token\$1signing\$1alg\$1values\$1supported：RS256、RS384、RS512、ES256、ES384、ES512
**注意**  
您可以在以下範例中包含其他宣告，如 `my_custom_claim` ；不過， AWS STS 會忽略宣告。  

   ```
   {
     "issuer": "https://example-domain.com",
     "jwks_uri": "https://example-domain.com/jwks/keys",
     "claims_supported": [
       "aud",
       "iat",
       "iss",
       "name",
       "sub",
       "my_custom_claim"
     ],
     "response_types_supported": [
       "id_token"
     ],
     "id_token_signing_alg_values_supported": [
       "RS256",
       "RS384",
       "RS512",
       "ES256",
       "ES384",
       "ES512"
     ],
     "subject_types_supported": [
       "public"
     ]
   }
   ```

## 建立及管理 OIDC 提供者 (主控台)
<a name="manage-oidc-provider-console"></a>

按照這些指示，在 AWS 管理主控台中建立和管理 IAM OIDC 身分提供者。

**重要**  
如果您正在使用來自 Google、Facebook 或 Amazon Cognito 的 OIDC 身分提供者，請勿使用此程序建立個別的 IAM 身分提供者。這些 OIDC 身分提供者已內建於 AWS ，可供您使用。請依照下列步驟為您的身分提供者建立新角色，請參閱 [為 OpenID Connect 聯合身分建立角色 (主控台)](id_roles_create_for-idp_oidc.md)。

**建立 IAM OIDC 身分提供者 (主控台)**

1. <a name="idpoidcstep1"></a>在建立 IAM OIDC 身分提供者之前，您必須使用 IdP 來註冊您的應用程式，才能接收*用戶端 ID*。用戶端 ID (也稱為*觀眾*) 是您在向 IdP 註冊應用程式時向您發佈的應用程式的唯一識別符。如需有關取得用戶端 ID 的詳細資訊，請參閱文件以取得您的 IdP。
**注意**  
AWS 使用我們的信任根憑證授權機構 (CAsIdPs) 的通訊，以驗證 JSON Web Key Set (JWKS) 端點的 TLS 憑證。如果您的 OIDC IdP 依賴的憑證不是由這些信任CAs 之一簽署，則我們只會使用 IdP 組態中設定的指紋進行安全通訊。如果我們無法擷取 TLS 憑證或如果需要 TLS v1.3， AWS 將返回指紋驗證。

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

1. 在導覽窗格中，請選擇 **Identity providers** (身分提供者)，然後選擇 **Add provider** (新增提供者)。

1. 對於 **Configure provider** (設定提供者)，選擇 **OpenID Connect** (OpenID 連線)。

1. 針對 **Provider URL (提供者 URL)**，輸入 IdP 的 URL。URL 必須符合這些限制：
   + URL 區分大小寫。
   + URL 必須以 **https://** 開頭。
   + URL 不應包含連接埠號碼。
   + 在您的 中 AWS 帳戶，每個 IAM OIDC 身分提供者都必須使用唯一的 URL。如果您嘗試提交已在 中用於 OpenID Connect 提供者的 URL AWS 帳戶，您會收到錯誤。

1. 針對**對象**，輸入您向 IdP 註冊並在 中接收之應用程式的用戶端 ID[Step 1](#idpoidcstep1)，以及提出請求的用戶端 ID AWS。如果此 IdP 有其他用戶端 ID (也稱*觀眾*)，則稍後可以在提供者詳細資訊頁面上新增它們。
**注意**  
如果您的 IdP JWT 權杖包含 `azp` 宣告，請輸入此值作為對象值。  
如果您的 OIDC 身分提供者在權杖中同時設定 `aud`和 `azp` 宣告， AWS STS 將使用`azp`宣告中的 值作為`aud`宣告。

1. (選用) 對於 **Add tags** (新增標籤)，您可以新增鍵值組，以協助您識別和整理 IdP。您也可以使用標籤來控制對 AWS 資源的存取。若要進一步了解如何標記 IAM OIDC 身分提供者，請參閱 [標記 OpenID Connect (OIDC) 身分提供者](id_tags_oidc.md)。選擇 **Add tag (新增標籤)**。輸入每個標籤鍵值組的值。

1. 請確認您提供的資訊。完成後，請選擇 **Add provider** (新增提供者)。IAM 會嘗試擷取並使用 OIDC IdP 伺服器憑證的頂層中繼 CA 指紋，來建立 IAM OIDC 身分提供者。
**注意**  
OIDC 身分提供者的憑證鏈必須以網域或發行者 URL 開頭，然後是中繼憑證，最後以根憑證結尾。如果憑證鏈順序不同或包含重複或其他憑證，則您會收到簽章不相符錯誤，且 STS 無法驗證 JSON Web 權杖 (JWT)。更正從伺服器傳回的鏈結中的憑證順序，以解決錯誤。如需有關憑證鏈標準的詳細資訊，請參閱 RFC 系列網站上的 [RFC 5246 中的 certificate\$1list](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2)。

1. 將 IAM 角色指派給您的身分提供者，以提供身分提供者管理的外部使用者身分許可，以存取您帳戶中 AWS 的資源。若要深入了解如何建立聯合身分角色，請參閱 [為第三方身分提供者建立角色](id_roles_create_for-idp.md)。
**注意**  
角色信任政策中使用的 OIDC IdP 必須與信任它的角色位於相同帳戶中。

**新增或移除 IAM OIDC 身分提供者的指紋 (主控台)**
**注意**  
AWS 使用我們的信任根憑證授權機構 (CAsIdPs) 的通訊，以驗證 JSON Web Key Set (JWKS) 端點的 TLS 憑證。如果您的 OIDC IdP 依賴的憑證不是由這些信任CAs 之一簽署，則我們只會使用 IdP 組態中設定的指紋進行安全通訊。如果我們無法擷取 TLS 憑證或如果需要 TLS v1.3， AWS 將返回指紋驗證。

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

1. 在導覽窗格中，請選擇 **Identity providers** (身分提供者)。然後選擇您要更新的 IAM 身分提供者名稱。

1. 選擇**端點驗證**索引標籤，然後在**指紋**區段中，選擇**管理**。若要輸入新的指紋值，請選擇 **Add thumbprint** 新增指紋。若要移除指紋，請選擇要移除的指紋旁的 **Remove** (移除)。
**注意**  
IAM OIDC 身分提供者必須至少有 1 個和最多可有 5 個指紋。

    完成後，請選擇 **Save changes** (儲存變更)。

**新增 IAM OIDC 身分提供者的對象 (主控台)**

1. 在導覽窗格中，選擇 **Identity providers** (身分提供者)，然後選擇您所要更新 IAM 身分提供者的名稱。

1. 在 **Audiences** (對象) 區段中，選擇 **Actions** (動作) 並選取 **Add audience** (新增對象)。

1. 輸入您向 IdP 註冊並在 中接收的應用程式的用戶端 ID[Step 1](#idpoidcstep1)，該應用程式將向其發出請求 AWS。然後選擇 **Add audiences** (新增對象)。
**注意**  
IAM OIDC 身分提供者必須至少有 1 個和最多可有 100 個對象。

**移除 IAM OIDC 身分提供者的對象 (主控台)**

1. 在導覽窗格中，選擇 **Identity providers** (身分提供者)，然後選擇您所要更新 IAM 身分提供者的名稱。

1. 在 **Audiences** (對象) 區段中，選取您要移除之對象旁邊的選項按鈕，然後選取 **Actions** (動作)。

1.  選擇 **Remove audience** (移除對象)。新的視窗將開啟。

1. 如果您移除對象，與對象聯合的身分無法擔任與對象相關聯的角色。在視窗中，閱讀警告，並在欄位中輸入單字 `remove`，確認您要移除對象。

1. 選擇 **Remove** (移除) 以移除對象。

**刪除 IAM OIDC 身分提供者 (主控台)**

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

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

1. 在您要刪除的 IAM 身分提供者旁邊，勾選核取方塊。新的視窗將開啟。

1. 在欄位中輸入單字 `delete`，確認您要刪除提供者。再選擇 **Delete** (刪除)。

## 建立及管理 IAM OIDC 身分提供者 (AWS CLI)
<a name="manage-oidc-provider-cli"></a>

您可以使用下列 AWS CLI 命令來建立和管理 IAM OIDC 身分提供者。

**建立 IAM OIDC 身分提供者 (AWS CLI)**

1. (選用) 若要取得 AWS 帳戶中所有 IAM OIDC 身分提供者的清單，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. 若要建立新的 IAM OIDC 身分提供者，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/create-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-open-id-connect-provider.html)

**更新現有 IAM OIDC 身分提供者的伺服器憑證指紋清單 (AWS CLI)**
+ 若要更新現有 IAM OIDC 身分提供者的伺服器憑證指紋清單，請執行下列命令：
  + [https://docs.aws.amazon.com/cli/latest/reference/iam/update-open-id-connect-provider-thumbprint.html](https://docs.aws.amazon.com/cli/latest/reference/iam/update-open-id-connect-provider-thumbprint.html)

**標記現有的 IAM OIDC 身分提供者 (AWS CLI)**
+ 若要標記現有 IAM OIDC 身分提供者，請執行下列命令：
  + [https://docs.aws.amazon.com/cli/latest/reference/iam/tag-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-open-id-connect-provider.html)

**列出現有 IAM OIDC 身分提供者 (AWS CLI) 的標籤**
+ 若要列出現有 IAM OIDC 身分提供者的標籤，請執行下列命令：
  + [https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-provider-tags.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-provider-tags.html)

**移除 IAM OIDC 身分提供者 (AWS CLI) 的標籤**
+ 若要移除 IAM OIDC 身分提供者的標籤，請執行下列命令：
  + [https://docs.aws.amazon.com/cli/latest/reference/iam/untag-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-open-id-connect-provider.html)

**從現有 IAM OIDC 身分提供者新增或移除用戶端 ID (AWS CLI API)**

1. (選用) 若要取得 AWS 帳戶中所有 IAM OIDC 身分提供者的清單，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. (選用) 若要取得有關 IAM OIDC 身分提供者的詳細資訊，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/get-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-open-id-connect-provider.html)

1. 若要將新的用戶端 ID 新增到現有 IAM OIDC 身分提供者，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/add-client-id-to-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/add-client-id-to-open-id-connect-provider.html)

1. 若要從現有 IAM OIDC 身分提供者中移除用戶端，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/remove-client-id-from-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/remove-client-id-from-open-id-connect-provider.html)

**若要刪除 IAM OIDC 身分提供者 (AWS CLI)**

1. (選用) 若要取得 AWS 帳戶中所有 IAM OIDC 身分提供者的清單，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-providers.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-providers.html)

1. (選用) 若要取得有關 IAM OIDC 身分提供者的詳細資訊，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/get-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-open-id-connect-provider.html)

1. 若要刪除 IAM OIDC 身分提供者，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-open-id-connect-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-open-id-connect-provider.html)

## 建立和管理 OIDC Identity Provider (AWS API)
<a name="manage-oidc-provider-api"></a>

您可以使用以下 IAM API 命令來建立及管理 OIDC 提供者。

**建立 IAM OIDC 身分提供者 (AWS API)**

1. (選用) 若要取得 AWS 帳戶中所有 IAM OIDC 身分提供者的清單，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. 若要建立新的 IAM OIDC 身分提供者，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html)

**更新現有 IAM OIDC 身分提供者 (AWS API) 的伺服器憑證指紋清單**
+ 若要更新現有 IAM OIDC 身分提供者的伺服器憑證指紋清單，請呼叫下列操作：
  + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateOpenIDConnectProviderThumbprint.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateOpenIDConnectProviderThumbprint.html)

**標記現有的 IAM OIDC 身分提供者 (AWS API)**
+ 若要標記現有 IAM OIDC 身分提供者，請叫用下列操作：
  + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html)

**列出現有 IAM OIDC 身分提供者 (AWS API) 的標籤**
+ 若要列出現有 IAM OIDC 身分提供者的標籤，請叫用下列操作：
  + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html)

**移除現有 IAM OIDC 身分提供者 (AWS API) 上的標籤**
+ 若要移除現有 IAM OIDC 身分提供者的標籤，請叫用下列操作：
  + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html)

**從現有的 IAM OIDC 身分提供者 (AWS API) 新增或移除用戶端 ID**

1. (選用) 若要取得 AWS 帳戶中所有 IAM OIDC 身分提供者的清單，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. (選用) 若要取得有關 IAM OIDC 身分提供者的詳細資訊，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html)

1. 若要將新的用戶端 ID 新增到現有 IAM OIDC 身分提供者，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddClientIDToOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AddClientIDToOpenIDConnectProvider.html)

1. 若要從現有 IAM OIDC 身分提供者中移除用戶端 ID，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveClientIDFromOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveClientIDFromOpenIDConnectProvider.html)

**刪除 IAM OIDC 身分提供者 (AWS API)**

1. (選用) 若要取得 AWS 帳戶中所有 IAM OIDC 身分提供者的清單，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html)

1. (選用) 若要取得有關 IAM OIDC 身分提供者的詳細資訊，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html)

1. 若要刪除 IAM OIDC 身分提供者，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteOpenIDConnectProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteOpenIDConnectProvider.html)

# 取得 OpenID Connect 身分提供者的指紋
<a name="id_roles_providers_create_oidc_verify-thumbprint"></a>

在 IAM 中[建立 OpenID Connect (OIDC) 身分提供者](id_roles_providers_create_oidc.md)時，IAM 需要頂層中繼憑證授權機構 (CA) 的指紋，該授權機構會簽署外部身分提供者 (IdP) 使用的憑證。指紋是 CA 憑證的簽章，該簽章會用來發出與 OIDC 相容的 IdP 憑證。當您建立 IAM OIDC 身分提供者時，您會信任該 IdP 驗證的身分可以存取您的 AWS 帳戶。透過使用 CA 的憑證指紋，您信任該 CA 發出的任何憑證，該 CA 會使用與任何登錄之指紋相同 DNS 名稱來發出憑證。這讓您在續約 IdP 的簽署憑證時，無需在每個帳戶中更新信任。

**重要**  
在大多數情況下，聯合伺服器會使用兩個不同的憑證：  
第一個 會在 AWS 和您的 IdP 之間建立 HTTPS 連線。此憑證應該由知名的公有根 CA 發行，例如 AWS Certificate Manager。這可讓用戶端檢查憑證的可靠性和狀態。
第二個憑證用於加密令牌，且應由私有或公有*根* CA 簽署。

您可以使用 [AWS Command Line Interface、Tools for Windows PowerShell 或 IAM API 建立 IAM OIDC ](id_roles_providers_create_oidc.md#manage-oidc-provider-cli)身分提供者。使用這些方法時，您可以選擇手動提供指紋。如果您選擇不包含指紋，IAM 將擷取 OIDC IdP 伺服器憑證的頂層中繼 CA 指紋。如果選擇包含指紋，您必須手動取得指紋並將其提供給 AWS。

當您使用 [IAM 主控台](id_roles_providers_create_oidc.md)建立 OIDC 身分提供者時，IAM 會嘗試為您擷取 OIDC IdP 伺服器憑證的頂層中繼 CA 指紋。

我們建議您同時手動取得您的 OIDC IdP 的使用指紋，並且驗證 IAM 已擷取到正確的指紋。如需有關取得憑證指紋的詳細資訊，請參閱下列各節。

**注意**  
AWS 使用我們的信任根憑證授權機構 (CAsIdPs) 的通訊，以驗證 JSON Web Key Set (JWKS) 端點的 TLS 憑證。如果您的 OIDC IdP 依賴的憑證不是由這些信任CAs 之一簽署，則我們只會使用 IdP 組態中設定的指紋進行安全通訊。如果我們無法擷取 TLS 憑證或如果需要 TLS v1.3， AWS 將返回指紋驗證。

## 取得憑證指紋
<a name="oidc-obtain-thumbprint"></a>

您可以使用 Web 瀏覽器和 OpenSSL 命令列工具，來取得 OIDC 提供者的憑證指紋。但是，您不需要手動取得憑證指紋即可建立 IAM OIDC 身分提供者。您可以使用下列程序來取得 OIDC 提供者的憑證指紋。

**取得 OIDC IdP 的指紋**

1. 您需要先取得 OpenSSL 命令列工具，然後才能取得 OIDC IdP 的指紋。您可使用此工具下載 OIDC IdP 憑證鍊並產生憑證連結中最終憑證的指紋。如果您需要安裝和設定 OpenSSL，請根據 [安裝 OpenSSL](#oidc-install-openssl) 與 [設定 OpenSSL](#oidc-configure-openssl) 中的說明操作。

1. 從 OIDC IdP URL 開始 (例如，`https://server.example.com`)，然後新增 `/.well-known/openid-configuration` 以組成該 IdP 的組態文件的 URL，如下所示：

   **https://*server.example.com*/.well-known/openid-configuration**

   在 Web 瀏覽器中開啟此 URL，並將 *server.example.com* 取代為 IdP 的伺服器名稱。

1. <a name="thumbstep2"></a>在顯示的文件中，使用您的 web 瀏覽器 **Find** (尋找) 功能來尋找文字 `"jwks_uri"`。文字 `"jwks_uri"` 後面會有一個冒號 (:)，然後是一個 URL。複製 URL 的完整網域名稱。不包括 `https://` 或在頂層網域後的任何路徑。

   ```
   {
    "issuer": "https://accounts.example.com",
    "authorization_endpoint": "https://accounts.example.com/o/oauth2/v2/auth",
    "device_authorization_endpoint": "https://oauth2.exampleapis.com/device/code",
    "token_endpoint": "https://oauth2.exampleapis.com/token",
    "userinfo_endpoint": "https://openidconnect.exampleapis.com/v1/userinfo",
    "revocation_endpoint": "https://oauth2.exampleapis.com/revoke",
    "jwks_uri": "https://www.exampleapis.com/oauth2/v3/certs",
   ...
   ```

1. 使用 OpenSSL 命令列工具來執行以下命令。將 *keys.example.com* 取代為您在[Step 3](#thumbstep2) 中取得的網域名稱。

   ```
   openssl s_client -servername keys.example.com -showcerts -connect keys.example.com:443
   ```

1. 在命令視窗中向上滾動，直至看到類似於以下範例的憑證。如果您看到多個憑證，請找到顯示的最後一個憑證 (在命令輸出末尾)。這包含憑證授權機構鏈中的頂層中繼 CA 憑證。

   ```
   -----BEGIN CERTIFICATE-----
    MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
    VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
    b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
    BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
    MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
    VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
    b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
    YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
    21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
    rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
    Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
    nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
    FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
    NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
    -----END CERTIFICATE-----
   ```

   複製憑證 (包括 `-----BEGIN CERTIFICATE-----` 與 `-----END CERTIFICATE-----` 行) 並將其貼上文字檔中。接著儲存檔案，並將其命名為 **certificate.crt**。
**注意**  
OIDC 身分提供者的憑證鏈必須以網域或發行者 URL 開頭，包含任何中繼憑證 (如果有)，並以根憑證結尾。如果憑證鏈順序不同或包含重複或其他憑證，您會收到簽章不相符錯誤，且 STS 無法驗證 JSON Web 權杖 (JWT)。更正從伺服器傳回的鏈結中的憑證順序，以解決錯誤。如需有關憑證鏈標準的詳細資訊，請參閱 RFC 系列網站上的 [RFC 5246 中的 certificate\$1list](https://www.rfc-editor.org/rfc/rfc5246#section-7.4.2)。

1. 使用 OpenSSL 命令列工具來執行以下命令。

   ```
   openssl x509 -in certificate.crt -fingerprint -sha1 -noout
   ```

   您的命令視窗將顯示類似於以下範例的憑證指紋：

   ```
   SHA1 Fingerprint=99:0F:41:93:97:2F:2B:EC:F1:2D:DE:DA:52:37:F9:C9:52:F2:0D:9E
   ```

   從此字串中去掉冒號 (:) 字元以產生最終指紋，如：

   ```
   990F4193972F2BECF12DDEDA5237F9C952F20D9E
   ```

1. 如果您要使用 AWS CLI、Tools for Windows PowerShell 或 IAM API 建立 IAM OIDC 身分提供者，則提供指紋是選用的。如果您選擇在建立期間不包含指紋，IAM 將擷取 OIDC IdP 伺服器憑證的頂層中繼 CA 指紋。在建立 IAM OIDC 身分提供者之後，您可以將此指紋與 IAM 擷取的指紋進行比較。

   如果您要在 IAM 主控台中建立 IAM OIDC 身分提供者，主控台會嘗試為您擷取 OIDC IdP 伺服器憑證的頂層中繼 CA 指紋。您可以將此指紋與 IAM 擷取的指紋進行比對。建立 IAM OIDC 身分提供者之後，您可以在 OIDC 提供者**摘要**主控台頁面上的**端點驗證**索引標籤中檢視 IAM OIDC 身分提供者的指紋。
**重要**  
如果您取得的指紋與您在 IAM OIDC 身分提供者指紋詳細資訊中看到的指紋不相符，則不應該使用該 OIDC 提供者。反之，您應刪除建立的 OIDC 提供者，然後在經過一段時間後再次嘗試建立 OIDC 提供者。在使用提供者之前，驗證指紋是否相符。如果這些指紋在第二次嘗試後仍然不相符，則請使用 [IAM 論壇](https://forums.aws.amazon.com/forum.jspa?forumID=76)與 AWS聯絡。

## 安裝 OpenSSL
<a name="oidc-install-openssl"></a>

如果您尚未安裝 OpenSSL，請遵循此節中的說明操作。

**在 Linux 或 Unix 上安裝 OpenSSL**

1. 移至 [OpenSSL: Source, Tarballs](https://openssl.org/source/) (https://openssl.org/source/)。

1. 下載最新來源並建置套件。

**在 Windows 安裝 OpenSSL**

1. 請前往 [OpenSSL: Binary Distributions](https://wiki.openssl.org/index.php/Binaries) (https://wiki.openssl.org/index.php/Binaries)，以取得您可以從中安裝 Windows 版本的網站清單。

1. 依照您所選網站上的指示開始安裝。

1. 如果系統要求您安裝 **Microsoft Visual C\$1\$1 2008 可轉散發套件**，並且您的系統上尚未安裝此版本，請選擇適合您環境的下載連結。請遵照 **Microsoft Visual C\$1\$1 2008 可轉散發套件安裝精靈**所提供的指示執行。
**注意**  
如果您不確定 Microsoft Visual C\$1\$1 2008 可轉散發套件是否已經安裝在您的系統上，您可以嘗試先安裝 OpenSSL。如果尚未安裝 Microsoft Visual C\$1\$1 2008 可轉散發套件，則 OpenSSL 安裝程式將會顯示提醒。請確定您安裝的架構 (32 位元或 64 位元) 符合您所安裝的 OpenSSL 版本。

1. 安裝 Microsoft Visual C\$1\$1 2008 可轉散發套件後，請選取適用於您環境的 OpenSSL 二進位檔版本並將檔案儲存在本機。啟動 **OpenSSL 安裝精靈**。

1. 遵循 **OpenSSL 安裝精靈**中所述的指示。

## 設定 OpenSSL
<a name="oidc-configure-openssl"></a>

在使用 OpenSSL 命令之前，您必須先設定作業系統，使其具有 OpenSSL 安裝位置的相關資訊。

**在 Linux 或 Unix 上設定 OpenSSL**

1. 在命令列，將 `OpenSSL_HOME` 變數設定為 OpenSSL 安裝的位置：

   ```
   $ export OpenSSL_HOME=path_to_your_OpenSSL_installation
   ```

1. 設定要包含 OpenSSL 安裝的路徑：

   ```
   $ export PATH=$PATH:$OpenSSL_HOME/bin
   ```
**注意**  
您使用 `export` 命令對環境變數做出的任何變更，僅適用於目前的工作階段。您可以在 shell 組態檔案中設定環境變數，對環境變數進行持續變更。如需詳細資訊，請參閱適用於您作業系統的文件。

**在 Windows 上設定 OpenSSL**

1. 開啟**命令提示**視窗。

1. 將 `OpenSSL_HOME` 變數設定為 OpenSSL 安裝的位置：

   ```
   C:\> set OpenSSL_HOME=path_to_your_OpenSSL_installation
   ```

1. 將 `OpenSSL_CONF` 變數設定為 OpenSSL 安裝中組態檔案的位置：

   ```
   C:\> set OpenSSL_CONF=path_to_your_OpenSSL_installation\bin\openssl.cfg
   ```

1. 設定要包含 OpenSSL 安裝的路徑：

   ```
   C:\> set Path=%Path%;%OpenSSL_HOME%\bin
   ```
**注意**  
您在**命令提示**視窗中對 Windows 環境變數做出的任何變更，僅適用於目前命令列工作階段。您可以將環境變數設定為系統屬性，對環境變數進行持續變更。確切的程序將取決於您索使用的 Windows 版本。(例如，在 Windows 7 中，開啟**控制面板**、**系統與安全**、**系統**。 然後選擇**進階系統設定**、**進階**索引標籤、**環境變數**。) 如需詳細資訊，請參閱 Windows 文件。

# 共用 OIDC 提供者的身分提供者控制項
<a name="id_roles_providers_oidc_secure-by-default"></a>

對於已辨識的共用 OpenID Connect (OIDC) 身分提供者 (IdP)，IAM 需要明確評估角色信任政策中的特定宣告。這些必要宣告稱為*身分提供者控制項*，由 IAM 在角色建立和信任政策更新期間進行評估。如果角色信任政策未評估共用 OIDC IdP 所需的控制項，角色建立或更新將會失敗。這可確保只有來自預期組織的授權身分才能擔任角色和存取 AWS 資源。當 OIDC 提供者在多個 AWS 客戶之間共用時，此安全控制項至關重要。



對於現有的 OIDC 角色信任政策，IAM 不會評估身分提供者控制項。現有 OIDC 角色若要對角色信任政策進行任何修改，IAM 將要求其在角色信任政策中包含身分提供者控制項。

## OIDC 提供者類型
<a name="id_roles_providers_oidc_idp_types"></a>

IAM 將 OIDC 身分提供者分類為兩種不同的類型：**私有**和**共用**。私有 OIDC IdP 可由單一組織擁有和管理，也可以是 SaaS 提供者的租用戶，其 OIDC 發行者 URL 可作為該組織特有的唯一識別碼。相比之下，共用的 OIDC IdP 可在多個組織之間使用，對於使用該共用身分提供者的所有組織，OIDC 發行者 URL 可能相同。

下表概述了私有和共用 OIDC 提供者之間的主要差異：


| 特性 | 私有 OIDC 提供者 | 共用 OIDC 提供者 | 
| --- | --- | --- | 
|  發行者  |  組織獨有  |  在多個組織間共用  | 
|  租用資訊  |  透過唯一發行者傳達  |  透過 JWT 中的宣告傳達  | 
|  信任政策需求  |  不需要評估特定宣告  |  需要評估特定宣告  | 

## 具有身分提供者控制項的共用 OIDC 身分提供者
<a name="id_roles_providers_oidc_idp_shared_oidc_secure_support"></a>

在 IAM 中建立或修改 OIDC 提供者時，系統會自動識別並評估已辨識之共用 OIDC 提供者所需的宣告。如果未在角色信任政策中設定身分提供者控制項，則角色建立或更新將會失敗，並發生 MalformedPolicyDocument 錯誤。

下表列出了需要在角色信任政策中使用身分提供者控制項的共用 OIDC 提供者，以及有助於設定身分提供者控制項的其他資訊。


| OIDC IdP | OIDC URL | 租用宣告 | 必要宣告 | 
| --- | --- | --- | --- | 
| [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html) |  `cognito-identity.amazonaws.com`  | aud |  `cognito-identity.amazonaws.com:aud`  | 
| [Azure Sentinel](https://learn.microsoft.com/en-us/azure/defender-for-cloud/sentinel-connected-aws) |  https://sts.windows.net/33e01921-4d64-4f8c-a055-5bdaffd5e33d  |  sts:RoleSessionName  |  sts:RoleSessionName  | 
| [Buildkite](https://buildkite.com/docs/pipelines/security/oidc/aws) |  https://agent.buildkite.com  |  sub  |  agent.buildkite.com:sub  | 
| [Codefresh SaaS](https://codefresh.io/docs/docs/integrations/oidc-pipelines/) | https://oidc.codefresh.io | sub |  oidc.codefresh.io:sub  | 
| [DVC Studio](https://dvc.org/doc/studio/user-guide/openid-connect) | https://studio.datachain.ai/api | sub |  studio.datachain.ai/api:sub  | 
| [GitHub actions](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) | https://token.actions.githubusercontent.com | sub |  token.actions.githubusercontent.com:sub  | 
| [GitHub audit log streaming](https://docs.github.com/en/enterprise-cloud@latest/admin/monitoring-activity-in-your-enterprise/reviewing-audit-logs-for-your-enterprise/streaming-the-audit-log-for-your-enterprise) | https://oidc-configuration.audit-log.githubusercontent.com | sub |  oidc-configuration.audit-log.githubusercontent.com:sub  | 
| [GitHub vstoken](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services) | https://vstoken.actions.githubusercontent.com | sub |  vstoken.actions.githubusercontent.com:sub  | 
| [GitLab](https://docs.gitlab.com/ci/cloud_services/aws/) | https://gitlab.com | sub |  gitlab.com:sub  | 
| [IBM Turbonomic SaaS\$1](https://www.ibm.com/docs/en/tarm/8.16.x?topic=turbonomic-setting-up-aws-iam-role-saas-deployments) |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_roles_providers_oidc_secure-by-default.html)  | sub |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/id_roles_providers_oidc_secure-by-default.html)  | 
| [Pulumi Cloud](https://www.pulumi.com/docs/pulumi-cloud/deployments/oidc/aws/) | https://api.pulumi.com/oidc | aud |  api.pulumi.com/oidc:aud  | 
| [sandboxes.cloud](https://docs.sandboxes.cloud/docs/cloud-resources-setup) | https://sandboxes.cloud | aud |  sandboxes.cloud:aud  | 
| [Scalr](https://docs.scalr.io/docs/aws) | https://scalr.io | sub |  scalr.io:sub  | 
| [Shisho Cloud](https://shisho.dev/docs/g/getting-started/integrate-apps/aws/) | https://tokens.cloud.shisho.dev | sub |  tokens.cloud.shisho.dev:sub  | 
| [Terraform Cloud](https://developer.hashicorp.com/terraform/cloud-docs/workspaces/dynamic-provider-credentials/aws-configuration) | https://app.terraform.io | sub |  app.terraform.io:sub  | 
| [Upbound](https://docs.upbound.io/providers/provider-aws/authentication/) | https://proidc.upbound.io | sub |  proidc.upbound.io:sub  | 
| [Vercel global endpoint](https://vercel.com/docs/oidc/reference) | https://oidc.vercel.com | aud |  oidc.vercel.com:aud  | 

\$1 IBM Turbonomic 會隨平台新版本定期更新其 OIDC 發行者 URL。我們會視需要將範圍內的其他 Turbonomic OIDC 發行者新增為共用提供者。

對於 IAM 識別為共用的任何新 OIDC IdP，將以類似方式記錄和強制執行角色信任政策所需的身分提供者控制項。

## 其他資源
<a name="concept_additional_resources"></a>

其他資源：
+ 如需有關為 OIDC 聯合身分建立 IAM 角色的詳細資訊，請參閱[為 OpenID Connect 聯合身分建立角色 (主控台)](id_roles_create_for-idp_oidc.md)。
+ 如需可用於宣告的 IAM 條件索引鍵清單，請參閱[AWS OIDC 聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-wif)。

# SAML 2.0 聯合身分
<a name="id_roles_providers_saml"></a>

AWS 支援與 [SAML 2.0 （安全性聲明標記語言 2.0) 的聯合身分](https://wiki.oasis-open.org/security)，這是一種許多身分提供者 (IdPs使用的開放標準。此功能可啟用聯合單一登入 (SSO)，讓使用者可以登入 AWS 管理主控台 或呼叫 AWS API 操作，而無需為您組織中的每個人建立 IAM 使用者。透過使用 SAML，您可以簡化使用 設定聯合的程序 AWS，因為您可以使用 IdP 的服務，而不是[編寫自訂身分代理程式碼](https://docs.aws.amazon.com/STS/latest/UsingSTS/CreatingFedTokens.html)。

**注意**  
IAM SAML 聯合身分支援來自 SAML 型聯合身分提供者 (IdP) 的加密 SAML 回應。IAM Identity Center 和 Amazon Cognito 不支援來自 IAM SAML 身分提供者的加密 SAML 聲明。  
您可以間接將對加密 SAML 聲明的支援新增至 Amazon Cognito 身分集區與 Amazon Cognito 使用者集區的聯合。使用者集區具有獨立 IAM SAML 聯合身分的 SAML 聯合身分，並支援 [SAML 簽署和加密](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-SAML-signing-encryption.html)。雖然此功能不會直接延伸至身分集區，但使用者集區可以是身分集區的 IdP。若要將 SAML 加密與身分集區搭配使用，請將具有加密功能的 SAML 提供者新增至作為身分集區的 IdP 的使用者集區。  
您的 SAML 提供者必須能夠使用使用者集區提供的金鑰來加密 SAML 聲明。使用者集區不會接受使用 IAM 提供的憑證加密的聲明。

IAM 聯合身分支援這些使用案例：
+ [**聯合存取，以允許組織中的使用者或應用程式呼叫 AWS API 操作**](#CreatingSAML-configuring)。下一章節會討論此使用案例。您可以使用組織內產生的 SAML 聲明 (身分驗證回應的一部分) 獲得臨時安全性憑證。此方案類似於 IAM 支援的其他聯合身分方案，如 [請求臨時安全憑證](id_credentials_temp_request.md) 和 [OIDC 聯合身分](id_roles_providers_oidc.md) 中說明之情況。但是，組織中以 SAML 2.0 為基礎的 IdP 可以在執行時間裡處理許多詳細資訊，以用於執行身分驗證和授權檢查。
+ [** AWS 管理主控台 來自您組織的 Web 型單一登入 (SSO) 至 **](id_roles_providers_enable-console-saml.md)。使用者可以登入由 SAML 2.0 相容 IdP 託管的組織中的入口網站，選取要前往的選項 AWS，然後重新導向至主控台，而無需提供其他登入資訊。您可以使用第三方 SAML IdP 建立對主控台的 SSO 存取，或您還可以建立自訂 IdP 來支援外部使用者的主控台存取。如需有關建構自訂 IdP 的詳細資訊，請參閱 [啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。

**Topics**
+ [使用 SAML 型聯合身分存取 API AWS](#CreatingSAML-configuring)
+ [配置以 SAML 2.0 為基礎的聯合身分驗證的概觀](#CreatingSAML-configuring-IdP)
+ [允許 SAML 聯合存取 AWS 資源的角色概觀](#CreatingSAML-configuring-role)
+ [單獨辨識以 SAML 為基礎的聯合身分中的使用者](#CreatingSAML-userid)
+ [在 IAM 中建立 SAML 身分提供者](id_roles_providers_create_saml.md)
+ [使用依賴方信任設定您的 SAML 2.0 IdP 並新增宣告](id_roles_providers_create_saml_relying-party.md)
+ [將第三方 SAML 解決方案供應商與 整合 AWS](id_roles_providers_saml_3rd-party.md)
+ [為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)
+ [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)
+ [在瀏覽器中檢視 SAML 回應](troubleshoot_saml_view-saml-response.md)

## 使用 SAML 型聯合身分存取 API AWS
<a name="CreatingSAML-configuring"></a>

假設您想要為員工提供一種方式，使其能將資料從他們的電腦中複製到備份資料夾。您可以建構一個可在使用者的電腦上執行的應用程式。該應用程式可在後端的 Amazon S3 儲存貯體中讀寫物件。使用者無法直接存取 AWS。而應使用以下程序：

![\[根據 SAML 聲明取得暫時安全憑證\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/saml-based-federation-diagram.png)


1. 組織中的使用者會使用用戶端應用程式來請求獲得組織 IdP 的身分驗證。

1. IdP 根據組織的身分存放區對使用者進行身分驗證。

1. IdP 會建構一個具有使用者相關資訊的 SAML 聲明，並將此聲明發送到用戶端應用程式。當您為 IAM SAML IdP 啟用 SAML 加密時，此聲明由外部 IdP 加密。

1. 用戶端應用程式會 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)呼叫 API，傳遞 SAML 供應商的 ARN、要擔任的角色 ARN，以及來自 IdP 的 SAML 聲明。如果啟用加密，透過用戶端應用程式傳遞的聲明會在傳輸中保持加密狀態。

1. （選用） AWS STS 使用您從外部 IdP 上傳的私有金鑰來解密加密的 SAML 聲明。

1. API 對用戶端應用程式的回應包括臨時性安全憑證。

1. 用戶端應用程式使用臨時安全性憑證來呼叫 Amazon S3 API 操作。

## 配置以 SAML 2.0 為基礎的聯合身分驗證的概觀
<a name="CreatingSAML-configuring-IdP"></a>

您必須先將組織的 IdP 和 設定為彼此 AWS 帳戶 信任，才能如上述案例和圖表所述使用 SAML 2.0 型聯合。以下步驟介紹了用於配置此信任關係的一般過程。組織內部必須有[支援 SAML 2.0 的 IdP](id_roles_providers_saml_3rd-party.md)，例如 Microsoft Active Directory Federation Service (AD FS，Windows Server 的一部分)、Shibboleth 或其他相容的 SAML 2.0 提供者。

**注意**  
若要改善聯合彈性，建議您將 IdP 和 AWS 聯合設定為支援多個 SAML 登入端點。如需詳細資訊，請參閱 AWS 安全部落格文章[如何使用區域 SAML 端點進行容錯移轉](https://aws.amazon.com/blogs//security/how-to-use-regional-saml-endpoints-for-failover)。

**將組織的 IdP 和 AWS 設定為彼此信任**

1. 向組織的 IdP 註冊 AWS 為服務提供者 (SP)。使用 `https://region-code.signin.aws.amazon.com/static/saml-metadata.xml` 中的 SAML 中繼資料文件

   對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。

   您可以選擇性地使用 `https://signin.aws.amazon.com/static/saml-metadata.xml` 中的 SAML 中繼資料文件。

1. <a name="createxml"></a>使用組織的 IdP 時，會產生一個同等的 SAML 中繼資料 XML 檔案，該檔案可將 IdP 描述為 AWS中的 IAM 身分提供者。它必須包含發行者名稱、建立日期、過期日期，以及 AWS 可用來驗證組織中身分驗證回應 （聲明） 的金鑰。

   如果您允許從外部 IdP 傳送加密的 SAML 聲明，您必須使用組織的 IdP 產生私有金鑰檔案，並以 .pem 檔案格式將此檔案上傳至您的 IAM SAML 組態。 AWS STS 需要此私有金鑰來解密對應至上傳到 IdP 之公有金鑰的 SAML 回應。
**注意**  
如 [SAML V2.0 Metadata Interoperability Profile Version 1.0](https://docs.oasis-open.org/security/saml/Post2.0/sstc-metadata-iop-os.html) 所定義，IAM 既不會評估 SAML 中繼資料文件中的 X.509 憑證是否過期，也不會對其採取動作。如果您擔心過期的 X.509 憑證，建議您監控憑證過期日期，並根據組織的治理和安全政策輪換憑證。

1. <a name="samlovrcreateentity"></a>在 IAM 主控台中，您可以建立一個 SAML 身分提供者。在此過程中，您將上傳由組織的 IdP 在[Step 2](#createxml) 中產生的 SAML 中繼資料文件和私有解密金鑰。如需詳細資訊，請參閱[在 IAM 中建立 SAML 身分提供者](id_roles_providers_create_saml.md)。

1. <a name="samlovrcreaterole"></a>在 IAM 中，建立一或多個 IAM 角色。在角色的信任政策中，您將 SAML 提供者設定為委託人，這會在您的組織與 之間建立信任關係 AWS。該角色的許可政策將決定允許您組織的使用者在 AWS中執行的操作。如需詳細資訊，請參閱[為第三方身分提供者建立角色](id_roles_create_for-idp.md)。
**注意**  
角色信任政策中使用的 SAML IDP 必須與角色所在的帳戶相同。

1. 在您組織的 IdP 中，定義可將組織中的使用者或群組映射到 IAM 角色的聲明。請注意，組織中不同的使用者和群組可能映射到不同的 IAM 角色。執行映射的確切步驟取決於您使用的 IdP。在使用者的 Amazon S3 資料夾的[早期方案](#CreatingSAML-configuring)中，可能出現所有使用者映射到提供 Amazon S3 許可的同一角色的情況。如需詳細資訊，請參閱[為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

   如果您的 IdP 啟用 AWS 主控台的 SSO，則您可以設定主控台工作階段的最長持續時間。如需詳細資訊，請參閱[啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。

1. 在您建立的應用程式中，您可以呼叫 AWS Security Token Service `AssumeRoleWithSAML` API，將您在 中建立的 SAML 提供者的 ARN[Step 3](#samlovrcreateentity)、在 中建立的角色的 ARN[Step 4](#samlovrcreaterole)，以及關於您從 IdP 取得之目前使用者的 SAML 聲明傳遞給 API。 AWS 確保擔任角色的請求來自 SAML 提供者中參考的 IdP。

   如需詳細資訊，請參閱 *AWS Security Token Service API 參考*中的 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)。

1. 如果請求成功，API 會傳回一組臨時安全性憑證，您的應用程式即可用其向 AWS發出已簽署的請求。您的應用程式具有有關目前使用者的資訊並可存取 Amazon S3 中使用者特定的資料夾，如上一方案中所述。

## 允許 SAML 聯合存取 AWS 資源的角色概觀
<a name="CreatingSAML-configuring-role"></a>

IAM 中建立的角色定義了組織中允許在 AWS中執行操作的 SAML 聯合身分主體。當您為角色建立信任政策時，您可以將先前建立的 SAML 提供者指定為 `Principal`。此外，您還可以使用 `Condition` 設定信任政策的範圍，以便僅允許與特定 SAML 屬性相符的使用者存取角色。例如，您可以指定僅允許 SAML 從屬關係為 `staff` (在 https://openidp.feide.no 中聲明) 的使用者存取角色，如以下範例政策所示：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"Federated": "arn:aws:iam::111122223333:saml-provider/ExampleOrgSSOProvider"},
    "Action": "sts:AssumeRoleWithSAML",
    "Condition": {
      "StringEquals": {
        "saml:aud": "https://us-east-1.signin.aws.amazon.com/saml",
        "saml:iss": "https://openidp.feide.no"
      },
      "ForAllValues:StringLike": {"saml:edupersonaffiliation": ["staff"]}
    }
  }]
}
```

------

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws-cn:iam::111122223333:saml-provider/ExampleOrgSSOProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "saml:aud": "https://ap-east-1.signin.amazonaws.cn/saml",
                    "saml:iss": "https://openidp.feide.no"
                },
                "ForAllValues:StringLike": {
                    "saml:edupersonaffiliation": [
                        "staff"
                    ]
                }
            }
        }
    ]
}
```

------

**注意**  
角色信任政策中使用的 SAML IDP 必須與角色所在的帳戶相同。

政策中的 `saml:aud` 內容索引鍵指定了登入主控台時瀏覽器顯示的 URL。此登入端點 URL 必須與身分提供者的 recipient 屬性相符。可在特定區域內包含登入 URL。 AWS 建議使用區域端點而非全域端點，以便改善聯合身分彈性。如果僅設定一個端點，在極少數情況下若該端點不可用，將無法聯合登入 AWS 。對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。

下列範例展示了包含選用 `region-code` 的登入 URL 格式。

`https://region-code.signin.aws.amazon.com/saml`

如果需要 SAML 加密，登入 URL 必須包含 AWS 指派給 SAML 提供者的唯一識別碼，您可以在「身分提供者詳細資訊」頁面上找到此識別碼。在下列範例中，登入 URL 包含 IdP 唯一識別碼，這需要在登入路徑後附加 /acs/。

`https://region-code.signin.aws.amazon.com/saml/acs/IdP-ID`

對於該角色中的許可政策，您可以像任何角色一樣指定許可。例如，如果允許您組織的使用者管理 Amazon Elastic Compute Cloud 執行個體，您必須在許可政策中明確允許 Amazon EC2 動作 (例如 **AmazonEC2FullAccess** 受管政策中的動作)。

如需有關您可以在政策中簽署的 SAML 索引鍵的詳細資訊，請參閱 [SAML AWS STS 型聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-saml)。

## 單獨辨識以 SAML 為基礎的聯合身分中的使用者
<a name="CreatingSAML-userid"></a>

在 IAM 中建立存取政策時，可根據使用者的身分指定許可，這一點通常很有用。舉例來說，對於已使用 SAML 聯合身分的使用者，應用程式可能希望使用如下的結構保留 Amazon S3 中的資訊：

```
amzn-s3-demo-bucket/app1/user1
amzn-s3-demo-bucket/app1/user2
amzn-s3-demo-bucket/app1/user3
```

您可以透過 Amazon S3 主控台或 建立儲存貯體 (`amzn-s3-demo-bucket`) 和資料夾 (`app1`) AWS CLI，因為這些是靜態值。不過，使用者特定的資料夾 (*user1*、*user2*、*user3* 等等) 必須在執行階段使用程式碼建立，因為在使用者首次透過聯合身分程序登入時，用來識別使用者的值未知。

若要編寫在資源名稱中引用特定於使用者的詳細資訊的政策，必須在可以用於政策條件的 SAML 索引鍵中提供使用者身分。以下索引鍵可供以 SAML 2.0 為基礎的聯合身分在 IAM 政策中使用。您可以使用以下索引鍵傳回的值為資源 (如 Amazon S3 資料夾) 建立唯一的使用者識別碼。
+ `saml:namequalifier`. 雜湊值，以 `Issuer` 回應值 (`saml:iss`)、含 `AWS` 帳戶 ID 的字串與 IAM 中 SAML 提供者的易記名稱 (ARN 的最後一部分) 的串聯為基礎。帳戶 ID 與 SAML 提供者的易記名稱的串聯可作為索引鍵 `saml:doc` 供 IAM 政策使用。帳戶 ID 與提供者名稱必須使用「/」分隔，例如「123456789012/provider\$1name」。如需詳細資訊，請參閱 `saml:doc` 中的 [SAML AWS STS 型聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-saml) 索引鍵。

  `NameQualifier` 與 `Subject` 的組合可用於唯一識別 SAML 聯合身分主體。下列虛擬程式碼顯示這個值是如何計算出來的。在此虛擬程式碼中，`+` 表示串聯，`SHA1` 代表使用 SHA-1 產生訊息摘要的功能，`Base64` 64 代表產生雜湊輸出的 Base-64 編碼版本的功能。

   `Base64 ( SHA1 ( "https://example.com/saml" + "123456789012" + "/MySAMLIdP" ) )` 

   如需有關可用於以 SAML 為基礎的聯合身分政策索引鍵的詳細資訊，請參閱 [SAML AWS STS 型聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-saml)。
+ `saml:sub` (string). 這是該陳述的主題，其中包含單獨辨識組織中某個使用者的值 (例如 `_cbb88bf52c2510eabe00c1642d4643f41430fe25e3`)。
+ `saml:sub_type` (string). 此索引鍵可以是 `persistent`、`transient` 或在您的 SAML 聲明中使用的 `Format` 與 `Subject` 元素的完整 `NameID` URI。`persistent` 的值表示在所有工作階段中使用者的 `saml:sub` 值是相同的。如果值為 `transient`，則使用者在每個工作階段中擁有不同的 `saml:sub` 值。如需 `NameID` 元素的 `Format` 屬性的詳細資訊，請參閱 [為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

以下範例顯示了一個許可政策，該政策使用上述索引鍵為 Amazon S3 中的使用者特定資料夾授予許可。該政策假設 Amazon S3 物件使用同時包含 `saml:namequalifier` 與 `saml:sub` 的字首識別。請注意，`Condition` 元素包括一個測試，用於確保 `saml:sub_type` 設為 `persistent`。如果已設為 `transient`，每個工作階段使用者的 `saml:sub` 值可能不同，因此不應使用值的組合來辨識使用者特定的資料夾。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "s3:GetObject",
      "s3:PutObject",
      "s3:DeleteObject"
    ],
    "Resource": [
      "arn:aws:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}",
      "arn:aws:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}/*"
    ],
    "Condition": {"StringEquals": {"saml:sub_type": "persistent"}}
  }
}
```

------

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "s3:GetObject",
      "s3:PutObject",
      "s3:DeleteObject"
    ],
    "Resource": [
      "arn:aws-cn:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}",
      "arn:aws-cn:s3:::amzn-s3-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}/*"
    ],
    "Condition": {"StringEquals": {"saml:sub_type": "persistent"}}
  }
}
```

------

如需有關從 IdP 映射聲明到政策索引鍵的詳細資訊，請參閱 [為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

# 在 IAM 中建立 SAML 身分提供者
<a name="id_roles_providers_create_saml"></a>

IAM SAML 2.0 身分提供者是 IAM 中的實體，其負責描述支援 [SAML 2.0 (安全性聲明標記語言 2.0)](https://wiki.oasis-open.org/security) 標準的外部身分提供者 (IdP) 服務。當您想要在 Shibboleth 或 Active Directory Federation Services 和 等 SAML 相容 IdP 之間建立信任時 AWS，您可以使用 IAM 身分提供者，以便您的使用者可以存取 AWS 資源。在 IAM 信任政策中，IAM SAML 身分提供者將作為主體。

如需有關此案例的詳細資訊，請參閱 [SAML 2.0 聯合身分](id_roles_providers_saml.md)。

您可以在 中或使用 Tools for Windows PowerShell 或 AWS API 呼叫 AWS 管理主控台 AWS CLI來建立和管理 IAM 身分提供者。

在您建立 SAML 提供者之後，您必須建立一個或多個 IAM 角色。角色是 中的身分 AWS ，沒有自己的登入資料 （與使用者相同）。但在此情況中，角色會動態指派給 SAML 聯合身分主體，而該主體由 IdP 進行驗證。該角色允許您的 IdP 請求暫時性安全憑證以存取 AWS。指派給角色的政策會決定允許使用者在其中執行的操作 AWS。若要為 SAML 聯合身分建立角色，請參閱 [為第三方身分提供者建立角色](id_roles_create_for-idp.md)。

最後，在建立角色之後，您可以使用有關 的資訊 AWS 和您希望 SAML 聯合委託人使用的角色來設定 IdP，以完成 SAML 信任。這是指在您的 IdP 和 AWS之間設定依賴方信任。若要設定依賴方信任，請參閱[使用依賴方信任設定您的 SAML 2.0 IdP 並新增宣告](id_roles_providers_create_saml_relying-party.md)。

**Topics**
+ [先決條件](#idp-manage-identityprovider-prerequisites)
+ [建立並管理 IAM SAML 身分提供者 (主控台)](#idp-manage-identityprovider-console)
+ [管理 SAML 加密金鑰](#id_federation_manage-saml-encryption)
+ [建立並管理 IAM SAML 身分提供者 (AWS CLI)](#idp-create-identityprovider-CLI)
+ [建立和管理 IAM SAML 身分提供者 (AWS API)](#idp-create-identityprovider-API)
+ [後續步驟](#id_roles_create-for-saml-next-steps)

## 先決條件
<a name="idp-manage-identityprovider-prerequisites"></a>

您必須從 IdP 取得下列資訊，然後才能建立 SAML 身分提供者。
+ 從 IdP 取得 SAML 中繼資料文件。此文件包括發行者的名稱、到期資訊以及可用於驗證從 IdP 接收的 SAML 身分驗證回應 (宣告) 的金鑰。若要產生中繼資料文件，請使用您的外部 IdP 提供的身分管理軟體。
**重要**  
此中繼資料檔案包括發行者名稱、過期資訊以及可用於驗證從 IdP 接收的 SAML 身分驗證回應 (聲明) 的金鑰。中繼資料檔案必須以 UTF-8 格式編碼，並且不含位元組順序記號 (BOM)。若要移除 BOM，您可以使用文字編輯工具，例如 Notepad\$1\$1，將檔案編碼為 UTF-8。  
包含在 SAML 中繼資料文件中的 X.509 憑證必須使用大小至少有 1024 位元的金鑰。此外，X.509 憑證也必須沒有任何重複的擴充。您可以使用擴充，但這些擴充只能在憑證中出現一次。如果 X.509 憑證不符合任一條件，IdP 建立會失敗，並傳回 "Unable to parse metadata" 錯誤。  
如 [SAML V2.0 Metadata Interoperability Profile Version 1.0](https://docs.oasis-open.org/security/saml/Post2.0/sstc-metadata-iop-os.html) 所定義，IAM 既不會評估 SAML 中繼資料文件中的 X.509 憑證是否過期，也不會對其採取動作。如果您擔心過期的 X.509 憑證，建議您監控憑證過期日期，並根據組織的治理和安全政策輪換憑證。
+ 如果選擇啟用 SAML 加密，必須使用 IdP 產生私有金鑰檔案，並以 .pem 檔案格式將此檔案上傳至 IAM SAML 組態。 AWS STS 需要此私有金鑰，才能解密對應於上傳至 IdP 之公有金鑰的 SAML 回應。支援下列演算法：
  + 加密演算法
    + AES-128
    + AES-256
    + RSA-OAEP
  + 金鑰傳輸演算法
    + AES-CBC
    + AES-GCM

  如需產生私有金鑰的步驟，請參閱身分提供者的文件。
**注意**  
IAM Identity Center 和 Amazon Cognito 不支援來自 IAM SAML 身分提供者的加密 SAML 聲明。您可以間接將對加密 SAML 聲明的支援新增至 Amazon Cognito 身分集區與 Amazon Cognito 使用者集區的聯合。使用者集區具有獨立 IAM SAML 聯合身分的 SAML 聯合身分，並支援 [SAML 簽署和加密](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pools-SAML-signing-encryption.html)。雖然此功能不會直接延伸至身分集區，但使用者集區可以是身分集區的 IdP。若要將 SAML 加密與身分集區搭配使用，請將具有加密功能的 SAML 提供者新增至作為身分集區的 IdP 的使用者集區。  
您的 SAML 提供者必須能夠使用使用者集區提供的金鑰來加密 SAML 聲明。使用者集區不會接受使用 IAM 提供的憑證加密的聲明。

如需如何設定許多可用 IdPs 以使用的指示 AWS，包括如何產生所需的 SAML 中繼資料文件，請參閱 [將第三方 SAML 解決方案供應商與 整合 AWS](id_roles_providers_saml_3rd-party.md)。

如需 SAML 聯合身分的協助，請參閱[對 SAML 聯合身分進行疑難排解](troubleshoot_saml.md)。

## 建立並管理 IAM SAML 身分提供者 (主控台)
<a name="idp-manage-identityprovider-console"></a>

您可以使用 AWS 管理主控台 來建立、更新和刪除 IAM SAML 身分提供者。如需 SAML 聯合身分的協助，請參閱[對 SAML 聯合身分進行疑難排解](troubleshoot_saml.md)。

**建立 IAM SAML 身分提供者 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，請選擇 **Identity providers** (身分提供者)，然後選擇 **Add provider** (新增提供者)。

1. 在 **Configure provider** (設定提供者) 中，選擇 **SAML**。

1. 輸入身分提供者的名稱。

1. 對於 **Metadata document** (中繼資料文件)，選擇 **Choose file** (選擇檔案)，並指定您在 [先決條件](#idp-manage-identityprovider-prerequisites) 下載的 SAML 中繼資料文件。
**注意**  
SAML 中繼資料文件中的 `validUntil` 或 `cacheDuration` 屬性定義了身分提供者的**有效截止時間**日期。如果 SAML 中繼資料文件不包含有效期間屬性，則**有效截止時間**日期將與 X.509 憑證過期日期不符。  
IAM 既不會評估 SAML 中繼資料文件中的 X.509 憑證是否過期，也不會對其採取動作。如果您擔心過期的 X.509 憑證，建議您監控憑證過期日期，並根據組織的治理和安全政策輪換憑證。

1. (選用) 在 **SAML 加密**欄位中，選擇**選擇檔案**，然後選取您在 [先決條件](#idp-manage-identityprovider-prerequisites) 中建立的私有金鑰檔案。選擇**需要加密**以僅接受來自 IdP 的加密請求。

1. (選用) 對於 **Add tags** (新增標籤)，您可以新增鍵值組，以協助您識別和整理 IdP。您也可以使用標籤來控制對 AWS 資源的存取。若要進一步了解如何標記 SAML 身分提供者，請參閱[標記 IAM SAML 身分提供者](id_tags_saml.md)。

   選擇 **Add tag (新增標籤)**。輸入每個標籤鍵值組的值。

1. 請確認您提供的資訊。完成後，請選擇 **Add provider** (新增提供者)。

1. 將 IAM 角色指派給您的身分提供者。此角色提供身分提供者管理的外部使用者身分許可，以存取您帳戶中 AWS 的資源。若要深入了解如何建立聯合身分角色，請參閱 [為第三方身分提供者建立角色](id_roles_create_for-idp.md)。
**注意**  
角色信任政策中使用的 SAML IDP 必須與角色所在的帳戶相同。

**刪除 SAML 提供者 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

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

1. 在您要刪除的身分提供者旁邊，選取選項按鈕。

1. 選擇 **Delete** (刪除)。新的視窗將開啟。

1. 在欄位中輸入單字 `delete`，確認您要刪除提供者。再選擇 **Delete** (刪除)。

## 管理 SAML 加密金鑰
<a name="id_federation_manage-saml-encryption"></a>

您可以將 IAM SAML 供應商設定為從外部 IdP 接收 SAML 回應中的加密聲明。使用者可以在 AWS 中使用加密的 SAML 聲明擔任角色，方法是呼叫 `[sts:AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)`。

SAML 加密可確保聲明在透過中介或第三方傳遞時是安全的。此外，此功能可協助您符合 FedRAMP 或任何強制要求 SAML 聲明加密的內部合規政策要求。

若要設定 IAM SAML 身分提供者，請參閱[在 IAM 中建立 SAML 身分提供者](#id_roles_providers_create_saml)。如需 SAML 聯合身分的協助，請參閱[對 SAML 聯合身分進行疑難排解](troubleshoot_saml.md)。

### 輪換 SAML 加密金鑰
<a name="id_federation_manage-saml-keys-rotate"></a>

IAM 使用您上傳至 IAM SAML 提供者的私有金鑰，從 IdP 解密加密的 SAML 聲明。您可以為每個身分提供者儲存最多兩個私有金鑰檔案，讓您視需要輪換私有金鑰。儲存兩個檔案時，每個請求會先嘗試以最新**新增**日期解密，然後 IAM 會嘗試以最舊**新增**日期解密請求。

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在導覽窗格中，請選擇**身分提供者**，然後從清單中選取提供者。

1. 選擇 **SAML 加密**索引標籤，然後選擇**新增金鑰**。

1. 選取**選擇檔案**，並上傳您從 IdP 下載的私有金鑰作為 .pem 檔案。然後，選擇**新增金鑰**。

1. 在 **SAML 解密的私有金鑰**區段中，選取過期的私有金鑰檔案，然後選擇**移除**。建議在新增私有金鑰之後移除過期的私有金鑰，確保首次嘗試解密聲明能夠成功。

## 建立並管理 IAM SAML 身分提供者 (AWS CLI)
<a name="idp-create-identityprovider-CLI"></a>

您可以使用 AWS CLI 來建立、更新和刪除 SAML 供應商。如需 SAML 聯合身分的協助，請參閱[對 SAML 聯合身分進行疑難排解](troubleshoot_saml.md)。

**建立 IAM 身分提供者並上傳中繼資料文件 (AWS CLI)**
+ 執行此命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/create-saml-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-saml-provider.html)

**若要更新 IAM SAML 身分提供者 (AWS CLI)**

您可以更新中繼資料檔案、SAML 加密設定，以及輪換 IAM SAML 提供者的私有金鑰解密檔案。若要輪換私有金鑰，請在個別請求中新增私有金鑰，然後移除舊金鑰。如需有關輪換私有金鑰的詳細資訊，請參閱 [管理 SAML 加密金鑰](#id_federation_manage-saml-encryption)。
+ 執行此命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/update-saml-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/update-saml-provider.html)

**標記現有 IAM 身分提供者 (AWS CLI)**
+ 執行此命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/tag-saml-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-saml-provider.html)

**列出現有 IAM 身分提供者的標籤 (AWS CLI)**
+ 執行此命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/list-saml-provider-tags.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-saml-provider-tags.html)

**移除現有 IAM 身分提供者的標籤 (AWS CLI)**
+ 執行此命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/untag-saml-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-saml-provider.html)

**刪除 IAM SAML 身分提供者 (AWS CLI)**

1. (選用) 若要列出所有提供者的資訊，例如 ARN、建立日期和過期日期，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/list-saml-providers.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-saml-providers.html)

1. (選用) 若要取得有關特定提供者的資訊 (例如 ARN、建立日期、過期日期、加密設定和私有金鑰資訊)，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/get-saml-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/get-saml-provider.html)

1. 若要刪除 IAM 身分提供者，請執行下列命令：
   + [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-saml-provider.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-saml-provider.html)

## 建立和管理 IAM SAML 身分提供者 (AWS API)
<a name="idp-create-identityprovider-API"></a>

您可以使用 AWS API 來建立、更新和刪除 SAML 供應商。如需 SAML 聯合身分的協助，請參閱[對 SAML 聯合身分進行疑難排解](troubleshoot_saml.md)。

**建立 IAM 身分提供者並上傳中繼資料文件 (AWS API)**
+ 呼叫此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateSAMLProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateSAMLProvider.html)

**更新 IAM SAML 身分提供者 (AWS API)**

您可以更新中繼資料檔案、SAML 加密設定，以及輪換 IAM SAML 提供者的私有金鑰解密檔案。若要輪換私有金鑰，請在個別請求中新增私有金鑰，然後移除舊金鑰。如需有關輪換私有金鑰的詳細資訊，請參閱 [管理 SAML 加密金鑰](#id_federation_manage-saml-encryption)。
+ 呼叫此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateSAMLProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateSAMLProvider.html)

**標記現有的 IAM 身分提供者 (AWS API)**
+ 呼叫此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagSAMLProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagSAMLProvider.html)

**列出現有 IAM 身分提供者 (AWS API) 的標籤**
+ 呼叫此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSAMLProviderTags.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSAMLProviderTags.html)

**移除現有 IAM 身分提供者 (AWS API) 上的標籤**
+ 呼叫此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagSAMLProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagSAMLProvider.html)

**刪除 IAM 身分提供者 (AWS API)**

1. (選用) 若要列出所有 IdP 的資訊，例如 ARN、建立日期和過期，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSAMLProviders.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSAMLProviders.html)

1. (選用) 若要取得有關特定提供者的資訊 (例如 ARN、建立日期、過期日期、加密設定和私有金鑰資訊)，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSAMLProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSAMLProvider.html)

1. 若要刪除 IdP，請呼叫下列操作：
   + [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteSAMLProvider.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteSAMLProvider.html)

## 後續步驟
<a name="id_roles_create-for-saml-next-steps"></a>

建立 SAML 身分提供者之後，使用 IdP 設定依賴方信任。您也可以在政策中使用來自 IdP 身分驗證回應的宣告，來控制對角色的存取。
+ 您必須告知 IdP AWS 作為服務提供者。這稱為在 IdP 和 AWS之間新增依賴方信任。新增依賴方信任的過程，取決於您使用哪種 IdP。如需詳細資訊，請參閱[使用依賴方信任設定您的 SAML 2.0 IdP 並新增宣告](id_roles_providers_create_saml_relying-party.md)。
+ 當 IdP 傳送包含宣告的回應至 時 AWS，許多傳入宣告會對應至 AWS 內容索引鍵。您可以利用 Condition 元素在 IAM 政策中使用這些內容索引鍵，來控制對角色的存取。如需詳細資訊，請參閱[為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)

# 使用依賴方信任設定您的 SAML 2.0 IdP 並新增宣告
<a name="id_roles_providers_create_saml_relying-party"></a>

當您為 SAML 存取權建立 IAM 身分提供者和角色時，基本上是在告知 AWS 有關允許身分提供者 (IdP) 和其使用者執行哪些動作。您的下一個步驟是告知 IdP AWS 作為服務提供者。這稱為在 IdP 和 * 之間新增*依賴方信任 AWS。新增依賴方信任的過程，取決於您使用哪種 IdP。如需詳細資訊，請參閱身分管理軟體的文件。

許多 IdP 都可以讓您指定 URL，以供 IdP 從其讀取包含依賴方資訊和憑證的 XML 文件。對於 AWS，請使用登入端點 URL。下列範例展示了包含選用 `region-code` 的 URL 格式。

`https://region-code.signin.aws.amazon.com/static/saml-metadata.xml`

如果需要 SAML 加密，URL 必須包含 AWS 指派給 SAML 供應商的唯一識別符，您可以在身分提供者詳細資訊頁面上找到該識別符。下列範例展示了包含唯一識別碼的區域登入 URL。

`https://region-code.signin.aws.amazon.com/static/saml/IdP-ID/saml-metadata.xml`

對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。對於 AWS 值，您也可以使用非區域端點 `https://signin.aws.amazon.com/saml`。

如果您無法直接指定 URL，請從先前的 URL 下載 XML 文件，然後匯入到您的 IdP 軟體。

您也需要在 IdP 中建立適當的宣告規則，將 指定 AWS 為依賴方。當 IdP 將 SAML 回應傳送至 AWS 端點時，它會包含包含一或多個*宣告*的 SAML *聲明*。宣告是和使用者及其群組相關的資訊。宣告規則將該資訊對應到 SAML 屬性。這可讓您確保來自 IdP 的 SAML 身分驗證回應包含 IAM 政策 AWS 中使用的必要屬性，以檢查 SAML 聯合身分主體的許可。如需詳細資訊，請參閱下列主題：
+  [允許 SAML 聯合存取 AWS 資源的角色概觀](id_roles_providers_saml.md#CreatingSAML-configuring-role)。此主題討論在 IAM 政策中使用 SAML 特定金鑰，以及如何使用這些政策來限制 SAML 聯合身分主體的許可。
+ [為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md). 此主題討論如何設定 SAML 宣告，其包含有關使用者的資訊。聲明已捆綁在 SAML 聲明中，並且包含在傳送到 AWS的 SAML 回應中。您必須確保 AWS 政策所需的資訊以 AWS 可識別和使用的形式包含在 SAML 聲明中。
+  [將第三方 SAML 解決方案供應商與 整合 AWS](id_roles_providers_saml_3rd-party.md)。 本主題提供第三方組織提供有關如何整合身分解決方案的文件連結 AWS。

**注意**  
若要改善聯合彈性，建議您將 IdP 和 AWS 聯合設定為支援多個 SAML 登入端點。如需詳細資訊，請參閱 AWS 安全部落格文章[如何使用區域 SAML 端點進行容錯移轉](https://aws.amazon.com/blogs//security/how-to-use-regional-saml-endpoints-for-failover)。

# 將第三方 SAML 解決方案供應商與 整合 AWS
<a name="id_roles_providers_saml_3rd-party"></a>

**注意**  
我們建議您要求人類使用者在存取時使用臨時登入資料 AWS。您是否考慮過使用 AWS IAM Identity Center？ 您可以使用 IAM Identity Center 集中管理對多個 的存取， AWS 帳戶 並為使用者提供受 MFA 保護的單一登入存取，可從單一位置存取其所有指派的帳戶。使用 IAM Identity Center，您可以在 IAM Identity Center 中建立和管理使用者身分，或輕鬆連線至您現有的 SAML 2.0 相容身分提供者。如需詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[什麼是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

下列連結可協助您設定第三方 SAML 2.0 身分提供者 (IdP) AWS 解決方案以使用聯合。請洽詢您的身分提供者，以判斷他們是否支援 SAML 權杖加密。如需 SAML 加密要求，請參閱[管理 SAML 加密金鑰](id_roles_providers_create_saml.md#id_federation_manage-saml-encryption)。

**提示**  
AWS 支援工程師可以透過涉及第三方軟體的一些整合任務，協助擁有業務和企業支援計劃的客戶。如需所支援平台和應用程式的最新清單，請參閱 *AWS Support 常見問答集*中的[支援哪些第三方軟體？](https://aws.amazon.com/premiumsupport/faqs/#what3rdParty)


****  

| 解決方案 | 其他資訊 | 
| --- | --- | 
| Auth0 |  [與 Amazon Web Services 整合](https://auth0.com/docs/integrations/aws) – Auth0 文件網站上的此頁面提供 資源的連結，說明如何使用 設定單一登入 (SSO)， AWS 管理主控台 並包含 JavaScript 範例。您可以設定 Auth0 來傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱 [Auth0 宣布與 AWS for IAM 工作階段標籤的合作夥伴關係](https://auth0.com/blog/auth0-partners-with-aws-for-iam-session-tags/)。 | 
| Microsoft Entra |  [教學課程：Microsoft Entra SSO 與 AWS 單一帳戶存取整合](https://learn.microsoft.com/en-us/azure/active-directory/saas-apps/amazon-web-service-tutorial) – Microsoft 網站上的本教學課程說明如何使用 SAML 聯合將 Microsoft Entra （先前稱為 Azure AD) 設定為身分提供者 (IdP)。 | 
| Centrify | [設定 Centrify 並使用 SAML for SSO to AWS](https://docs.centrify.com/Content/Applications/AppsWeb/AmazonSAML.htm) – Centrify 網站上的此頁面說明如何將 Centrify 設定為使用 SAML for SSO to AWS。 | 
| CyberArk | 設定 [CyberArk](https://docs.cyberark.com/Product-Doc/OnlineHelp/Idaptive/Latest/en/Content/Applications/AppsWeb/AmazonSAML.htm) 以提供 Amazon Web Services (AWS) 存取許可，讓使用者從 CyberArk 使用者入口網站透過 SAML 單一登入 (SSO) 進行登入。 | 
| ForgeRock | [ForgeRock Identity Platform](https://backstage.forgerock.com/docs/am/6.5/saml2-guide/#saml2-create-hosted-idp) 與 整合 AWS。您可以設定 ForgeRock 來傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱 [Amazon Web Services 的屬性型存取控制](https://www.forgerock.com/blog/attribute-based-access-control-amazon-web-services)。 | 
| Google Workspace | [Amazon Web Services 雲端應用程式](https://support.google.com/a/answer/6194963) – Google Workspace Admin Help 網站上的這篇文章說明如何使用 作為服務提供者 AWS ，將 Google Workspace 設定為 SAML 2.0 IdP。 | 
| IBM | 您可以設定 IBM 傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱 [IBM Cloud Identity IDaaS，這是支援 AWS 工作階段標籤的其中一個](https://community.ibm.com/community/user/security/blogs/adam-case/2019/11/25/ibm-cloud-identity-idaas-one-of-first-to-support-aws-session-tags)。 | 
| JumpCloud |  [使用 Amazon 透過 IAM 角色授予單一登入 (SSO) 存取 AWS](https://support.jumpcloud.com/support/s/article/Granting-Access-via-IAM-Roles-for-Single-Sign-On-SSO-with-Amazon-AWS) – JumpCloud 網站上的這篇文章說明如何根據 IAM 角色設定和啟用 SSO AWS。 | 
| Matrix42 | [MyWorkspace 入門指南](https://myworkspace.matrix42.com/documents/MyWorkspace-Getting-Started-with-AWS.pdf) – 本指南說明如何將 AWS 身分服務與 Matrix42 MyWorkspace 整合。 | 
| Microsoft Active Directory Federation Services (AD FS) |  [欄位備註：將 Active Directory Federation Service 與 整合 AWS IAM Identity Center](https://aws.amazon.com/blogs/architecture/field-notes-integrating-active-directory-federation-service-with-aws-single-sign-on/) – AWS 架構部落格上的這篇文章說明 AD FS 和 AWS IAM Identity Center (IAM Identity Center) 之間的身分驗證流程。IAM Identity Center 使用 SAML 2.0 支援聯合身分，可與 AD FS 解決方案整合。使用者可透過其公司憑證登入 IAM Identity Center 入口網站，減少在 IAM Identity Center 上維護單獨憑證的管理開銷。您也可以設定 AD FS 來傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱[搭配 AD FS 使用屬性型存取控制，以簡化 IAM 許可管理](https://aws.amazon.com/blogs/security/attribute-based-access-control-ad-fs-simplify-iam-permissions-management/)。  | 
| miniOrange | [SSO for AWS](http://miniorange.com/amazon-web-services-%28aws%29-single-sign-on-%28sso%29) – miniOrange 網站上的此頁面說明如何 AWS 為企業建立安全存取，並完全控制應用程式的存取 AWS 。 | 
| Okta |  [使用 Okta 整合 Amazon Web Services 命令列介面](https://support.okta.com/help/Documentation/Knowledge_Article/Integrating-the-Amazon-Web-Services-Command-Line-Interface-Using-Okta) – 從 Okta 支援網站的這個頁面，您可以了解如何設定 Okta 以與 AWS一起使用。您可以設定 Okta 傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱 [Okta 和 AWS 合作夥伴透過工作階段標籤簡化存取](https://www.okta.com/blog/2019/11/okta-and-aws-partner-to-simplify-access-via-session-tags/)。 | 
| Okta | [AWS 帳戶聯合](https://help.okta.com/oie/en-us/Content/Topics/DeploymentGuides/AWS/aws-deployment.htm) – Okta 網站上的本節說明如何設定和啟用 IAM Identity Center AWS。 | 
| OneLogin | 從 [OneLogin 知識庫](https://onelogin.service-now.com/support)中，搜尋文章SAML AWS清單，說明如何在 OneLogin 和 之間設定 IAM Identity Center 功能， AWS 以尋找單一角色和多角色案例。您可以設定 OneLogin 傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱 [OneLogin 和工作階段標籤：以屬性為基礎的 AWS 資源存取控制](https://www.onelogin.com/blog/aws-session-tags-integration)。 | 
| Ping 身分 |  [PingFederate AWS Connector](https://support.pingidentity.com/s/marketplace-integration-details?recordId=a7i1W0000004HBwQAM) – 檢視 PingFederate AWS Connector 的詳細資訊，這是一種快速連線範本，可輕鬆設定單一登入 (SSO) 和佈建連線。閱讀文件並下載最新的 PingFederate AWS Connector 以進行整合 AWS。您可以設定 Ping 身分以傳遞[工作階段標籤](id_session-tags.md)。如需詳細資訊，請參閱[宣佈 Ping Identity 支援 AWS中的屬性型存取控制](https://support.pingidentity.com/s/document-item?bundleId=integrations&topicId=pon1571779451105.html)。  | 
| RadiantLogic | [Radiant Logic Technology Partners](http://www.radiantlogic.com/about/partners/technology-partners/) – Radiant Logic 的 RadiantOne 聯合身分服務與 整合 AWS ，為 SAML 型 SSO 提供身分中樞。 | 
| RSA | [Amazon Web Services - RSA Ready Implementation Guide](https://community.rsa.com/s/article/Amazon-Web-Services-RSA-Ready-Implementation-Guide) 提供整合 AWS 和 RSA 的指引。如需有關 SAML 組態的詳細資訊，請參閱 [Amazon Web Services - SAML My Page SSO Configuration - RSA Ready Implementation Guide](https://community.rsa.com/s/article/Amazon-Web-Services-SAML-My-Page-SSO-Configuration-RSA-Ready-Implementation-Guide)。 | 
| Salesforce.com |  [如何設定從 Salesforce 到 的 SSO AWS](https://developer.salesforce.com/page/Configuring-SAML-SSO-to-AWS) – https：//Salesforce.com 開發人員網站上的此教學文章說明如何在 Salesforce 中設定身分提供者 (IdP)，並將 AWS 設定為服務提供者。 | 
| SecureAuth |  [AWS - SecureAuth SAML SSO](https://docs.secureauth.com/2104/en/amazon-web-services--aws---idp-initiated--integration-guide.html) – SecureAuth 網站上的這篇文章說明如何為 SecureAuth 設備設定與 AWS 的 SAML 整合。 | 
| Shibboleth |  [如何使用 Shibboleth 進行 SSO 到 AWS 管理主控台](https://aws.amazon.com/blogs/security/how-to-use-shibboleth-for-single-sign-on-to-the-aws-management-console) - AWS 安全部落格上的這個項目提供step-by-step教學，說明如何設定 Shibboleth 並將其設定為 的身分提供者 AWS。您可以設定 Shibboleth 傳遞[工作階段標籤](id_session-tags.md)。 | 

如需詳細資訊，請參閱 AWS 網站上的 [IAM 合作夥伴](https://aws.amazon.com/iam/partners/)頁面。

# 為身分驗證回應設定 SAML 聲明
<a name="id_roles_providers_create_saml_assertions"></a>

驗證組織中的使用者身分後，外部身分提供者 (IdP) 會將身分驗證回應傳送至 AWS 登入端點 URL。此回應是一個包含 SAML 權杖的 POST 請求，該權杖遵循[適用於 SAML 2.0 的 HTTP POST 繫結](http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf)標準，其中包含下列元素或*宣告*。您可在與 SAML 相容的 IdP 中配置這些聲明。請參考 IdP 文件，以了解有關如何輸入這些聲明的說明。

當 IdP 傳送包含宣告的回應至 時 AWS，許多傳入宣告會對應至 AWS 內容索引鍵。可以在 IAM 政策中使用 `Condition` 元素來檢查這些內容索引鍵。可用映射的清單將根據 [將 SAML 屬性映射至 AWS 信任政策內容索引鍵](#saml-attribute-mapping) 中所示。

## `Subject` 與 `NameID`
<a name="saml_subject-name-id"></a>

回應必須恰好包含一個 `SubjectConfirmation` 元素，而該元素所包含的 `SubjectConfirmationData` 元素須同時具備 `NotOnOrAfter` 屬性和 `Recipient` 屬性。收件人屬性必須包含符合 AWS 登入端點 URL 的值。IdP 可能會使用 `ACS`、`Recipient` 或 `Target` 來指代此屬性。

如果需要 SAML 加密，登入 URL 必須包含 AWS 指派給 SAML 提供者的唯一識別碼，您可以在「身分提供者詳細資訊」頁面上找到此識別碼。下列範例展示了包含選用 `region-code` 的登入 URL 格式。

`https://region-code.signin.aws.amazon.com/saml`

在下列範例中，登入 URL 包含唯一識別碼，這需要在登入路徑後附加 /acs/。

`https://region-code.signin.aws.amazon.com/saml/acs/IdP-ID`

對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。對於 AWS 值，您也可以使用全域登入端點 `https://signin.aws.amazon.com/saml`。

`NameID` 元素的值可以是持久的、暫時的，也可以由 IdP 解決方案提供的完整格式 URI 組成。持久的值表示 `NameID` 中的值對於工作階段之間的使用者是相同的。如果值為暫時的，則使用者在每個工作階段中擁有不同的 `NameID` 值。單一登入互動支援下列類型的識別碼：
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:transient`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName`
+ `urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName`
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos`
+ `urn:oasis:names:tc:SAML:2.0:nameid-format:entity`

下列的摘錄顯示了範例。用您自己的值替代標記值。

```
<Subject>
  <NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">_cbb88bf52c2510eabe00c1642d4643f41430fe25e3</NameID>
  <SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
    <SubjectConfirmationData NotOnOrAfter="2013-11-05T02:06:42.876Z" Recipient="https://region-code.signin.aws.amazon.com/saml/SAMLSP4SHN3UIS2D558H46"/>
  </SubjectConfirmation>
</Subject>
```

**重要**  
`saml:aud` 內容索引鍵來自 SAML *recipient* 屬性，因其為等同於 OIDC 觀眾欄位 (例如 `accounts.google.com:aud`) 的 SAML。

## `PrincipalTag` SAML 屬性
<a name="saml_role-session-tags"></a>

(選用) 您可以使用 `Attribute` 元素，並將 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/PrincipalTag:{TagKey}`。此元素可讓您在 SAML 聲明中將屬性做為工作階段標籤傳遞。如需有關工作階段標籤的詳細資訊，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

若要將屬性做為工作階段標籤傳遞，請包含指定標籤值的 `AttributeValue` 元素。例如，若要傳遞標籤金鑰/值對 `Project` = `Marketing` 和 `CostCenter` = `12345`，請使用以下屬性。為每個標籤包含個別的 `Attribute` 元素。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:Project">
  <AttributeValue>Marketing</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:CostCenter">
  <AttributeValue>12345</AttributeValue>
</Attribute>
```

如要將以上標籤設為可轉移，請在其中包含另一個 `Attribute` 元素，並將其 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys`。這是一個選用的多重值屬性，會將您的工作階段標籤設為可轉移。可轉移標籤會在您於 AWS中使用 SAML 聲明擔任另一個角色時保存。這就是所謂的[角色鏈接](id_roles.md#iam-term-role-chaining)。例如，若要將 `Principal` 和 `CostCenter` 標籤設為可轉移，請使用以下屬性來指定金鑰。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys">
  <AttributeValue>Project</AttributeValue>
  <AttributeValue>CostCenter</AttributeValue>
</Attribute>
```

## `Role` SAML 屬性
<a name="saml_role-attribute"></a>

您可以使用 `Attribute` 元素，將 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/Role`。此元素包含一或多個 `AttributeValue` 元素，這些元素可列出將由您的 IdP 對應之使用者的 IAM 身分提供者和角色。該 IAM 角色和 IAM 身分提供者被指定為逗號分隔的 ARN 組，所採用的格式與傳遞到 [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) 的 `RoleArn` 與 `PrincipalArn` 參數的格式相同。此元素必須包含至少一個角色提供者對 (`AttributeValue` 元素)，並且可以包含多個角色提供者對。如果該元素包含多個角色提供者組，則使用者將需要選擇其使用 WebSSO 登入 AWS 管理主控台時要擔任的角色。

**重要**  
`Name` 標籤中 `Attribute` 屬性的值區分大小寫。必須精準設定為 `https://aws.amazon.com/SAML/Attributes/Role`。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
  <AttributeValue>arn:aws:iam::account-number:role/role-name1,arn:aws:iam::account-number:saml-provider/provider-name</AttributeValue>
  <AttributeValue>arn:aws:iam::account-number:role/role-name2,arn:aws:iam::account-number:saml-provider/provider-name</AttributeValue>
  <AttributeValue>arn:aws:iam::account-number:role/role-name3,arn:aws:iam::account-number:saml-provider/provider-name</AttributeValue>
</Attribute>
```

## `RoleSessionName` SAML 屬性
<a name="saml_role-session-attribute"></a>

您可以使用 `Attribute` 元素，將 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/RoleSessionName`。此元素包含一個為暫時憑證提供識別符的 `AttributeValue` 元素，而這些憑證是在擔任角色時所發出。您可以使用此功能將臨時憑證與正在使用應用程式的使用者建立關聯。此元素用於在 中顯示使用者資訊 AWS 管理主控台。`AttributeValue` 元素中的值長度必須介於 2 到 64 個字元之間，只能包含字母數位字元、底線和以下字元：**. , \$1 = @ -** (連字號)。其中不可含有空格。該值通常是使用者 ID (`john`) 或電子郵件地址 (`johndoe@example.com`)。該值不應包含空格，如使用者的顯示名稱 (`John Doe`)。

**重要**  
`Name` 標籤中 `Attribute` 屬性的值區分大小寫。必須精準設定為 `https://aws.amazon.com/SAML/Attributes/RoleSessionName`。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/RoleSessionName">
  <AttributeValue>user-id-name</AttributeValue>
</Attribute>
```

## `SessionDuration` SAML 屬性
<a name="saml_role-session-duration"></a>

(選用) 您可以使用 `Attribute` 元素，並將 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/SessionDuration"`。此元素包含一個`AttributeValue`元素，指定使用者在必須請求新的臨時登入資料 AWS 管理主控台 之前，可以存取 的時間長度。該值是一個表示工作階段秒數的整數。該值的範圍是 900 秒 (15 分鐘) 到 43200 秒 (12 小時)。如果此屬性不存在，則憑證有效時間為 1 小時 (`DurationSeconds` API 的 `AssumeRoleWithSAML` 參數的預設值)。

若要使用此屬性，您必須設定 SAML 供應商， AWS 管理主控台 透過位於 的主控台登入 Web 端點提供 的單一登入存取`https://region-code.signin.aws.amazon.com/saml`。對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。您可以選擇使用以下 URL：`https://signin.aws.amazon.com/static/saml`。請注意，此屬性只會將工作階段擴展到 AWS 管理主控台。它不能延長其他憑證的有效期。但是，如果其存在於 `AssumeRoleWithSAML` API 呼叫中，則可以用來*縮短*工作階段的持續時間。呼叫傳回的憑證預設存留期是 60 分鐘。

另請注意，如果同時定義了 `SessionNotOnOrAfter` 屬性，則兩個屬性的***較小***值 (`SessionDuration` 或 `SessionNotOnOrAfter`) 將建立主控台工作階段的持續時間上限。

在啟用具有更長持續時間的主控台工作階段時，可能會導致憑證洩露的風險。為了幫助緩解這種風險，您可以在 IAM 主控台的 **Role Summary** (角色摘要) 頁面上選擇 **Revoke Sessions** (撤銷工作階段) 來立即停用所有角色的使用中的主控台工作階段。如需詳細資訊，請參閱 [撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

**重要**  
`Name` 標籤中 `Attribute` 屬性的值區分大小寫。必須精準設定為 `https://aws.amazon.com/SAML/Attributes/SessionDuration`。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SessionDuration">
  <AttributeValue>1800</AttributeValue>
</Attribute>
```

## `SourceIdentity` SAML 屬性
<a name="saml_sourceidentity"></a>

(選用) 您可以使用 `Attribute` 元素，並將 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/SourceIdentity`。此元素包含一個 `AttributeValue` 元素，提供使用 IAM 角色之人員或應用程式的識別碼。當您使用 SAML 工作階段在 AWS 中擔任另一個角色時，來源身分的值會持續存在，稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。針對在角色工作階段期間所採取的每個動作，來源身分的值會出現在請求中。設定的值無法在角色工作階段期間變更。然後，管理員可以使用 AWS CloudTrail 日誌來監控和稽核來源身分資訊，以判斷誰使用共用角色執行動作。

`AttributeValue` 元素中的值長度必須介於 2 到 64 個字元之間，只能包含字母數位字元、底線和以下字元：**. , \$1 = @ -** (連字號)。其中不可含有空格。此值通常是與使用者相關聯的屬性，例如使用者 ID (`john`) 或電子郵件地址 (`johndoe@example.com`)。該值不應包含空格，如使用者的顯示名稱 (`John Doe`)。如需有關使用來源身分的詳細資訊，請參閱 [監控並控制使用擔任角色所採取的動作](id_credentials_temp_control-access_monitor.md)。

**重要**  
如果您的 SAML 聲明設定為使用 [`SourceIdentity`](#saml_sourceidentity) 屬性，則您的信任政策也必須包含 `sts:SetSourceIdentity` 動作，否則擔任角色操作將失敗。如需有關使用來源身分的詳細資訊，請參閱 [監控並控制使用擔任角色所採取的動作](id_credentials_temp_control-access_monitor.md)。

若要傳遞來源身分屬性，請包含指定來源身分值的 `AttributeValue` 元素。例如，若要傳遞來源身分 `Diego`，請使用下列屬性。

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SourceIdentity">
  <AttributeValue>Diego</AttributeValue>
```

## 將 SAML 屬性映射至 AWS 信任政策內容索引鍵
<a name="saml-attribute-mapping"></a>

本部分中的表列出了常用的 SAML 屬性以及它們在 AWS中映射到信任政策條件內容索引鍵的方式。您可以使用這些金鑰來控制角色的存取。若要執行此作業，請將金鑰與包含在 SAML 存取請求隨附聲明中的值進行比較。

**重要**  
這些索引鍵僅在 IAM 信任政策 (可決定誰能擔任角色的政策) 中可用，並且不適用於許可政策。

在 eduPerson 和 eduOrg 屬性工作表中，值是以字串或字串清單的形式輸入的。對於字串值，您可以使用 `StringEquals` 或 `StringLike` 條件測試 IAM 信任政策中的這些值。對於包含字串清單的值，您可以使用 `ForAnyValue` 與 `ForAllValues` [政策集運算子](reference_policies_condition-single-vs-multi-valued-context-keys.md#reference_policies_condition-multi-valued-context-keys)來測試信任政策中的這些值。

**注意**  
每個 AWS 內容索引鍵應該只包含一個宣告。如果包含多個聲明，將僅映射其中一個。

下表顯示 eduPerson 和 eduOrg 屬性。


| eduPerson 或 eduOrg 屬性 (`Name` 索引鍵) | 映射至此 AWS 內容索引鍵 (`FriendlyName` 索引鍵） | Type | 
| --- | --- | --- | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.1`   |   `eduPersonAffiliation`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.2`   |   `eduPersonNickname`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.3`   |   `eduPersonOrgDN`   |  字串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.4`   |   `eduPersonOrgUnitDN`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.5`   |   `eduPersonPrimaryAffiliation`   |  字串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.6`   |   `eduPersonPrincipalName`   |  字串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.7`   |   `eduPersonEntitlement`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.8`   |   `eduPersonPrimaryOrgUnitDN`   |  字串  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.9`   |   `eduPersonScopedAffiliation`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.10`   |   `eduPersonTargetedID`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.1.1.11`   |   `eduPersonAssurance`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.2`   |   `eduOrgHomePageURI`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.3`   |   `eduOrgIdentityAuthNPolicyURI`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.4`   |   `eduOrgLegalName`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.5`   |   `eduOrgSuperiorURI`   |  字串清單  | 
|   `urn:oid:1.3.6.1.4.1.5923.1.2.1.6`   |   `eduOrgWhitePagesURI`   |  字串清單  | 
|   `urn:oid:2.5.4.3`   |   `cn`   |  字串清單  | 

下表顯示 Active Directory 屬性。


| AD 屬性 | 對應至此 AWS 內容索引鍵 | Type | 
| --- | --- | --- | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name`  |  `name`  |  字串  | 
|  `http://schemas.xmlsoap.org/claims/CommonName`  |  `commonName`  |  字串  | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname`  |  `givenName`  |  字串  | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname`  |  `surname`  |  字串  | 
|  `http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`  |  `mail`  |  字串  | 
|  `http://schemas.microsoft.com/ws/2008/06/identity/claims/primarygroupsid`  |  `uid`  |  String  | 

下表顯示 X.500 屬性。


| X.500 屬性 | 對應至此 AWS 內容索引鍵 | Type | 
| --- | --- | --- | 
|  `2.5.4.3`  |  `commonName`  |  字串  | 
|  `2.5.4.4`  |  `surname`  |  字串  | 
|  `2.4.5.42`  |  `givenName`  |  字串  | 
|  `2.5.4.45`  |  `x500UniqueIdentifier`  |  字串  | 
|  `0.9.2342.19200300100.1.1`  |  `uid`  |  字串  | 
|  `0.9.2342.19200300100.1.3`  |  `mail`  |  字串  | 
|  `0.9.2342.19200300.100.1.45`  |  `organizationStatus`  |  字串  | 

# 啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台
<a name="id_roles_providers_enable-console-saml"></a>

您可以使用角色來設定 SAML 2.0 相容身分提供者 (IdP) AWS ，並允許 SAML 聯合身分主體存取 AWS 管理主控台。該角色為使用者授予了在主控台中執行任務的許可。如果您想要為 SAML 聯合身分主體提供其他存取方式 AWS，請參閱下列其中一個主題：
+ AWS CLI: [切換到 IAM 角色 (AWS CLI)](id_roles_use_switch-role-cli.md)
+ Tools for Windows PowerShell：[切換至 IAM 角色 (Tools for Windows PowerShell)](id_roles_use_switch-role-twp.md)
+ AWS API： [切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)

## 概觀
<a name="enable-console-saml-overview"></a>

下圖說明了啟用了 SAML 的單一登入的流程。

**注意**  
此 SAML 的特定用途與 中說明的更一般用途不同，[SAML 2.0 聯合身分](id_roles_providers_saml.md)因為此工作流程 AWS 管理主控台 會代表使用者開啟 。這需要使用 AWS 登入端點，而不是直接呼叫 `AssumeRoleWithSAML` API。該端點將為使用者呼叫 API 並傳回將使用者的瀏覽器自動重新引導到 AWS 管理主控台的 URL。

![\[使用 SAML 的單一登入 (SSO) 至 AWS 管理主控台\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/saml-based-sso-to-console.diagram.png)


此圖說明了下列步驟：

1. 使用者瀏覽到您的組織的入口網站，並選擇前往 AWS 管理主控台的選項。在您的組織中，入口網站通常是 IdP 的函數，可處理組織與 之間的信任交換 AWS。例如，在 Active Directory Federation Services 中，入口網站的 URL 是：`https://ADFSServiceName/adfs/ls/IdpInitiatedSignOn.aspx`

1. 該入口網站可驗證您的組織使用者的身分。

1. 入口網站會產生一個 SAML 身分驗證回應，其中包括辨識使用者身分的聲明以及使用者的相關屬性。您也可以配置 IdP 以包含一個名為 `SessionDuration` 的 SAML 聲明屬性，該屬性指定主控台工作階段的有效時間長度。您也可以設定 IdP，將屬性做為[工作階段標籤](id_session-tags.md)傳遞。該入口網站將此回應傳送到用戶端瀏覽器。

1. 用戶端瀏覽器會重新導向至 AWS 單一登入端點，並發佈 SAML 聲明。

1. 端點代表使用者請求臨時安全性憑證，並建立一個使用這些憑證的主控台登入 URL。

1. AWS 會將登入 URL 傳回用戶端做為重新導向。

1. 該用戶端瀏覽器將重新引導到 AWS 管理主控台。如果 SAML 身分驗證回應包含映射到多個 IAM 角色的屬性，則將首先提示使用者選取要用於存取主控台的角色。

從使用者的角度來看，程序透明地發生：使用者從組織的內部入口網站開始，最後在 AWS 管理主控台，而不必提供任何 AWS 登入資料。

有關如何配置此行為的概述以及指向詳細步驟的連結，請參閱以下章節。

## 將您的網路設定為 的 SAML 供應商 AWS
<a name="fedconsole-config-network-as-saml"></a>

在您的組織的網路內部，將您的身分存放區 (如 Windows Active Directory) 設定為與 Windows Active Directory 聯合服務、Shibboleth 等以 SAML 為基礎的身分提供者 (IdP) 一起使用。使用 IdP 產生一個中繼資料文件，該文件將您的組織描述為身分提供者 (IdP) 並包含身分驗證索引鍵。您也可以設定組織的入口網站，將 的使用者請求路由 AWS 管理主控台 至 AWS SAML 端點，以使用 SAML 聲明進行身分驗證。配置您的 IdP 來產生 metadata.xml 文件之方法將根據您的 IdP 而定。請參閱您的 IdP 文件以獲得說明，或參閱 [將第三方 SAML 解決方案供應商與 整合 AWS](id_roles_providers_saml_3rd-party.md) 以取得包含許多支援的 SAML 提供者之 Web 文件連結。

## 在 IAM 中建立 SAML 提供者
<a name="fedconsole-create-saml-provider"></a>

接著，您登入 AWS 管理主控台 並前往 IAM 主控台。您將在此建立一個新的 SAML 提供者，該提供者是 IAM 中包含您組織的身分提供者 (IdP) 的相關資訊的實體。在此過程中，您可以上傳在前一章節中由組織中的 IdP 軟體所產生的中繼資料文件。如需詳細資訊，請參閱[在 IAM 中建立 SAML 身分提供者](id_roles_providers_create_saml.md)。

## 在 中 AWS 為 SAML 聯合主體設定許可
<a name="fedconsole-grantperms"></a>

下一個步驟是建立 IAM 角色，以便建立 IAM 和您組織 IdP 之間的信任關係。基於聯合目的，這個角色必須將您的 IdP 識別為主體 (信任的實體)。此角色也會定義允許組織 IdP 驗證的使用者在其中執行的操作 AWS。您可使用 IAM 主控台來建立此角色。當您建立信任政策，指出可以擔任角色的人員時，您可以指定您先前在 IAM 中建立的 SAML 提供者。您也可以指定一或多個 SAML 屬性，讓使用者在符合這些屬性的情況下，才能允許擔任角色。例如，您可以指定只允許其 SAML `[eduPersonOrgDN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_edupersonorgdn)` 值為 `ExampleOrg` 的使用者登入。角色精靈會自動新增一個測試 `saml:aud` 屬性的條件，確保僅以登入 AWS 管理主控台為目的來擔任該角色。

如果需要 SAML 加密，登入 URL 必須包含 AWS 指派給 SAML 提供者的唯一識別碼，您可以在「身分提供者詳細資訊」頁面上找到此識別碼。該角色的信任政策可能如下所示：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::111122223333:saml-provider/ExampleOrgSSOProvider"
            },
            "Action": "sts:AssumeRoleWithSAML",
            "Condition": {
                "StringEquals": {
                    "saml:edupersonorgdn": "ExampleOrg",
                    "saml:aud": "https://region-code.signin.aws.amazon.com/saml/acs/SAMLSP4SHN3UIS2D558H46"
                }
            }
        }
    ]
}
```

------

**注意**  
角色信任政策中使用的 SAML IDP 必須與角色所在的帳戶相同。

建議對 `https://region-code.signin.aws.amazon.com/static/saml-metadata.xml` 中的 `saml:aud` 屬性使用區域端點。對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。

對於該角色中的[許可政策](access_policies.md)，您可以像任何角色、使用者或群組一樣指定許可。例如，如果允許您組織中的使用者管理 Amazon EC2 執行個體，您可以在許可政策中明確允許 Amazon EC2 動作。您可以指派[受管政策](access_policies_manage-attach-detach.md) (如 **Amazon EC2 完整存取**受管政策) 來執行此操作。

有關建立用於 SAML IdP 的角色的詳細資訊，請參閱 [為 SAML 2.0 聯合身分建立角色 (主控台)](id_roles_create_for-idp_saml.md)。

## 完成組態並建立 SAML 聲明
<a name="fedconsole-configassertions"></a>

安裝位於 `https://region-code.signin.aws.amazon.com/static/saml-metadata.xml`或 `saml-metadata.xml`的檔案，以通知 AWS 做為服務供應商的 SAML IdP`https://signin.aws.amazon.com/static/saml-metadata.xml`。如果需要 SAMl 加密，可在 `https://region-code.signin.aws.amazon.com/static/saml/SAMLSP4SHN3UIS2D558H46/saml-metadata.xml` 中找到檔案。

對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。

安裝該檔案的方式取決於您的 IdP。部分提供者為您提供了輸入該 URL 的選項，此時，IdP 將為您取得並安裝該檔案。另一些提供者則要求您從該 URL 處下載檔案，然後將其做為本機檔案提供。請參閱您的 IdP 文件以獲得詳細資訊，或參閱 [將第三方 SAML 解決方案供應商與 整合 AWS](id_roles_providers_saml_3rd-party.md) 以取得包含許多支援的 SAML 提供者之 Web 文件連結。

您也可設定一條資訊，說明您希望 IdP 在身分驗證回應期間將此資訊做為 SAML 屬性傳遞到 AWS 。大多數此資訊會在 中顯示 AWS 為條件內容索引鍵，您可以在政策中評估這些索引鍵。這些條件索引鍵會確保只有經過授權且位於正確內容中的使用者，才能獲得授予存取您 AWS 資源的許可。您可以指定限制可使用主控台時間的時段。您也可以指定使用者在重新整理其憑證前，可存取主控台的時間上限 (最多 12 小時)。如需詳細資訊，請參閱[為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

# 在瀏覽器中檢視 SAML 回應
<a name="troubleshoot_saml_view-saml-response"></a>

以下程序介紹在排除與 SAML 2.0 相關的故障問題時，如何從您的瀏覽器中查看服務供應商的 SAML 回應。

對於所有瀏覽器，請前往可以重現問題的頁面。然後，針對適用的瀏覽器執行以下步驟：

**Topics**
+ [Google Chrome](#chrome)
+ [Mozilla Firefox](#firefox)
+ [Apple Safari](#safari)
+ [如何處理 Base64 編碼的 SAML 回應](#whatnext)

## Google Chrome
<a name="chrome"></a>

**在 Chrome 中查看 SAML 回應**

這些步驟已使用 Google Chrome 版本 106.0.5249.103 (正式版本) (arm64) 進行了測試。如果您使用其他版本，則可能需要根據情況調整步驟。

1. 按下 **F12** 來啟動 **Developer Tools** (開發人員工具) 主控台。

1. 選取 **Network** (網路) 標籤，然後選取 **Developer Tools** (開發人員工具) 視窗左上角的 **Preserve log** (保留記錄)。

1. 重現問題。

1. (選擇性) 如果 **Developer Tools** (開發人員工具) 的 **Network** (網路) 記錄窗格中未顯示 **Method** (方法) 欄，請在任一欄標籤上按一下滑鼠右鍵，然後選擇 **Method** (方法) 以新增該欄。

1. 在 **Developer Tools** (開發人員工具) 的 **Network** (網路) 記錄窗格中尋找 **SAML Post** (SAML 文章)。選擇該列，然後檢視頂端的 **Payload** (承載) 標籤。尋找包含加密請求的 **SAMLResponse** 元素。關聯值為 Base64 編碼的回應。

## Mozilla Firefox
<a name="firefox"></a>

**在 Firefox 中查看 SAML 回應**

此程序已在 Mozilla Firefox 版本 105.0.3 (64 位元) 上進行了測試。如果您使用其他版本，則可能需要根據情況調整步驟。

1. 按下 **F12** 來啟動 **Web Developer Tools** (Web 開發人員工具) 主控台。

1. 選取 **Network (網路)** 標籤。

1. 在 **Web Developer Tools** (Web 開發人員工具) 視窗右上角選擇選項 (小齒輪圖示)。選取 **Persist logs** (持續記錄)。

1. 重現問題。

1. (選擇性) 如果 **Web Developer Tools** (Web 開發人員工具) 的 **Network** (網路) 記錄窗格中未顯示 **Method** (方法) 欄，請在任一欄標籤上按一下滑鼠右鍵，然後選擇 **Method** (方法) 以新增該欄。

1. 尋找表格中的 **POST** **SAML**。選取該列，然後檢視 **Request** 標籤並尋找 **SamlResponse** 元素。關聯值為 Base64 編碼的回應。

## Apple Safari
<a name="safari"></a>

**在 Safari 中查看 SAML 回應**

這些步驟已使用 Apple Safari 版本 16.0 (17614.1.25.9.10, 17614) 進行了測試。如果您使用其他版本，則可能需要根據情況調整步驟。

1. 在 Safari 中啟用 Web Inspector。開啟 **Preferences (偏好設定)** 視窗，選取 **Advanced (進階)** 標籤，然後選取 **Show Develop menu in the menu bar (在選單列顯示開發選單)**。

1. 現在您可以開啟 Web Inspector。在選單列中選擇 **Develop** (開發)，然後選取 **Show Web Inspector** (顯示 Web Inspector)。

1. 選取 **Network (網路)** 標籤。

1. 在 **Web Inspector** 視窗右上角選擇選項 (包含三條水平線的小圓形圖示)。選取 **Preserve logs** (保留記錄)。

1. (選擇性) 如果 **Web Inspector** 的 **Network** (網路) 記錄窗格中未顯示 **Method** (方法) 欄，請在任一欄標籤上按一下滑鼠右鍵，然後選擇 **Method** (方法) 以新增該欄。

1. 重現問題。

1. 尋找表格中的 **POST** **SAML**。選擇該列，然後檢視 Headers (標題) 標籤。

1. 尋找包含加密請求的 **SAMLResponse** 元素。向下捲動到找到含有名稱 `SAMLResponse` 的 `Request Data`。關聯值為 Base64 編碼的回應。

## 如何處理 Base64 編碼的 SAML 回應
<a name="whatnext"></a>

在瀏覽器中找到 Base64 編碼的 SAML 回應元素之後，複製這些元素並使用您偏好的 Base-64 解碼工具來擷取含有 XML 標籤的回應。

**安全提示**  
由於您查看的 SAML 回應資料可能包含敏感安全資料，我們建議您不要使用*線上* base64 解碼器。而是使用安裝在本機電腦上，不會透過網路傳送 SAML 資料的工具。

**適用於 Windows 系統的內建選項 (PowerShell)：**

```
PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("base64encodedtext"))
```

**適用於 MacOS 與 Linux 系統的內建選項：**

```
$ echo "base64encodedtext" | base64 --decode
```

**檢閱解碼檔案中的值**  
檢閱已解碼 SAML 回應檔案中的值。
+ 確認 saml:NameID 屬性的值符合已驗證使用者的使用者名稱。
+ 檢閱 https://aws.amazon.com/SAML/Attributes/Role 的值。ARN 和 SAML 提供者區分大小寫，且 [ARN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html) 必須符合您帳戶中的資源。
+ 檢閱 https://aws.amazon.com/SAML/Attributes/RoleSessionName 的值。該值必須符合[宣告規則](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html)中的值。
+ 如果設定電子郵件地址或帳戶名稱的屬性值，請確定這些值正確無誤。這些值必須對應至已驗證使用者的電子郵件地址或帳戶名稱。

**檢查錯誤並確認組態**  
檢查值是否包含錯誤，並確認下列組態正確無誤。
+ 宣告規則符合必要元素，且所有 ARN 皆正確。如需詳細資訊，請參閱[使用依賴方信任設定您的 SAML 2.0 IdP 並新增宣告](id_roles_providers_create_saml_relying-party.md)。
+ 您已將最新的中繼資料檔案從 IdP 上傳至 SAML 供應商 AWS 中的 。如需詳細資訊，請參閱[啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。
+ 您已正確設定 IAM 角色的信任政策。如需詳細資訊，請參閱[擔任角色的方法](id_roles_manage-assume.md)。

# 將 AWS 身分聯合到外部服務
<a name="id_roles_providers_outbound"></a>

IAM 傳出聯合身分可讓您的 AWS 工作負載安全地存取外部服務，而無需存放長期憑證。您的 AWS 工作負載可以呼叫 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API，向 AWS Security Token Service () 請求短期 JSON Web Token JWTs AWS STS)。這些字符以密碼編譯方式簽署，可公開驗證，並包含一組完整的宣告，可向外部服務宣告 AWS 工作負載的身分。您可以搭配各種第三方雲端提供者、SaaS 平台和自我託管應用程式使用這些字符。外部服務會使用在已知端點上發佈 AWS的驗證金鑰來驗證字符的真偽，並使用字符中的資訊進行身分驗證和授權決策。

傳出聯合身分不需要在應用程式程式碼或環境變數中存放長期登入資料，例如 API 金鑰或密碼，可改善您的安全狀態。您可以使用 IAM 政策控制權杖產生和強制執行權杖屬性的存取，例如簽署演算法、允許的受眾和持續時間。所有字符請求都會登入 AWS ，為安全性監控和合規報告提供完整的稽核線索。您也可以使用顯示為自訂宣告的標籤來自訂權杖，讓外部服務實作精細的屬性型存取控制。

## 常用案例
<a name="outbound-federation-use-cases"></a>

使用傳出聯合身分，您的 AWS 工作負載可以安全地：
+ 存取外部雲端提供者中的資源和服務。例如，Lambda 函數處理資料可以將結果寫入外部雲端提供者的儲存服務，或查詢其資料庫。
+ 與外部software-as-a-service(SaaS) 供應商整合，用於分析、資料處理、監控等。例如，您的 Lambda 函數可以將指標傳送至可觀測性平台。
+ 使用託管在 AWS外部雲端提供者或內部部署資料中心上的應用程式進行驗證，以啟用安全的混合和多雲端架構。例如，您的 AWS 工作負載可以與內部部署 Kubernetes 叢集中執行的容器化應用程式互動。

## 運作方式
<a name="outbound-federation-how-it-works"></a>

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/outbound-use-cases.png)


1. Lambda 函數會呼叫 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API，向 AWS Security Token Service () 請求 JSON Web Token (JWT)AWS STS。

1. AWS STS 會驗證請求，並將已簽署的 JWT 傳回 Lambda 函數。

1. Lambda 函數會將 JWT 傳送至外部服務。

1. 外部服務會從權杖擷取發行者 URL、驗證是否符合已知信任的發行者，以及從 OIDC 探索端點擷取 AWS驗證金鑰和中繼資料。

1. 外部服務使用驗證金鑰來驗證字符的簽章，並驗證過期時間、主旨和對象等宣告。

1. 驗證成功後，外部服務會授予 Lambda 函數的存取權。

# 開始使用傳出聯合身分
<a name="id_roles_providers_outbound_getting_started"></a>

本指南說明如何為 AWS 您的帳戶啟用傳出聯合身分，並取得您的第一個 JSON Web Token (JWT) （使用 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API)。您將啟用此功能、與外部服務建立信任關係、設定 IAM 許可，以及使用 AWS CLI 或 AWS SDK for Python (Boto3) 請求權杖。

## 先決條件
<a name="outbound-federation-prerequisites"></a>

開始前，請確保您具備以下條件：
+ 已安裝最新版本的 AWS CLI 或 Python 3.8 （或更新版本） 和 Boto3 （適用於 AWS SDK 範例）
+ 您可以在其中設定信任關係的外部服務帳戶 （例如外部雲端提供者、SaaS 提供者或測試應用程式）

**注意**  
此 `GetWebIdentityToken` API 無法在 STS 全域端點上使用。
`GetWebIdentityToken` API 產生的 JSON Web Token (JWTs) 無法用於 AWS （透過 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API) 的 OpenID Connect (OIDC) 聯合。

## 為您的帳戶啟用傳出聯合身分
<a name="enable-outbound-federation"></a>

您必須先啟用傳出聯合身分，才能請求字符。您可以使用 AWS 管理主控台或以程式設計方式使用 [EnableOutboundWebIdentityFederation](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableOutboundWebIdentityFederation.html) API 來啟用此功能。

### 使用 AWS CLI
<a name="enable-using-cli"></a>

```
aws iam enable-outbound-web-identity-federation
```

### 使用適用於 Python 的 AWS SDK
<a name="enable-using-sdk"></a>

```
import boto3

# Create IAM client
iam_client = boto3.client('iam')

# Enable outbound identity federation
response = iam_client.enable_outbound_web_identity_federation()
print(f"Feature enabled. Issuer URL: {response['IssuerUrl']}")
print(f"Status: {response['Status']}")
```

### 使用 AWS 主控台
<a name="enable-using-console"></a>

導覽至 IAM，然後在左側導覽功能表的**存取管理**區段下選取**帳戶設定** 

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/outbound-screen-1.png)


啟用此功能後，請記下您的帳戶特定發行者 URL。在外部服務中設定信任關係時，您將使用此 URL。您也可以視需要使用 [GetOutboundWebIdentityFederationInfo](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOutboundWebIdentityFederationInfo.html) API 擷取此發行者 URL。

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/outbound-screen-2.png)


## 在外部服務中建立信任關係
<a name="establish-trust-relationship"></a>

設定外部服務以信任和接受 AWS 帳戶發行的字符。具體步驟因服務而異，但通常涉及：
+ 將 AWS 您的帳戶發行者 URL 註冊為信任的身分提供者
+ 設定要驗證的宣告 （對象、主體模式）
+ 將字符宣告映射至外部服務中的許可

如需詳細的組態指示，請參閱外部服務文件。

## 設定 IAM 許可
<a name="configure-iam-permissions"></a>

建立 IAM 政策，授予呼叫 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 的許可，並將政策連接到需要產生字符的 IAM 角色。

此範例政策授予具有特定限制的權杖產生存取權。它只允許以「https://api.example.com」為對象請求字符，並強制執行字符生命週期上限為 5 分鐘 (300 秒）。如需可用來強制執行權杖屬性的條件金鑰[IAM 和 AWS STS 條件內容索引鍵](reference_policies_iam-condition-keys.md)清單，請參閱 。

### IAM 政策範例
<a name="example-iam-policy"></a>

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:GetWebIdentityToken",
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringEquals": {
                    "sts:IdentityTokenAudience": "https://api.example.com"
                },
                "NumericLessThanEquals": {
                    "sts:DurationSeconds": 300
                }
            }
        }
    ]
}
```

## 請求您的第一個 JSON Web 權杖 (JWT)
<a name="request-first-jwt"></a>

您可以使用 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 請求 JSON Web 權杖。您可以在呼叫 API 時指定下列參數：
+ **對象 （必要）：**字符的預期收件人。此值會在 JWT 中填入「aud」宣告。外部服務會驗證此宣告，以確保權杖適用於它們。
+ **SigningAlgorithm （必要）：**用於簽署字符的密碼編譯演算法。有效值為 ES384 和 RS256。使用 ES384 獲得最佳安全性和效能，或 RS256 與不支援 ECDSA 的系統具有更廣泛的相容性。
+ **DurationSeconds （選用）：**字符生命週期，以秒為單位。有效值的範圍為 60 到 3600。預設值為 300 (5 分鐘)。我們建議較短的字符生命週期，以提高安全性。
+ **標籤 （選用）：**要做為自訂宣告包含在字符中的鍵值對清單。外部服務可以使用這些宣告進行精細授權。

API 會傳回下列欄位：
+ **IdentityToken：**簽署的 JWT 做為 base64url 編碼字串。在對外部服務的請求中包含此字符。
+ **過期：**字符過期時的 UTC 時間戳記。

### 使用 AWS CLI
<a name="using-aws-cli"></a>

```
aws sts get-web-identity-token \
    --audience "https://api.example.com" \
    --signing-algorithm ES384 \
    --duration-seconds 300 \
    --tags Key=team,Value=data-engineering \
           Key=environment,Value=production \
           Key=cost-center,Value=analytics
```

### 使用適用於 Python 的 AWS SDK
<a name="using-aws-sdk-python"></a>

```
import boto3

sts_client = boto3.client('sts')

response = sts_client.get_web_identity_token(
    Audience=['https://api.example.com'],
    DurationSeconds=300,
    SigningAlgorithm='RS256',
    Tags=[
        {'Key': 'team', 'Value': 'data-engineering'},
        {'Key': 'environment', 'Value': 'production'},
        {'Key': 'cost-center', 'Value': 'analytics'}
    ]
)

token = response['WebIdentityToken']
```

您也可以解碼 JWT，使用 PyJWT、Python-jose for Python、Nimbus JOSE\$1JWT for Java 或 jwt.io 等偵錯工具等標準 JWT 程式庫來檢查其內容。如需字符中包含之宣告[了解字符宣告](id_roles_providers_outbound_token_claims.md)的詳細資訊，請參閱 。

## 搭配外部服務使用字符
<a name="use-token-with-external-service"></a>

收到字符後，將其包含在外部服務的請求中。該方法因服務而異，但大多數服務接受授權標頭中的字符。外部服務應實作權杖驗證邏輯，從發行者的已知端點擷取 JWKS 金鑰、驗證權杖的簽章，並在授予 AWS 工作負載存取權之前驗證基本宣告。

## 從 OpenID Connect (OIDC) 端點擷取驗證金鑰和中繼資料
<a name="fetch-verification-keys"></a>

您 AWS 帳戶的唯一發行者 URL 託管 OpenID Connect (OIDC) 探索端點，其中包含權杖驗證所需的驗證金鑰和中繼資料。

OIDC 探索端點 URL 包含一些提供者用來驗證字符的中繼資料。可在以下位置取得：

```
{issuer_url}/.well-known/openid-configuration
```

JWKS (JSON Web 金鑰集） 端點包含用於驗證字符簽章的金鑰。可在以下位置取得：

```
{issuer_url}/.well-known/jwks.json
```

### 使用 curl 擷取 JWKS
<a name="fetch-jwks-curl"></a>

```
curl https://{issuer_url}/.well-known/jwks.json
```

回應：

```
{
  "keys": [
    {
      "kty": "EC",
      "use": "sig",
      "kid": "key-id-1",
      "alg": "ES384",
      "crv": "P-384",
      "x": "base64-encoded-x-coordinate",
      "y": "base64-encoded-y-coordinate"
    },
    {
      "kty": "RSA",
      "use": "sig",
      "kid": "key-id-2",
      "n": "base64-encoded-modulus",
      "e": "AQAB"
    }
  ]
}
```

### 使用適用於 Python 的 AWS SDK
<a name="fetch-using-sdk"></a>

```
import requests

# Fetch Openid Configuration
open_id_config_response = requests.get("https://{issuer_url}/.well-known/openid-configuration")
open_id_config = open_id_config_response.json()

# Fetch JWKS
jwks_response = requests.get("https://{issuer_url}/.well-known/jwks.json")
jwks = jwks_response.json()
```

我們建議您快取這些金鑰，以避免在每次權杖驗證時擷取它們。

### 基本宣告驗證
<a name="essential-claim-validations"></a>
+ **主旨 (sub)：**確認主旨宣告包含預期的 IAM 主體 ARN 模式。
+ **過期 (exp)：**確保字符尚未過期。JWT 程式庫通常會自動處理。
+ **對象 (aud)：**驗證對象是否符合您的預期值。這可防止其他 服務的字符與您的 搭配使用。
+ **發行者 (iss)：**確認發行者符合您信任 AWS 的帳戶 (s)。維護信任的發行者 URLs清單。

您應該盡可能驗證額外的 AWS特定宣告，以在外部服務中實作精細存取控制。例如，驗證 org\$1id 宣告以限制對 AWS 組織中 IAM 主體的存取、檢查 principal\$1tags 以強制執行屬性型存取控制 （例如僅允許生產環境或特定團隊），或驗證工作階段內容宣告，例如 lambda\$1source\$1function\$1arn 或 ec2\$1instance\$1source\$1vpc，以根據運算資源限制存取。如需[字符中包含的完整聲明清單，請參閱了解字符宣告](id_roles_providers_outbound_token_claims.md)。

# 了解字符宣告
<a name="id_roles_providers_outbound_token_claims"></a>

當您呼叫 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 時， AWS Security Token Service 會傳回已簽署的 JSON Web Token (JWT)，其中包含一組代表 IAM 主體身分的宣告。這些字符符合 [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519)。了解這些字符的結構和內容可協助您實作安全身分驗證流程、在外部服務中設定適當的宣告驗證，以及有效地使用自訂宣告進行精細存取控制。

JWT 包含標準 OpenID Connect (OIDC) 宣告，例如主體 ("sub")、受眾 ("aud")、發行者 ("iss")，以促進不同外部服務的互通性。 會在適用時將 AWS 身分特定宣告 （例如 AWS 帳戶 ID 和主體標籤） 和工作階段內容宣告 （例如 EC2 執行個體 ARNs) AWS STS 填入字符。您也可以將自訂宣告做為請求標籤傳遞至 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API，藉此將自訂宣告新增至權杖。 AWS 身分特定的宣告、工作階段內容宣告和自訂宣告會巢狀在權杖中的「https://sts.amazonaws.com/」命名空間下。

如需字符中包含的宣告清單，請參閱以下範例字符。請注意，所有這些宣告可能不會同時出現在字符中。

```
{
  "iss": "https://abc123-def456-ghi789-jkl012.tokens.sts.global.api.aws",
  "aud": "https://api.example.com",
  "sub": "arn:aws:iam::123456789012:role/DataProcessingRole",
  "iat": 1700000000,
  "exp": 1700000900,
  "jti": "xyz123-def456-ghi789-jkl012",
  "https://sts.amazonaws.com/": {
    "aws_account": "123456789012",
    "source_region": "us-east-1",
    "org_id": "o-abc1234567",
    "ou_path": "o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/",
    "principal_tags": {
      "environment": "production",
      "team": "data-engineering",
      "cost-center": "engineering"
    },
    "lambda_source_function_arn": "arn:aws:lambda:us-east-1:123456789012:function:process-data",
    "request_tags": {
        "job-id": "job-2024-001",
        "priority": "high",
        "data-classification": "sensitive"
    }
  }
}
```

## 標準宣告
<a name="standard-claims"></a>

字符中存在的標準 OIDC 宣告有助於與各種外部服務互通。這些宣告可以使用大多數 JWT 程式庫進行驗證。


| 取得 | 名稱 | 描述 | 範例值 | 
| --- | --- | --- | --- | 
| iss | 發行者 | 您的帳戶特定發行者 URL。外部服務會驗證此宣告，以確保其符合其信任的發行者。 | https://abc123-def456-ghi789-jkl012.tokens.sts.global.api.aws | 
| aud | 目標對象 | [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) 請求中指定字符的預期收件人。 | https://api.example.com | 
| sub | 主旨 | 請求權杖之 IAM 主體的 ARN。 | arn：aws：iam：：123456789012：role/DataProcessingRole | 
| iat | 在 發行 | 識別發出 JWT 時間的 NumericDate 值。 | 1700000000 | 
| exp | Expiration | 識別過期時間的 NumericDate 值，在此時間之後，JWT 不得接受處理。 | 1700000900 | 
| jti | JWT ID | 此字符執行個體的唯一識別符。 | xyz123-def456-ghi789-jkl012 | 

## 自訂宣告
<a name="custom-claims"></a>

除了標準 OIDC 宣告之外， 還會在適用時 AWS STS 新增有關身分和工作階段內容的宣告。您也可以將自己的宣告做為請求標籤傳遞至權杖。自訂宣告會巢狀在 https://sts.amazonaws.com/ 命名空間下。

### AWS 身分宣告
<a name="aws-identity-claims"></a>

這些宣告提供有關 AWS 您的帳戶、組織結構和 IAM 主體的詳細資訊。


| 取得 | Description | 條件索引鍵的映射 | 範例值 | 
| --- | --- | --- | --- | 
| aws\$1account |  AWS 您的帳戶 ID | [aws：PrincipalAccount](reference_policies_condition-keys.md#condition-keys-principalaccount) | 123456789012 | 
| source\$1region | 請求字符 AWS 的區域 | [aws:RequestedRegion](reference_policies_condition-keys.md#condition-keys-requestedregion) | us-east-1 | 
| org\$1id | 您的 AWS Organizations ID （如果您的帳戶是組織的一部分） | [aws:PrincipalOrgID](reference_policies_condition-keys.md#condition-keys-principalorgid) | o-abc1234567 | 
| ou\$1path | 您的組織單位路徑 （如適用） | [aws:PrincipalOrgPaths](reference_policies_condition-keys.md#condition-keys-principalorgpaths) | o-a1b2c3d4e5/r-ab12/ou-ab12-11111111/ou-ab12-22222222/ | 
| principal\$1tags | 連接至 IAM 主體或擔任角色工作階段的標籤。當請求的 IAM 主體同時具有主體標籤和工作階段標籤時，請求權杖時，工作階段標籤會出現在 JWT 中。 | [aws：PrincipalTag/<tag-key>](reference_policies_condition-keys.md#condition-keys-principaltag) | \$1"環境"： "生產"、"團隊"： "資料工程"、"成本中心"："工程"\$1 | 

### 工作階段內容宣告
<a name="session-context-claims"></a>

這些宣告提供有關字符請求發起的運算環境和工作階段的資訊。根據請求主體的工作階段內容，當適用時 AWS AWS STS ， 會自動包含這些宣告。


| 取得 | Description | 條件索引鍵的映射 | 範例值 | 
| --- | --- | --- | --- | 
| original\$1session\$1exp | 原始角色工作階段登入資料過期的時間 （適用於擔任的角色） | N/A | 2024-01-15T10：00：00Z | 
| federated\$1provider | 聯合工作階段的身分提供者名稱 | [aws:FederatedProvider](reference_policies_condition-keys.md#condition-keys-federatedprovider) | arn：aws：iam：：111122223333：oidc-provider/your\$1oidc\$1provider | 
| identity\$1store\$1user\$1id | IAM Identity Center 使用者 ID | [identitystore：UserId](reference_policies_condition-keys.md#condition-keys-identity-store-user-id) | user-abc123def456 | 
| identity\$1store\$1arn | Identity Center 身分存放區的 ARN | [identitystore：IdentityStoreArn](https://docs.aws.amazon.com/singlesignon/latest/userguide/condition-context-keys-sts-idc.html#condition-keys-identity-store-arn) | arn：aws：identitystore：：123456789012：identitystore/d-abc1234567 | 
| ec2\$1source\$1instance\$1arn | 請求 EC2 執行個體的 ARN | [ec2：SourceInstanceArn](reference_policies_condition-keys.md#condition-keys-ec2-source-instance-arn) | arn：aws：ec2：us-east-1：123456789012：instance/i-abc123def456 | 
| ec2\$1instance\$1source\$1vpc | 交付 EC2 角色登入資料的 VPC ID | [aws：Ec2InstanceSourceVpc](reference_policies_condition-keys.md#condition-keys-ec2instancesourcevpc) | vpc-abc123def456 | 
| ec2\$1instance\$1source\$1private\$1ipv4 | EC2 執行個體的私有 IPv4 地址 | [aws：Ec2InstanceSourcePrivateIPv4](reference_policies_condition-keys.md#condition-keys-ec2instancesourceprivateip4) | 10.0.1.25 | 
| ec2\$1role\$1delivery | 執行個體中繼資料服務版本 | [ec2：RoleDelivery](reference_policies_condition-keys.md#condition-keys-ec2-role-delivery) | 2 | 
| source\$1identity | 委託人設定的來源身分 | [aws：SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity) | admin-user | 
| lambda\$1source\$1function\$1arn | 呼叫 Lambda 函數的 ARN | [lambda：SourceFunctionArn](reference_policies_condition-keys.md#condition-keys-lambda-source-function-arn) | arn：aws：lambda：us-east-1：123456789012：function：my-function | 
| glue\$1credential\$1issuing\$1service | AWS Glue 任務的 Glue 服務識別符 | [glue：CredentialIssuingService](reference_policies_condition-keys.md#condition-keys-glue-credential-issuing) | glue.amazonaws.com | 

### 請求標籤
<a name="request-tags"></a>

您可以在 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API 請求中指定標籤，將自訂宣告新增至權杖。這些宣告會出現在字符的 request\$1tags 欄位下，可讓您傳遞外部服務可用於精細授權決策的特定資訊。每個請求最多可以指定 50 個標籤。

範例請求：

```
response = sts_client.get_web_identity_token(
    Audience=['https://api.example.com'],
    SigningAlgorithm='ES384'
    Tags=[
        {'Key': 'team', 'Value': 'data-engineering'},
        {'Key': 'cost-center', 'Value': 'analytics'},
        {'Key': 'environment', 'Value': 'production'}
    ]
)
```

權杖中產生的宣告：

```
{
  "request_tags": {
    "team": "data-engineering",
    "cost-center": "analytics",
    "environment": "production"
  }
}
```

# 使用 IAM 政策控制存取
<a name="id_roles_providers_outbound_policies"></a>

IAM 提供多種政策類型，以控制對傳出聯合身分功能的存取。您可以使用[身分型政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)來控制哪些 IAM 主體可以請求權杖，並強制執行特定權杖屬性，例如對象、生命週期和簽署演算法。[服務控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) SCPs) 可讓您對 Organizations 中的所有帳戶強制執行 AWS 整個組織的字符產生限制。[資源控制政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html) RCPs) 控制資源層級的存取。您也可以使用 [VPC 端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)來限制哪些主體可以透過 VPC 端點存取 API，將 AWS STS `GetWebIdentityToken`網路層級控制新增至您的安全狀態。本節說明如何使用這些政策類型和條件索引鍵實作精細存取控制。

若要請求身分字符，IAM 主體必須具有 `sts:GetWebIdentityToken`許可。透過連接至 IAM 使用者或角色的身分政策授予此許可。若要允許標籤 （金鑰、值對） 傳遞給 GetWebIdentityToken 呼叫，IAM 主體必須具有 `sts:TagGetWebIdentityToken`許可。
+ 使用 [sts：IdentityTokenAudience](reference_policies_iam-condition-keys.md#ck_identitytokenaudience) 條件金鑰來限制哪些外部服務可以接收字符。
+ 使用 [sts：DurationSeconds](reference_policies_iam-condition-keys.md#ck_durationseconds) 條件金鑰來強制執行字符生命週期上限。
+ 使用 [sts：SigningAlgorithm](reference_policies_iam-condition-keys.md#ck_signingalgorithm) 條件金鑰來要求特定的密碼編譯演算法。
+ 使用 [aws：RequestTag](reference_policies_condition-keys.md#condition-keys-requesttag) 條件金鑰，將請求中傳遞的標籤鍵值對與您在政策中指定的標籤對進行比較。
+ 使用 [aws：TagKeys](reference_policies_condition-keys.md#condition-keys-tagkeys) 條件索引鍵，將請求中的標籤索引鍵與您在政策中指定的索引鍵進行比較。

請參閱 [IAM 和 AWS STS](reference_policies_iam-condition-keys.md) 條件金鑰，進一步了解 IAM 政策中可用的條件金鑰。

此範例身分政策結合了多個條件索引鍵：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowTokenGenerationWithRestrictions",
            "Effect": "Allow",
            "Action": "sts:GetWebIdentityToken",
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "sts:IdentityTokenAudience": [
                        "https://api1.example.com",
                        "https://api2.example.com"
                    ]
                },
                "NumericLessThanEquals": {
                    "sts:DurationSeconds": 300
                },
                "StringEquals": {
                    "sts:SigningAlgorithm": "ES384"
                }
            }
        }
    ]
}
```

## 最佳實務
<a name="outbound-best-practices"></a>

遵循這些建議，將 AWS 您的身分安全地聯合到外部 服務。
+ **使用較短的字符生命週期：**請求具有最短生命週期的字符，以符合您的操作需求。
+ **使用 IAM 政策實作最低權限存取並限制權杖屬性：**僅將 `sts:GetWebIdentityToken`許可授予需要它的 IAM 主體。視需要使用條件索引鍵來指定簽署演算法、允許的權杖對象和權杖生命週期上限。
+ **驗證外部服務中的宣告：**為了安全起見，請一律驗證相關宣告，例如主旨 ("sub")、受眾 ("aud") 等，以確保符合您預期的值。盡可能驗證自訂宣告，以在外部服務中啟用精細的授權決策。

# IAM 中的暫時安全憑證
<a name="id_credentials_temp"></a>

您可以使用 AWS Security Token Service (AWS STS) 來建立和提供信任的使用者暫時安全登入資料，以控制對 AWS 資源的存取。暫時性安全憑證的作用幾乎與長期存取金鑰憑證完全相同，而其差異如下：
+ 暫時安全憑證是「短期」**的，如其名稱所暗示。其可設定為在任何地方持續幾分鐘到幾小時不等。登入資料過期後， AWS 就無法再辨識這些登入資料，也無法允許從使用它們提出的 API 請求進行任何類型的存取。
+ 暫時性安全憑證不會與使用者一起儲存，但會動態產生並在請求時提供給使用者。當暫時性安全憑證到期時 (或者即使在此之前)，使用者可以請求新的憑證，只要使用者的請求仍具有可這麼做的許可。

因此，相較於長期憑證，暫時性憑證具有下列優點：
+ 您不需要向應用程式分發或嵌入長期 AWS 安全登入資料。
+ 您可以為使用者提供 AWS 資源的存取權，而不必為其定義 AWS 身分。臨時憑證是[角色](id_roles.md)和[聯合身分](id_roles_providers.md)的基礎。
+ 臨時安全憑證的存留期有限，因此當不再需要時，您不需要更新它們或明確予以撤銷。暫時性安全憑證到期之後，就無法重複使用。您可以指定憑證的有效期，達到最長限制。

## AWS STS 和 AWS 區域
<a name="sts-regionalization"></a>

 AWS STS所產生暫時性安全憑證。根據預設， AWS STS 是位於 的單一端點的全域服務`https://sts.amazonaws.com`。不過，您也可以選擇對任何其他支援區域中的端點進行 AWS STS API 呼叫。這可透過從地理位置較靠近您的區域的伺服器傳送請求，來降低延遲發生機率 (伺服器延遲)。無論您的憑證來自哪個區域，都能全域使用。如需詳細資訊，請參閱 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

## 暫時性憑證的常見案例
<a name="sts-introduction"></a>

暫時性憑證在涉及聯合身分、委派、跨帳戶存取和 IAM 角色的案例中非常有用。

### 聯合身分
<a name="id-federation"></a>

您可以在 外部的外部系統中管理您的使用者身分， AWS 並授予從這些系統登入的使用者執行 AWS 任務和存取 資源 AWS 的存取權。IAM 支援兩種類型的聯合身分。在這兩種情況下，身分都會存放在 外部 AWS。差別是外部系統所在地點是您的資料中心或外部第三方的 Web 上。若要比較聯合身分的臨時安全憑證的功能，請參閱[比較 AWS STS 登入資料](id_credentials_sts-comparison.md)。

如需關於外部身分提供者的詳細資訊，請參閱[身分提供者和聯合身分 AWS](id_roles_providers.md)。
+ **OpenID Connect (OIDC) 聯合身分**：您可以讓使用者使用知名第三方身分提供者 (例如，Login with Amazon、Facebook、Google，或任何適用於您的行動或 Web 應用程式的與 OIDC 2.0 相容的提供者) 登入，您無需建立自訂登入代碼或管理您自己的使用者身分。使用 OIDC 聯合可協助您保持 AWS 帳戶 安全，因為您不必將 IAM 使用者存取金鑰等長期安全登入資料與您的應用程式一起分發。如需詳細資訊，請參閱[OIDC 聯合身分](id_roles_providers_oidc.md)。

  AWS STS OIDC 聯合支援 Login with Amazon、Facebook、Google 和任何與 OpenID Connect (OIDC) 相容的身分提供者。
**注意**  
對於行動應用程式，我們建議您使用 Amazon Cognito。您可以使用此服務搭配 AWS SDKs進行行動開發，為使用者建立唯一身分，並對其進行驗證，以安全地存取您的 AWS 資源。Amazon Cognito 支援與 相同的身分提供者 AWS STS，也支援未經驗證的 （訪客） 存取，並可讓您在使用者登入時遷移使用者資料。Amazon Cognito 還提供 API 操作以同步使用者資料，如此可在使用者於不同裝置之間移動時進行保留。如需詳細資訊，請參閱 *Amplify 文件* 中的 [Amplify 身分驗證](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js/#authentication-with-amplify)。
+ **SAML 聯合** – 您可以對組織網路中的使用者進行身分驗證，然後為這些使用者提供 的存取權， AWS 而無需為其建立新的 AWS 身分，並要求他們使用不同的登入憑證登入。這稱為臨時存取的*單一登入*方法。 AWS STS 支援開放標準，例如安全性聲明標記語言 (SAML) 2.0，您可以使用 Microsoft AD FS 來利用您的 Microsoft Active Directory。您也可以使用 SAML 2.0 來管理您自己的聯合使用者身分的解決方案。如需詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。
  + **自訂聯合代理程式** – 您可以使用組織的身分驗證系統來授予 AWS 資源的存取權。如需範例案例，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。
  + **使用 SAML 2.0 的聯合** – 您可以使用您組織的身分驗證系統和 SAML，來授予 AWS 資源的存取。如需詳細資訊和範例案例，請參閱 [SAML 2.0 聯合身分](id_roles_providers_saml.md)。

### 跨帳戶存取的角色
<a name="role_cross-account"></a>

許多組織維護多個 AWS 帳戶。您可以使用角色和跨帳戶存取，來定義一個帳戶中的使用者身分，並使用那些身分來存取屬於您組織的其他帳戶中的 AWS 資源。這就是所謂暫時存取的「委派」**方法。如需有關建立跨帳戶角色的詳細資訊，請參閱 [建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)。若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

### Amazon EC2 的角色
<a name="role_ec2"></a>

如果您在 Amazon EC2 執行個體上執行應用程式，並且那些應用程式需要存取 AWS 資源，則您可以在您啟動它們時提供暫時安全憑證。這些暫時性安全憑證可供在執行個體上執行的所有應用程式使用，因此您不需要在執行個體上儲存任何長期憑證。如需詳細資訊，請參閱[使用 IAM 角色為在 Amazon EC2 執行個體上執行的應用程式授予許可](id_roles_use_switch-role-ec2.md)。

若要進一步了解 IAM Amazon EC2 角色憑證，請參閱 *Amazon Elastic Compute Cloud User Guide* 中的 [IAM roles for Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

### AWS 其他服務
<a name="other-services"></a>

您可以使用臨時安全登入資料來存取大多數 AWS 服務。如需接受暫時性安全性憑證的服務的清單，請參閱[AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md)。

## 使用臨時憑證的應用程式範例
<a name="id_credentials_temp_sample-apps"></a>

您可以使用 AWS Security Token Service (AWS STS) 來建立信任的使用者，並提供暫時安全登入資料，以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](#id_credentials_temp)。若要了解如何使用 AWS STS 來管理臨時安全登入資料，您可以下載下列範例應用程式，以實作完整的範例案例：
+ [AWS 使用 Windows Active Directory、ADFS 和 SAML 2.0 將聯合啟用至 ](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)。示範如何使用企業聯合將存取權委派給 AWS 使用 Windows Active Directory (AD)、Active Directory Federation Services (ADFS) 2.0 和 SAML （安全性聲明標記語言） 2.0 的 。
+ [啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。示範如何建立啟用單一登入 (SSO) 的自訂聯合代理程式，使現有 Active Directory 使用者能夠登入  AWS 管理主控台。
+ [如何使用 Shibboleth 進行 的單一登入 AWS 管理主控台。](https://aws.amazon.com/blogs/security/how-to-use-shibboleth-for-single-sign-on-to-the-aws-management-console/)示範如何使用 [Shibboleth](http://shibboleth.net/) 與 [SAML](id_roles_providers_saml.md) 來提供使用者存取 AWS 管理主控台的單一登入 (SSO) 許可。

### OIDC 聯合身分的範例
<a name="sts-sample-apps-wif"></a>

下列範例應用程式說明如何使用 Login with Amazon、Amazon Cognito、Facebook 或 Google 等提供商的 OIDC 聯合身分。您可以從這些供應商交易身分驗證，以取得臨時 AWS 安全登入資料以存取 AWS 服務。
+ [Amazon Cognito 教學](https://docs.aws.amazon.com/cognito/latest/developerguide/tutorials.html)課程 – 我們建議您使用 Amazon Cognito 搭配 AWS SDKs進行行動開發。Amazon Cognito 是進行行動應用程式身分管理的最便捷的方式，並提供了同步和跨裝置身分驗證等連接功能。如需有關 Amazon Cognito 的詳細資訊，請參閱 *Amplify 文件* 中的 [Amplify 身分驗證](https://docs.amplify.aws/lib/auth/getting-started/q/platform/js/#authentication-with-amplify)。

## 暫時性安全憑證的其他資源。
<a name="id_credentials_temp_related-topics"></a>

以下案例和應用程式可以指導您使用暫時性安全憑證：
+ [如何將 AWS STS SourceIdentity 與您的身分提供者整合](https://aws.amazon.com/blogs/security/how-to-integrate-aws-sts-sourceidentity-with-your-identity-provider/)。此文章說明如何在使用 AWS STS `SourceIdentity` Okta、Ping 或 OneLogin 做為 IdP 時設定 屬性。
+  [OIDC 聯合身分](id_roles_providers_oidc.md)。本節討論如何在使用 OIDC 聯合身分和 `AssumeRoleWithWebIdentity` API 時設定 IAM 角色。
+ [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md). 本主題說明如何使用角色來要求多重要素驗證 (MFA) 以保護您的帳戶中的敏感 API 動作。

如需 中政策和許可的詳細資訊， AWS 請參閱下列主題：
+ [AWS 資源的存取管理](access.md)
+ [政策評估邏輯](reference_policies_evaluation-logic.md).
+ *Amazon Simple Storage Service 使用者指南*中的[管理 Amazon S3 資源的存取許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)。
+  若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

# 比較 AWS STS 登入資料
<a name="id_credentials_sts-comparison"></a>

下表比較傳回暫時安全登入資料之 中 API AWS STS 操作的功能。若要了解可用來在擔任角色時請求暫時性安全憑證的不同方法，請參閱[擔任角色的方法](id_roles_manage-assume.md)。若要了解可讓您傳遞工作階段標籤的不同 AWS STS API 操作，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

**注意**  
您可以將 AWS STS API 呼叫傳送至全域端點或其中一個區域端點。如果您選擇比較靠近您的端點，您可以減少延遲並改善您的 API 呼叫的效能。如果可以不再與原始端點通訊，您也可以選擇將您的呼叫導向至其他區域性端點。如果您使用的是其中一個各種 AWS SDKs，請在進行 API 呼叫之前使用該 SDK 方法來指定區域。如果您手動建構 HTTP API 請求，則必須您自己將請求直接導向到正確的端點。如需詳細資訊，請參閱[*區域與端點*的AWS STS 一節](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)和 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。


|  **AWS STS API**  |  **誰可以呼叫**  |  **憑證存留期 (最小 \$1 最大 \$1 預設)**  |  **MFA 支援**¹  |  **工作階段政策支援**²  |  **產生的暫時憑證限制**  | 
| --- | --- | --- | --- | --- | --- | 
|  [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)  | 具現有暫時性安全憑證的 IAM 使用者或 IAM 角色  | 15 分鐘 \$1 最大工作階段持續時間設定³ \$1 1 小時  | 是  | 是 |  無法呼叫 `GetFederationToken` 或 `GetSessionToken`。  | 
|  [AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)  | 任何使用者；呼叫者必須傳遞 SAML 身分驗證回應，指出通過已知身分提供者的身分驗證 | 15 分鐘 \$1 最大工作階段持續時間設定³ \$1 1 小時  | 否 | 是 |  無法呼叫 `GetFederationToken` 或 `GetSessionToken`。  | 
|  [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)  | 任何使用者；發起人必須傳遞符合 OIDC 規範的 JWT 權杖，指出通過已知身分提供者的驗證 | 15 分鐘 \$1 最大工作階段持續時間設定³ \$1 1 小時  | 否 | 是 |  無法呼叫 `GetFederationToken` 或 `GetSessionToken`。  | 
| [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) | IAM 使用者或 AWS 帳戶根使用者 |  IAM 使用者：15 分鐘 \$1 36 小時 \$1 12 小時 根使用者：15 分鐘 \$1 1 小時 \$1 1 小時  | 否  | 是  |  無法使用 AWS CLI 或 AWS API 呼叫 IAM 操作。此限制不適用主控台工作階段。 無法呼叫 `GetCallerIdentity`.4 以外的 AWS STS 操作 允許 SSO 到主控台。⁵  | 
| [GetSessionToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) | IAM 使用者或 AWS 帳戶根使用者 |  IAM 使用者：15 分鐘 \$1 36 小時 \$1 12 小時 根使用者：15 分鐘 \$1 1 小時 \$1 1 小時  | 是  | 否  |  除非請求包含 MFA 資訊，否則無法呼叫 IAM API 操作。 無法呼叫 `AssumeRole`或 以外的 AWS STS API 操作`GetCallerIdentity`。 不允許 SSO 到主控台。⁶  | 

 ¹ **MFA 支援**。您可以在您呼叫 AssumeRole 和 GetSessionToken API 操作時，包含有關 多重要素驗證 (MFA) 裝置的資訊。這可確保 API 呼叫所產生的暫時性安全憑證，僅可由使用 MFA 裝置進行身分驗證的使用者使用。如需詳細資訊，請參閱 [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

 ² **工作階段政策支援**。當您以程式設計方式為角色或 AWS STS 聯合身分使用者工作階段建立暫時工作階段時，工作階段政策是做為參數傳遞的政策。這個政策會限制工作階段獲派自角色或使用者之以身分為基礎政策的許可。所產生工作階段的許可會是實體的身分類型政策和工作階段政策的交集。工作階段政策不能用來授予超出即將擔任角色之以身分為基礎政策所允許的許可。如需有關角色工作階段許可的詳細資訊，請參閱 [工作階段政策](access_policies.md#policies_session)。

³ **最大工作階段持續時間設定**。使用 `DurationSeconds` 參數來指定 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定之間的角色工作階段持續時間。若要了解如何檢視角色的最大值，請參閱 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。

⁴ **GetCallerIdentity**。執行此操作不需要任何許可。如果管理員將明確拒絕存取 `sts:GetCallerIdentity` 動作的政策新增到 IAM 使用者或角色，您仍然可以執行此操作。不需要許可，因為當 IAM 使用者或角色被拒絕存取時，會傳回相同的資訊。若要檢視範例回應，請參閱 [我未獲得授權，不得執行：iam:DeleteVirtualMFADevice](troubleshoot.md#troubleshoot_general_access-denied-delete-mfa)。

⁵ **Single sign-on (SSO) 至主控台**。若要支援 SSO，請 AWS 呼叫聯合端點 (`https://signin.aws.amazon.com/federation`) 並傳遞臨時安全登入資料。端點會傳回權杖，您可用來建構 URL，直接將使用者登入主控台，而不需要密碼。如需詳細資訊，請參閱 AWS 安全部落格中的 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md) 和[如何啟用 AWS 管理主控台的跨帳戶存取](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console)。

⁶ 在您擷取暫時憑證後，您無法透過將憑證傳遞到聯合單一登入端點，來存取 AWS 管理主控台 。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。

# 服務持有人權杖
<a name="id_credentials_bearer"></a>

有些 AWS 服務需要您取得 AWS STS 服務承載字符的許可，才能以程式設計方式存取其資源。這些服務支援的協定會要求您使用持有人權杖，而不是使用傳統的 [AWS API 請求的簽章版本 4](reference_sigv.md)。當您執行需要承載字符的 AWS CLI 或 AWS API 操作時， AWS 服務會代表您請求承載字符。該服務會提供您權杖，接著您就可以使用該權杖在該服務中執行後續操作。

AWS STS 服務承載字符包含原始主體身分驗證中可能影響您許可的資訊。此資訊可能包括主體標籤、工作階段標籤和工作階段政策。權杖的存取金鑰 ID 會以 `ABIA` 字首開頭。這可協助您在 CloudTrail 日誌中識別出使用服務持有人權杖來執行的操作。

**重要**  
持有人權杖只能用於對產生該權杖之服務的呼叫，以及產生該權杖的區域中。您無法在其他服務或區域中使用持有人權杖執行操作。

支援承載字符的服務範例是 AWS CodeArtifact。您必須先呼叫 `aws codeartifact get-authorization-token`操作，才能使用 NPM、Maven 或 PIP 等套件管理員與 AWS CodeArtifact 互動。此操作會傳回承載字符，您可以用來執行 AWS CodeArtifact 操作。或者，您也可以使用能完成相同操作並自動設定您用戶端的 `aws codeartifact login` 命令。

如果您在為您產生承載字符的 AWS 服務中執行 動作，您必須在 IAM 政策中擁有下列許可：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowServiceBearerToken",
            "Effect": "Allow",
            "Action": "sts:GetServiceBearerToken",
            "Resource": "*"
        }
    ]
}
```

------

如需服務持有人權杖範例，請參閱 *AWS CodeArtifact* 使用者指南中的[將以身分為基礎的政策用於 AWS CodeArtifact](https://docs.aws.amazon.com/codeartifact/latest/ug/auth-and-access-control-iam-identity-based-access-control.html)。

# 請求臨時安全憑證
<a name="id_credentials_temp_request"></a>

若要請求臨時安全登入資料，您可以在 AWS API 中使用 AWS Security Token Service (AWS STS) 操作。這包括建立和提供信任使用者暫時安全登入資料的操作，這些登入資料可以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。若要了解可用來在擔任角色時請求暫時性安全憑證的不同方法，請參閱[擔任角色的方法](id_roles_manage-assume.md)。

若要呼叫 API 操作，您可以使用其中一個 [AWS 軟體開發套件](https://aws.amazon.com/tools/)。適用於多種程式設計語言和環境的軟體開發套件，包括 Java、.NET、Python、Ruby、Android 和 iOS。開發套件會負責的工作諸如以密碼演算法簽署請求，必要時重試請求，以及處理錯誤回應。您也可以使用 AWS STS 查詢 API，如 [AWS Security Token Service API 參考](https://docs.aws.amazon.com/STS/latest/APIReference/)中所述。最後，兩個命令列工具支援 AWS STS 命令： [AWS Command Line Interface](https://aws.amazon.com/documentation/cli)和 [AWS Tools for Windows PowerShell](https://aws.amazon.com/documentation/powershell)。

 AWS STS API 操作會使用包含存取金鑰對和工作階段字符的臨時安全登入資料建立新的工作階段。存取金鑰對包含存取金鑰 ID 和秘密金鑰。使用者 (或使用者執行的應用程式) 可以使用這些憑證來存取您的資源。您可以建立角色工作階段，並使用 AWS STS API 操作以程式設計方式傳遞工作階段政策和工作階段標籤。所產生工作階段許可會是角色的以身分為基礎的政策和工作階段政策的交集。如需有關工作階段政策的詳細資訊，請參閱 [工作階段政策](access_policies.md#policies_session)。如需有關工作階段標籤的詳細資訊，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

**注意**  
 AWS STS API 操作傳回的工作階段字符大小不固定。我們強烈建議您不對大小上限做出任何假設。一般權杖大小小於 4096 個位元組，但有可能會不同。

## 使用 AWS STS 搭配 AWS 區域
<a name="using_sts_regions"></a>

您可以將 AWS STS API 呼叫傳送至全域端點或其中一個區域端點。如果您選擇比較靠近您的端點，您可以減少延遲並改善您的 API 呼叫的效能。如果可以不再與原始端點通訊，您也可以選擇將您的呼叫導向至其他區域性端點。如果您使用的是其中一個各種 AWS SDKs，請在進行 API 呼叫之前使用該 SDK 方法來指定區域。如果您手動建構 HTTP API 請求，則必須您自己將請求直接導向到正確的端點。如需詳細資訊，請參閱[*區域與端點*的AWS STS 一節](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)和 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

以下是您可以用來取得臨時登入資料的 API 操作，以便在 AWS 環境和應用程式中使用。

## 透過自訂身分經紀人請求跨帳戶委派和聯合身分的憑證
<a name="api_assumerole"></a>

[https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html) API 操作有助於讓現有的 IAM 使用者存取他們尚未存取 AWS 的資源。例如，使用者可能需要存取另一個 AWS 帳戶中的資源。它也能夠用來暫時獲得特殊許可，例如，提供多重要素驗證 (MFA)。您必須使用作用中的登入資料呼叫此 API。若要了解誰可以呼叫此操作，請參閱 [比較 AWS STS 登入資料](id_credentials_sts-comparison.md)。如需詳細資訊，請參閱[建立角色以將許可授予 IAM 使用者](id_roles_create_for-user.md)及[透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

**透過自訂身分經紀人請求跨帳戶委派和聯合身分的臨時安全憑證**

1. 使用您的 AWS 安全登入資料進行驗證。必須使用有效的 AWS 安全憑證進行此呼叫。

1. 呼叫 [https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com//STS/latest/APIReference/API_AssumeRole.html) 操作。

以下範例顯示使用 `AssumeRole` 的範例請求及回應。此範例請求假設指定時間內的 `demo` 角色具有已包含的[工作階段政策](access_policies.md#policies_session)、[工作階段標籤](id_session-tags.md)、[外部 ID](id_roles_common-scenarios_third-party.md) 和[來源身分](id_credentials_temp_control-access_monitor.md)。產生的工作階段名為 `John-session`。

**Example 範例請求**  

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=AssumeRole
&RoleSessionName=John-session
&RoleArn=arn:aws::iam::123456789012:role/demo
&Policy=%7B%22Version%22%3A%222012-10-17		 	 	 %22%2C%22Statement%22%3A%5B%7B%22Sid%22%3A%20%22Stmt1%22%2C%22Effect%22%3A%20%22Allow%22%2C%22Action%22%3A%20%22s3%3A*%22%2C%22Resource%22%3A%20%22*%22%7D%5D%7D
&DurationSeconds=1800
&Tags.member.1.Key=Project
&Tags.member.1.Value=Pegasus
&Tags.member.2.Key=Cost-Center
&Tags.member.2.Value=12345
&ExternalId=123ABC
&SourceIdentity=DevUser123
&AUTHPARAMS
```

在上述範例中顯示的政策值是以下政策的 URL 編碼版本：

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

****  

```
{"Version":"2012-10-17",		 	 	 "Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:*","Resource":"*"}]}
```

------

範例中的 `AUTHPARAMS` 參數是*簽章*的預留位置。簽章是您在 AWS HTTP API 請求中必須包含的身分驗證資訊。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請參閱《》中的[使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)，以*Amazon Web Services 一般參考*了解如何簽署請求。

除了暫時性安全憑證外，回應包含聯合身分使用者的 Amazon Resource Name (ARN) 和憑證過期時間。

**Example 回應範例**  

```
<AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<AssumeRoleResult>
<SourceIdentity>DevUser123</SourceIdentity>
<Credentials>
  <SessionToken>
   AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW
   LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd
   QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU
   9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz
   +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==
  </SessionToken>
  <SecretAccessKey>
   wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
  </SecretAccessKey>
  <Expiration>2019-07-15T23:28:33.359Z</Expiration>
  <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
</Credentials>
<AssumedRoleUser>
  <Arn>arn:aws:sts::123456789012:assumed-role/demo/John</Arn>
  <AssumedRoleId>ARO123EXAMPLE123:John</AssumedRoleId>
</AssumedRoleUser>
<PackedPolicySize>8</PackedPolicySize>
</AssumeRoleResult>
<ResponseMetadata>
<RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
</ResponseMetadata>
</AssumeRoleResponse>
```

**注意**  
 AWS 轉換會將傳遞的工作階段政策和工作階段標籤壓縮為具有個別限制的封裝二進位格式。即使您的純文字符合其他需求，您的請求也可能因不符限制而失敗。`PackedPolicySize` 回應元素會按百分比指出請求的政策和標籤與大小上限的距離。

## 透過 OIDC 提供者請求憑證
<a name="api_assumerolewithwebidentity"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作會傳回一組臨時 AWS 安全憑證，以換取 JSON Web 權杖 (JWT)。其中包括公有身分提供者 (例如 Login with Amazon、Facebook、Google)，以及發行與 OpenID Connect (OIDC) 探索相容的 JWT 的提供者 (例如 GitHub actions 或 Azure Devops)。如需詳細資訊，請參閱[OIDC 聯合身分](id_roles_providers_oidc.md)。

**注意**  
`AssumeRoleWithWebIdentity` 請求未經簽名，且不需要 AWS 憑證。

**透過 OIDC 提供者請求憑證**

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) 操作。

   當您呼叫 時`AssumeRoleWithWebIdentity`， 會使用 IdP 的 JSON Web 金鑰集 (JWKS) 提供的公有金鑰驗證數位簽章，以 AWS 驗證顯示的字符。如果字符有效，且符合 IAM 角色信任政策中規定的所有條件， 會 AWS 傳回下列資訊給您：
   + 一組暫時性安全憑證。這些包含存取金鑰 ID、私密存取金鑰和工作階段權杖。
   + 所擔任角色的角色 ID 和 ARN。
   + `SubjectFromWebIdentityToken` 值，其中包含唯一的使用者 ID。

1. 然後，您的應用程式可能會使用回應中傳回的臨時安全登入資料來進行 AWS API 呼叫。這與使用長期安全登入資料進行 AWS API 呼叫的程序相同。差別在於您必須包含工作階段字符，讓 驗證 AWS 臨時安全登入資料是否有效。

您的應用程式應快取 傳回的登入資料 AWS STS ，並視需要重新整理。如果您的應用程式是使用 AWS SDK 建置，則 SDK 具有登入資料提供者，可在登入資料過期之前處理呼叫`AssumeRoleWithWebIdentity`和重新整理 AWS 登入資料。如需詳細資訊，請參閱 *AWS SDKs and Tools Reference Guide* 中的 [AWS SDKs and Tools standardized credential providers](https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html)。

## 透過 SAML 2.0 身分提供者請求憑證
<a name="api_assumerolewithsaml"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作會傳回 SAML 聯合身分主體的一組臨時安全憑證，這些主體透過您組織現有的身分系統進行驗證。使用者還必須使用 [SAML 2.0 (安全聲明標記語言)](https://www.oasis-open.org/standards#samlv2.0) 來將身分驗證和授權資訊傳遞至 AWS。這個 API 操作適用於整合他們自己的身分系統的組織 (例如，Windows Active Directory 或 OpenLDAP)，而軟體可以產生 SAML 聲明。這種整合會提供有關使用者身分和許可 (例如 Active Directory Federation Services 或 Shibboleth) 的資訊。如需詳細資訊，請參閱[SAML 2.0 聯合身分](id_roles_providers_saml.md)。

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) 操作。

   這是未簽署的呼叫，這表示您不需要在提出請求之前驗證 AWS 安全登入資料。
**注意**  
`AssumeRoleWithSAML` 呼叫未簽署 (加密)。因此，如果請求是透過信任的媒介傳輸，您應該只包含選用的工作階段政策。在這種情況下，有人可以更改政策以移除限制。

1. 當您呼叫 時`AssumeRoleWithSAML`， 會 AWS 驗證 SAML 聲明的真實性。假設身分提供者驗證聲明， 會 AWS 傳回下列資訊給您：
   + 一組暫時性安全憑證。這些包含存取金鑰 ID、私密存取金鑰和工作階段權杖。
   + 所擔任角色的角色 ID 和 ARN。
   + `Audience` 值，其包含 SAML 聲明的 `Recipient` 元素的 `SubjectConfirmationData` 屬性值。
   + `Issuer` 值，其包含 SAML 聲明的 `Issuer` 元素的值。
   + 包含從 SAML 供應商的值、 AWS 帳戶 ID 和易記名稱建置的雜湊`Issuer`值的`NameQualifier`元素。當與 `Subject` 元素結合使用時，這些內容可以唯一識別 SAML 聯合身分主體。
   + `Subject` 元素，其包含 SAML 聲明的 `NameID` 元素的 `Subject` 元素值。
   + `SubjectType` 元素指出 `Subject` 元素的格式。此值可以是 `persistent`、`transient` 或在您的 SAML 聲明中使用的 `Format` 與 `Subject` 元素的完整 `NameID` URI。如需 `NameID` 元素的 `Format` 屬性的詳細資訊，請參閱 [為身分驗證回應設定 SAML 聲明](id_roles_providers_create_saml_assertions.md)。

1. 使用回應中傳回的臨時安全登入資料來進行 AWS API 呼叫。這與使用長期安全登入資料進行 AWS API 呼叫的程序相同。差別在於您必須包含工作階段權杖，這個權杖可讓 AWS 驗證臨時安全憑證是否有效。

您的應用程式應該快取憑證。預設情況下，憑證會在一小時後到期。如果您不是在 AWS SDK 中使用 [AmazonSTSCredentialsProvider](https://aws.amazon.com/blogs/mobile/using-the-amazoncredentialsprovider-protocol-in-the-aws-sdk-for-ios) 動作，則由您和應用程式`AssumeRoleWithSAML`再次呼叫。呼叫此操作，或取得一組新的暫時性安全憑證，之後舊的憑證才會過期。

## 透過自訂身分經紀人請求憑證
<a name="api_getfederationtoken"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 操作會傳回 AWS STS 聯合身分使用者主體的一組臨時安全登入資料。此 API 與 `AssumeRole` 不同，其中的預設過期時段是實質上比較長 (12 小時，而不是 1 小時)。此外，您可以使用 `DurationSeconds` 參數來指定暫時性安全憑證的持續時間，以保持有效。產生的憑證在指定的持續時間內有效，介於 900 秒 (15 分鐘) 至 129,600 秒 (36 小時) 之間。較長的過期期間有助於減少對 的呼叫次數， AWS 因為您不需要經常取得新的登入資料。

1. 使用特定 IAM 使用者 AWS 的安全登入資料進行驗證。此呼叫必須使用有效的 AWS 安全登入資料進行。

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) 操作。

`GetFederationToken` 呼叫會傳回暫時性安全憑證，該憑證由工作階段字符、存取金鑰、私密金鑰和過期時間組成。如果您想要管理您組織內的許可 (例如，使用 Proxy 應用程式以指派許可)，您可以使用 `GetFederationToken`。

以下範例顯示使用 `GetFederationToken` 的範例請求及回應。此範例請求會將指定期間的呼叫發起使用者與[工作階段政策](access_policies.md#policies_session) ARN 和[工作階段標籤](id_session-tags.md)聯合在一起。產生的工作階段名為 `Jane-session`。

**Example 範例請求**  

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=GetFederationToken
&Name=Jane-session
&PolicyArns.member.1.arn==arn%3Aaws%3Aiam%3A%3A123456789012%3Apolicy%2FRole1policy
&DurationSeconds=1800
&Tags.member.1.Key=Project
&Tags.member.1.Value=Pegasus
&Tags.member.2.Key=Cost-Center
&Tags.member.2.Value=12345
&AUTHPARAMS
```

上述範例中顯示的政策 ARN 包含以下 URL 編碼 ARN：

`arn:aws:iam::123456789012:policy/Role1policy`

此外，請注意範例中的 `&AUTHPARAMS` 參數表示身分驗證資訊的預留位置。這是您必須在 AWS HTTP API 請求中包含的*簽章*。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請前往 中的[使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)*Amazon Web Services 一般參考*，了解如何簽署請求。

除了暫時性安全憑證外，回應包含聯合身分使用者的 Amazon Resource Name (ARN) 和憑證過期時間。

**Example 回應範例**  

```
<GetFederationTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<GetFederationTokenResult>
<Credentials>
  <SessionToken>
   AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQW
   LWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGd
   QrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU
   9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz
   +scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCEXAMPLE==
  </SessionToken>
  <SecretAccessKey>
  wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
  </SecretAccessKey>
  <Expiration>2019-04-15T23:28:33.359Z</Expiration>
  <AccessKeyId>AKIAIOSFODNN7EXAMPLE;</AccessKeyId>
</Credentials>
<FederatedUser>
  <Arn>arn:aws:sts::123456789012:federated-user/Jean</Arn>
  <FederatedUserId>123456789012:Jean</FederatedUserId>
</FederatedUser>
<PackedPolicySize>4</PackedPolicySize>
</GetFederationTokenResult>
<ResponseMetadata>
<RequestId>c6104cbe-af31-11e0-8154-cbc7ccf896c7</RequestId>
</ResponseMetadata>
</GetFederationTokenResponse>
```

**注意**  
 AWS 轉換會將傳遞的工作階段政策和工作階段標籤壓縮為具有個別限制的封裝二進位格式。即使您的純文字符合其他需求，您的請求也可能因不符限制而失敗。`PackedPolicySize` 回應元素會按百分比指出請求的政策和標籤與大小上限的距離。

AWS 建議您在資源層級授予許可 （例如，您將資源型政策連接到 Amazon S3 儲存貯體），您可以省略 `Policy` 參數。不過，如果您未包含 AWS STS 聯合身分使用者主體的政策，則暫時安全登入資料將不會授予任何許可。在這種情況下，您「必須」**使用資源政策，來授予聯合身分使用者存取您 AWS 資源的許可。

例如，假設您的 AWS 帳戶 號碼是 111122223333，而且您要允許 Susan 存取 Amazon S3 儲存貯體。Susan 的暫時性安全憑證不包含儲存貯體的政策。在這種情況下，您需要確保儲存貯體具有其 ARN 與 Susan 的 ARN 相符的政策，例如 `arn:aws:sts::111122223333:federated-user/Susan`。

## 為不信任環境中的使用者請求憑證
<a name="api_getsessiontoken"></a>

[https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) API 操作會傳回現有 IAM 使用者的一組臨時安全憑證。這有助於提供增強的安全性，例如僅在 IAM 使用者啟用 MFA 時允許 AWS 請求。因為憑證為暫時性，它們可在您有透過較不安全環境存取您資源的 IAM 使用者時，提供增強的安全性。較不安全環境的範例包含行動裝置或 Web 瀏覽器。

1. 使用特定 IAM 使用者 AWS 的安全登入資料進行驗證。此呼叫必須使用有效的 AWS 安全登入資料進行。

1. 呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 操作。

1. `GetSessionToken` 會傳回暫時性安全憑證，其由工作階段字符、存取金鑰 ID 和私密存取金鑰組成。

在預設情況下，IAM 使用者的暫時性安全憑證的有效期最長為 12 小時。但是，您可以使用 `DurationSeconds` 參數請求持續時間最短為 15 分鐘最長為 36 小時。基於安全考量， 的字符的持續時間限制 AWS 帳戶根使用者 為一小時。

以下範例顯示使用 `GetSessionToken` 的範例請求及回應。回應還包括暫時性安全憑證的過期時間。

**Example 範例請求**  

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=GetSessionToken
&DurationSeconds=1800
&AUTHPARAMS
```

範例中的 `AUTHPARAMS` 參數是*簽章*的預留位置。簽章是您在 AWS HTTP API 請求中必須包含的身分驗證資訊。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請前往 中的[使用簽章第 4 版簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)*Amazon Web Services 一般參考*，了解如何簽署請求。

**Example 回應範例**  

```
<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<GetSessionTokenResult>
<Credentials>
  <SessionToken>
   AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/L
   To6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3z
   rkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtp
   Z3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE
  </SessionToken>
  <SecretAccessKey>
  wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
  </SecretAccessKey>
  <Expiration>2011-07-11T19:55:29.611Z</Expiration>
  <AccessKeyId>AKIAIOSFODNN7EXAMPLE</AccessKeyId>
</Credentials>
</GetSessionTokenResult>
<ResponseMetadata>
<RequestId>58c5dbae-abef-11e0-8cfe-09039844ac7d</RequestId>
</ResponseMetadata>
</GetSessionTokenResponse>
```

或者，`GetSessionToken`請求可以包含 AWS 多重要素驗證 (MFA) 驗證的 `SerialNumber`和 `TokenCode`值。如果提供的值有效， AWS STS 會提供包含 MFA 身分驗證狀態的臨時安全登入資料。然後，只要 MFA 身分驗證有效，就可以使用臨時安全登入資料來存取受 MFA 保護的 API 操作或 AWS 網站。

以下範例顯示 `GetSessionToken` 請求，其中包含 MFA 驗證碼和裝置序號。

```
https://sts.amazonaws.com/
?Version=2011-06-15
&Action=GetSessionToken
&DurationSeconds=7200
&SerialNumber=YourMFADeviceSerialNumber
&TokenCode=123456
&AUTHPARAMS
```

**注意**  
對 的呼叫 AWS STS 可以是全域端點或您啟用 的任何區域端點 AWS 帳戶。如需詳細資訊，請參閱[*區域與端點*的AWS STS 一節](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)。  
範例中的 `AUTHPARAMS` 參數是*簽章*的預留位置。簽章是您在 AWS HTTP API 請求中必須包含的身分驗證資訊。我們建議使用 [AWS 開發套件](https://aws.amazon.com/tools/)來建立 API 請求。執行此作業的其中一個好處是開發套件會為您處理請求簽署。如果您必須手動建立和簽署 API 請求，請參閱《[》中的使用簽章版本 4 簽署 AWS 請求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)，以*Amazon Web Services 一般參考*了解如何簽署請求。

# 搭配 AWS 資源使用臨時登入資料
<a name="id_credentials_temp_use-resources"></a>

您可以使用臨時安全登入資料，使用 AWS CLI 或 AWS API （使用 [AWS SDKs](https://aws.amazon.com/tools/)) 對 AWS 資源提出程式設計請求。暫時性憑證提供的許可與長期安全憑證許可相同，例如 IAM 使用者憑證。不過，有幾個差異：
+ 當您使用臨時安全登入資料進行呼叫時，呼叫必須包含工作階段字符，該字符會與這些臨時登入資料一起傳回。 AWS 會使用工作階段字符來驗證臨時安全登入資料。
+ 暫時性憑證在指定的間隔時間後到期。暫時性憑證到期後，使用這些憑證進行的任何呼叫都將失敗，所以您必須產生一組新的暫時性憑證。暫時性憑證無法延期或重新整理超過原始指定間隔。
+ 當您使用暫時憑證發出請求時，您的主體可能會包含一組標籤。這些標籤來自工作階段標籤和連接到您擔任角色的標籤。如需有關工作階段標籤的詳細資訊，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

如果您使用的是 [AWS SDK](https://aws.amazon.com/tools)、[AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/) (AWS CLI) 或 [Tools for Windows PowerShell](https://aws.amazon.com/powershell)，則取得和使用臨時安全憑證的方式會隨內容而有所不同。如果您在 EC2 執行個體內執行程式碼 AWS CLI或 Tools for Windows PowerShell 命令，您可以利用 Amazon EC2 的角色。否則，您可以呼叫 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/) 以取得暫時憑證，然後明確地使用他們呼叫 AWS 服務。

**注意**  
您可以使用 AWS Security Token Service (AWS STS) 來建立信任的使用者，並提供暫時安全登入資料，以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。 AWS STS 是一項全域服務，其在 具有預設端點`https://sts.amazonaws.com`。此端點位在美國東部 (維吉尼亞北部) 區域，但您從此端點和其他端點取得的憑證為全域有效。這些憑證可配合任何區域中的服務和資源使用。您也可以選擇對任何支援區域中的端點進行 AWS STS API 呼叫。從地理位置較靠近您的區域的伺服器提出請求，可以降低延遲發生機率。無論您的憑證來自哪個區域，都能全域使用。如需詳細資訊，請參閱 [在 AWS STS 中管理 AWS 區域](id_credentials_temp_enable-regions.md)。

**Contents**
+ [在 Amazon EC2 執行個體中使用暫時憑證](#using-temp-creds-sdk-ec2-instances)
+ [搭配 AWS SDKs](#using-temp-creds-sdk)
+ [搭配 使用臨時安全登入資料 AWS CLI](#using-temp-creds-sdk-cli)
+ [使用暫時性安全憑證與 API 操作](#RequestWithSTS)
+ [其他資訊](#using-temp-creds-more-info)

## 在 Amazon EC2 執行個體中使用暫時憑證
<a name="using-temp-creds-sdk-ec2-instances"></a>

如果您想要在 EC2 執行個體內執行 AWS CLI 命令或程式碼，建議取得登入資料的方式是使用 [Amazon EC2 的角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。您建立 IAM 角色，指定要授予在 EC2 執行個體上執行之應用程式的許可。當您啟動執行個體時，會建立角色與執行個體的關聯。

然後 AWS CLI，在執行個體上執行的應用程式和 Tools for Windows PowerShell 命令可以從執行個體中繼資料取得自動臨時安全登入資料。您不必明確取得暫時安全憑證。適用於 Windows PowerShell AWS SDKs AWS CLI和 Tools 會自動從 EC2 執行個體中繼資料服務 (IMDS) 取得憑證並使用它們。暫時性憑證擁有您為與執行個體定義關聯的角色所定義的許可。

如需詳細資訊及範例，請參閱下列：
+  [使用 IAM 角色授予 AWS Amazon Elastic Compute Cloud 上資源的存取權](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html)： 適用於 Java 的 AWS SDK
+  [使用 IAM 角色授予存取權](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-hosm.html) — 適用於 .NET 的 AWS SDK 
+  [建立角色](https://docs.aws.amazon.com/sdk-for-ruby/latest/developer-guide/iam-example-create-role.html) — 適用於 Ruby 的 AWS SDK

## 搭配 AWS SDKs
<a name="using-temp-creds-sdk"></a>

若要在程式碼中使用臨時安全登入資料，請以程式設計方式呼叫類似 的 AWS STS API，`AssumeRole`並擷取產生的登入資料和工作階段字符。然後，您可以將這些值用作後續呼叫的登入資料 AWS。下列範例顯示假碼，說明如何在使用 AWS SDK 時使用臨時安全登入資料：

```
assumeRoleResult = AssumeRole(role-arn);
tempCredentials = new SessionAWSCredentials(
   assumeRoleResult.AccessKeyId, 
   assumeRoleResult.SecretAccessKey, 
   assumeRoleResult.SessionToken);
s3Request = CreateAmazonS3Client(tempCredentials);
```

如需使用 Python 撰寫的範例 (使用 [適用於 Python (Boto) 的 AWS SDK](https://aws.amazon.com/sdk-for-python/))，請參閱[切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)。此範例會示範如何呼叫 `AssumeRole` 以取得暫時安全憑證，然後使用這些憑證呼叫 Amazon S3。

如需如何呼叫 `AssumeRole`、`GetFederationToken` 以及其他 API 操作的詳細資訊，請參閱 [AWS Security Token Service API 參考](https://docs.aws.amazon.com/STS/latest/APIReference/)。有關從結果取得臨時安全憑證和工作階段權杖的詳細資訊，請參閱您正在使用的軟體開發套件的說明文件。您可以在 SDK **SDKs 和工具組**區段的主要文件頁面上找到所有 AWS SDKs 的文件。 [AWS](https://aws.amazon.com/documentation)

您必須在舊的憑證到期之前，確實取得一組新的憑證。在某些軟體開發套件中，您可以使用為您管理重新整理憑證程序的提供者；檢查您正在使用的開發套件的文件。

## 搭配 使用臨時安全登入資料 AWS CLI
<a name="using-temp-creds-sdk-cli"></a>

您可以使用暫時性安全憑證與 AWS CLI。這很適合用於測試政策。

若使用 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/)，您便可以呼叫 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/) (例如 `AssumeRole` 或 `GetFederationToken`)，然後擷取產生的輸出。以下範例顯示對 `AssumeRole` 的呼叫，其會傳送輸出至檔案。在此範例中，假設 `profile` 參數是 AWS CLI 組態檔案中的設定檔。同時也假設會參考有權擔任角色之 IAM 使用者的憑證。

```
aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --profile IAM-user-name > assume-role-output.txt
```

當命令完成時，您可以從您路由的任何地方擷取存取金鑰 ID、私密存取金鑰和工作階段權杖。您可以手動或使用指令碼執行這項作業。然後，您可以將這些值指派給環境變數。

當您執行 AWS CLI 命令時， 會先在環境變數中 AWS CLI 尋找特定順序的登入資料，然後在組態檔案中尋找登入資料。因此，在您將臨時登入資料放入環境變數之後， 預設 AWS CLI 會使用這些登入資料。（如果您在 命令中指定`profile`參數， 會 AWS CLI 略過環境變數。 相反地， 會在組態檔案中 AWS CLI 尋找，這可讓您視需要覆寫環境變數中的登入資料。) 

下列範例示範如何設定暫時安全登入資料的環境變數，然後呼叫 AWS CLI 命令。由於 AWS CLI 命令中不包含 `profile` 參數，因此 會先在環境變數中 AWS CLI 尋找登入資料，因此會使用臨時登入資料。

**Linux**

```
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
$ export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
$ export AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of session token>
$ aws ec2 describe-instances --region us-west-1
```

**Windows**

```
C:\> SET AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE
C:\> SET AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
C:\> SET AWS_SESSION_TOKEN=AQoDYXdzEJr...<remainder of token> 
C:\> aws ec2 describe-instances --region us-west-1
```

## 使用暫時性安全憑證與 API 操作
<a name="RequestWithSTS"></a>

如果您要向 提出直接 HTTPS API 請求 AWS，您可以使用從 AWS Security Token Service () 取得的臨時安全登入資料來簽署這些請求AWS STS。若要這樣做，您可以使用您從中接收的存取金鑰 ID 和私密存取金鑰 AWS STS。使用存取金鑰 ID 和私密存取金鑰簽署請求的方式，就和使用長期憑證簽署請求一樣。您也可以將您收到的工作階段字符新增至您的 API 請求 AWS STS。您將工作階段權杖新增到 HTTP 標頭，或查詢名為 `X-Amz-Security-Token` 的字串參數。您將工作階段權杖新增到 HTTP 標頭「或」**查詢字串參數，但不是兩者。如需簽署 HTTPS API 請求的詳細資訊，請參閱《》中的[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)*AWS 一般參考*。

## 其他資訊
<a name="using-temp-creds-more-info"></a>

如需將 AWS STS 與其他 AWS 服務搭配使用的詳細資訊，請參閱下列連結：
+ **Amazon S3** 請參閱 *《Amazon Simple Storage Service 使用者指南》*中的[使用 IAM 使用者暫時憑證提出請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html)或[使用聯合身分使用者暫時憑證提出請求](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempFederationToken.html)。
+ **Amazon SNS**。請參閱《Amazon Simple Queue Service 開發人員指南》**中的[將身分型政策與 Amazon SNS 搭配使用](https://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html#UsingTemporarySecurityCredentials_SNS)。
+ **Amazon SQS** 請參閱《Amazon Simple Queue Service 開發人員指南》**中的 [Amazon SQS 中的 Identity and Access Management](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/UsingIAM.html#UsingTemporarySecurityCredentials_SQS)。
+ **Amazon SimpleDB**。請參閱[使用臨時安全憑證](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/index.html?UsingTemporarySecurityCredentials_SDB.html)中的*Amazon SimpleDB 開發人員指南*。

# 臨時安全憑證的許可
<a name="id_credentials_temp_control-access"></a>

您可以使用 AWS Security Token Service (AWS STS) 來建立信任的使用者，並提供暫時安全登入資料，以控制對 AWS 資源的存取。如需 的詳細資訊 AWS STS，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。在 AWS STS 發出臨時安全憑證後，它們在過期期間有效，且無法撤銷。但是，每次發出使用憑證的請求時，都會評估指派給臨時安全憑證的許可，因此您可以透過在發出憑證後變更其存取權來達到撤銷憑證的效果。

下列主題假設您具備 AWS 許可和政策的工作知識。如需有關這些主題的詳細資訊，請參閱 [AWS 資源的存取管理](access.md)。

**Topics**
+ [AssumeRole、AssumeRoleWithSAML 和 AssumeRoleWithWebIdentity 的許可](id_credentials_temp_control-access_assumerole.md)
+ [監控並控制使用擔任角色所採取的動作](id_credentials_temp_control-access_monitor.md)
+ [GetFederationToken 許可](id_credentials_temp_control-access_getfederationtoken.md)
+ [GetSessionToken 許可](id_credentials_temp_control-access_getsessiontoken.md)
+ [停用臨時安全性憑證的許可](id_credentials_temp_control-access_disable-perms.md)
+ [授予許可以建立暫時性安全憑證](id_credentials_temp_control-access_enable-create.md)
+ [授予許可以使用身分增強型主控台工作階段](id_credentials_temp_control-access_sts-setcontext.md)

# AssumeRole、AssumeRoleWithSAML 和 AssumeRoleWithWebIdentity 的許可
<a name="id_credentials_temp_control-access_assumerole"></a>

所擔任角色的許可政策，將會決定由 `AssumeRole`、`AssumeRoleWithSAML` 和 `AssumeRoleWithWebIdentity` 傳回的臨時安全憑證的許可。當您建立或更新角色時定義這些許可。

或者，您可以傳遞內嵌或受管的[工作階段政策](access_policies.md#policies_session)作為 `AssumeRole`、`AssumeRoleWithSAML` 或 `AssumeRoleWithWebIdentity` API 操作的參數。工作階段政策會為該角色的臨時憑證工作階段限制許可。所產生工作階段的許可會是角色的身分類型政策和工作階段政策的交集。您可以在後續 AWS API 呼叫中使用角色的臨時登入資料，來存取擁有該角色之帳戶中的資源。您無法使用工作階段政策來授予超出即將擔任角色之以身分為基礎政策所允許的許可。若要進一步了解 AWS 如何決定角色的有效許可，請參閱[政策評估邏輯](reference_policies_evaluation-logic.md)。

![\[PermissionsWhenPassingRoles_Diagram\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/role_passed_policy_permissions.png)


進行「允許」或「拒絕」授權決策 AWS 時， `AssumeRole` 不會評估連接至發出原始呼叫之登入資料的 政策。使用者暫時放棄其原始許可，以支援由擔任角色指派的許可。在 `AssumeRoleWithSAML`和 `AssumeRoleWithWebIdentity` API 操作中，由於 API 的發起人不是 AWS 身分，因此沒有要評估的政策。

## 範例：使用 AssumeRole 指派許可
<a name="permissions-assume-role-example"></a>

您可以將 `AssumeRole` API 操作與不同類型的政策一起使用。以下是幾個範例。

### 角色許可政策
<a name="permissions-assume-role-example-role-access-policy"></a>

在此範例中，您在呼叫 `AssumeRole` API 操作時未使用選用 `Policy` 參數來指定工作階段。指派給臨時憑證的許可由所擔任角色的許可政策決定。以下範例許可政策授予角色許可，以列出名為 `productionapp` 的 S3 儲存貯體中包含的所有物件。它還允許角色取得、放置和刪除該儲存貯體中的物件。

**Example 角色許可政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::productionapp"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::productionapp/*"
    }
  ]
}
```

### 工作階段政策作為參數傳遞
<a name="permissions-assume-role-example-passed-policy"></a>

假設您想要讓使用者擔任與上一個範例相同的角色。但是，此時您希望該角色工作階段擁有的許可，只允許其取得 `productionapp` S3 儲存貯體中的物件，以及在其中放入物件。您不想讓他們刪除物件。實現此目的一種方法是建立新的角色並在該角色的許可政策中指定所需許可。實現此目的之另一種方法是呼叫 `AssumeRole` API，並將工作階段政策包含在可選的 `Policy` 參數做為 API 操作的一部分。所產生工作階段的許可會是角色的以身分為基礎的政策和工作階段政策的交集。工作階段政策不能用來授予超出即將擔任角色之以身分為基礎政策所允許的許可。如需有關角色工作階段許可的詳細資訊，請參閱 [工作階段政策](access_policies.md#policies_session)。

擷取新的工作階段臨時憑證後，您可以將這些資料傳遞給您希望擁有這些許可的使用者。

例如，假設以下政策做為 API 呼叫的參數傳遞。使用這項工作階段的人員所擁有的許可，將僅能執行下列動作：
+ 列出 `productionapp` 儲存貯體中的所有物件。
+ 取得並將物件放入 `productionapp` 儲存貯體中。

在以下工作階段政策中，`s3:DeleteObject` 許可會遭篩除，而且擔任的工作階段不會獲得 `s3:DeleteObject` 許可的授予。此政策設定角色工作階段的最大許可，並供以覆寫該角色的任何現有許可政策。

**Example 工作階段使用`AssumeRole` API 呼叫傳遞政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::productionapp"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::productionapp/*"
    }
  ]
}
```

### 以資源為基礎的政策
<a name="permissions-assume-role-example-resource-based-policy"></a>

有些 AWS 資源支援以資源為基礎的政策，這些政策提供另一個機制來定義影響臨時安全登入資料的許可。只有少數資源 (例如 Amazon S3 儲存貯體、Amazon SNS 主題和 Amazon SQS 佇列) 支援資源式政策。以下範例使用名為 `productionapp` 的 S3 儲存貯體擴展前面的範例。以下政策連接至儲存貯體。

當您將下面以資源為基礎的政策連接到 `productionapp` 儲存貯體時，將拒絕*所有*使用者從儲存貯體中刪除物件的許可。(請參閱政策中的 `Principal` 元素。) 這包括所有擔任角色使用者，即使角色許可政策授予 `DeleteObject` 許可。明確 `Deny` 陳述式一律優先於 `Allow` 陳述式。

**Example 儲存貯體政策的範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Principal": {"AWS": "*"},
    "Effect": "Deny",
    "Action": "s3:DeleteObject",
    "Resource": "arn:aws:s3:::productionapp/*"
  }
}
```

如需如何合併和評估多個政策類型的詳細資訊 AWS，請參閱 [政策評估邏輯](reference_policies_evaluation-logic.md)。

# 監控並控制使用擔任角色所採取的動作
<a name="id_credentials_temp_control-access_monitor"></a>

[IAM 角色](id_roles.md)是 IAM 中受指派[許可](access_policies.md)的物件。當您使用來自 外部的 IAM 身分或身分[擔任該角色](id_roles_manage-assume.md)時 AWS，您會收到具有指派給該角色之許可的工作階段。

當您在 中執行動作時 AWS，您的工作階段相關資訊可以記錄到 AWS CloudTrail ，以供帳戶管理員監控。管理員可以將角色設定為要求身分傳遞自訂字串，以識別在 AWS中執行動作的人員或應用程式。此身分資訊會儲存為 AWS CloudTrail中的*來源身分*。當管理員查看 CloudTrail 中的活動時，他們可以查看來源身分資訊以判斷曾使用擔任角色工作階段執行動作者。

設定來源身分後，它會出現在角色工作階段期間所採取任何 AWS 動作的請求中。當角色用於透過 AWS CLI 或 AWS API 擔任另一個角色時，設定的 值會持續存在，稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。設定的值無法在角色工作階段期間變更。管理員可以根據來源身分的存在或值來設定精細許可，以進一步控制使用共用角色採取 AWS 的動作。您可以決定是否可以使用來源身分屬性、是否需要，以及可以使用的數值。



您使用來源身分的方式與角色工作階段名稱和工作階段標記有很大的不同。來源身分值在設定之後即無法變更，而且對於對角色工作階段採取的任何其他動作，會持續存在。以下說明如何使用工作階段標籤和角色工作階段名稱：
+ **工作階段標籤** – 您也可以在擔任角色或與使用者聯合身分時傳遞工作階段標籤。擔任角色時，工作階段標籤即會出現。您可以定義使用標籤條件金鑰的政策，以根據主體的標籤來授與許可。您可以使用 CloudTrail 來檢視為了擔任角色或聯合身分使用者而提出的請求。若要進一步了解工作階段標籤，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。
+ **角色工作階段名稱** – 您可以在角色信任政策中使用 `sts:RoleSessionName` 條件金鑰，請求您的使用者在擔任角色時提供特定的工作階段名稱。當不同主體使用角色時，角色工作階段名稱可用來區分角色工作階段。若要進一步了解角色工作階段名稱，請參閱 [sts:RoleSessionName](reference_policies_iam-condition-keys.md#ck_rolesessionname)。

當您想要控制擔任角色的身分時，建議您使用來源身分。對於挖掘 CloudTrail 日誌以判斷使用角色來執行動作的人員時，來源身分也示非常實用的資訊。

**Topics**
+ [設定以使用來源身分](#id_credentials_temp_control-access_monitor-setup)
+ [來源身分的須知事項](#id_credentials_temp_control-access_monitor-know)
+ [設定來源身分所需的許可](#id_credentials_temp_control-access_monitor-perms)
+ [擔任角色時指定來源身分](#id_credentials_temp_control-access_monitor-specify-sourceid)
+ [搭配 AssumeRole 使用來源身分](#id_credentials_temp_control-access_monitor-assume-role)
+ [將來源身分與 AssumeRoleWithSAML 搭配使用](#id_credentials_temp_control-access_monitor-assume-role-saml)
+ [使用具有 AssumeRoleWithWebIdentity 的來源身分](#id_credentials_temp_control-access_monitor-assume-role-web-id)
+ [使用來源身分資訊控制存取](#id_credentials_temp_control-access_monitor-control-access)
+ [在 CloudTrail 中檢視來源身分](#id_credentials_temp_control-access_monitor-ct)

## 設定以使用來源身分
<a name="id_credentials_temp_control-access_monitor-setup"></a>

您設定為使用來源身分的方式將取決於擔任角色時所使用的方法。例如，您的 IAM 使用者可能會直接使用 `AssumeRole` 操作擔任角色。如果您有企業身分，也稱為人力身分，他們可能會使用 存取您的 AWS 資源`AssumeRoleWithSAML`。如果最終使用者要存取您的行動或 Web 應用程式，他們可能會使用 `AssumeRoleWithWebIdentity` 來存取。以下是高階工作流程概觀，可協助您瞭解如何設定以利用現有環境中的來源身分資訊。

1. **設定測試使用者和角色** – 使用生產前環境，設定測試使用者和角色，並設定其政策以允許設定來源身分。

   如果您使用身分提供者 (IdP) 作為聯合身分，請將 IdP 設定為將您選擇的使用者屬性傳遞至聲明或權杖中的來源身分。

1. **擔任角色** – 測試擔任角色，並使用您設定要進行測試的使用者和角色傳遞來源身分。

1. **檢視 CloudTrail** – 檢閱 CloudTrail 日誌中測試角色的來源身分資訊。

1. **培訓您的使用者** – 在生產前環境中進行測試之後，請確保您的使用者知道如何傳入來源身分資訊 (如有必要)。設定您要求使用者在生產環境中提供來源身分的截止日期。

1. **設定生產政策** – 為您的生產環境設定政策，然後將政策新增至您的生產使用者和角色。

1. **監控活動** – 使用 CloudTrail 日誌來監控您的生產角色活動。

## 來源身分的須知事項
<a name="id_credentials_temp_control-access_monitor-know"></a>

使用來源身分時請記住下列事項。
+ 連線至身分提供者 (IdP) 之所有角色的信任政策均須具有 `sts:SetSourceIdentity` 許可。對於角色信任政策中沒有此許可的角色，`AssumeRole*` 操作將會失敗。如果您不想更新每個角色的角色信任政策，則您可以使用個別的 IdP 執行個體傳遞來源身分。然後將 `sts:SetSourceIdentity` 許可僅新增至連線至個別 IdP 的角色。
+ 當身分設定來源身分時，`sts:SourceIdentity` 金鑰會存在於請求中。針對在角色工作階段期間採取的後續動作，`aws:SourceIdentity` 金鑰會出現在請求中。 AWS 不會在 `sts:SourceIdentity` 或 `aws:SourceIdentity` 金鑰中控制來源身分的值。如果您選擇要求來源身分，則必須選擇要讓使用者或 IdP 提供的屬性。基於安全考量，您必須確保您可以控制提供這些值的方式。
+ 來源身分中的值長度必須介於 2 到 64 個字元之間，只能包含字母數位字元、底線和以下字元：**. , \$1 = @ -** (連字號)。您不能使用以文字 **aws:** 為開頭的值。此字首保留供 AWS 內部使用。
+ 當 AWS 服務或服務連結角色代表聯合身分或人力資源身分執行動作時，CloudTrail 不會擷取來源身分資訊。

**重要**  
您無法在 中切換到在擔任角色時 AWS 管理主控台 需要設定來源身分的角色。若要擔任這類角色，您可以使用 AWS CLI 或 AWS API 來呼叫 `AssumeRole`操作，並指定來源身分參數。

## 設定來源身分所需的許可
<a name="id_credentials_temp_control-access_monitor-perms"></a>

除了符合 API 操作的動作外，您必須在您的政策中具備下列僅許可動作：

```
sts:SetSourceIdentity
```
+ 若要指定來源身分，主體 (IAM 使用者和角色) 必須具有 `sts:SetSourceIdentity` 的許可。身為系統管理員，您可以在角色信任政策和主體的權限政策中設定此選項。
+ 當您擔任另一個角色的角色時，稱為[角色鏈結](id_roles.md#iam-term-role-chaining)，在主體 (擔任角色) 的許可政策和目標角色的角色信任政策中都需要 `sts:SetSourceIdentity` 的許可。否則，擔任角色操作將會失敗。
+ 使用來源身分時，連線至 IdP 之所有角色的角色信任政策必須具有 `sts:SetSourceIdentity` 許可。任何連接至 IdP 的角色，在沒有此許可的情況下，`AssumeRole*` 操作將會失敗。如果您不想更新每個角色的角色信任政策，則您可以使用個別的 IdP 執行個體傳遞來源身分，然後將 `sts:SetSourceIdentity` 許可僅新增至連線至個別 IdP 的角色
+ 若要跨帳戶界限設定來源身分，您必須在兩個地方均包含 `sts:SetSourceIdentity` 許可。此許可必須存在於原始帳戶中主體的許可政策，以及目標帳戶中角色的角色信任政策。您可能需要執行此操作，例如，當一個角色被用來在另一個具有[角色鏈結](id_roles.md#iam-term-role-chaining)的帳戶中擔任一個角色時。

身為帳戶管理員，假設您想要允許您帳戶中的 IAM 使用者 `DevUser` 在同一個帳戶中擔任 `Developer_Role`。但是，您希望只有在使用者已將來源身分設定為其 IAM 使用者名稱時，才允許此動作。您可將下列政策連接至 IAM 使用者。

**Example 連接至 DevUser 的以身分為基礎的政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeRole",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/Developer_Role"
    },
    {
      "Sid": "SetAwsUserNameAsSourceIdentity",
      "Effect": "Allow",
      "Action": "sts:SetSourceIdentity",
      "Resource": "arn:aws:iam::123456789012:role/Developer_Role",
      "Condition": {
        "StringLike": {
          "sts:SourceIdentity": "${aws:username}"
        }
      }
    }
  ]
}
```

若要強制執行可接受的來源身分值，您可以設定下列角色信任政策。政策會為 IAM 使用者提供`DevUser`許可來擔任角色並設定來源身分。`sts:SourceIdentity` 條件索引鍵定義了可接受的來源身分值。

**Example 來源身分的角色信任政策範例**  

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowDevUserAssumeRole",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:user/DevUser"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringEquals": {
          "sts:SourceIdentity": "DevUser"
        }
      }
    }
  ]
}
```

------

使用者使用 IAM 使用者的登入資料 `DevUser`，嘗試`DeveloperRole`使用以下 AWS CLI 請求擔任 。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/Developer_Role \
--role-session-name Dev-project \ 
--source-identity DevUser \
```

當 AWS 評估請求時，請求內容會包含 `sts:SourceIdentity`的 `DevUser`。

## 擔任角色時指定來源身分
<a name="id_credentials_temp_control-access_monitor-specify-sourceid"></a>

當您使用其中一個 AWS STS `AssumeRole*` API 操作來取得角色的臨時安全登入資料時，可以指定來源身分。您使用的 API 操作會視您的使用案例而有所不同。例如，如果您使用 IAM 角色讓 IAM 使用者存取他們通常無法存取 AWS 的資源，您可以使用 `AssumeRole`操作。如果您使用企業聯合身分來管理人力使用者，可以使用 `AssumeRoleWithSAML` 操作。如果您使用 OIDC 聯合身分來允許最終使用者存取您的行動裝置或 Web 應用程式，則可以使用 `AssumeRoleWithWebIdentity` 操作。以下各節說明如何在每項操作中使用來源身分。若要進一步了解暫時憑證的常見案例，請參閱[暫時性憑證的常見案例](id_credentials_temp.md#sts-introduction)。

## 搭配 AssumeRole 使用來源身分
<a name="id_credentials_temp_control-access_monitor-assume-role"></a>

`AssumeRole` 操作會傳回一組臨時登入資料，您可用來存取 AWS 資源。您可以使用 IAM 使用者或角色憑證來呼叫 `AssumeRole`。若要在擔任角色時傳遞來源身分，請使用 `-–source-identity` AWS CLI 選項或 `SourceIdentity` AWS API 參數。以下範例顯示如何使用 AWS CLI來指定來源身分。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/developer \
--role-session-name Audit \ 
--source-identity Admin \
```

## 將來源身分與 AssumeRoleWithSAML 搭配使用
<a name="id_credentials_temp_control-access_monitor-assume-role-saml"></a>

主體呼叫 `AssumeRoleWithSAML` 操作是使用 SAML 類型的聯合進行身分驗證。此操作會傳回一組臨時登入資料，您可以用來存取 AWS 資源。如需使用 SAML 型聯合進行 AWS 管理主控台 存取的詳細資訊，請參閱 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。如需 AWS CLI 或 AWS API 存取的詳細資訊，請參閱 [SAML 2.0 聯合身分](id_roles_providers_saml.md)。如需為 Active Directory 使用者設定 SAML 聯合的教學課程，請參閱 AWS 安全部落格中的[AWS 使用 Active Directory 聯合服務 (ADFS) 進行聯合身分驗證](https://aws.amazon.com/blogs/security/aws-federated-authentication-with-active-directory-federation-services-ad-fs/)。

身為管理員，您可以允許公司目錄的成員 AWS 使用 AWS STS `AssumeRoleWithSAML`操作聯合到 。若要執行此操作，您必須完成下列任務：

1. [在組織中設定 SAML 提供者](id_roles_providers_saml_3rd-party.md)。

1. [在 IAM 中建立 SAML 提供者](id_roles_providers_create_saml.md)

1. 在 [中 AWS 為您的 SAML 聯合委託人設定角色及其許可](id_roles_create_for-idp_saml.md)。

1. [完成配置 SAML IdP 並為 SAML 身分驗證回應建立聲明](id_roles_providers_create_saml_assertions.md)。

若要設定來源身分的 SAML 屬性，請包含 `Attribute` 元素與設定為 `https://aws.amazon.com/SAML/Attributes/SourceIdentity` 的 `Name` 屬性。使用 `AttributeValue` 元素指定來源身分的值。例如，假設您希望將下列身分屬性作為來源身分傳遞。

`SourceIdentity:DiegoRamirez`

如要傳遞此屬性，請在您的 SAML 聲明中包含下列元素。

**Example SAML 聲明的程式碼片段範例**  

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/SourceIdentity">
<AttributeValue>DiegoRamirez</AttributeValue>
</Attribute>
```

## 使用具有 AssumeRoleWithWebIdentity 的來源身分
<a name="id_credentials_temp_control-access_monitor-assume-role-web-id"></a>

主體呼叫 `AssumeRoleWithWebIdentity` 操作是使用與 OpenID Connect (OIDC) 相容的聯合身分進行身分驗證。此操作會傳回一組暫時憑證，讓您用來存取 AWS 資源。如需有關使用 OIDC 聯合身分以存取 AWS 管理主控台 的資訊，請參閱 [OIDC 聯合身分](id_roles_providers_oidc.md)。

若要從 OpenID Connect (OIDC) 傳遞來源身分，您必須在 JSON Web 權杖 (JWT) 中包含來源身分。在您提交 `AssumeRoleWithWebIdentity` 請求時，您必須在權杖中的 `[https://aws.amazon.com/](https://aws.amazon.com/)source_identity` 命名空間內包含來源身分。若要進一步了解 OIDC 權杖和要求，請參閱《Amazon Cognito 開發人員指南》**中的[搭配使用者集區使用權杖](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)。

例如，以下解碼後的 JWT 是搭配 `Admin` 來源身分呼叫 `AssumeRoleWithWebIdentity` 的權杖。

**Example 解碼後的 JSON Web 權杖範例**  

```
{
    "sub": "john",
    "aud": "ac_oic_client",
    "jti": "ZYUCeRMQVtqHypVPWAN3VB",
    "iss": "https://xyz.com",
    "iat": 1566583294,
    "exp": 1566583354,
    "auth_time": 1566583292,
    "https://aws.amazon.com/source_identity":"Admin"
}
```

## 使用來源身分資訊控制存取
<a name="id_credentials_temp_control-access_monitor-control-access"></a>

初始設定來源身分時，[sts:SourceIdentity](reference_policies_iam-condition-keys.md#ck_sourceidentity) 金鑰會出現在請求中。設定來源身分之後，[aws:SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity) 金鑰會存在於角色工作階段期間所提出的所有後續請求中。身為管理員，您可以撰寫政策，根據來源身分屬性的存在或值授予條件式授權來執行 AWS 動作。

假設您想要要求開發人員設定來源身分，以擔任具有寫入生產關鍵 AWS 資源許可的關鍵角色。也假設您使用 授予對人力資源身分的 AWS 存取權`AssumeRoleWithSAML`。您只希望資深開發人員 Saanvi 和 Diego 能夠存取角色，因此您為該角色建立下列信任政策。

**Example 來源身分的角色信任政策範例 (SAML)**  

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "SAMLProviderAssumeRoleWithSAML",
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:saml-provider/name-of-identity-provider"
      },
      "Action": [
        "sts:AssumeRoleWithSAML"
      ],
      "Condition": {
        "StringEquals": {
          "SAML:aud": "https://signin.aws.amazon.com/saml"
        }
      }
    },
    {
      "Sid": "SetSourceIdentitySrEngs",
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:saml-provider/name-of-identity-provider"
      },
      "Action": [
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringLike": {
          "sts:SourceIdentity": [
            "Saanvi",
            "Diego"
          ]
        }
      }
    }
  ]
}
```

------

信任政策包含 `sts:SourceIdentity` 的條件，需要 Saanvi 或 Diego 的來源身分，才能擔任關鍵角色。

或者，如果您使用 OIDC 提供者作為聯合身分，且使用者已透過 `AssumeRoleWithWebIdentity` 驗證身分，則您的角色信任政策可能如下所示。

**Example 來源身分的角色信任政策範例 (OIDC 提供者)**  

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::111122223333:oidc-provider/server.example.com"
      },
      "Action": [
        "sts:AssumeRoleWithWebIdentity",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringEquals": {
          "server.example.com:aud": "oidc-audience-id"
        },
        "StringLike": {
          "sts:SourceIdentity": [
            "Saanvi",
            "Diego"
          ]
        }
      }
    }
  ]
}
```

------

### 角色鏈結和跨帳戶需求
<a name="id_credentials_temp_control-access_monitor-chain"></a>

假設您想允許已擔任 `CriticalRole` 的使用者在另一個帳戶中擔任 `CriticalRole_2`。為擔任 `CriticalRole` 而取得的角色工作階段憑證用於將[角色鏈結](id_roles.md#iam-term-role-chaining)至另一個帳戶中的第二個角色 `CriticalRole_2`。角色是跨帳戶界限擔任。因此，必須在 `CriticalRole` 的許可政策和 `CriticalRole_2` 的角色信任政策中授予 `sts:SetSourceIdentity` 許可。

**Example CriticalRole 上的許可政策範例**  

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeRoleAndSetSourceIdentity",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity"
      ],
      "Resource": "arn:aws:iam::222222222222:role/CriticalRole_2"
    }
  ]
}
```

------

為了確保跨帳戶界限設定來源身分，以下角色信任政策僅信任 `CriticalRole` 的角色主體來設定來源身分。

**Example CriticalRole\$12 上的角色信任政策範例**  

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:role/CriticalRole"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetSourceIdentity"
      ],
      "Condition": {
        "StringLike": {
          "aws:SourceIdentity": ["Saanvi","Diego"]
        }
      }
    }
  ]
}
```

------

使用者使用擔任 CritealRole 所取得的角色工作階段憑證進行下列呼叫。來源身分是在擔任 CrealRole 期間所設定，所以不需要再次明確設定。如果使用者嘗試設定的來源身分與擔任 `CriticalRole` 時設定的值不同，則擔任角色請求將會遭到拒絕。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \ 
--role-arn arn:aws:iam::222222222222:role/CriticalRole_2 \
--role-session-name Audit \
```

當呼叫主體擔任角色時，請求中的來源身分會從第一個擔任角色工作階段開始一直存在。因此，`aws:SourceIdentity` 和 `sts:SourceIdentity` 索引鍵均會出現在請求內容中。

## 在 CloudTrail 中檢視來源身分
<a name="id_credentials_temp_control-access_monitor-ct"></a>

您可以使用 CloudTrail 來檢視為了擔任角色或聯合身分使用者而提出的請求。您也可以檢視角色或使用者請求，以在 AWS中採取行動。CloudTrail 日誌檔案包含經擔任角色或聯合身分使用者工作階段的來源身分設定資訊。如需詳細資訊，請參閱[使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)

例如，假設使用者提出 AWS STS `AssumeRole`請求，並設定來源身分。您可以在您的 CloudTrail 日誌的 `requestParameters` 索引鍵中找到 `sourceIdentity` 資訊。

**Example AWS CloudTrail 日誌中的範例 requestParameters 區段**  

```
"eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSAccount",
        "principalId": "AIDAJ45Q7YFFAREXAMPLE",
        "accountId": "111122223333"
    },
    "eventTime": "2020-04-02T18:20:53Z",
    "eventSource": "sts.amazonaws.com",
    "eventName": "AssumeRole",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "203.0.113.64",
    "userAgent": "aws-cli/1.16.96 Python/3.6.0 Windows/10 botocore/1.12.86",
    "requestParameters": {
        "roleArn": "arn:aws:iam::123456789012:role/DevRole",
        "roleSessionName": "Dev1",
        "sourceIdentity": "source-identity-value-set"
    }
```

如果使用者使用擔任的角色工作階段來執行動作，則來源身分資訊會出現在 CloudTrail 日誌的 `userIdentity` 索引鍵中。

**Example AWS CloudTrail 日誌中 userIdentity 金鑰的範例**  

```
{
  "eventVersion": "1.08",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "AROAJ45Q7YFFAREXAMPLE:Dev1",
    "arn": "arn:aws:sts::123456789012:assumed-role/DevRole/Dev1",
    "accountId": "123456789012",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "AROAJ45Q7YFFAREXAMPLE",
        "arn": "arn:aws:iam::123456789012:role/DevRole",
        "accountId": "123456789012",
        "userName": "DevRole"
      },
      "webIdFederationData": {},
      "attributes": {
        "mfaAuthenticated": "false",
        "creationDate": "2021-02-21T23:46:28Z"
      },
      "sourceIdentity": "source-identity-value-present"
    }
  }
}
```

若要查看 CloudTrail 日誌中的範例 AWS STS API 事件，請參閱 [CloudTrail 日誌中的 IAM API 事件範例](cloudtrail-integration.md#cloudtrail-integration_examples-iam-api)。如需有關 CloudTrail 日誌檔案中包含資訊的詳細資訊，請參閱《AWS CloudTrail 使用者指南》**中的 [CloudTrail 事件參考](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html)。

# GetFederationToken 許可
<a name="id_credentials_temp_control-access_getfederationtoken"></a>

此 `GetFederationToken` 操作是由 IAM 使用者所呼叫並會傳回該使用者的臨時憑證。此操作會*聯合*使用者。指派給 AWS STS 聯合身分使用者工作階段的許可定義在兩個位置之一：
+ 該工作階段政策會以 `GetFederationToken` API 呼叫的參數傳遞。(這是最常見的)。
+ 以資源為基礎的政策，在政策的 `Principal`元素中明確命名 AWS STS 聯合身分使用者工作階段。(這是最少見的)。

工作階段政策是一種進階政策，且您會在以程式設計方式建立臨時工作階段時，以參數方式傳遞此政策。當您建立 AWS STS 聯合身分使用者工作階段並傳遞工作階段政策時，產生的工作階段許可是使用者身分型政策和工作階段政策的交集。您無法使用工作階段政策來授予超出即將聯合使用者之以身分為基礎政策所允許的許可。

在大部分情況下，如果您未通過 `GetFederationToken` API 呼叫的政策，則所產生的暫時安全憑證沒有許可。不過，以資源為基礎的政策可提供該工作階段的額外許可。您可以使用以資源為基礎的政策存取資源，該政策會將您的工作階段指定為允許的主體。

下圖顯示政策互動的視覺化呈現，以判斷對 `GetFederationToken` 呼叫傳回的暫時安全憑證的許可。

![\[IAM 使用者下圖顯示核取記號，指出工作階段許可是使用者身分型政策和工作階段政策的交集。工作階段許可也可以是使用者身分型政策和資源型政策的交集。\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/getfederationtoken-permissions.diagram.png)


## 範例：使用 GetFederationToken 指派許可
<a name="permissions-get-federation-token-example"></a>

您可以將 `GetFederationToken` API 動作與不同類型的政策一起使用。以下是幾個範例。

### 連接至 IAM 使用者的政策
<a name="permissions-get-federation-token-example-iam-user"></a>

在這個範例中，您有一個以瀏覽器為基礎的用戶端應用程式，它依賴於兩個後端的 Web 服務。一個後端服務是您自己的身分驗證伺服器，使用您自己的身分系統來驗證用戶端應用程式。另一個後端服務是 AWS 服務，可提供一些用戶端應用程式的功能。用戶端應用程式由您的伺服器進行身分驗證，您的伺服器會建立或擷取適當的許可政策。然後，您的伺服器呼叫 `GetFederationToken` API 以取得暫時安全憑證，並將這些憑證傳回給用戶端應用程式。然後，用戶端應用程式可以使用臨時安全登入資料直接向 AWS 服務提出請求。此架構可讓用戶端應用程式提出 AWS 請求，而無需內嵌長期 AWS 登入資料。

您的身分驗證伺服器使用名為 `token-app` 之 IAM 使用者的長期安全憑證來呼叫 `GetFederationToken` API。但長期 IAM 使用者憑證會保持在伺服器上且絕對不會發佈到用戶端。下列範例政策會連接至 `token-app` IAM 使用者，並定義 AWS STS 聯合身分使用者 （用戶端） 所需的最廣泛許可集。請注意，您的身分驗證服務需要 `sts:GetFederationToken`許可，才能取得 AWS STS 聯合身分使用者的臨時安全登入資料。

**Example 連接到呼叫 `GetFederationToken` 的 IAM 使用者 `token-app` 的政策範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:GetFederationToken",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "dynamodb:ListTables",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "sqs:ReceiveMessage",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "sns:ListSubscriptions",
      "Resource": "*"
    }
  ]
}
```

上述政策會將多個許可授予 IAM 使用者。不過，僅此政策不會將任何許可授予 AWS STS 聯合身分使用者。如果此 IAM 使用者呼叫 `GetFederationToken`，且 未將政策作為 API AWS STS 呼叫的參數傳遞，則產生的聯合身分使用者沒有有效的許可。

### 工作階段政策作為參數傳遞
<a name="permissions-get-federation-token-example-passed-policy"></a>

確保 AWS STS 聯合身分使用者獲指派適當許可的最常見方法是在 `GetFederationToken` API 呼叫中傳遞工作階段政策。擴展前面的範例，假設使用 IAM 使用者 `token-app` 憑證來呼叫 `GetFederationToken`。假設以下工作階段政策做為 API 呼叫的參數傳遞。所產生的 AWS STS 聯合身分使用者具有列出名為 `productionapp` 的 Amazon S3 儲存貯體內容的許可。該使用者無法對 `productionapp` 儲存貯體中的項目執行 Amazon S3 `GetObject`、`PutObject` 和 `DeleteObject` 動作。

聯合身分使用者會獲派這些許可，因為這些許可是 IAM 使用者政策和您傳遞之工作階段政策的交集。

 AWS STS 聯合身分使用者無法在 Amazon SNS、Amazon SQS、Amazon DynamoDB 或任何 S3 儲存貯體中執行動作，但 除外`productionapp`。即使這些許可已授予給與 `GetFederationToken` 呼叫相關聯的 IAM 使用者，這些動作仍然會遭到拒絕。

**Example 工作階段政策作為 `GetFederationToken` API 呼叫的參數傳遞範例**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::productionapp"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::productionapp/*"]
    }
  ]
}
```

### 資源型政策
<a name="permissions-get-federation-token-resource-based-policy"></a>

有些 AWS 資源支援以資源為基礎的政策，而這些政策提供另一種機制，可將許可直接授予 AWS STS 聯合身分使用者。只有部分 AWS 服務支援以資源為基礎的政策。例如，Amazon S3 具有儲存貯體，Amazon SNS 具有主題，並且 Amazon SQS 具有可以連接政策的佇列。如需有關支援以資源為基礎的政策的所有服務的清單，請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md) 並查看表格中的「以資源為基礎的政策」資料列。您可以使用資源型政策，直接將許可指派給 AWS STS 聯合身分使用者。透過在資源型政策的 `Principal`元素中指定 AWS STS 聯合身分使用者的 Amazon Resource Name (ARN) 來執行此操作。以下範例使用名為 `productionapp` 的 S3 儲存貯體說明此範例並擴展前面的範例。

以下以資源為基礎的政策已連接到儲存貯體。此儲存貯體政策允許名為 Carol AWS STS 的聯合身分使用者存取儲存貯體。當前述的範例政策連接至 `token-app` IAM 使用者時，名為 Carol AWS STS 的聯合身分使用者具有許可，可在名為 的儲存貯體上執行 `s3:GetObject`、 `s3:PutObject`和 `s3:DeleteObject`動作`productionapp`。即使沒有工作階段政策做為 `GetFederationToken` API 呼叫的參數傳遞時，也是如此。這是因為在此案例中，名為 Carol AWS STS 的聯合身分使用者已由下列以資源為基礎的政策明確授予許可。

請記住，只有當 AWS STS 這些許可同時明確授予 IAM 使用者***和***聯合身分使用者時， AWS STS 才會授予聯合身分使用者許可。也可以由以資源為基礎的政策授予 （在帳戶中），該政策在政策的 AWS STS `Principal`元素中明確命名聯合身分使用者，如下列範例所示。

**Example 允許存取聯合身分使用者的儲存貯體政策範例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
        "Principal": {
            "AWS": "arn:aws:sts::111122223333:federated-user/Carol"
        },
        "Effect": "Allow",
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::productionapp/*"
        ]
    }
}
```

如需有關如何評估政策的詳細資訊，請參閱[政策評估邏輯](reference_policies_evaluation-logic.md)。

# GetSessionToken 許可
<a name="id_credentials_temp_control-access_getsessiontoken"></a>

呼叫 `GetSessionToken` API 操作或 `get-session-token` CLI 命令的主要時間是，當使用者必須透過多重要素驗證 (MFA) 進行身分驗證時。可以編寫只允許特定操作的一項政策，且只有在這些操作是由經過 MFA 身分驗證的使用者提出的請求時，才允許執行。為成功通過 MFA 身分驗證檢查，使用者必須先呼叫 `GetSessionToken`，並且包含可選的`SerialNumber` 和 `TokenCode` 參數。如果使用者成功通過 MFA 裝置身分驗證，`GetSessionToken` API 操作傳回的憑證包含 MFA 內容。此內容表示使用者通過 MFA 身分驗證，並且獲得 API 操作授權，其需要 MFA 身分驗證。

## GetSessionToken 需要的許可
<a name="getsessiontoken-permissions-required"></a>

使用者要取得工作階段權杖並不需要許可。`GetSessionToken` 操作的目的是使用 MFA 驗證使用者的身分。您不能使用政策來控制驗證操作。

若要授予執行大部分 AWS 操作的許可，請將具有相同名稱的動作新增至政策。例如，若要建立使用者，您必須使用 `CreateUser` API 操作、`create-user` CLI 命令或 AWS 管理主控台。若要執行這些操作，您必須擁有一個政策，其可讓您存取 `CreateUser` 動作。

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

****  

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

------

您可以在您的政策中包含 `GetSessionToken` 動作，但不會影響使用者執行 `GetSessionToken` 操作的能力。

## GetSessionToken 授予的許可
<a name="getsessiontoken-permissions-granted"></a>

如果使用 IAM 使用者的憑證呼叫 `GetSessionToken`，臨時安全性憑證與 IAM 使用者會有相同的許可。同樣地，如果 使用 AWS 帳戶根使用者 登入資料`GetSessionToken`呼叫 ，則暫時安全登入資料具有根使用者許可。

**注意**  
我們建議您不要使用根使用者憑證呼叫 `GetSessionToken`。相反的，請遵循我們的[最佳實務](best-practices-use-cases.md)，並建立具有所需許可的 IAM 使用者。然後，使用這些 IAM 使用者與 進行日常互動 AWS。

當您呼叫 `GetSessionToken` 時您獲得的臨時憑證有下列功能和限制：
+ 您可以使用登入資料來存取 ， AWS 管理主控台 方法是將登入資料傳遞至位於 的聯合單一登入端點`https://signin.aws.amazon.com/federation`。如需詳細資訊，請參閱[啟用 AWS 主控台的自訂身分代理程式存取](id_roles_providers_enable-console-custom-url.md)。
+ 您**無法**使用憑證來呼叫 IAM 或 AWS STS API 操作。**您可以使用**它們來呼叫其他服務的 API 操作 AWS 。

將此 API 操作和其限制及功能與在 [比較 AWS STS 登入資料](id_credentials_sts-comparison.md) 建立臨時安全性憑證的 API 操作相較

如需有關使用 `GetSessionToken` 的受 MFA 保護之 API 存取的詳細資訊，請參閱 [透過 MFA 實現安全的 API 存取](id_credentials_mfa_configure-api-require.md)。

# 停用臨時安全性憑證的許可
<a name="id_credentials_temp_control-access_disable-perms"></a>

暫時安全憑證在過期之前持續有效。這些憑證在指定的持續時間內有效，從 900 秒 (15 分鐘) 至最長 129,600 秒 (36 小時)。預設工作階段持續時間為 43,200 秒 (12 小時)。您可以撤銷這些憑證，但也必須變更 IAM 使用者或角色的許可，以停止使用遭洩漏的憑證進行惡意帳戶活動。每次使用指派給臨時安全登入資料的許可來提出 AWS 請求時，都會進行評估。從登入資料中移除所有許可後，使用它們的 AWS 請求會失敗。

政策更新可能需要幾分鐘的時間才會生效。對於 IAM 角色工作階段，您可以撤銷角色的臨時安全憑證，以強制所有擔任該角色的使用者重新驗證並請求新的憑證。如需詳細資訊，請參閱[撤銷角色的臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)。

您無法變更 的許可 AWS 帳戶根使用者。同樣地，以根使用者身分登入時，您無法更改呼叫 `GetFederationToken` 或 `GetSessionToken` 建立的暫時安全憑證許可。因此，我們建議您不要以根使用者身分呼叫 `GetFederationToken` 或 `GetSessionToken`。

如需有關如何變更 IAM 使用者的許可的程序，請參閱[變更 IAM 使用者的許可](id_users_change-permissions.md)。

如需有關如何變更 IAM 角色的許可的程序，請參閱[更新角色的許可](id_roles_update-role-permissions.md)。

**重要**  
您無法在 IAM 中編輯從 IAM Identity Center 許可集建立的角色。您必須撤銷 IAM Identity Center 中使用者的作用中許可集工作階段。如需詳細資訊，請參閱 *IAM Identity Center User Guide* 中的 [Revoke active IAM role sessions created by permission sets](https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#revoke-user-permissions)。

**Topics**
+ [拒絕存取與角色關聯的所有 IAM 角色工作階段](#deny-access-to-all-sessions)
+ [拒絕存取特定 IAM 角色工作階段](#deny-access-to-specific-session)
+ [拒絕存取具有條件內容索引鍵的臨時安全憑證工作階段](#deny-access-to-specific-session-condition-key)
+ [使用資源型政策拒絕存取特定主體](#deny-access-with-resource-based)

## 拒絕存取與角色關聯的所有 IAM 角色工作階段
<a name="deny-access-to-all-sessions"></a>

此程序拒絕與角色關聯的**所有** IAM 角色工作階段的許可。當您擔心被以下身分進行可疑存取時，請使用此方法：


+ 使用跨帳戶存取權的其他帳戶中的主體
+ 具有存取您帳戶中 AWS 資源許可的外部使用者身分
+ 在行動或 Web 應用程式中，已透過 OIDC 提供者驗證的使用者

若要變更或移除透過呼叫 `AssumeRole`、`AssumeRoleWithSAML`、`AssumeRoleWithWebIdentity`、`GetFederationToken` 或 `GetSessionToken` 而取得的指派給臨時安全憑證的許可，您可以編輯或刪除為角色定義許可的身分型政策。

**重要**  
如果存在允許主體存取的以資源為基礎的政策，您還必須為該資源新增明確拒絕。如需詳細資訊，請參閱 [使用資源型政策拒絕存取特定主體](#deny-access-with-resource-based)。

**若要拒絕存取與角色關聯的**所有** IAM 角色工作階段**

1. 登入 AWS 管理主控台 並開啟 IAM 主控台。

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

1. 選擇要編輯的角色名稱。您可以使用搜尋方塊來篩選清單。

1. 選擇**許可**索引標籤。

1. 選取要編輯的相關政策。在編輯客戶管理政策之前，檢閱**連接的實體**索引標籤，以避免中斷對可能已連接相同政策的其他身分的存取。

1. 選擇 **JSON** 標籤並更新政策以拒絕所有資源和動作。
**注意**  
這些許可與 AWS 受管政策 [AWSDenyAll](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSDenyAll.html) 中的許可相同。您可以將此 AWS 受管政策連接至您想要拒絕所有存取的任何 IAM 使用者或角色。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "DenyAll",
               "Effect": "Deny",
               "Action": [
                   "*"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在 **Review** (檢視) 頁面上，查看政策 **Summary** (摘要)，然後選擇 **Save changes** (儲存政策) 以儲存您的工作。

在更新政策時，所做出的變更將影響與該角色關聯的所有暫時安全憑證的許可，包括在更改該角色的許可政策之前發行的憑證。

更新政策之後，您可以[撤銷角色的暫時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)以立即撤銷角色所發行憑證的所有許可。

## 拒絕存取特定 IAM 角色工作階段
<a name="deny-access-to-specific-session"></a>

當您使用全部拒絕政策更新 IAM 角色或完全刪除該角色時，有權存取該角色的所有使用者都會中斷。您可以拒絕存取，而不會影響與該角色關聯的所有其他工作階段的許可。

您可以使用[條件內容索引鍵](#deny-access-to-specific-session-condition-key)或[以資源為基礎的政策](#deny-access-with-resource-based)拒絕 `Principal` 的許可。

**提示**  
您可以使用 AWS CloudTrail 日誌來尋找聯合身分使用者的 ARNs。如需詳細資訊，請參閱[如何使用 輕鬆識別您的聯合身分使用者 AWS CloudTrail](https://aws.amazon.com/blogs/security/how-to-easily-identify-your-federated-users-by-using-aws-cloudtrail/)。

## 拒絕存取具有條件內容索引鍵的臨時安全憑證工作階段
<a name="deny-access-to-specific-session-condition-key"></a>

您可以在想要拒絕存取特定臨時安全憑證工作階段的情況下使用身分型政策中的條件內容索引鍵，而不影響建立憑證的 IAM 使用者或角色的許可。對於 IAM 角色，在更新政策之後，您還可以[撤銷角色的臨時安全憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)工作階段，以立即撤銷所有發行的憑證。

如需條件內容索引鍵的詳細資訊，請參閱 [AWS 全域條件內容索引鍵](reference_policies_condition-keys.md)。

### aws:PrincipalArn
<a name="deny-access-condition-key-principalarn"></a>

您可以在身分型政策中使用條件內容索引鍵 [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn)，依 Amazon Resource Name (ARN) 拒絕存取特定主體。您可以透過在政策的條件元素中指定暫時安全登入資料與之關聯的 AWS STS IAM 使用者、角色或聯合身分使用者工作階段的 ARN 來執行此操作。

**若要依 ARN 拒絕存取特定主體**

1. 在 IAM 主控台導覽窗格中，選擇**使用者**或**角色**。

1. 選擇要編輯的 IAM 使用者或角色的名稱。您可以使用搜尋方塊來篩選清單。

1. 選擇**許可**索引標籤。

1. 選取要編輯的相關政策。在編輯客戶管理政策之前，檢閱**連接的實體**索引標籤，以避免中斷對可能已連接相同政策的其他身分的存取。

1. 選擇 **JSON** 標籤並為主體 ARN 新增拒絕陳述式，如下列範例所示。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Deny",
         "Action": "*",
         "Resource": "*",
         "Condition": {
           "ArnEquals": {
             "aws:PrincipalArn": [
               "arn:aws:iam::222222222222:role/ROLENAME",
               "arn:aws:iam::222222222222:user/USERNAME",
               "arn:aws:iam::222222222222:federated-user/USERNAME" 
             ]
           }
         }
       }
     ]
   }
   ```

------

1. 在 **Review** (檢視) 頁面上，查看政策 **Summary** (摘要)，然後選擇 **Save changes** (儲存政策) 以儲存您的工作。

### aws:SourceIdentity
<a name="deny-access-condition-key-sourceidentity"></a>

您可以在身分型政策中使用條件內容索引鍵 [aws:SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity)，拒絕存取與 IAM 角色工作階段關聯的特定來源身分。只要角色工作階段是在委託人使用任何 AWS STS `assume-role`\$1 CLI 命令或 AWS STS `AssumeRole`\$1 API 操作擔任角色時，透過設定`SourceIdentity`請求參數發出，就會套用。您可以透過在政策的 `Condition` 元素中指定臨時安全憑證關聯的來源身分來執行此操作。

與內容索引鍵 [sts:RoleSessionName](reference_policies_iam-condition-keys.md#ck_rolesessionname) 不同，在設定來源身分之後，無法變更值。`aws:SourceIdentity` 索引鍵會出現在由角色所採取的所有動作的請求內容中。當您使用工作階段憑證來擔任另一個角色時，來源身分仍然存在於後續角色工作階段。從另一個角色取得及擔任角色稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。

下列政策顯示如何使用條件內容索引鍵 `aws:SourceIdentity` 拒絕存取暫時安全憑證工作階段的範例。如果您指定與角色工作階段關聯的來源身分，則它會拒絕含有具名來源身分的角色工作階段，而不會影響建立憑證的角色的許可。在此範例中，發出角色工作階段時，主體設定的來源身分為 `nikki_wolf@example.com`。具有來源身分 `nikki_wolf@example.com` 的角色工作階段發出的任何請求都會遭拒，因為來源身分包含在政策條件中，且政策效果設定為 `Deny`。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:SourceIdentity": [
            "nikki_wolf@example.com",
            "<source identity value>"
          ]
        }
      }
    }
  ]
}
```

------

### aws:userid
<a name="deny-access-condition-key-userid"></a>

您可以在身分型政策中使用條件內容索引鍵 [aws:userid](reference_policies_condition-keys.md#condition-keys-userid) 拒絕存取與 IAM 使用者或角色關聯的所有或特定臨時安全憑證工作階段。您可以透過在政策的 `Condition`元素中指定暫時安全登入資料相關聯的 IAM AWS STS 使用者、角色或聯合身分使用者工作階段的唯一識別符 (ID) 來執行此操作。

下列政策顯示如何使用條件內容索引鍵 `aws:userid` 拒絕存取暫時安全憑證工作階段的範例。
+ `AIDAXUSER1` 代表 IAM 使用者的唯一 ID。指定 IAM 使用者的唯一 ID 作為內容索引鍵 `aws:userid` 的值將拒絕存取 IAM 使用者。其中包括透過呼叫 `GetSessionToken` API 建立的任何臨時安全憑證工作階段。
+ `AROAXROLE1:*` 代表與 IAM 角色關聯的所有工作階段的唯一 ID。將 IAM 角色的唯一 ID 和 caller-specified-role-session-name 部分中的萬用字元 (\$1) 指定為內容索引鍵 `aws:userid` 的值將拒絕與該角色關聯的所有工作階段。
+ `AROAXROLE2:<caller-specified-role-session-name>` 代表擔任角色工作階段的唯一 ID。在擔任角色唯一 ID 的 caller-specified-role-session-name 部分中，如果使用 StringLike 條件運算子，您可以指定角色工作階段名稱或萬用字元。如果您指定角色工作階段名稱，則它會拒絕具名角色工作階段，而不會影響建立憑證的角色的許可。如果您為角色工作階段名稱指定萬用字元，則它會拒絕與角色關聯的所有工作階段。
**注意**  
呼叫者指定的角色工作階段名稱是擔任角色工作階段的唯一識別碼的一部分，可能會在角色鏈結期間變更。當一個角色擔任另一個角色時，會發生角色鏈結。當委託人使用 API 操作擔任角色時，會使用 AWS STS `AssumeRole` `RoleSessionName`請求參數設定角色工作階段名稱。
+ `account-id:<federated-user-caller-specified-name>` 代表 AWS STS 聯合身分使用者工作階段的唯一 ID。IAM 使用者透過呼叫 `GetFederationToken` API 來建立此工作階段。為 AWS STS 聯合身分使用者工作階段指定唯一 ID 會拒絕具名聯合身分工作階段，而不會影響建立憑證的 IAM 使用者的許可。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:userId": [
            "AIDAXUSER1",
            "AROAXROLE1:*",
            "AROAXROLE2:<caller-specified-role-session-name>",
            "123456789012:<federated-user-caller-specified-name>"
          ]
        }
      }
    }
  ]
}
```

------

如需主體索引鍵值的特定範例，請參閱 [主體索引鍵值](reference_policies_variables.md#principaltable)。如需有關 IAM 唯一識別碼以及如何取得它們的資訊，請參閱[唯一識別碼](reference_identifiers.md#identifiers-unique-ids)。

## 使用資源型政策拒絕存取特定主體
<a name="deny-access-with-resource-based"></a>

若要使用資源型政策限制對特定主體的存取，您可以使用 `Condition` 元素中的條件內容索引鍵 [aws:PrincipalArn](reference_policies_condition-keys.md#condition-keys-principalarn) 或 [aws:SourceIdentity](reference_policies_condition-keys.md#condition-keys-sourceidentity)。資源型政策是連接至資源的許可政策，可控制誰可以存取資源，以及他們可以對其執行哪些動作。

當您使用`aws:PrincipalARN`內容金鑰時，請在政策的條件元素中指定與暫時安全登入資料相關聯的 IAM AWS STS 使用者、角色或聯合身分使用者工作階段的 ARN。下列範例政策示範如何在資源型政策中使用 `aws:PrincipalARN` 內容索引鍵：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Principal": "*",
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
    "Condition": {
      "ArnEquals": {
        "aws:PrincipalArn": [
          "arn:aws:iam::222222222222:role/ROLENAME",
          "arn:aws:iam::222222222222:user/USERNAME",
          "arn:aws:sts::222222222222:federated-user/USERNAME"
        ]
      }
    }
  }
}
```

------

當您使用 `aws:SourceIdentity` 內容索引鍵時，在政策的 `Condition` 元素中指定與角色的臨時安全憑證關聯的來源身分值。只要角色工作階段是在委託人使用任何 AWS STS `assume-role`\$1 CLI 命令或 AWS STS `AssumeRole`\$1 API 操作擔任角色時，透過設定`SourceIdentity`請求參數發出，就會套用。下列範例示範如何在資源型政策中使用 `aws:SourceIdentity` 內容索引鍵：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Principal": "*",
    "Effect": "Deny",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket",
    "Condition": {
      "StringLike": {
        "aws:SourceIdentity": [
          "nikki_wolf@example.com",
          "<source identity value>"
        ]
      }
    }
  }
}
```

------

如果您僅更新主體的身分型政策，其仍然可以執行資源型政策中允許的動作，除非在身分型政策中明確拒絕這些動作。

**若要在資源型政策中拒絕存取特定主體**

1. 請參閱 [AWS 使用 IAM 的 服務](reference_aws-services-that-work-with-iam.md) 以查看服務是否支援以資源為基礎的政策。

1. 登入 AWS 管理主控台 並開啟 服務的 主控台。每個服務在主控台中都有不同的位置用於附加政策。

1. 編輯資源型政策。新增拒絕政策陳述式以指定憑證的識別資訊：

   1. 在 `Principal` 元素中，輸入萬用字元 (\$1)。在 `Condition` 元素中，主體將受到限制。

   1. 在 `Effect` 元素中，輸入 "Deny"。

   1. 在 `Action` 中，輸入服務命名空間和要拒絕的動作名稱。若要拒絕所有動作，請使用萬用字元 (\$1)。例如：`"s3:*"`。

   1. 在 `Resource` 元素中，輸入目標資源的 ARN。例如：`"arn:aws:s3:::amzn-s3-demo-bucket"`。

   1. 在 `Condition` 元素中，指定 `aws:PrincipalARN` 或 `aws:SourceIdentity` 內容索引鍵。

      如果您使用 `aws:PrincipalARN` 內容索引鍵，請輸入要拒絕其存取之主體的 ARN。

      如果您使用 `aws:SourceIdentity` 內容索引鍵，請在角色工作階段中輸入要拒絕存取的來源身分值。

1. 儲存您的工作。

# 授予許可以建立暫時性安全憑證
<a name="id_credentials_temp_control-access_enable-create"></a>

依預設，IAM 使用者沒有為 AWS STS 聯合身分使用者工作階段和角色建立臨時安全憑證的許可。您必須使用政策提供您的使用者這些許可。雖然您可以直接授予許可給使用者，我們強烈建議您將許可授予群組。這可讓許可的管理更輕鬆。當有人不再需要執行與許可相關的任務時，您只需從群組中移除許可。如果其別人需要執行該任務，將它們新增到群組以授予許可。

若要授予 IAM 群組為 AWS STS 聯合身分使用者工作階段或角色建立臨時安全憑證的許可，您可以連接能夠授予以下一個或兩個權限的政策：
+ 若要讓 OIDC 和 SAML 聯合主體存取 IAM 角色，請將存取權授予 AWS STS `AssumeRole`。
+ <a name="para_gsy_hxg_1t"></a>對於不需要角色的 AWS STS 聯合身分使用者，將存取權授予 AWS STS `GetFederationToken`。

 如需有關 `AssumeRole` 和 `GetFederationToken` API 操作間差異的詳細資訊，請參閱 [請求臨時安全憑證](id_credentials_temp_request.md)。

IAM 使用者也可以呼叫 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 建立臨時安全憑證。使用者呼叫 `GetSessionToken` 不需要許可。此操作的目的是使用 MFA 驗證使用者的身分。您不能使用政策來控制身分驗證。這表示您無法避免 IAM 使用者呼叫 `GetSessionToken` 來建立臨時憑證。

**Example 授予許可以擔任角色的政策範例**  
下列範例政策授予 呼叫 中`UpdateApp`角色`AssumeRole`的許可 AWS 帳戶 `123123123123`。當使用 `AssumeRole` 時，代表聯合身分使用者建立安全憑證的使用者 (或應用程式)，無法委派角色許可政策中未指定的許可。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::123123123123:role/UpdateAPP"
  }]
}
```

**Example 授予許可以建立聯合身分使用者的暫時性安全憑證的政策範例**  
下列範例政策會授予許可以存取 `GetFederationToken`。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:GetFederationToken",
    "Resource": "*"
  }]
}
```

**重要**  
當您授予 IAM 使用者許可，讓他們能夠透過 `GetFederationToken` 為 AWS STS 聯合身分使用者建立臨時安全憑證時，請留意，這會允許這些使用者委派自己的許可。如需在 IAM 使用者和 之間委派許可的詳細資訊 AWS 帳戶，請參閱 [委派存取權限的政策範例](id_roles_create_policy-examples.md)。如需有關如何控制暫時性安全憑證的許可的詳細資訊，請參閱[臨時安全憑證的許可](id_credentials_temp_control-access.md)。

**Example 授予使用者有限許可以建立聯合身分使用者的暫時性安全憑證的政策範例**  
當您讓 IAM 使用者呼叫 `GetFederationToken`，最佳實務是限制 IAM 使用者可以委派的許可。例如，下列政策顯示如何讓 IAM 使用者僅為名稱開頭為 *Manager* AWS STS 的聯合身分使用者建立臨時安全登入資料。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Effect": "Allow",
    "Action": "sts:GetFederationToken",
    "Resource": ["arn:aws:sts::123456789012:federated-user/Manager*"]
  }]
}
```

# 授予許可以使用身分增強型主控台工作階段
<a name="id_credentials_temp_control-access_sts-setcontext"></a>

身分增強主控台工作階段可在 AWS IAM Identity Center 使用者登入時將使用者和工作階段 IDs AWS 包含在使用者的主控台工作階段中。例如，Amazon Q Developer Pro 利用身分增強型主控台工作階段來個人化服務體驗。如需有關身分增強型主控台工作階段的詳細資訊，請參閱 *AWS IAM Identity Center User Guide* 中的 [Enabling identity-enhanced console sessions](https://docs.aws.amazon.com/singlesignon/latest/userguide/identity-enhanced-sessions.html)。如需有關 Amazon Q Developer 設定的資訊，請參閱 *Amazon Q Developer User Guide* 中的 [Setting up Amazon Q Developer](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/setting-up.html)。

為了讓身分增強型主控台工作階段可供使用者使用，您必須使用身分型政策向 IAM 主體授予代表其自己的主控台工作階段的資源的 `sts:SetContext` 許可。

**重要**  
依預設，使用者無權為身分增強型主控台工作階段設定內容。為此，您必須在身分型政策中向 IAM 主體授予 `sts:SetContext` 許可，如下面的政策範例所示。

下列以身分為基礎的政策範例會將 `sts:SetContext`許可授予 IAM 主體，允許主體為自己的主控台工作階段設定身分增強型 AWS 主控台工作階段內容。政策資源 `arn:aws:sts::account-id:self`代表呼叫者的 AWS 工作階段。如果跨多個帳戶部署相同的許可政策 (例如使用 IAM Identity Center 許可集部署此政策)，則可以將 `account-id` ARN 區段取代為萬用字元 `*`。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:SetContext",
            "Resource": "arn:aws:sts::111122223333:self"
        }
    ]
}
```

------

# 在 AWS STS 中管理 AWS 區域
<a name="id_credentials_temp_enable-regions"></a>

區域端點是 Web 服務特定區域內進入點的 AWS URL。 AWS 建議使用 Regional AWS Security Token Service (AWS STS) 端點而非全域端點，以減少延遲、建置備援並提高工作階段字符有效性。雖然全域 （舊版） AWS STS 端點`https://sts.amazonaws.com`高度可用，但它託管在單一 AWS 區域、美國東部 （維吉尼亞北部） 和其他端點，但它不提供自動容錯移轉到其他區域中的端點。
+ **降低延遲** – 透過 AWS STS 呼叫地理位置上更接近服務和應用程式的端點，您可以存取具有更低延遲和更好回應時間 AWS STS 的服務。
+ **內建備援** – 您可以將工作負載內失敗的影響限制為有限數量的元件，且具有可預測的影響限制範圍。使用區域 AWS STS 端點可讓您將元件的範圍與工作階段字符的範圍保持一致。如需有關此可靠性支柱的詳細資訊，請參閱 *AWS  Well-Architected Framework *中的[使用故障隔離來保護工作負載](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/use-fault-isolation-to-protect-your-workload.html)。
+ **提高工作階段字符有效性** – 區域 AWS STS 端點的工作階段字符在所有 中都有效 AWS 區域。來自全域 STS 端點的工作階段權杖僅在預設啟用 AWS 區域 的 中有效。如果您想要為帳戶啟用新的區域，您可以從區域 AWS STS 端點使用工作階段字符。如果您選擇使用全域端點，則必須變更全域端點之 AWS STS 工作階段字符的區域相容性。這樣做可確保字符在所有 中都有效 AWS 區域。

如需 AWS STS 區域及其端點的清單，請參閱 [AWS STS 區域和端點](id_credentials_temp_region-endpoints.md)。

**注意**  
AWS 已對[依預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中的 AWS Security Token Service (AWS STS) 全域端點 (`https://sts.amazonaws.com`) 進行變更，以增強其彈性和效能。對全域端點的 AWS STS 請求會在與您的工作負載 AWS 區域 相同的 中自動提供。這些變更不會部署至選擇加入區域。我們建議您使用適當的 AWS STS 區域端點。如需詳細資訊，請參閱[AWS STS 全域端點變更](id_credentials_temp_region-endpoints.md#reference_sts_global_endpoint_changes)。

**Topics**
+ [在 AWS STS 中啟用和停用 AWS 區域](#sts-regions-activate-deactivate)
+ [編寫程式碼以使用 AWS STS 區域](#id_credentials_temp_enable-regions_writing_code)
+ [管理全域端點的工作階段權杖](#sts-regions-manage-tokens)

## 在 AWS STS 中啟用和停用 AWS 區域
<a name="sts-regions-activate-deactivate"></a>

當您啟用區域的 AWS STS 端點時， AWS STS 可以向帳戶中提出 AWS STS 請求的使用者和角色發出臨時登入資料。然後，您就可以在預設啟用或手動啟用的任何區域中使用這些憑證。對於預設啟用的區域，您必須在產生臨時憑證的帳戶中啟用區域 AWS STS 端點。提出請求時使用者登入的是相同帳戶或不同帳戶並不重要。 AWS 帳戶 使用手動啟用的區域請求另一個 中角色的臨時登入資料時，目標帳戶 （包含該角色的帳戶） 必須啟用該區域以進行 AWS STS 操作。這樣可以確保正確地產生臨時安全憑證。

例如，假設帳戶 A 中的使用者想要向 [AWS STS 區域端點](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_region-endpoints.html) `https://sts.ap-southeast-3.amazonaws.com` 傳送 `sts:AssumeRole` API 請求。該請求的目的是為帳戶 B 中名為 `Developer` 的角色取得臨時憑證。由於請求的目的是為帳戶 B 中的實體建立憑證，因此帳戶 B 必須啟用 `ap-southeast-3` 區域。來自帳戶A (或任何其他帳戶) 的使用者可以呼叫 `ap-southeast-3` AWS STS 端點以請求帳戶 B 的憑證，無論該帳戶中是否已啟用該區域。若要進一步了解，請參閱[AWS 區域 在您的帳戶中啟用或停用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html) 。

**注意**  
在該帳戶中使用臨時性憑證的每個人都可使用作用中的區域。若要控制哪些 IAM 使用者或角色可以存取區域，請在許可政策中使用 `aws:RequestedRegion` 條件金鑰。

**在預設啟用 AWS STS 的區域中啟用或停用 （主控台）**

1. 以具有 IAM 管理任務執行許可的根使用者或使用者身分來登入。

1. 開啟 [IAM 主控台](https://console.aws.amazon.com/iam/home?#home)，然後在導覽窗格中選擇 [https://console.aws.amazon.com/iam/home?#account_settings](https://console.aws.amazon.com/iam/home?#account_settings) (帳戶設定)。

1. 在 **Security Token Service (STS)** 的**端點**區段中，找到要設定的區域，然後在 **STS 狀態**資料欄中選擇**作用中**或**非作用中**。

1. 在開啟的對話方塊中，選擇 **Activate** (啟用) 或 **Deactivate** (停用)。

對於必須啟用的區域，我們會在您啟用區域時 AWS STS 自動啟用 。啟用區域之後， AWS STS 一律會為該區域啟用，且您無法停用該區域。若要了解如何啟用預設停用的區域，請參閱《 *AWS 帳戶管理 參考指南*》中的[指定 AWS 區域 您的帳戶可以使用哪些](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)區域。

## 編寫程式碼以使用 AWS STS 區域
<a name="id_credentials_temp_enable-regions_writing_code"></a>

啟用區域之後，您可以將 AWS STS API 呼叫導向該區域。以下 Java 程式碼片段示範如何設定 `AWSSecurityTokenService` 物件，以對歐洲 (米蘭) (eu-south-1) 區域提出請求。

```
EndpointConfiguration regionEndpointConfig = new EndpointConfiguration("https://sts.eu-south-1.amazonaws.com", "eu-south-1");
AWSSecurityTokenService stsRegionalClient = AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(credentials)
.withEndpointConfiguration(regionEndpointConfig)
.build();
```

AWS STS 建議您呼叫區域端點。若要了解如何手動啟用區域，請參閱 *AWS 帳戶管理 Reference Guide* 中的[Specify which AWS 區域 your account can use](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)。

在這個範例中，第一行會執行個體化稱為 `regionEndpointConfig` 的 `EndpointConfiguration` 物件，並將端點和 AWS 區域 的 URL 做為參數傳遞。

若要了解如何使用 SDKs AWS 的環境變數設定 AWS STS 區域端點，請參閱 *AWS SDKs和工具參考指南*中的[AWS STS 區域化端點](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)。

對於所有其他語言和程式設計環境組合，請參閱[相關軟體開發套件的文件](https://aws.amazon.com/tools/)。

## 管理全域端點的工作階段權杖
<a name="sts-regions-manage-tokens"></a>

根據 AWS 服務 預設 AWS 區域 ，大多數都已啟用所有 中的操作。這些區域會自動啟用以搭配 使用 AWS STS。亞太區域 (香港) 之類的某些區域必須手動啟用。若要了解如何啟用和停用 AWS 區域，請參閱 *AWS 帳戶管理 Reference Guide* 中的 [Specify which AWS 區域 your account can use](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)。當您啟用這些 AWS 區域時，它們會自動啟用以供 使用 AWS STS。您無法為已停用的區域啟用 AWS STS 端點。在所有 中有效的工作階段字符 AWS 區域 包含的字元多於在預設啟用的區域中有效的字符。變更此設定可能會影響暫時存放權杖的現有系統。

您可以使用 AWS 管理主控台 AWS CLI或 AWS API 變更此設定。

**變更全域端點工作階段權杖的區域相容性 (主控台)**

1. 以具有 IAM 管理任務執行許可的根使用者或使用者身分來登入。若要變更工作階段權杖的相容性，您必須擁有允許 `iam:SetSecurityTokenServicePreferences` 動作的政策。

1. 開啟 [ IAM 主控台](https://console.aws.amazon.com/iam/home?#home)。在導覽窗格中，選擇 **Account settings (帳戶設定)**。

1. 在 **Security Token Service (STS)** (安全權杖服務 (STS)) 區段的 **Session Tokens from the STS endpoints** (來自 STS 端點的工作階段權杖) 下方。**Global endpoint** (全域端點) 表示 `Valid only in AWS 區域 enabled by default`。選擇 **Change (變更)**。

1. 在**變更區域相容性**對話方塊中，選取**全部 AWS 區域**。接著選擇 **Save changes (儲存變更)**。
**注意**  
在所有 中有效的工作階段字符 AWS 區域 包含的字元多於在預設啟用的區域中有效的字符。變更此設定可能會影響暫時存放權杖的現有系統。

**變更全域端點工作階段權杖的區域相容性 (AWS CLI)**  
設定工作階段字符版本。第 1 版字符僅在預設 AWS 區域 可用的 中有效。這些權杖不適用於手動啟用的區域，例如亞太區域 (香港)。版本 2 權杖在所有區域都有效。不過，版本 2 權杖包含較多字元且可能會影響暫時存放權杖的系統。
+ [https://docs.aws.amazon.com/cli/latest/reference/iam/set-security-token-service-preferences.html](https://docs.aws.amazon.com/cli/latest/reference/iam/set-security-token-service-preferences.html)

**變更全域端點 (AWS API) 工作階段字符的區域相容性**  
設定工作階段字符版本。第 1 版字符僅在預設 AWS 區域 可用的 中有效。這些權杖不適用於手動啟用的區域，例如亞太區域 (香港)。版本 2 權杖在所有區域都有效。不過，版本 2 權杖包含較多字元且可能會影響暫時存放權杖的系統。
+ [https://docs.aws.amazon.com/IAM/latest/APIReference/API_SetSecurityTokenServicePreferences.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_SetSecurityTokenServicePreferences.html) 

# AWS STS 區域和端點
<a name="id_credentials_temp_region-endpoints"></a>

**注意**  
AWS 已對[依預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中的 AWS Security Token Service (AWS STS) 全域端點 (`https://sts.amazonaws.com`) 進行變更，以增強其彈性和效能。對全域端點的 AWS STS 請求會在與您的工作負載 AWS 區域 相同的 中自動提供。這些變更不會部署至選擇加入區域。我們建議您使用適當的 AWS STS 區域端點。如需詳細資訊，請參閱[AWS STS 全域端點變更](#reference_sts_global_endpoint_changes)。

下表列出區域及其端點。它會指出哪些是預設啟用，以及哪些可以啟用或停用。

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

¹ 您必須[啟用區域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)才能使用它。這會自動啟動 AWS STS。您無法手動啟動或停用這些區域中的 AWS STS 。

2若要 AWS 在中國使用 ，您需要一個 帳戶和 登入資料，中國 AWS 為 。

## AWS STS 全域端點變更
<a name="reference_sts_global_endpoint_changes"></a>

AWS 已對[依預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中的 AWS Security Token Service (AWS STS) 全域端點 (`https://sts.amazonaws.com`) 進行變更，以增強其彈性和效能。先前，對 AWS STS 全球端點的所有請求都由單一 AWS 區域美國東部 （維吉尼亞北部） 提供服務。現在，在[預設啟用](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)的區域中， AWS STS 全域端點的請求會在請求來源的相同區域中自動提供，而不是美國東部 （維吉尼亞北部） 區域。這些變更不會部署至選擇加入區域。

透過此變更， AWS STS 會根據使用的原始區域和 DNS 解析程式處理您的請求。如果 AWS STS 全域端點的 DNS 請求是由預設啟用區域中的 Amazon DNS 伺服器處理，則 AWS STS 全域端點的請求會在與 AWS 部署工作負載相同的區域中提供。如果請求來自選擇加入區域，或者請求是使用 DNS 解析程式而不是 Amazon DNS 伺服器進行解析，則向 AWS STS 全域端點發出的請求將繼續在美國東部 (維吉尼亞北部) 區域處理。如需有關 Amazon DNS 的詳細資訊，請參閱 *Amazon Virtual Private Cloud User Guide* 中的 [Amazon DNS server](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#AmazonDNS)。

下表顯示 全域 AWS STS 端點的請求如何根據您的 DNS 供應商路由。


| DNS 解析程式 | 路由到本機 AWS STS 的全域端點請求 AWS 區域？ | 
| --- | --- | 
|  預設啟用區域中 Amazon VPC 中的 Amazon DNS 解析程式  |  是  | 
|  選擇加入區域中 Amazon VPC 中的 Amazon DNS 解析程式  |  否，請求將路由至美國東部 (維吉尼亞北部) 區域  | 
|  由 ISP、公有 DNS 供應商或任何其他 DNS 供應商提供的 DNS 解析程式  |  否，請求將路由至美國東部 (維吉尼亞北部) 區域  | 

為了確保對現有程序的干擾降到最低， AWS 已實作下列措施：
+ AWS CloudTrail 向 AWS STS 全域端點發出的請求日誌會傳送至美國東部 （維吉尼亞北部） 區域。 AWS STS 區域端點所提供請求的 CloudTrail 日誌將繼續記錄在 CloudTrail 中的其各自區域。
+  AWS STS 全域端點和區域端點所執行操作的 CloudTrail 日誌具有額外的欄位`awsServingRegion`，`endpointType`並指出哪個端點和區域提供請求。如需 CloudTrail 日誌範例，請參閱[CloudTrail 日誌檔案中使用全域端點的範例 AWS STS API 事件](cloudtrail-integration.md#stscloudtrailexample-assumerole-sts-global-endpoint)。
+ 無論向哪個區域提供請求，對 AWS STS 全域端點提出`us-east-1`的請求對於`aws:RequestedRegion`條件索引鍵的值為 。
+  AWS STS 全域端點處理的請求不會與區域 AWS STS 端點共用每秒請求配額。

如果您在選擇加入區域中有工作負載，但仍使用 AWS STS 全域端點，建議您遷移至 AWS STS 區域端點，以提高彈性和效能。如需設定區域 AWS STS 端點的詳細資訊，請參閱 *AWS SDKs和工具參考指南*中的[AWS STS 區域端點](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sts-regionalized-endpoints.html)。

## AWS CloudTrail 和區域端點
<a name="sts-regions-cloudtrail"></a>

對區域和全域端點的呼叫會記錄在  AWS CloudTrail 的 `tlsDetails` 欄位中。對區域端點 (例如 `us-east-2.amazonaws.com`) 的呼叫會記錄在 CloudTrail 中適當的區域內。對此全球端點 `sts.amazonaws.com` 的呼叫都會記錄為對全球服務的呼叫。全域 AWS STS 端點的事件會記錄到 us-east-1。

**注意**  
 只有支援此欄位的服務可檢視 `tlsDetails`。請參閱 *AWS CloudTrail  使用者指南*中的 [CloudTrail 中支援 TLS 詳細資訊的服務](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-supported-tls-details.html)  
如需詳細資訊，請參閱[使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)。

# 啟用 AWS 主控台的自訂身分代理程式存取
<a name="id_roles_providers_enable-console-custom-url"></a>

您可以運用編寫和執行程式碼來建立 URL 以使登入到您組織網路的使用者能夠安全存取 AWS 管理主控台。URL 包含您從 取得 AWS 並驗證使用者的登入字符 AWS。產生的主控台工作階段可能因為聯合而包含不同的 `AccessKeyId`。若要透過相關 CloudTrail 事件追蹤聯合登入的存取金鑰使用情況，請參閱 [使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md) 和 [AWS 管理主控台 登入事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-aws-console-sign-in-events.html)。

**注意**  
如果您的組織使用與 SAML 相容的身分提供者 (IdP)，則無需編寫程式碼即可設定對主控台的存取許可。這適用於 Microsoft 的 Active Directory 聯合身分驗證服務或開放原始碼 Shibboleth 等提供者。如需詳細資訊，請參閱[啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。

若要讓組織的使用者能夠存取 AWS 管理主控台，您可以建立執行下列步驟的自訂*身分代理程式*：

1. 確認您的本機身分系統已對使用者進行身分驗證。

1. 呼叫 AWS Security Token Service (AWS STS) [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) （建議） 或 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 操作，以取得使用者的臨時安全登入資料。要了解在擔任角色時使用的各種方法，請參閱 [擔任角色的方法](id_roles_manage-assume.md)。若要了解如何在取得您安全憑證時傳遞選用工作階段標籤，請參閱 [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。
   + 如果使用某個 `AssumeRole*` API 操作取得角色的臨時安全性憑證，您可以在呼叫中包含 `DurationSeconds` 參數。此參數指定 900 秒 (15 分鐘) 到角色的最大工作階段持續時間設定之間的角色工作階段持續時間。當您在 `AssumeRole*` 操作中使用 `DurationSeconds` 時，您必須稱之為具有長期憑證的 IAM 使用者。否則，在步驟 3 中對聯合端點的呼叫將失敗。如要了解如何查看或更改角色的最大值，請參閱 [更新角色的最大工作階段持續時間](id_roles_update-role-settings.md#id_roles_update-session-duration)。
   + 如果使用某個 `GetFederationToken` API 操作取得憑證，您可以在呼叫中包含 `DurationSeconds` 參數。此參數指定您的角色工作階段的持續時間。該值的範圍是 900 秒 (15 分鐘) 到 129,600 秒 (36 小時)。您只能使用 IAM 使用者的長期 AWS 安全登入資料來進行此 API 呼叫。您也可以使用 AWS 帳戶根使用者 登入資料進行這些呼叫，但我們不建議這麼做。如果您以根使用者身分執行呼叫，則工作階段預設將持續 1 小時。或者，您可以指定 900 秒 (15 分鐘) 到 3,600 秒 (1 小時) 之間的工作階段。

1. 呼叫 AWS 聯合端點並提供臨時安全登入資料來請求登入字符。

1. 建構包含該權杖的主控台 URL：
   + 如果在 URL 中使用某個 `AssumeRole*` API 操作，您可以包含 `SessionDuration` HTTP 參數。此參數指定主控台工作階段持續時間，範圍是 900 秒 (15 分鐘) 到 43200 秒 (12 小時)。
   + 如果在 URL 中使用 `GetFederationToken` API 操作，您可以包含 `DurationSeconds` 參數。此參數指定您的聯合身分主控台工作階段的持續時間。該值的範圍是 900 秒 (15 分鐘) 到 129,600 秒 (36 小時)。
**注意**  
您的 `SessionDuration` 不能大於或等於您擔任之角色的工作階段持續時間上限設定。例如，您將要擔任之角色的工作階段持續時間上限設定為 5 小時。您的 `SessionDuration` 參數可以是 16,524 秒或 4 小時 59 秒。
如果透過 `GetFederationToken` 取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。
使用一個角色的憑證來擔任不同的角色稱為[*角色鏈結*](id_roles.md#iam-term-role-chaining)。當您使用角色鏈結時，新憑證的最大持續時間限制為一小時。使用角色[授予許可給在 EC2 執行個體上執行的應用程式](id_roles_use_switch-role-ec2.md)時，那些應用程式不受此限制。
如果透過角色鏈結取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。

1. 將 URL 分配給使用者或代表使用者呼叫 URL。

聯合端點提供的 URL 在建立後的 15 分鐘內有效。這與 URL 關聯的臨時安全性憑證工作階段的持續時間 (以秒為單位) 不同。這些憑證在建立時指定的持續時間內有效，從建立的時間算起。

**重要**  
 AWS 管理主控台 如果您已在關聯的暫時安全登入資料中啟用許可，URL 會透過 授予 AWS 資源的存取權。因此，您應該將 URL 視為機密。我們建議您透過安全的重新引導傳回 URL，例如，在 SSL 連接上使用 302 HTTP 回應狀態碼。如需有關 302 HTTP 回應狀態碼的詳細資訊，請參閱 [RFC 2616, section 10.3.3](https://datatracker.ietf.org/doc/html/rfc2616#section-10.3.3)。

若要完成這些任務，您可以使用適用於 [AWS Identity and Access Management (IAM) 的 HTTPS Query API](https://docs.aws.amazon.com/IAM/latest/APIReference/) 和 [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/)。或者，您可以使用程式設計語言 (例如 Java、Ruby 或 C\$1) 與適當的 [AWS 開發套件](https://aws.amazon.com/tools/)。這些方法皆在下列主題中有詳述。

**Topics**
+ [使用 IAM 查詢 API 操作的範例程式碼](#STSConsoleLink_manual)
+ [使用 Python 的範例程式碼](#STSConsoleLink_programPython)
+ [使用 Java 的範例程式碼](#STSConsoleLink_programJava)
+ [範例顯示建構 URL 的方法 (Ruby)](#STSConsoleLink_programRuby)

## 使用 IAM 查詢 API 操作的範例程式碼
<a name="STSConsoleLink_manual"></a>

您可以建構一個 URL，向角色和聯合身分主體授予 AWS 管理主控台的直接存取權。此任務使用 IAM 和 AWS STS HTTPS 查詢 API。如需有關提出查詢請求的詳細資訊，請參閱[提出查詢請求](https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html)。

**注意**  
以下過程包括了文字字串的範例。為增加可讀性，一些較長的範例中加入了分行符號。如果您要建立並使用這些字串，必須省略所有分行符號。

**讓角色和聯合委託人從 存取您的資源 AWS 管理主控台**

1. 在您的身分驗證系統裡驗證該使用者。

1. 為使用者取得臨時安全性憑證。臨時性憑證由存取金鑰 ID、私密存取金鑰和工作階段字符組成。如需有關建立暫時性憑證檔案的詳細資訊，請參閱 [IAM 中的暫時安全憑證](id_credentials_temp.md)。

   若要取得臨時登入資料，您可以呼叫 AWS STS [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API （建議） 或 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API。如需這些 API 操作之間差異的詳細資訊，請參閱 AWS 安全部落格中的[了解安全委派存取您 AWS 帳戶的 API 選項](https://aws.amazon.com/blogs/security/understanding-the-api-options-for-securely-delegating-access-to-your-aws-account)。
**重要**  
在使用 [GetFederationToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 建立暫時安全憑證時，您必須指定這些憑證授予擔任角色之使用者的許可。對於任何以 `AssumeRole*` 開頭的 API 操作，可使用 IAM 角色來分配許可。對於其他 API 操作，機制會因 API 而異。如需詳細資訊，請參閱 [臨時安全憑證的許可](id_credentials_temp_control-access.md)。此外，如果使用 `AssumeRole*` API 操作，您還必須以具有長期憑證的 IAM 使用者身分來呼叫這些操作。否則，在步驟 3 中對聯合端點的呼叫將失敗。  


1. 在取得臨時安全性憑證後，將其建構到 JSON 工作階段字串以將其交換為登入權杖。以下範例顯示如何為憑證編碼。請將預留位置文字替換為上一步驟中接收的憑證中的適用值。

   ```
   {"sessionId":"*** temporary access key ID ***",
   "sessionKey":"*** temporary secret access key ***",
   "sessionToken":"*** session token ***"}
   ```

1. [URL 編碼](https://en.wikipedia.org/wiki/Percent-encoding)前一步驟中的工作階段字串。由於您編碼的資訊是敏感資訊，因此建議您避免對此編碼使用 Web 服務。請改用開發套件中在本機安裝的函數或功能來安全地編碼這些資訊。您可以使用 Python 的 `urllib.quote_plus` 函數、Java 的 `URLEncoder.encode` 函數或 Ruby 的 `CGI.escape` 函數。請參閱本主題後述的範例。

1. <a name="STSConsoleLink_manual_step5"></a>
**注意**  
AWS 支援此處的 POST 請求。

   將您的請求傳送至 AWS 聯合端點：

   `https://region-code.signin.aws.amazon.com/federation` 

   對於可能的 *region-code* 值清單，請參閱 [AWS 登入端點](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region** (區域) 欄位。您可以選擇使用預設 AWS 的登入聯合端點：

   `https://signin.aws.amazon.com/federation` 

   該請求必須包含 `Action` 與 `Session` 參數；(選擇性) 如果已使用 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作，還必須包含 `SessionDuration` HTTP 參數，如下列範例所示。

   ```
   Action = getSigninToken
   SessionDuration = time in seconds
   Session = *** the URL encoded JSON string created in steps 3 & 4 ***
   ```
**注意**  
此步驟中的下列指示僅適用於 GET 請求。

   `SessionDuration` HTTP 參數指定主控台工作階段的持續時間。它不同於使用 `DurationSeconds` 參數指定的臨時性憑證的持續時間。您可指定 `SessionDuration` 最高值為 43,200 (12 小時)。如果缺少 `SessionDuration` 參數，則工作階段預設為您在步驟 2 AWS STS 中從 擷取的憑證持續時間 （預設為一小時）。如需如何使用 `DurationSeconds` 參數指定持續時間的詳細資訊，請參閱 [`AssumeRole` API 的文件](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。建立超過 1 小時的主控台工作階段的功能是聯合端點的 `getSigninToken` 操作所內建的特性。
**注意**  
您的 `SessionDuration` 不能大於或等於您擔任之角色的工作階段持續時間上限設定。例如，您將要擔任之角色的工作階段持續時間上限設定為 5 小時。您的 `SessionDuration` 參數可以是 16,524 秒或 4 小時 59 秒。
如果透過 `GetFederationToken` 取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。
使用一個角色的憑證來擔任不同的角色稱為[*角色鏈結*](id_roles.md#iam-term-role-chaining)。當您使用角色鏈結時，新憑證的最大持續時間限制為一小時。使用角色[授予許可給在 EC2 執行個體上執行的應用程式](id_roles_use_switch-role-ec2.md)時，那些應用程式不受此限制。
如果透過角色鏈結取得臨時憑證，請勿使用 `SessionDuration` HTTP 參數。否則，操作會失敗。

   在啟用具有更長持續時間的主控台工作階段時，您會增加洩露憑證的風險。為了幫助緩解這種風險，您可以在 **Role Summary** (角色摘要) IAM 主控台頁面上選擇 **Revoke Sessions** (撤銷工作階段) 來立即停用所有角色的使用中的主控台工作階段。如需詳細資訊，請參閱 [撤銷 IAM 角色臨時安全憑證](id_roles_use_revoke-sessions.md)。

    以下為請求具體形式的範例。在此處換行以便閱讀，但您應將其做為單行字串提交。

   ```
   https://signin.aws.amazon.com/federation
   ?Action=getSigninToken
   &SessionDuration=1800
   &Session=%7B%22sessionId%22%3A+%22ASIAJUMHIZPTOKTBMK5A%22%2C+%22sessionKey%22
   %3A+%22LSD7LWI%2FL%2FN%2BgYpan5QFz0XUpc8s7HYjRsgcsrsm%22%2C+%22sessionToken%2
   2%3A+%22FQoDYXdzEBQaDLbj3VWv2u50NN%2F3yyLSASwYtWhPnGPMNmzZFfZsL0Qd3vtYHw5A5dW
   AjOsrkdPkghomIe3mJip5%2F0djDBbo7SmO%2FENDEiCdpsQKodTpleKA8xQq0CwFg6a69xdEBQT8
   FipATnLbKoyS4b%2FebhnsTUjZZQWp0wXXqFF7gSm%2FMe2tXe0jzsdP0O12obez9lijPSdF1k2b5
   PfGhiuyAR9aD5%2BubM0pY86fKex1qsytjvyTbZ9nXe6DvxVDcnCOhOGETJ7XFkSFdH0v%2FYR25C
   UAhJ3nXIkIbG7Ucv9cOEpCf%2Fg23ijRgILIBQ%3D%3D%22%7D
   ```

   來自聯合身分端點的回應是一個具有 `SigninToken` 值的 JSON 文件。看起來與下列範例類似。

   ```
   {"SigninToken":"*** the SigninToken string ***"}
   ```

1. 
**注意**  
AWS 支援此處的 POST 請求。

   最後，建立使用者可用於存取 AWS 管理主控台的 URL。此 URL 與您在 [Step 5](#STSConsoleLink_manual_step5) 中使用的聯合身分 URL 端點相同，外加以下參數：

   ```
   ?Action = login
   &Issuer = *** the form-urlencoded URL for your internal sign-in page ***
   &Destination = *** the form-urlencoded URL to the desired AWS console page ***
   &SigninToken = *** the value of SigninToken received in the previous step ***
   ```
**注意**  
此步驟中的下列指示僅適用於 GET API。

   以下範例顯示 URL 的最終形式。URL 的有效期為 15 分鐘，自建立時算起。在 URL 中嵌入的臨時安全性憑證和主控台工作階段的有效期為在最初請求它們時在 `SessionDuration` HTTP 參數中指定的持續時間。

   ```
   https://signin.aws.amazon.com/federation
   ?Action=login
   &Issuer=https%3A%2F%2Fexample.com
   &Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F
   &SigninToken=VCQgs5qZZt3Q6fn8Tr5EXAMPLEmLnwB7JjUc-SHwnUUWabcRdnWsi4DBn-dvC
   CZ85wrD0nmldUcZEXAMPLE-vXYH4Q__mleuF_W2BE5HYexbe9y4Of-kje53SsjNNecATfjIzpW1
   WibbnH6YcYRiBoffZBGExbEXAMPLE5aiKX4THWjQKC6gg6alHu6JFrnOJoK3dtP6I9a6hi6yPgm
   iOkPZMmNGmhsvVxetKzr8mx3pxhHbMEXAMPLETv1pij0rok3IyCR2YVcIjqwfWv32HU2Xlj471u
   3fU6uOfUComeKiqTGX974xzJOZbdmX_t_lLrhEXAMPLEDDIisSnyHGw2xaZZqudm4mo2uTDk9Pv
   9l5K0ZCqIgEXAMPLEcA6tgLPykEWGUyH6BdSC6166n4M4JkXIQgac7_7821YqixsNxZ6rsrpzwf
   nQoS14O7R0eJCCJ684EXAMPLEZRdBNnuLbUYpz2Iw3vIN0tQgOujwnwydPscM9F7foaEK3jwMkg
   Apeb1-6L_OB12MZhuFxx55555EXAMPLEhyETEd4ZulKPdXHkgl6T9ZkIlHz2Uy1RUTUhhUxNtSQ
   nWc5xkbBoEcXqpoSIeK7yhje9Vzhd61AEXAMPLElbWeouACEMG6-Vd3dAgFYd6i5FYoyFrZLWvm
   0LSG7RyYKeYN5VIzUk3YWQpyjP0RiT5KUrsUi-NEXAMPLExMOMdoODBEgKQsk-iu2ozh6r8bxwC
   RNhujg
   ```

## 使用 Python 的範例程式碼
<a name="STSConsoleLink_programPython"></a>

下列範例說明如何使用 Python 以程式設計方式建構 URL，向使用者授予 AWS 管理主控台直接存取權。以下是兩個範例：
+ 透過 GET 請求聯合至 AWS
+ 透過 POST 請求聯合至 AWS

兩個範例使用 [適用於 Python (Boto3) 的 AWS SDK](https://aws.amazon.com/tools/) 和 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 來取得暫時安全憑證。

如果 `AssumeRoleSession` 憑證來自角色鏈結，請勿包含 `SessionDuration`。如果包含 `SessionDuration`，操作將會失敗。

### 使用 GET 請求
<a name="post-api-py-example"></a>

```
import urllib, json, sys
import requests # 'pip install requests'
import boto3 # AWS SDK for Python (Boto3) 'pip install boto3'

# Step 1: Authenticate user in your own identity system.

# Step 2: Using the access keys for an IAM user in your AWS 帳戶,
# call "AssumeRole" to get temporary access keys for the role or federated principal

# Note: Calls to AWS STS AssumeRole must be signed using the access key ID 
# and secret access key of an IAM user or using existing temporary credentials.
# The credentials can be in Amazon EC2 instance metadata, in environment variables, 
# or in a configuration file, and will be discovered automatically by the 
# client('sts') function. For more information, see the Python SDK docs:
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role
sts_connection = boto3.client('sts')

assumed_role_object = sts_connection.assume_role(
    RoleArn="arn:aws:iam::account-id:role/ROLE-NAME",
    RoleSessionName="AssumeRoleSession",
)

# Step 3: Format resulting temporary credentials into JSON
url_credentials = {}
url_credentials['sessionId'] = assumed_role_object.get('Credentials').get('AccessKeyId')
url_credentials['sessionKey'] = assumed_role_object.get('Credentials').get('SecretAccessKey')
url_credentials['sessionToken'] = assumed_role_object.get('Credentials').get('SessionToken')
json_string_with_temp_credentials = json.dumps(url_credentials)

# Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with
# the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials 
# as parameters.
request_parameters = "?Action=getSigninToken"
request_parameters += "&SessionDuration=43200"
if sys.version_info[0] < 3:
    def quote_plus_function(s):
        return urllib.quote_plus(s)
else:
    def quote_plus_function(s):
        return urllib.parse.quote_plus(s)
request_parameters += "&Session=" + quote_plus_function(json_string_with_temp_credentials)
request_url = "https://signin.aws.amazon.com/federation" + request_parameters
r = requests.get(request_url)
# Returns a JSON document with a single element named SigninToken.
signin_token = json.loads(r.text)

# Step 5: Create URL where users can use the sign-in token to sign in to 
# the console. This URL must be used within 15 minutes after the
# sign-in token was issued.
request_parameters = "?Action=login" 
request_parameters += "&Issuer=Example.org" 
request_parameters += "&Destination=" + quote_plus_function("https://console.aws.amazon.com/")
request_parameters += "&SigninToken=" + signin_token["SigninToken"]
request_url = "https://signin.aws.amazon.com/federation" + request_parameters

# Send final URL to stdout
print (request_url)
```

### 使用 POST 請求
<a name="get-api-py-example-1"></a>

```
import urllib, json, sys
import requests # 'pip install requests'
import boto3 # AWS SDK for Python (Boto3) 'pip install boto3'
import os
from selenium import webdriver # 'pip install selenium', 'brew install chromedriver'

# Step 1: Authenticate user in your own identity system.

# Step 2: Using the access keys for an IAM user in your A AWS 帳戶,
# call "AssumeRole" to get temporary access keys for the role or federated principal

# Note: Calls to AWS STS AssumeRole must be signed using the access key ID 
# and secret access key of an IAM user or using existing temporary credentials.
# The credentials can be in Amazon EC2 instance metadata, in environment variables, 

# or in a configuration file, and will be discovered automatically by the 
# client('sts') function. For more information, see the Python SDK docs:
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html
# http://boto3.readthedocs.io/en/latest/reference/services/sts.html#STS.Client.assume_role
if sys.version_info[0] < 3:
    def quote_plus_function(s):
        return urllib.quote_plus(s)
else:
    def quote_plus_function(s):
        return urllib.parse.quote_plus(s)

sts_connection = boto3.client('sts')

assumed_role_object = sts_connection.assume_role(
    RoleArn="arn:aws:iam::account-id:role/ROLE-NAME",
    RoleSessionName="AssumeRoleDemoSession",
)

# Step 3: Format resulting temporary credentials into JSON
url_credentials = {}
url_credentials['sessionId'] = assumed_role_object.get('Credentials').get('AccessKeyId')
url_credentials['sessionKey'] = assumed_role_object.get('Credentials').get('SecretAccessKey')
url_credentials['sessionToken'] = assumed_role_object.get('Credentials').get('SessionToken')
json_string_with_temp_credentials = json.dumps(url_credentials)

# Step 4. Make request to AWS federation endpoint to get sign-in token. Construct the parameter string with
# the sign-in action request, a 12-hour session duration, and the JSON document with temporary credentials 
# as parameters.
request_parameters = {}
request_parameters['Action'] = 'getSigninToken'
request_parameters['SessionDuration'] = '43200'
request_parameters['Session'] = json_string_with_temp_credentials

request_url = "https://signin.aws.amazon.com/federation"
r = requests.post( request_url, data=request_parameters)

# Returns a JSON document with a single element named SigninToken.
signin_token = json.loads(r.text)

# Step 5: Create a POST request where users can use the sign-in token to sign in to 
# the console. The POST request must be made within 15 minutes after the
# sign-in token was issued.
request_parameters = {}
request_parameters['Action'] = 'login'
request_parameters['Issuer']='Example.org'
request_parameters['Destination'] = 'https://console.aws.amazon.com/'
request_parameters['SigninToken'] =signin_token['SigninToken']

jsrequest = '''
var form = document.createElement('form');
form.method = 'POST';
form.action = '{request_url}';
request_parameters = {request_parameters}
for (var param in request_parameters) {{
    if (request_parameters.hasOwnProperty(param)) {{
        const hiddenField = document.createElement('input');
        hiddenField.type = 'hidden';
        hiddenField.name = param;
        hiddenField.value = request_parameters[param];
        form.appendChild(hiddenField);
    }}
}}
document.body.appendChild(form);
form.submit();
'''.format(request_url=request_url, request_parameters=request_parameters)

driver = webdriver.Chrome()
driver.execute_script(jsrequest)
input("Press Enter to close the browser window...")
```

## 使用 Java 的範例程式碼
<a name="STSConsoleLink_programJava"></a>

下列範例說明如何使用 Java 以程式設計方式建構 URL，向使用者授予 AWS 管理主控台的直接存取權。下列程式碼片段使用 [AWS SDK for Java](https://aws.amazon.com/documentation/sdkforjava/)。

```
import java.net.URLEncoder;
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;
// Available at http://www.json.org/java/index.html
import org.json.JSONObject;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient;
import com.amazonaws.services.securitytoken.model.Credentials;
import com.amazonaws.services.securitytoken.model.GetFederationTokenRequest;
import com.amazonaws.services.securitytoken.model.GetFederationTokenResult;


/* Calls to AWS STS API operations must be signed using the access key ID 
   and secret access key of an IAM user or using existing temporary 
   credentials. The credentials should not be embedded in code. For 
   this example, the code looks for the credentials in a 
   standard configuration file.
*/
AWSCredentials credentials = 
  new PropertiesCredentials(
         AwsConsoleApp.class.getResourceAsStream("AwsCredentials.properties"));

AWSSecurityTokenServiceClient stsClient = 
  new AWSSecurityTokenServiceClient(credentials);

GetFederationTokenRequest getFederationTokenRequest = 
  new GetFederationTokenRequest();
getFederationTokenRequest.setDurationSeconds(1800);
getFederationTokenRequest.setName("UserName");

// A sample policy for accessing Amazon Simple Notification Service (Amazon SNS) in the console.

String policy = "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Action\":\"sns:*\"," +
  "\"Effect\":\"Allow\",\"Resource\":\"*\"}]}";

getFederationTokenRequest.setPolicy(policy);

GetFederationTokenResult federationTokenResult = 
  stsClient.getFederationToken(getFederationTokenRequest);

Credentials federatedCredentials = federationTokenResult.getCredentials();

// The issuer parameter specifies your internal sign-in
// page, for example https://mysignin.internal.mycompany.com/.
// The console parameter specifies the URL to the destination console of the
// AWS Management Console. This example goes to Amazon SNS. 
// The signin parameter is the URL to send the request to.

String issuerURL = "https://mysignin.internal.mycompany.com/";
String consoleURL = "https://console.aws.amazon.com/sns";
String signInURL = "https://signin.aws.amazon.com/federation";
  
// Create the sign-in token using temporary credentials,
// including the access key ID,  secret access key, and session token.
String sessionJson = String.format(
  "{\"%1$s\":\"%2$s\",\"%3$s\":\"%4$s\",\"%5$s\":\"%6$s\"}",
  "sessionId", federatedCredentials.getAccessKeyId(),
  "sessionKey", federatedCredentials.getSecretAccessKey(),
  "sessionToken", federatedCredentials.getSessionToken());
              
// Construct the sign-in request with the request sign-in token action, a
// 12-hour console session duration, and the JSON document with temporary 
// credentials as parameters.

String getSigninTokenURL = signInURL + 
                           "?Action=getSigninToken" +
                           "&DurationSeconds=43200" + 
                           "&SessionType=json&Session=" + 
                           URLEncoder.encode(sessionJson,"UTF-8");

URL url = new URL(getSigninTokenURL);

// Send the request to the AWS federation endpoint to get the sign-in token
URLConnection conn = url.openConnection ();

BufferedReader bufferReader = new BufferedReader(new 
  InputStreamReader(conn.getInputStream()));  
String returnContent = bufferReader.readLine();

String signinToken = new JSONObject(returnContent).getString("SigninToken");

String signinTokenParameter = "&SigninToken=" + URLEncoder.encode(signinToken,"UTF-8");

// The issuer parameter is optional, but recommended. Use it to direct users
// to your sign-in page when their session expires.

String issuerParameter = "&Issuer=" + URLEncoder.encode(issuerURL, "UTF-8");

// Finally, present the completed URL for the AWS console session to the user

String destinationParameter = "&Destination=" + URLEncoder.encode(consoleURL,"UTF-8");
String loginURL = signInURL + "?Action=login" +
                     signinTokenParameter + issuerParameter + destinationParameter;
```

## 範例顯示建構 URL 的方法 (Ruby)
<a name="STSConsoleLink_programRuby"></a>

以下範例顯示了如何使用 Ruby 以程式設計方式構建 URL，向使用者授予 AWS 管理主控台的直接存取權。此程式碼片段使用 [AWS SDK for Ruby](https://aws.amazon.com/documentation/sdkforruby/)。

```
require 'rubygems'
require 'json'
require 'open-uri'
require 'cgi'
require 'aws-sdk'

# Create a new STS instance
# 
# Note: Calls to AWS STS API operations must be signed using an access key ID 
# and secret access key. The credentials can be in EC2 instance metadata 
# or in environment variables and will be automatically discovered by
# the default credentials provider in the AWS Ruby SDK. 
sts = Aws::STS::Client.new()

# The following call creates a temporary session that returns 
# temporary security credentials and a session token.
# The policy grants permissions to work
# in the AWS SNS console.

session = sts.get_federation_token({
  duration_seconds: 1800,
  name: "UserName",
  policy: "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":{\"Effect\":\"Allow\",\"Action\":\"sns:*\",\"Resource\":\"*\"}}",
})

# The issuer value is the URL where users are directed (such as
# to your internal sign-in page) when their session expires.
#
# The console value specifies the URL to the destination console.
# This example goes to the Amazon SNS console.
#
# The sign-in value is the URL of the AWS STS federation endpoint.
issuer_url = "https://mysignin.internal.mycompany.com/"
console_url = "https://console.aws.amazon.com/sns"
signin_url = "https://signin.aws.amazon.com/federation"

# Create a block of JSON that contains the temporary credentials
# (including the access key ID, secret access key, and session token).
session_json = {
  :sessionId => session.credentials[:access_key_id],
  :sessionKey => session.credentials[:secret_access_key],
  :sessionToken => session.credentials[:session_token]
}.to_json

# Call the federation endpoint, passing the parameters
# created earlier and the session information as a JSON block. 
# The request returns a sign-in token that's valid for 15 minutes.
# Signing in to the console with the token creates a session 
# that is valid for 12 hours.
get_signin_token_url = signin_url + 
                       "?Action=getSigninToken" + 
                       "&SessionType=json&Session=" + 
                       CGI.escape(session_json)

returned_content = URI.parse(get_signin_token_url).read

# Extract the sign-in token from the information returned
# by the federation endpoint.
signin_token = JSON.parse(returned_content)['SigninToken']
signin_token_param = "&SigninToken=" + CGI.escape(signin_token)

# Create the URL to give to the user, which includes the
# sign-in token and the URL of the console to open.
# The "issuer" parameter is optional but recommended.
issuer_param = "&Issuer=" + CGI.escape(issuer_url)
destination_param = "&Destination=" + CGI.escape(console_url)
login_url = signin_url + "?Action=login" + signin_token_param + 
  issuer_param + destination_param
```

# AWS Identity and Access Management 資源的標籤
<a name="id_tags"></a>

*標籤*是一種自訂屬性標籤，可由您指派給 AWS 資源。每個標籤有兩個部分：
+ *標籤鍵* (例如，`CostCenter`、`Environment`、`Project` 或 `Purpose` )。
+ 一個名為*標籤值* (例如，`111122223333`、`Production` 或團隊名稱) 的選用欄位。忽略標籤值基本上等同於使用空字串。

這些合稱為鍵值組。關於可具有 IAM 資源標籤數量的限制，請參閱 [IAM AWS STS 和配額](reference_iam-quotas.md)。

**注意**  
如需有關標籤索引鍵和標籤索引鍵值區分大小寫的詳細資訊，請參閱 [Case sensitivity](#case-sensitivity)。

標籤可協助您識別和組織 AWS 資源。許多 AWS 服務支援標記，因此您可以將相同的標籤指派給來自不同 服務的資源，以指出資源相關。例如，您可以將相同的標籤指派給您指派給 Amazon S3 儲存貯體的 IAM 角色。如需標記策略的詳細資訊，請參閱 *[標記 AWS 資源](https://docs.aws.amazon.com/tag-editor/latest/userguide/tagging.html)使用者指南*。

此外，若要使用標籤來識別、整理和追蹤 IAM 資源，您可以在 IAM 政策中使用標籤，以協助控制誰可以檢視您的資源並與其互動。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

**Topics**
+ [選擇 AWS 標籤命名慣例](#id_tags_naming)
+ [在 IAM 和 中標記的規則 AWS STS](#id_tags_rules)
+ [標記 IAM 使用者](id_tags_users.md)
+ [標記 IAM 角色](id_tags_roles.md)
+ [標記客戶管理政策](id_tags_customer-managed-policies.md)
+ [標記 OpenID Connect (OIDC) 身分提供者](id_tags_oidc.md)
+ [標記 IAM SAML 身分提供者](id_tags_saml.md)
+ [標記 Amazon EC2 角色的執行個體設定檔](id_tags_instance-profiles.md)
+ [標記伺服器憑證](id_tags_server-certificates.md)
+ [標記虛擬 MFA 裝置](id_tags_virtual-mfa.md)
+ [在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)

## 選擇 AWS 標籤命名慣例
<a name="id_tags_naming"></a>

當您開始將標籤連接至您的 IAM 資源時，請小心選擇您的標籤命名慣例。將相同的慣例套用至所有 AWS 標籤。如果您在政策中使用標籤來控制對 AWS 資源的存取，這尤其重要。如果您在 AWS中已經使用標籤，請檢閱您的命名慣例和加以調整。

**注意**  
如果您的帳戶是 的成員 AWS Organizations，請參閱《 使用者指南》中的 AWS Organizations [標籤政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_tag-policies.html)，進一步了解如何在其中使用標籤 AWS Organizations。

### 標籤命名的最佳實務
<a name="id_tags_naming_best_practices"></a>

以下是標籤的一些最佳實務和命名慣例。

請確保以一致的方式使用標籤名稱。例如，標籤 `CostCenter` 和 `costcenter` 是不同的，因此可能會將其中一個設定為用於財務分析與報表的成本配置標籤，而另一個則可能不會如此設定。同樣地，許多資源的`Name`標籤會出現在 AWS 主控台中，但`name`標籤不會。如需有關標籤索引鍵和標籤索引鍵值區分大小寫的詳細資訊，請參閱 [Case sensitivity](#case-sensitivity)。

許多標籤由 預先定義， AWS 或由各種 AWS 服務自動建立。許多 AWS定義的標籤名稱使用所有小寫，連字號分隔名稱中的單字，以及用於識別標籤來源服務的字首。例如：
+ `aws:ec2spot:fleet-request-id` 識別啟動執行個體的 Amazon EC2 Spot 執行個體請求。
+ `aws:cloudformation:stack-name` 會識別建立資源的 CloudFormation 堆疊。
+ `elasticbeanstalk:environment-name` 識別建立資源的應用程式。

請考慮使用全部小寫字母來命名標籤，以連字號分隔文字，並且採用識別組織名稱或縮寫名稱的字首。例如，對於一家名為 *AnyCompany* 的虛構公司，您可以定義如下的標籤：
+ `anycompany:cost-center` 可識別內部成本中心代碼 
+ `anycompany:environment-type` 可識別環境是否為開發、測試或生產
+ `anycompany:application-id` 可識別建立資源的應用程式 

字首可確保標籤明確識別為由您的組織所定義，而不是由您或您可能正在使用 AWS 的第三方工具所定義。將所有小寫字母和連字號 (作為分隔符號) 搭配使用可避免對如何大寫標籤名稱造成混淆。例如：`anycompany:project-id` 比 `ANYCOMPANY:ProjectID`、`anycompany:projectID` 或 `Anycompany:ProjectId` 更容易記住。

## 在 IAM 和 中標記的規則 AWS STS
<a name="id_tags_rules"></a>

多種慣例會掌管在 IAM 和 AWS STS中標籤的建立和應用。

### 命名標籤
<a name="id_tags_rules_creating"></a>

為 IAM 資源、 AWS STS assume-role 工作階段和 AWS STS 聯合身分使用者工作階段制定標籤命名慣例時，請遵循下列慣例：

**字元要求** – 標籤鍵和值可以包含任意組合字母、數字、空格和 \$1 . : / = \$1 - @ 符號。

**區分大小寫** – 標籤鍵是否區分大小寫會因標記的 IAM 資源類型而有所不同。IAM 使用者和角色的標籤鍵值不區分大小寫，但會保留大小寫。這表示您無法個別擁有 **Department** 和 **department** 標籤鍵。如果您使用 **Department=finance** 標籤為使用者加上標籤，而且您新增 **department=hr** 標籤，它會取代第一個標籤。不會新增第二個標籤。

對於其他 IAM 資源類型，標籤鍵值會區分大小寫。這意味著您可以有單獨的 **Costcenter** 和 **costcenter** 標籤鍵。例如，如果您已使用 **Costcenter = 1234** 標籤標記客戶受管政策，並新增 **costcenter = 5678** 標籤，則政策將同時具有 **Costcenter** 和 **costcenter** 標籤鍵。

最佳作法是，建議您避免使用類似的標籤使用不一致的大小寫處理。建議您決定大寫標籤的策略，並一致地在所有資源類型中實作該策略。若要進一步了解標記的最佳實務，請參閱《》中的[標記 AWS 資源](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html) AWS 一般參考。

下列清單顯示連接至 IAM 資源之標籤鍵的區分大小寫差異。

標籤鍵值**不**區分大小寫：
+ IAM 角色
+ IAM 使用者

標籤鍵值區分大小寫：
+ 客戶受管政策
+ 執行個體設定檔
+ OpenID Connect 身分提供者
+ SAML 身分提供者
+ 伺服器憑證
+ 虛擬 MFA 裝置

此外，適用下列規則：
+ 您不能建立標籤鍵或以文字 **aws:** 為開頭的值。此標籤字首保留供 AWS 內部使用。
+ 您可以使用 **phoneNumber = ** 之類的空值來建立標籤。您不能建立空的標籤鍵。
+ 您可以在單一標籤不指定多個值，但您可以在單一值建立自訂多值結構。例如，假設使用者 Zhang 與工程團隊和 QA 團隊合作。如果您連接 **team = Engineering** 標籤，然後連接 **team = QA** 標籤，則您將標籤的值從 **Engineering** 變更為 **QA**。反之，您可以在單一標籤中使用自訂分隔符號來包含多個值。在這個範例中，您可以將 **team = Engineering:QA** 標籤連接至 Zhang。
**注意**  
若要在此範例中使用 **team** 標籤控制工程師的存取權，您必須建立一個政策，以允許可能包含 **Engineering** 的每個組態，包括 **Engineering:QA**。若要進一步了解在政策中使用標籤的詳細資訊，請參閱 [使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

### 套用和編輯標籤
<a name="id_tags_rules_applying"></a>

將標籤連接至 IAM 資源時，請遵守下列慣例：
+ 您可以標記大多數 IAM 資源，但不能標記群組、擔任的角色、存取報告或硬體式 MFA 裝置。
+ 您不能使用標籤編輯器來標記 IAM 資源。標籤編輯器不支援 IAM 標籤。如需使用標籤編輯器搭配其他服務的詳細資訊，請參閱 *AWS Resource Groups 使用者指南*中的[使用標籤編輯器](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/tag-editor.html)。
+ 若要標記 IAM 資源，您必須擁有特定的許可。若要標記或取消標記資源，您還必須有列出標籤的許可。如需詳細資訊，請參閱本頁結尾每個 IAM 資源的主題清單。
+  AWS 帳戶中 IAM 資源的數量和大小有限。如需詳細資訊，請參閱[IAM AWS STS 和配額](reference_iam-quotas.md)。
+ 您可以將相同標籤套用到多個 IAM 資源。例如，假設您有一個名為 `AWS_Development` 的部門，其中包含 12 名成員。您可以擁有 12 名使用者，以及具備 **department** 標籤鍵和 **awsDevelopment** 值的角色 (**department = awsDevelopment**)。您也可以在其他[支援標籤的服務](reference_aws-services-that-work-with-iam.md)中對資源使用相同標籤。
+ IAM 實體 (使用者或角色) 不能擁有相同標籤鍵的多個執行個體。例如，如果您有一個使用者與標籤鍵值對 **costCenter = 1234**，您可以接著連接標籤鍵值對 **costCenter = 5678**。IAM 會更新 **costCenter** 標籤的值至 **5678**。
+ 若要編輯連接至 IAM 實體 (使用者或角色) 的標籤，請連接含有新值的標籤以覆寫現有標籤。例如，假設您有一個使用者，含有標籤鍵值組 **department = Engineering**。如果您需要將使用者新增到 QA 部門，則可以將 **department = QA** 標籤鍵值組連接至使用者。這會造成 **Engineering** 標籤鍵的 **department** 值取代為 **QA** 值。

# 標記 IAM 使用者
<a name="id_tags_users"></a>

您可以使用 IAM 標籤鍵值組向 IAM 使用者新增自訂屬性。例如，若要將位置資訊新增到使用者，您可以新增標籤鍵 **location** 和標籤值 **us\$1wa\$1seattle**。或者，您可以使用三個不同的位置的標籤鍵值組：**loc-country = us**、**loc-state = wa** 和 **loc-city = seattle**。您可以使用標籤來控制使用者對資源的存取權，或控制哪些標籤可以連接到使用者。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

## 標記 IAM 使用者所需的許可
<a name="id_tags_users_permissions"></a>

您必須設定許可，以允許 IAM 使用者標記其他使用者。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListUserTags`
+ `iam:TagUser`
+ `iam:UntagUser`

**允許 IAM 實體新增、列出，或移除特定使用者的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 使用者的許可政策。使用您的帳戶並使用需要其標籤受管之使用者的名稱取代 *<username>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListUserTags",
        "iam:TagUser",
        "iam:UntagUser"
    ],
    "Resource": "arn:aws:iam::<account-number>:user/<username>"
}
```

**允許 IAM 使用者自行管理標籤**  
將下列陳述式新增至使用者的許可政策，以讓使用者能管理其自身的標籤。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListUserTags",
        "iam:TagUser",
        "iam:UntagUser"
    ],
    "Resource": "arn:aws:iam::user/${aws:username}"
}
```

**允許 IAM 使用者新增特定使用者的標籤**  
將下列陳述式新增至 IAM 使用者的許可政策，而該使用者需要新增 (非移除) 特定使用者的標籤。

**注意**  
此 `iam:TagUser` 動作需要您也包含 `iam:ListUserTags` 動作。

若要使用此政策，請使用其標籤需要受管之使用者的名稱取代 *<username>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListUserTags",
        "iam:TagUser"
    ],
    "Resource": "arn:aws:iam::<account-number>:user/<username>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理 IAM 使用者的標籤 (主控台)
<a name="id_tags_users_procs-console"></a>

您可以從 AWS 管理主控台管理 IAM 使用者的標籤。

**管理使用者的標籤 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在主控台導覽窗格中，選擇 **Users** (使用者)，然後選擇您要編輯的使用者名稱。

1. 選擇 **Tags (標籤)** 標籤，然後完成以下其中一個動作：
   + 如果使用者還沒有標籤，請選擇 **新增標籤**。
   + 選擇 **Manage tags** (管理標籤) 來管理現有的一組標籤。

1. 新增或移除標籤來完成標籤的設定。接著選擇 **Save changes (儲存變更)**。

## 管理 IAM 使用者 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_users_procs-cli-api"></a>

您可以列出、連接，或移除 IAM 使用者的標籤。您可以使用 AWS CLI 或 AWS API 來管理 IAM 使用者的標籤。

**列出目前連接至 IAM 使用者的標籤 (AWS CLI 或 AWS API)**
+ AWS CLI: [aws iam list-user-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-user-tags.html)
+ AWS API：[ListUserTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUserTags.html)

**將標籤連接至 IAM 使用者 (AWS CLI 或 AWS API)**
+ AWS CLI：[aws iam tag-user](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-user.html)
+ AWS API：[TagUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagUser.html)

**從 IAM 使用者 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI：[aws iam untag-user](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-user.html)
+ AWS API：[UntagUser](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagUser.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記 IAM 角色
<a name="id_tags_roles"></a>

您可以使用 IAM 標籤鍵值組將自訂屬性新增至 IAM 角色。例如，若要將位置資訊新增至角色，您可以新增標籤鍵 **location** 和標籤值 **us\$1wa\$1seattle**。或者，您可以使用三個不同的位置的標籤鍵值組：**loc-country = us**、**loc-state = wa** 和 **loc-city = seattle**。您可以使用標籤來控制角色對資源的存取權，或控制哪些標籤可以連接到角色。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

## 標記 IAM 角色所需的許可
<a name="id_tags_roles_permissions"></a>

您必須設定許可，允許 IAM 角色標記其他實體 (使用者或角色)。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListRoleTags`
+ `iam:TagRole`
+ `iam:UntagRole`
+ `iam:ListUserTags`
+ `iam:TagUser`
+ `iam:UntagUser`

**允許 IAM 角色新增、列出，或移除特定使用者的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 角色的許可政策。使用您的帳戶並使用需要其標籤受管之使用者的名稱取代 *<username>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListUserTags",
        "iam:TagUser",
        "iam:UntagUser"
    ],
    "Resource": "arn:aws:iam::<account-number>:user/<username>"
}
```

**允許 IAM 角色新增特定使用者的標籤**  
將下列陳述式新增至 IAM 角色的許可政策，而該角色需要新增 (非移除) 特定使用者的標籤。

若要使用此政策，請使用其標籤需要受管之使用者的名稱取代 *<username>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListUserTags",
        "iam:TagUser"
    ],
    "Resource": "arn:aws:iam::<account-number>:user/<username>"
}
```

**允許 IAM 角色新增、列出，或移除特定角色的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 角色的許可政策。用其標籤需要受管的角色名稱取代 *<rolename>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListRoleTags",
        "iam:TagRole",
        "iam:UntagRole"
    ],
    "Resource": "arn:aws:iam::<account-number>:role/<rolename>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理 IAM 角色的標籤 (主控台)
<a name="id_tags_roles_procs-console"></a>

您可以從 AWS 管理主控台管理 IAM 角色的標籤。

**管理角色的標籤 (主控台)**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在主控台導覽窗格中，選擇 **Roles** (角色)，然後選擇您要編輯的角色名稱。

1. 選擇 **Tags (標籤)** 標籤，然後完成以下其中一個動作：
   + 如果角色還沒有標籤，請選擇 **Add new tag** (新增標籤)。
   + 選擇 **Manage tags** (管理標籤) 來管理現有的一組標籤。

1. 新增或移除標籤來完成標籤的設定。然後，選擇 **Save changes** (儲存變更)。

## 管理 IAM 角色 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_roles_procs-cli-api"></a>

您可以列出、連接，或移除 IAM 角色的標籤。您可以使用 AWS CLI 或 AWS API 來管理 IAM 角色的標籤。

**列出目前連接至 IAM 角色 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-role-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-role-tags.html)
+ AWS API：[ListRoleTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoleTags.html)

**將標籤連接至 IAM 角色 (AWS CLI 或 AWS API)**
+ AWS CLI：[aws iam tag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-role.html)
+ AWS API：[TagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagRole.html)

**從 IAM 角色 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI：[aws iam untag-role](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-role.html)
+ AWS API：[UntagRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagRole.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記客戶管理政策
<a name="id_tags_customer-managed-policies"></a>

您可以使用 IAM 標籤鍵值組，將自訂屬性新增至客戶受管政策。例如，若要使用部門資訊來標記政策，您可以新增標籤鍵 **Department** 和標籤值 **eng**。或者，您可能想要標記政策，以指出這些政策適用於特定環境，例如 **Environment = lab**。您可以使用標籤來控制對資源的存取權，或控制哪些標籤可以連接到資源。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

## 標記客戶受管政策所需的許可
<a name="id_tags_customer-managed-policies_permissions"></a>

您必須設定許可，以允許 IAM 實體 (使用者或角色) 標記客戶受管政策。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListPolicyTags`
+ `iam:TagPolicy`
+ `iam:UntagPolicy`

**允許 IAM 實體 (使用者或角色) 新增、列出或移除客戶受管政策的標記**  
將下列陳述式新增至需要管理標籤之 IAM 實體的許可政策。使用您的帳戶號碼，用需要其標籤受管的政策名稱取代 *<policyname>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListPolicyTags",
        "iam:TagPolicy",
        "iam:UntagPolicy"
    ],
    "Resource": "arn:aws:iam::<account-number>:policy/<policyname>"
}
```

**允許 IAM 實體 (使用者或角色) 新增標籤至特定客戶受管政策**  
將下列陳述式新增至 IAM 實體的許可政策，而該實體需要新增 (非移除) 特定政策的標籤。

**注意**  
此 `iam:TagPolicy` 動作需要您也包含 `iam:ListPolicyTags` 動作。

若要使用此政策，請用需要其標籤受管的政策名稱取代 *<policyname>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListPolicyTags",
        "iam:TagPolicy"
    ],
    "Resource": "arn:aws:iam::<account-number>:policy/<policyname>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理 IAM 客戶受管政策的標籤 (主控台)
<a name="id_tags_customer-managed-policies_procs-console"></a>

您可以從 AWS 管理主控台管理 IAM 客戶受管政策的標籤。

**管理客戶受管政策的標籤 (主控台)**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在主控台導覽窗格中，選擇 **Policies** (政策)，然後選擇您要編輯的客戶受管政策名稱。

1. 選擇**標籤**索引標籤，然後選擇**管理標籤**。

1. 新增或移除標籤來完成標籤的設定。接著選擇 **Save changes (儲存變更)**。

## 管理 IAM 客戶受管政策 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_customer-managed-policies_procs-cli-api"></a>

您可以列出、連接或移除 IAM 客戶受管政策的標籤。您可以使用 AWS CLI 或 AWS API 來管理 IAM 客戶受管政策的標籤。

**列出目前連接至 IAM 客戶受管政策 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-policy-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-policy-tags.html)
+ AWS API：[ListPolicyTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyTags.html)

**將標籤連接至 IAM 客戶受管政策 (AWS CLI 或 AWS API)**
+ AWS CLI: [aws iam tag-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-policy.html)
+ AWS API：[TagPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagPolicy.html)

**從 IAM 客戶受管政策 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI: [aws iam untag-policy](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-policy.html)
+ AWS API：[UntagPolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagPolicy.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記 OpenID Connect (OIDC) 身分提供者
<a name="id_tags_oidc"></a>

您可以使用 IAM 標籤鍵值將自訂屬性新增至 IAM OpenID Connect (OIDC) 身分提供者。例如，若要識別 OIDC 身分提供者，您可以新增標籤鍵 **google** 和標籤值 **oidc**。您可以使用標籤來控制對資源的存取權，或控制哪些標籤可以連接到物件。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

## 標記 IAM OIDC 身分提供者所需的許可
<a name="id_tags_oidc_permissions"></a>

您必須設定許可，允許 IAM 實體 (使用者或角色) 標記 IAM OIDC 身分提供者。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListOpenIDConnectProviderTags`
+ `iam:TagOpenIDConnectProvider`
+ `iam:UntagOpenIDConnectProvider`

**若要允許 IAM 實體新增、列出或移除 IAM OIDC 身分提供者的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 實體的許可政策。使用您的帳戶號碼，用需要其標籤受管的 OIDC 提供者名稱取代 *<OIDCProviderName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListOpenIDConnectProviderTags",
        "iam:TagOpenIDConnectProvider",
        "iam:UntagOpenIDConnectProvider"
    ],
    "Resource": "arn:aws:iam::<account-number>:oidc-provider/<OIDCProviderName>"
}
```

**允許 IAM 實體 (使用者或角色) 將標籤新增至特定 IAM OIDC 身分提供者**  
將下列陳述式新增至 IAM 實體的許可政策，而該實體需要新增 (非移除) 特定身分提供者的標籤。

**注意**  
此 `iam:TagOpenIDConnectProvider` 動作需要您也包含 `iam:ListOpenIDConnectProviderTags` 動作。

若要使用此政策，請用需要其標籤受管的 OIDC 提供者名稱取代 *<OIDCProviderName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListOpenIDConnectProviderTags",
        "iam:TagOpenIDConnectProvider"
    ],
    "Resource": "arn:aws:iam::<account-number>:oidc-provider/<OIDCProviderName>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理 IAM OIDC 身分提供者的標籤 (主控台)
<a name="id_tags_oidc_procs-console"></a>

您可以從 AWS 管理主控台管理 IAM OIDC 身分提供者的標籤。

**管理 OIDC 身分提供者 (主控台) 的標籤**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在主控台的導覽窗格中，選擇 **Identity providers** (身分提供者)，然後選擇您所要編輯的身分提供者之名稱。

1. 選擇**標籤**索引標籤，然後在**標籤**區段中，選擇**管理標籤**，然後完成下列其中一個動作：
   + 如果 OIDC 身分提供者尚未有標籤或新增標籤，請選擇 **Add tag** (新增標籤)。
   + 編輯現有標籤鍵和值。
   + 請選擇 **Remove tag** (移除標籤) 以移除標籤。

1. 接著選擇 **Save changes (儲存變更)**。

## 管理 IAM OIDC 身分提供者 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_oidc_procs-cli-api"></a>

您可以列出、連接或移除 IAM OIDC 身分提供者的標籤。您可以使用 AWS CLI 或 AWS API 來管理 IAM OIDC 身分提供者的標籤。

**列出目前連接至 IAM OIDC 身分提供者 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-open-id-connect-provider-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-open-id-connect-provider-tags.html)
+ AWS API：[ListOpenIDConnectProviderTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviderTags.html)

**將標籤連接至 IAM OIDC 身分提供者 (AWS CLI 或 AWS API)**
+ AWS CLI: [aws iam tag-open-id-connect-provider](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-open-id-connect-provider.html)
+ AWS API：[TagOpenIDConnectProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagOpenIDConnectProvider.html)

**從 IAM OIDC 身分提供者 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI: [aws iam untag-open-id-connect-provider](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-open-id-connect-provider.html)
+ AWS API：[UntagOpenIDConnectProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagOpenIDConnectProvider.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記 IAM SAML 身分提供者
<a name="id_tags_saml"></a>

您可以使用 IAM 標籤鍵值組，將自訂屬性新增至 SAML 身分提供者。例如，若要識別提供者，您可以新增標籤鍵 **okta** 和標籤值 **saml**。您可以使用標籤來控制對資源的存取權，或控制哪些標籤可以連接到物件。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

## 標記 SAML 身分提供者所需的許可
<a name="id_tags_saml_permissions"></a>

您必須設定權限，以允許 IAM 實體 (使用者或角色) 標記 SAML 2.0 型身分提供者 (IdP)。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListSAMLProviderTags`
+ `iam:TagSAMLProvider`
+ `iam:UntagSAMLProvider`

**允許 IAM 實體 (使用者或角色) 新增、列出或移除 SAML 身分提供者的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 實體的許可政策。使用您的帳戶號碼，用需要其標籤受管的 SAML 提供者名稱取代 *<SAMLProviderName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListSAMLProviderTags",
        "iam:TagSAMLProvider",
        "iam:UntagSAMLProvider"
    ],
    "Resource": "arn:aws:iam::<account-number>:saml-provider/<SAMLProviderName>"
}
```

**允許 IAM 實體 (使用者或角色) 將標籤新增至特定 SAML 身分提供者**  
將下列陳述式新增至 IAM 實體的許可政策，而該實體需要新增 (非移除) 特定 SAML 提供者的標籤。

**注意**  
此 `iam:TagSAMLProvider` 動作需要您也包含 `iam:ListSAMLProviderTags` 動作。

若要使用此政策，請用需要其標籤受管的 SAML 提供者名稱取代 *<SAMLProviderName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListSAMLProviderTags",
        "iam:TagSAMLProvider"
    ],
    "Resource": "arn:aws:iam::<account-number>:saml-provider/<SAMLProviderName>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理 IAM SAML 身分提供者的標籤 (主控台)
<a name="id_tags_saml_procs-console"></a>

您可以從 AWS 管理主控台管理 IAM SAML 身分提供者的標籤。

**管理 SAML 身分提供者 (主控台) 的標籤**

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在主控台的導覽窗格中，選擇 **Identity providers** (身分提供者)，然後選擇您所要編輯的 SAML 身分提供者之名稱。

1. 選擇**標籤**索引標籤，然後在**標籤**區段中，選擇**管理標籤**，然後完成下列其中一個動作：
   + 如果 SAML 身分提供者尚未有標籤或新增標籤，請選擇 **Add tag** (新增標籤)。
   + 編輯現有標籤鍵和值。
   + 請選擇 **Remove tag** (移除標籤) 以移除標籤。

1. 新增或移除標籤來完成標籤的設定。接著選擇 **Save changes (儲存變更)**。

## 管理 IAM SAML 身分提供者 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_saml_procs-cli-api"></a>

您可以列出、連接或移除 IAM SAML 身分提供者的標籤。您可以使用 AWS CLI 或 AWS API 來管理 IAM SAML 身分提供者的標籤。

**列出目前連接至 SAML 身分提供者 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-saml-provider-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-saml-provider-tags.html)
+ AWS API：[ListSAMLProviderTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSAMLProviderTags.html)

**將標籤連接至 SAML 身分提供者 (AWS CLI 或 AWS API)**
+ AWS CLI: [aws iam tag-saml-provider](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-saml-provider.html)
+ AWS API：[TagSAMLProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagSAMLProvider.html)

**從 SAML 身分提供者 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI: [aws iam untag-saml-provider](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-saml-provider.html)
+ AWS API：[UntagSAMLProvider](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagSAMLProvider.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記 Amazon EC2 角色的執行個體設定檔
<a name="id_tags_instance-profiles"></a>

啟動 Amazon EC2 執行個體時，指定要與執行個體相關聯的 IAM 角色。執行個體描述檔是適用於 IAM 角色的容器，可讓您在執行個體啟動時將角色資訊傳遞至 Amazon EC2 執行個體。您可以在使用 AWS CLI 或 AWS API 時標記執行個體描述檔。

您可以使用 IAM 標籤鍵值組將自訂屬性新增至執行個體描述檔。例如，若要將部門資訊新增至執行個體設定檔，您可以新增標籤鍵 **access-team** 和標籤值 **eng**。這樣做可讓具有相符標籤的主體存取具有相同標籤的執行個體設定檔。您可以使用多個標籤鍵值組來指定團隊和專案：**access-team = eng ** 和 **project = peg**。您可以使用標籤來控制使用者對資源的存取權，或控制哪些標籤可以連接到使用者。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

## 標記執行個體設定檔所需的許可
<a name="id_tags_instance-profiles_permissions"></a>

您必須設定許可，允許 IAM 實體 (使用者或角色) 標記執行個體描述檔。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListInstanceProfileTags`
+ `iam:TagInstanceProfile`
+ `iam:UntagInstanceProfile`

**允許 IAM 實體 (使用者或角色) 新增、列出或移除執行個體描述檔的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 實體的許可政策。使用您的帳戶號碼，用需要其標籤受管的執行個體描述檔取代 *<InstanceProfileName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListInstanceProfileTags",
        "iam:TagInstanceProfile",
        "iam:UntagInstanceProfile"
    ],
    "Resource": "arn:aws:iam::<account-number>:instance-profile/<InstanceProfileName>"
}
```

**允許 IAM 實體 (使用者或角色) 將標籤新增至特定執行個體描述檔**  
將下列陳述式新增至 IAM 實體的許可政策，而該實體需要新增 (非移除) 特定執行個體描述檔的標籤。

**注意**  
此 `iam:TagInstanceProfile` 動作需要您也包含 `iam:ListInstanceProfileTags` 動作。

若要使用此政策，請用需要其標籤受管的執行個體描述檔取代 *<InstanceProfileName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListInstanceProfileTags",
        "iam:TagInstanceProfile"
    ],
    "Resource": "arn:aws:iam::<account-number>:instance-profile/<InstanceProfileName>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理執行個體描述檔 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_instance-profile_procs-cli-api"></a>

您可以列出、連接或移除執行個體設定檔的標籤。您可以使用 AWS CLI 或 AWS API 來管理執行個體描述檔的標籤。

**列出目前連接至執行個體描述檔 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-instance-profile-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profile-tags.html)
+ AWS API：[ListInstanceProfileTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfileTags.html)

**將標籤連接至執行個體描述檔 (AWS CLI 或 AWS API)**
+ AWS CLI：[aws iam tag-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-instance-profile.html)
+ AWS API：[TagInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagInstanceProfile.html)

**從執行個體描述檔 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI: [aws iam untag-instance-profile](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-instance-profile.html)
+ AWS API：[UntagInstanceProfile](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagInstanceProfile.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記伺服器憑證
<a name="id_tags_server-certificates"></a>

如果您使用 IAM 管理 SSL/TLS 憑證，您可以使用 AWS CLI 或 AWS API 在 IAM 中標記伺服器憑證。對於 AWS Certificate Manager (ACM) 支援的區域中的憑證，我們建議您使用 ACM 而非 IAM 來佈建、管理和部署伺服器憑證。在不支援的區域中，您必須使用 IAM 作為憑證管理員。如需了解 ACM 支援哪些區域，請參閱 *AWS 一般參考* 中的 [AWS Certificate Manager 端點和配額](https://docs.aws.amazon.com/general/latest/gr/acm.html)。

您可以使用 IAM 標籤鍵值組將自訂屬性新增至伺服器憑證。例如，若要新增伺服器憑證擁有者或系統管理員的相關資訊，請新增標籤鍵 **owner** 和標籤值 **net-eng**。或者，您可以透過新增標籤鍵 **CostCenter** 和標籤值 **1234** 來指定成本中心。您可以使用標籤來控制對資源的存取權，或控制哪些標籤可以連接到資源。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

## 標記伺服器憑證所需的許可
<a name="id_tags_server-certificates_permissions"></a>

您必須設定許可，允許 IAM 實體 (使用者或角色) 標記其他伺服器憑證。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListServerCertificateTags`
+ `iam:TagServerCertificate`
+ `iam:UntagServerCertificate`

**允許 IAM 實體 (使用者或角色) 新增、列出或移除伺服器憑證的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 實體的許可政策。使用您的帳戶號碼，用需要其標籤受管的伺服器憑證名稱取代 *<CertificateName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListServerCertificateTags",
        "iam:TagServerCertificate",
        "iam:UntagServerCertificate"
    ],
    "Resource": "arn:aws:iam::<account-number>:server-certificate/<CertificateName>"
}
```

**允許 IAM 實體 (使用者或角色) 將標籤新增至特定伺服器憑證**  
將下列陳述式新增至 IAM 實體的許可政策，而該實體需要新增 (非移除) 特定伺服器憑證的標籤。

**注意**  
此 `iam:TagServerCertificate` 動作需要您也包含 `iam:ListServerCertificateTags` 動作。

若要使用此政策，請用需要其標籤受管的伺服器憑證名稱取代 *<CertificateName>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListServerCertificateTags",
        "iam:TagServerCertificate"
    ],
    "Resource": "arn:aws:iam::<account-number>:server-certificate/<CertificateName>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理伺服器憑證 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_server-certificates_procs-cli-api"></a>

您可以列出、連接或移除伺服器憑證的標籤。您可以使用 AWS CLI 或 AWS API 來管理伺服器憑證的標籤。

**列出目前連接至伺服器憑證 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-server-certificate-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-server-certificate-tags.html)
+ AWS API：[ListServerCertificateTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServerCertificateTags.html)

**將標籤連接至伺服器憑證 (AWS CLI 或 AWS API)**
+ AWS CLI: [aws iam tag-server-certificate](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-server-certificate.html)
+ AWS API：[TagServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagServerCertificate.html)

**從伺服器憑證 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI: [aws iam untag-server-certificate](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-server-certificate.html)
+ AWS API：[UntagServerCertificate](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagServerCertificate.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 標記虛擬 MFA 裝置
<a name="id_tags_virtual-mfa"></a>

您可以使用 IAM 標籤鍵值組將自訂屬性新增至虛擬 MFA 裝置。例如，若要新增使用者虛擬 MFA 裝置的成本中心資訊，您可以新增標籤鍵 **CostCenter** 和標籤值 **1234**。您可以使用標籤來控制對資源的存取權，或控制哪些標籤可以連接到物件。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

您也可以在 中使用標籤 AWS STS ，在擔任角色或聯合使用者時新增自訂屬性。如需詳細資訊，請參閱[在 中傳遞工作階段標籤 AWS STS](id_session-tags.md)。

## 標記虛擬 MFA 裝置所需的許可
<a name="id_tags_virtual-mfa_permissions"></a>

您必須設定許可，允許 IAM 實體 (使用者或角色) 標記虛擬 MFA 裝置。您可在 IAM 政策中指定以下一個或所有 IAM 標籤動作：
+ `iam:ListMFADeviceTags`
+ `iam:TagMFADevice`
+ `iam:UntagMFADevice`

**允許 IAM 實體 (使用者或角色) 新增、列出或移除虛擬 MFA 裝置的標籤**  
將下列陳述式新增至需要管理標籤之 IAM 實體的許可政策。使用您的帳戶並使用需要其標籤受管之虛擬 MFA 裝置的名稱取代 *<MFATokenID>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListMFADeviceTags",
        "iam:TagMFADevice",
        "iam:UntagMFADevice"
    ],
    "Resource": "arn:aws:iam::<account-number>:mfa/<MFATokenID>"
}
```

**允許 IAM 實體 (使用者或角色) 將標籤新增至特定虛擬 MFA 裝置**  
將下列陳述式新增至 IAM 實體的許可政策，而該實體需要新增 (非移除) 特定 MFA 裝置的標籤。

**注意**  
此 `iam:TagMFADevice` 動作需要您也包含 `iam:ListMFADeviceTags` 動作。

若要使用此政策，請用需要其標籤受管之虛擬 MFA 裝置的名稱取代 *<MFATokenID>*。若要了解如何使用此範例 JSON 政策文件來建立政策，請參閱 [正在使用 JSON 編輯器建立政策](access_policies_create-console.md#access_policies_create-json-editor)。

```
{
    "Effect": "Allow",
    "Action": [
        "iam:ListMFADeviceTags",
        "iam:TagMFADevice"
    ],
    "Resource": "arn:aws:iam::<account-number>:mfa/<MFATokenID>"
}
```

或者，您可以使用 受 AWS 管政策，例如 [IAMFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/IAMFullAccess) 來提供 IAM 的完整存取權。

## 管理虛擬 MFA 裝置 (AWS CLI 或 AWS API) 上的標籤
<a name="id_tags_virtual-mfa_procs-cli-api"></a>

您可以列出、連接或移除虛擬 MFA 裝置的標籤。您可以使用 AWS CLI 或 AWS API 來管理虛擬 MFA 裝置的標籤。

**列出目前連接至虛擬 MFA 裝置 (AWS CLI 或 AWS API) 的標籤**
+ AWS CLI: [aws iam list-mfa-device-tags](https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-device-tags.html)
+ AWS API：[ListMFADeviceTags](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADeviceTags.html)

**將標籤連接至虛擬 MFA 裝置 (AWS CLI 或 AWS API)**
+ AWS CLI: [aws iam tag-mfa-device](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-mfa-device.html)
+ AWS API：[TagMFADevice](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagMFADevice.html)

**從虛擬 MFA 裝置 (AWS CLI 或 AWS API) 移除標籤**
+ AWS CLI: [aws iam untag-mfa-device](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-mfa-device.html)
+ AWS API：[UntagMFADevice](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagMFADevice.html)

如需將標籤連接至其他 AWS 服務資源的相關資訊，請參閱這些服務的文件。

如需使用標籤來設定多個精密許可搭配 IAM 許可政策的更多資訊，請參閱 [IAM 政策元素：變數與標籤](reference_policies_variables.md)。

# 在 中傳遞工作階段標籤 AWS STS
<a name="id_session-tags"></a>

工作階段標籤是您在 AWS STS中擔任 IAM 角色或與使用者聯合身分時傳遞的鍵/值對。您可以透過 AWS CLI 身分提供者 (IdP) 提出 AWS STS 或 AWS API 請求來執行此操作。當您使用 AWS STS 請求臨時安全登入資料時，會產生工作階段。工作階段會過期且包含[憑證](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html)，例如存取金鑰對和工作階段權杖。當您使用工作階段憑證發出後續請求時，[請求內容](reference_policies_elements_condition.md#AccessPolicyLanguage_RequestContext)會包含 `aws:PrincipalTag` 內容鍵。您可以在您政策的 `aws:PrincipalTag` 元素中使用 `Condition` 鍵來根據這些標籤允許或拒絕存取。

當您使用暫時憑證發出請求時，您的主體可能會包含一組標籤。這些標籤來自下列來源：

1. **工作階段標籤** – 當您使用 或 AWS CLI AWS API 擔任角色或聯合使用者時傳遞的標籤。如需有關這些操作的詳細資訊，請參閱 [工作階段標記操作](#id_session-tags_operations)。

1. **傳入的可轉移工作階段標籤** – 這些標籤會從角色鏈中的上一個工作階段繼承。如需詳細資訊，請參閱本主題稍後的 [使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。

1. **IAM 標籤** – 連接至 IAM 的標籤擔任角色。

**Topics**
+ [工作階段標記操作](#id_session-tags_operations)
+ [工作階段標籤的須知事項](#id_session-tags_know)
+ [新增工作階段標籤所需的許可](#id_session-tags_permissions-required)
+ [使用 AssumeRole 傳遞工作階段標籤](#id_session-tags_adding-assume-role)
+ [使用 AssumeRoleWithSAML 傳遞工作階段標籤](#id_session-tags_adding-assume-role-saml)
+ [使用 AssumeRoleWithWebIdentity 傳遞工作階段標籤](#id_session-tags_adding-assume-role-idp)
+ [使用 GetFederationToken 傳遞工作階段標籤](#id_session-tags_adding-getfederationtoken)
+ [使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)
+ [使用 ABAC 的工作階段標籤](#id_session-tags_using-abac)
+ [在 CloudTrail 中檢視工作階段標籤](#id_session-tags_ctlogs)

## 工作階段標記操作
<a name="id_session-tags_operations"></a>

您可以使用下列 AWS CLI 或 AWS API 操作傳遞工作階段標籤 AWS STS。* AWS 管理主控台 **[切換角色](id_roles_use_switch-role-console.md)**功能不允許您傳遞工作階段標籤。*

您也可以將工作階段標籤設為可轉移。可轉移標籤會在角色鏈結期間保存。如需詳細資訊，請參閱[使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。

下表比較傳遞工作階段索引標籤的方法。


|  作業 |  **誰可以擔任這個角色**  | **傳遞標籤的方法** |  **設定可轉移標籤的方法**  | 
| --- | --- | --- | --- | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作 | IAM 使用者或工作階段 | Tags API 參數或 --tags CLI 選項 | TransitiveTagKeys API 參數或 --transitive-tag-keys CLI 選項 | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-saml.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-saml.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 操作 | 使用 SAML 身分提供者進行身分驗證的任何使用者 | PrincipalTag SAML 屬性 | TransitiveTagKeys SAML 屬性 | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role-with-web-identity.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作 | 使用 OIDC 提供者進行身分驗證的任何使用者 | PrincipalTag OIDC 權杖 | TransitiveTagKeys OIDC 權杖 | 
| [https://docs.aws.amazon.com/cli/latest/reference/sts/get-federation-token.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-federation-token.html) CLI 或 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 操作 | IAM 使用者或根使用者 | Tags API 參數或 --tags CLI 選項 | 不支援 | 

在以下條件下，則支援工作階段標記的操作便可能會失敗：
+ 您傳遞的工作階段標籤數超過 50 個。
+ 工作階段標籤索引鍵的純文字超過 128 個字元。
+ 工作階段標籤值的純文字超過 256 個字元。
+ 工作階段政策純文字的總大小超過 2048 個字元。
+ 工作階段政策和標籤的合計總封裝大小太大。若操作失敗，錯誤訊息會顯示政策和標籤的合計大小與大小上限的接近程度 (以百分比)。

## 工作階段標籤的須知事項
<a name="id_session-tags_know"></a>

使用工作階段標籤前，請檢閱下列工作階段和標籤的相關詳細資訊。
+ 使用工作階段標籤時，所有連線至傳遞標籤之身分提供者 (IdP) 之角色的信任政策必須具有 [`sts:TagSession`](#id_session-tags_permissions-required) 許可。對於在信任政策中沒有此許可的角色，`AssumeRole` 操作即會失敗。
+ 當您要求工作階段時，您可以指定主體標籤作為工作階段標籤。標籤會套用至您使用工作階段的憑證所發出的請求。
+ 工作階段標籤使用鍵值對。例如，若要將聯絡資訊新增至工作階段，您可以新增工作階段標籤鍵 `email` 及標籤值 `johndoe@example.com`。
+ 工作階段標籤必須遵循 [IAM 和 中命名標籤的規則 AWS STS](id_tags.md#id_tags_rules_creating)。本主題包含適用於您工作階段標籤的區分大小寫及受限制字首資訊。
+ 新的工作階段標籤會覆寫具有相同標籤鍵的現有擔任角色或聯合身分使用者工作階段標籤，無論字元大小寫為何。
+ 您無法使用 傳遞工作階段標籤 AWS 管理主控台。
+ 工作階段標籤僅對目前的工作階段有效。
+ 工作階段標籤支援[角色鏈結](id_roles.md#iam-term-role-chaining)。根據預設， AWS STS 不會將標籤傳遞至後續的角色工作階段。但是，您可以將工作階段標籤設為可轉移。可轉移標籤在角色鏈結期間會持續存在，並在角色信任政策評估期間取代相符的 `ResourceTag` 值。如需詳細資訊，請參閱[使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。
+ 您可以使用工作階段標籤來控制對資源的存取，或是控制可傳遞至後續工作階段的標籤。如需詳細資訊，請參閱 [IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](tutorial_abac-saml.md)。
+ 您可以在 AWS CloudTrail 日誌中檢視您工作階段的主體標籤，包括工作階段標籤。如需詳細資訊，請參閱[在 CloudTrail 中檢視工作階段標籤](#id_session-tags_ctlogs)。
+ 您必須傳遞每個工作階段標籤的單一值。 AWS STS 不支援多值工作階段標籤。
+ 您最多可傳遞 50 個工作階段標籤。 AWS 帳戶中 IAM 資源的數量和大小有限。如需詳細資訊，請參閱[IAM AWS STS 和配額](reference_iam-quotas.md)。
+  AWS 轉換會將傳遞的工作階段政策和工作階段標籤壓縮為具有個別限制的封裝二進位格式。如果您超過此限制， AWS CLI 或 AWS API 錯誤訊息會依百分比顯示政策和標籤組合達到大小上限的接近程度。

## 新增工作階段標籤所需的許可
<a name="id_session-tags_permissions-required"></a>

除了符合 API 操作的動作外，您必須在您的政策中具備下列僅許可動作：

```
sts:TagSession
```

**重要**  
使用工作階段標籤時，連線至身分提供者 (IdP) 之所有角色的角色信任政策必須具有 `sts:TagSession` 許可。任何連接至 IdP 的正在傳遞工作階段標籤之角色，在沒有此許可的情況下，`AssumeRole` 操作即會失敗。如果您不想更新每個角色的角色信任政策，則您可以使用個別的 IdP 執行個體傳遞工作階段標籤。然後，將 `sts:TagSession` 許可僅新增至連線至個別 IdP 的角色。

您可以使用 `sts:TagSession` 動作搭配下列條件金鑰。
+ `aws:PrincipalTag` – 將連接至提出請求主體的標籤，與您在政策中所指定的標籤進行比較。例如，您可以允許主體只有在主體提出具備指定標籤的請求時，才能傳遞工作階段標籤。
+ `aws:RequestTag` – 將請求中傳遞的標籤鍵值對與您在政策中所指定的標籤對進行比較。例如，您可以允許主體傳遞指定工作階段標籤，但僅限指定的值。
+ `aws:ResourceTag` – 將您在政策中所指定的標籤鍵值對與連接到資源的鍵值對進行比較。例如，您可以允許主體僅在其擔任的角色包含指定標籤時，才能傳遞工作階段標籤。
+ `aws:TagKeys` – 將請求中的標籤鍵與您在政策中所指定的鍵進行比較。例如，您可以只允許主體傳遞具備指定標籤鍵的工作階段標籤。此條件索引鍵會限制可傳遞的工作階段標籤組上限。
+ `sts:TransitiveTagKeys` - 將請求中的可轉移工作階段標籤鍵與政策中指定的標籤鍵進行比較。例如，您可以撰寫政策，只允許主體將特定標籤設為可轉移。可轉移標籤會在角色鏈結期間保存。如需詳細資訊，請參閱 [使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。

例如，以下[角色信任政策](id_roles.md#term_trust-policy)會允許 `test-session-tags` 使用者擔任連接政策的角色。當該使用者擔任該角色時，他們必須使用 AWS CLI 或 AWS API 來傳遞三個必要的工作階段標籤和所需的[外部 ID](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id)。此外，使用者可以選擇將 `Project` 和 `Department` 標籤設為可轉移。

**Example 工作階段標籤的角色信任政策範例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowIamUserAssumeRole",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Principal": {"AWS": "arn:aws:iam::123456789012:user/test-session-tags"},
            "Condition": {
              "StringLike": {
                    "aws:RequestTag/Project": "*",
                    "aws:RequestTag/CostCenter": "*",
                    "aws:RequestTag/Department": "*"
                },
                "StringEquals": {"sts:ExternalId": "Example987"}
            }
        },
        {
            "Sid": "AllowPassSessionTagsAndTransitive",
            "Effect": "Allow",
            "Action": "sts:TagSession",
            "Principal": {"AWS": "arn:aws:iam::123456789012:user/test-session-tags"},
            "Condition": {
                "StringLike": {
                    "aws:RequestTag/Project": "*",
                    "aws:RequestTag/CostCenter": "*"
                },
                "StringEquals": {
                    "aws:RequestTag/Department": [
                        "Engineering",
                        "Marketing"
                    ]
                },
                "ForAllValues:StringEquals": {
                    "sts:TransitiveTagKeys": [
                        "Project",
                        "Department"
                    ]
                }
            }
        }
    ]
}
```

**此政策的功能為何？**
+ `AllowIamUserAssumeRole` 陳述式允許 `test-session-tags` 使用者擔任連接政策的角色。當該使用者擔任角色時，他們必須傳遞必要的工作階段標籤和[外部 ID](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id)。
  + 此陳述式的第一個條件區塊要求使用者傳遞 `Project`、`CostCenter` 和 `Department` 工作階段標籤。由於標籤值在此陳述式中不重要，因此您可以針對標籤值使用萬用字元 (\$1)。此區塊會確保使用者至少傳遞這三個工作階段標籤。否則，操作會失敗。使用者可傳遞其他標籤。
  + 第二個條件區塊則會要求使用者傳遞值為 `Example987` 的[外部 ID](id_roles_common-scenarios_third-party.md#id_roles_third-party_external-id)。
+ `AllowPassSessionTagsAndTransitive` 陳述式允許 `sts:TagSession` 僅許可動作。必須先允許此動作，使用者才能傳遞工作階段標籤。如果您的政策包含第一個陳述式，但沒有第二個陳述式，使用者便無法擔任角色。
  + 此陳述式的第一個條件區塊允許使用者針對 `CostCenter` 和 `Project` 工作階段標籤傳遞任何值。您可以在政策中針對標籤值使用萬用字元 (\$1) 來執行此作業，該政策會要求您使用 [StringLike](reference_policies_elements_condition_operators.md#Conditions_String) 條件運算子。
  + 第二個條件區塊則只會允許使用者針對 `Engineering` 工作階段標籤傳遞 `Marketing` 或 `Department` 值。
  + 第三個條件區塊則會列出您可設為可轉移的標籤組上限。使用者可以選擇將一部分，或是不將任何標籤設為可轉移。使用者無法將其他標籤設為可轉移。您可以新增另一個包含 `"Null":{"sts:TransitiveTagKeys":"false"}` 的條件區塊，來要求使用者將其中至少一個標籤設為可轉移。

## 使用 AssumeRole 傳遞工作階段標籤
<a name="id_session-tags_adding-assume-role"></a>

`AssumeRole` 操作會傳回一組可用來存取 AWS 資源的臨時登入資料。您可以使用 IAM 使用者或角色憑證來呼叫 `AssumeRole`。若要在擔任角色時傳遞工作階段標籤，請使用 `--tags` AWS CLI 選項或 `Tags` AWS API 參數。

若要將標籤設定為可轉移，請使用 `--transitive-tag-keys` AWS CLI 選項或 `TransitiveTagKeys` AWS API 參數。可轉移標籤會在角色鏈結期間保存。如需詳細資訊，請參閱 [使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。

以下範例顯示使用 `AssumeRole` 的範例請求。在此範例中，當您擔任 `my-role-example` 角色時，您可以建立名為 `my-session` 的工作階段。您可以新增工作階段標籤鍵/值對 `Project` = `Automation`、`CostCenter` = `12345` 和 `Department` = `Engineering`。您也可以透過指定其鍵，將 `Project` 和 `Department` 標籤設為可轉移。您必須傳遞每個工作階段標籤的單一值。 AWS STS 不支援多值工作階段標籤。

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/my-role-example \
--role-session-name my-session \
--tags Key=Project,Value=Automation Key=CostCenter,Value=12345 Key=Department,Value=Engineering \
--transitive-tag-keys Project Department \
--external-id Example987
```

## 使用 AssumeRoleWithSAML 傳遞工作階段標籤
<a name="id_session-tags_adding-assume-role-saml"></a>

`AssumeRoleWithSAML` 操作是使用 SAML 類型的聯合進行身分驗證。此操作會傳回一組可用來存取 AWS 資源的臨時登入資料。如需使用 SAML 型聯合進行 AWS 管理主控台 存取的詳細資訊，請參閱 [啟用 SAML 2.0 聯合主體來存取 AWS 管理主控台](id_roles_providers_enable-console-saml.md)。如需 AWS CLI 或 AWS API 存取的詳細資訊，請參閱 [SAML 2.0 聯合身分](id_roles_providers_saml.md)。如需為 Active Directory 使用者設定 SAML 聯合的教學課程，請參閱 AWS 安全部落格中的[AWS 使用 Active Directory 聯合服務 (ADFS) 進行聯合身分驗證](https://aws.amazon.com/blogs/security/aws-federated-authentication-with-active-directory-federation-services-ad-fs/)。

身為管理員，您可以允許公司目錄的成員 AWS 使用 AWS STS `AssumeRoleWithSAML`操作聯合到 。若要執行此操作，您必須完成下列任務：

1. [將網路配置為適用於 AWS的 SAML 提供者](id_roles_providers_saml_3rd-party.md)

1. [在 IAM 中建立 SAML 提供者](id_roles_providers_create_saml.md)

1. [為 SAML 2.0 聯合身分建立角色 (主控台)](id_roles_create_for-idp_saml.md)

1. [完成配置 SAML IdP 並為 SAML 身分驗證回應建立聲明](id_roles_providers_create_saml_assertions.md)

AWS 包含具有工作階段標籤端對端end-to-end體驗的身分提供者及其身分解決方案。如要了解如何使用這些身分提供者來設定工作階段標籤，請參閱 [將第三方 SAML 解決方案供應商與 整合 AWS](id_roles_providers_saml_3rd-party.md)。

如要將 SAML 屬性做為工作階段標籤傳遞，請在其中包含 `Attribute` 元素，並將其 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/PrincipalTag:{TagKey}`。使用 `AttributeValue` 元素指定標籤的值。為每個工作階段標籤包含個別的 `Attribute` 元素。

例如，假設您希望將下列身分屬性做為工作階段標籤傳遞：
+ `Project:Automation`
+ `CostCenter:12345`
+ `Department:Engineering`

如要傳遞這些屬性，請在您的 SAML 聲明中包含下列元素。

**Example SAML 聲明的程式碼片段範例**  

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:Project">
  <AttributeValue>Automation</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:CostCenter">
  <AttributeValue>12345</AttributeValue>
</Attribute>
<Attribute Name="https://aws.amazon.com/SAML/Attributes/PrincipalTag:Department">
  <AttributeValue>Engineering</AttributeValue>
</Attribute>
```

如要將前述標籤設為可轉移，請在其中包含另一個 `Attribute` 元素，並將其 `Name` 屬性設為 `https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys`。可轉移標籤會在角色鏈結期間保存。如需詳細資訊，請參閱 [使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。

如要將 `Project` 和 `Department` 標籤設為可轉移，請使用以下多值屬性：

**Example SAML 聲明的程式碼片段範例**  

```
<Attribute Name="https://aws.amazon.com/SAML/Attributes/TransitiveTagKeys">
  <AttributeValue>Project</AttributeValue>
  <AttributeValue>Department</AttributeValue>
</Attribute>
```

## 使用 AssumeRoleWithWebIdentity 傳遞工作階段標籤
<a name="id_session-tags_adding-assume-role-idp"></a>

使用與 OpenID Connect (OIDC) 相容的聯合身分對 `AssumeRoleWithWebIdentity` 操作進行身分驗證。此操作會傳回一組可用來存取 AWS 資源的臨時登入資料。如需使用 Web 聯合身分進行 AWS 管理主控台 存取的詳細資訊，請參閱 [OIDC 聯合身分](id_roles_providers_oidc.md)。

若要從 OpenID Connect (OIDC) 傳遞工作階段標籤，您必須在提交 `AssumeRoleWithWebIdentity` 請求時在 JSON Web 權杖 (JWT) 中包含工作階段標籤。若要進一步了解 OIDC 權杖和要求，請參閱《Amazon Cognito 開發人員指南》**中的[搭配使用者集區使用權杖](https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html)。

AWS 支援兩種在 JWT 中包含工作階段標籤的宣告格式：
+ 巢狀宣告格式
+ 平面化宣告格式

### 巢狀宣告格式
<a name="id_session-tags_adding-assume-role-idp-nested-format"></a>

巢狀宣告格式使用 JWT 中 `https://aws.amazon.com/tags` 命名空間內的結構。在此格式中：
+ 主體標籤以巢狀物件的形式呈現在 `principal_tags` 索引鍵下。
+ 每個主體標籤都是單一字串值。
+ 可轉移標籤索引鍵呈現在 `transitive_tag_keys` 索引鍵下的陣列中。
+ `principal_tags` 和 `transitive_tag_keys` 都會巢狀在 `https://aws.amazon.com/tags` 命名空間下。

下列範例示範使用巢狀物件格式解碼的 JWT：

**Example 使用巢狀宣告格式解碼的 JSON Web 權杖的範例**  

```
{
    "sub": "johndoe",
    "aud": "ac_oic_client",
    "jti": "ZYUCeRMQVtqHypVPWAN3VB",
    "iss": "https://xyz.com",
    "iat": 1566583294,
    "exp": 1566583354,
    "auth_time": 1566583292,
    "https://aws.amazon.com/tags": {
        "principal_tags": {
            "Project": ["Automation"],
            "CostCenter": ["987654"],
            "Department": ["Engineering"]
        },
        "transitive_tag_keys": [
            "Project",
            "CostCenter"
        ]
    }
}
```

### 平面化宣告格式
<a name="id_session-tags_adding-assume-role-idp-flattened-format"></a>

平面化宣告格式與不支援 JWT 宣告中巢狀物件的身分提供者 (例如 Microsoft Entra ID) 相容。在此格式中：
+ 主體標籤以單獨的宣告呈現，字首為 `https://aws.amazon.com/tags/principal_tags/`。
+ 每個主體標籤都是單一字串值。
+ 可轉移標籤索引鍵在單一宣告中呈現為字首為 `https://aws.amazon.com/tags/transitive_tag_keys` 的字串陣列。

現在，讓我們看看如何使用平面化宣告格式來表示相同的資訊：

**Example 使用平面化宣告格式解碼的 JSON Web 權杖範例**  

```
{
    "sub": "johndoe",
    "aud": "ac_oic_client",
    "jti": "ZYUCeRMQVtqHypVPWAN3VB",
    "iss": "https://xyz.com",
    "iat": 1566583294,
    "exp": 1566583354,
    "auth_time": 1566583292,
    "https://aws.amazon.com/tags/principal_tags/Project": "Automation",
    "https://aws.amazon.com/tags/principal_tags/CostCenter": "987654",
    "https://aws.amazon.com/tags/principal_tags/Department": "Engineering",
    "https://aws.amazon.com/tags/transitive_tag_keys": [
        "Project",
        "CostCenter"
    ]
}
```

兩個解碼的 JWT 範例都顯示對 `AssumeRoleWithWebIdentity` 的呼叫，其中包含 `Project`、`CostCenter` 和 `Department` 工作階段標籤。這兩個權杖都會將 `Project` 和 `CostCenter` 標籤設定為可轉移。可轉移標籤會在角色鏈結期間保存。如需詳細資訊，請參閱[使用工作階段標籤鏈結角色](#id_session-tags_role-chaining)。

平面化宣告格式實現與巢狀宣告格式相同的結果，但使用標籤的平面化結構。可讓您在 JWT 宣告不支援巢狀 JSON 物件的環境中包含工作階段標籤。使用任一格式時，請確保您的身分提供者已設定為使用適當的宣告結構發出權杖。 AWS 支援兩種宣告格式，因此您可以選擇最適合您身分提供者特定要求的格式。

## 使用 GetFederationToken 傳遞工作階段標籤
<a name="id_session-tags_adding-getfederationtoken"></a>

`GetFederationToken` 允許您聯合您的使用者。此操作會傳回一組可用來存取 AWS 資源的臨時登入資料。若要將標籤新增至聯合身分使用者工作階段，請使用 `--tags` AWS CLI 選項或 `Tags` AWS API 參數。當您使用時，您無法將工作階段標籤設為可轉移`GetFederationToken`，因為您無法使用臨時憑證來擔任角色。在這種情況下，您無法使用角色鏈結。

以下範例顯示使用 `GetFederationToken` 的範例請求。在此範例中，當您請求權杖時，您會建立名為 `my-fed-user` 的工作階段。您可以新增工作階段標籤鍵/值對 `Project` = `Automation` 和 `Department` = `Engineering`。

**Example GetFederationToken CLI 請求範例**  

```
aws sts get-federation-token \
--name my-fed-user \
--tags key=Project,value=Automation key=Department,value=Engineering
```

當您使用 `GetFederationToken` 操作傳回的暫時憑證時，工作階段的主體標籤會包含使用者的標籤和傳遞的工作階段標籤。

## 使用工作階段標籤鏈結角色
<a name="id_session-tags_role-chaining"></a>

您可以擔任一個角色，然後使用暫時憑證來擔任另一個角色。您可以從一個工作階段繼續前往另一個工作階段。這稱為[角色鏈結](id_roles.md#iam-term-role-chaining)。當您在擔任角色期間傳遞工作階段標籤時，您可以將鍵設為可轉移。這可確保會在角色鏈中，將這些工作階段標籤傳遞到後續的工作階段。您無法將角色標籤設為可轉移。如要將這些標籤傳遞至後續工作階段，請將這些標籤指定為工作階段標籤。

**注意**  
可轉移標籤在角色鏈結期間會持續存在，並在角色信任政策評估期間取代相符的 `ResourceTag` 值。

下列範例顯示 如何將工作階段標籤、傳輸性標籤和角色標籤 AWS STS 傳遞至角色鏈中的後續工作階段。

在此角色鏈結案例中，您會使用 中的 IAM 使用者存取金鑰 AWS CLI 來擔任名為 的角色`Role1`。您接著會使用產生的工作階段憑證來擔任名為 `Role2` 的第二個角色。您接著可以使用第二個工作階段憑證來擔任名為 `Role3` 的第三個角色。這些請求會以三個不同操作的形式發生。每個角色都已在 IAM 中加上標籤。而在每個請求期間，您會傳遞其他工作階段標籤。

![\[角色鏈結\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/session-tags-chaining-simple.png)


鏈結角色時，您可以確保將先前工作階段的標籤保存到後續工作階段。若要執行此操作，請使用 `assume-role` CLI 命令；您必須將標籤作為工作階段標籤傳遞，並將標籤設為可轉移。您將標籤 `Star` = `1` 設為工作階段標籤。命令還會將標籤 `Heart` = `1` 連接到角色，並在您使用工作階段時作為主體標籤套用。但是，您也希望 `Heart` = `1` 標籤能自動傳遞到第二個或第三個工作階段。若要執行此作業，您可以手動將其做為工作階段標籤包含在其中。產生的工作階段主體標籤包含這兩個標籤，並將其設定為可轉移。

![\[擔任角色鏈中的第一個角色\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/session-tags-chaining-role1.png)


您可以使用下列 AWS CLI 命令執行此請求：

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/Role1 \
--role-session-name Session1 \
--tags Key=Star,Value=1 Key=Heart,Value=1 \
--transitive-tag-keys Star Heart
```

然後，您可以使用該工作階段的憑證來擔任 `Role2`。命令會將標籤 `Sun` = `2` 連接至第二個角色，並在您使用第二個工作階段時作為主體標籤套用。`Heart` 和 `Star` 標籤會繼承自第一個工作階段中的可轉移工作階段。第二個工作階段所產生的主體標籤是 `Heart` = `1`、`Star` = `1` 及 `Sun` = `2`。`Heart` 和 `Star` 會繼續處於可轉移狀態。連接至 `Role2` 的 `Sun` 標籤並未標記為可轉移，因為其不是工作階段標籤。未來的工作階段不會繼承此標籤。

![\[擔任角色鏈中的第二個角色\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/session-tags-chaining-role2.png)


您可以使用下列 AWS CLI 命令執行第二個請求：

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/Role2 \
--role-session-name Session2
```

您接著會使用第二個工作階段憑證來擔任 `Role3`。第三個工作階段的主體標籤是來自任何新的工作階段標籤、繼承的可轉移工作階段標籤，以及角色標籤。第二個工作階段上的 `Heart` = `1` 和 `Star` = `1` 標籤是繼承自第一個工作階段中的可轉移工作階段標籤。如您嘗試傳遞 `Sun` = `2` 工作階段標籤，操作將會失敗。繼承的 `Star` = 1 工作階段標籤會覆寫角色的 `Star` = `3` 標籤。在角色鏈結過程中，進行角色信任政策評估之後，可轉移標籤的值會覆寫與 `ResourceTag` 值相符的角色。在此範例中，若 `Role3` 在角色信任政策中使用 `Star` 作為 `ResourceTag`，並將 `ResourceTag` 值設定為來自呼叫角色工作階段的可轉移標籤值。角色的 `Lightning` 標籤也會套用到第三個工作階段，且並未設為可轉移。

![\[擔任角色鏈中的第三個角色\]](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/images/session-tags-chaining-role3.png)


您可以使用下列 AWS CLI 命令執行第三個請求：

**Example AssumeRole CLI 請求範例**  

```
aws sts assume-role \
--role-arn arn:aws:iam::123456789012:role/Role3 \
--role-session-name Session3
```

## 使用 ABAC 的工作階段標籤
<a name="id_session-tags_using-abac"></a>

屬性類型存取控制 (ABAC) 會使用一種授權策略，根據標籤屬性定義許可。

如果您的公司使用 OIDC 或 SAML 類型的身分提供者 (IdP) 來管理使用者身分，您可以將您的聲明設為將工作階段標籤傳遞到 AWS。例如，當您的員工聯合到公司使用者身分時 AWS， 會將其屬性 AWS 套用至其產生的委託人。您接著可以使用 ABAC 來根據這些屬性允許或拒絕許可。如需詳細資訊，請參閱[IAM 教學課程：針對 ABAC 使用 SAML 工作階段標記](tutorial_abac-saml.md)。

如需有關 IAM Identity Center 搭配 ABAC 使用的詳細資訊，請參閱 *AWS IAM Identity Center 使用者指南*中的[存取控制的屬性](https://docs.aws.amazon.com/singlesignon/latest/userguide/attributesforaccesscontrol.html)。

## 在 CloudTrail 中檢視工作階段標籤
<a name="id_session-tags_ctlogs"></a>

您可以使用 AWS CloudTrail 來檢視用於擔任角色或聯合使用者的請求。CloudTrail 日誌檔案包含經擔任角色或聯合身分使用者工作階段的主體標籤資訊。如需詳細資訊，請參閱 [使用 記錄 IAM 和 AWS STS API 呼叫 AWS CloudTrail](cloudtrail-integration.md)。

例如，假設您提出請求 AWS STS `AssumeRoleWithSAML`、傳遞工作階段標籤，並將這些標籤設定為可轉移。您可以在您的 CloudTrail 日誌中找到以下資訊。

**Example AssumeRoleWithSAML CloudTrail 日誌範例**  

```
    "requestParameters": {
        "sAMLAssertionID": "_c0046cEXAMPLEb9d4b8eEXAMPLE2619aEXAMPLE",
        "roleSessionName": "MyRoleSessionName",
        "principalTags": {
            "CostCenter": "987654",
            "Project": "Unicorn"
        },
        "transitiveTagKeys": [
            "CostCenter",
            "Project"
        ],
        "durationSeconds": 3600,
        "roleArn": "arn:aws:iam::123456789012:role/SAMLTestRoleShibboleth",
        "principalArn": "arn:aws:iam::123456789012:saml-provider/Shibboleth"
    },
```

您可以檢視以下範例 CloudTrail 日誌，來檢視使用工作階段標籤的事件。
+ [CloudTrail 日誌檔案中 AWS STS 的角色鏈結 API 事件範例](cloudtrail-integration.md#stscloudtrailexample-assumerole)
+ [CloudTrail 日誌檔案中的範例 SAML AWS STS API 事件](cloudtrail-integration.md#stscloudtrailexample_saml)
+ [CloudTrail 日誌檔案中的範例 OIDC AWS STS API 事件](cloudtrail-integration.md#stscloudtrailexample_web-identity)