

# 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 角色。有关更多信息，请参阅 [What is 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)。
如果您在登录时遇到问题，请参阅 [Sign in to the AWS 管理控制台](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html)。

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

当您首次创建 AWS 账户时，最初使用的是一个对账户中所有 AWS 服务和资源拥有完全访问权限的登录身份。此身份称作 AWS 账户*根用户*。有关更多信息，请参阅 [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)。
+ 如果您在登录时遇到问题，请参阅 [Sign in to the 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 Organizations 管理的 AWS 账户的根用户凭证，以防止大规模的根用户凭证恢复和访问。

集中根访问后，您可以选择从组织的成员账户中删除根用户凭证。您可以移除根用户密码、访问密钥、签名证书，并停用多重身份验证（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 Organizations](https://docs.aws.amazon.com//organizations/latest/userguide/orgs_introduction.html) 中管理您的 AWS 账户。
+ 您必须具有以下权限才能在组织中启用此功能：
  + `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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 Organizations 中启用 AWS Identity and Access Management 的可信访问权限，则请使用以下命令：[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 Organizations 中启用 AWS Identity and Access Management 的可信访问权限，则请使用以下命令：[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>

AWS Organizations 管理账户或IAM的委托管理员账户，可以在成员账户上执行一些原本需要根用户凭证的特权任务。通过集中式根访问权限，这些任务通过短期特权会话执行。这些会话提供限于特定特权操作的临时凭证，无需根用户登录成员账户。

启动特权会话后，您可以删除配置错误的 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在控制台的导航窗格中，选择**根访问管理**。

1. 从成员账户列表中选择一个名称，然后选择**采取特权操作**。

1. 选择您想要在成员账户中执行的特权操作。
   + 选择**删除 Amazon S3 存储桶策略**，以删除一项配置错误的存储桶策略，此策略将会拒绝所有主体访问 Amazon S3 存储桶策略。

     1. 选择**浏览 S3**，从成员账户拥有的存储桶中选择一个名称，然后选择**选择**。

     1. 选择**删除存储桶策略**。

     1. 在删除配置错误的策略后，使用 Amazon S3 控制台来纠正存储桶策略。有关更多信息，请参阅《Amazon S3 用户指南》**中的[使用 Amazon S3 控制台添加存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/add-bucket-policy.html)。
   + 选择**删除 Amazon SQS 策略**，以删除 Amazon Simple Queue Service 基于资源的策略，此策略将会拒绝所有主体访问 Amazon SQS 队列。

     1. 在 **SQS 队列名称**中输入队列名称，然后选择**删除 SQS 策略**。

     1. 在删除配置错误的策略后，使用 Amazon SQS 控制台来纠正队列策略。有关更多信息，请参阅《Amazon SQS 开发人员指南》**中的 [Configuring an access policy in 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 区域中的 AWS STS](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. 使用响应中的 `SessionToken`、`AccessKeyId` 和 `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 区域中的 AWS STS](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. 使用响应中的 `SessionToken`、`AccessKeyId` 和 `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 建议您在登录 AWS 时，尽可能使用通行密钥或安全密钥，因为它们更能抵御网络钓鱼等攻击。有关更多信息，请参阅 [通行密钥和安全密钥](#passkeys-security-keys-for-root)。

多重身份验证 (MFA) 是一种用于增强安全性的简单而有效的机制。第一个因素（密码）是您记住的秘密，也称为知识因素。其他因素可以是拥有因素（您拥有的东西，例如安全密钥）或固有因素（您与生俱来的东西，例如生物识别扫描）。为增强安全性，我们强烈建议您配置多重身份验证（MFA）以帮助保护 AWS 资源。

**注意**  
所有 AWS 账户 账户类型（独立账户、管理账户和成员账户）都需要为其根用户配置 MFA。如果尚未启用 MFA，则用户必须在首次登录尝试访问 AWS 管理控制台后 35 天内注册 MFA。

您可以为 AWS 账户根用户 和 IAM 用户启用 MFA。当您为根用户启用 MFA 时，它仅影响根用户凭证。有关如何为 IAM 用户启用 MFA 的更多信息，请参阅 [IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)。

**注意**  
使用 AWS Organizations 托管的 AWS 账户可以选择[集中管理成员账户的根访问权限](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 MacBook 上的 Touch ID）来解锁凭证管理器并登录 AWS。通行密钥是通过您选择的提供商使用您的指纹、面部或设备 PIN 创建的。您还可以使用一台设备（如移动设备或硬件安全密钥）上的跨设备身份验证 (CDA) 密钥在另一台设备（如笔记本电脑）上登录。有关更多信息，请参阅[跨设备身份验证](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda) (CDA)。

您可以跨设备同步通行密钥以方便登录 AWS，从而增强可用性和可恢复性。有关启用通行密钥和安全密钥的更多信息，请参阅 [为根用户启用密钥或安全密钥（控制台）](enable-fido-mfa-for-root.md)。

FIDO 联盟维护一份与 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)。有关使用 AWS 设置虚拟 MFA 设备的说明，请参阅 [为根用户启用虚拟 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 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html)。

1. 在导航栏的右侧，选择您的账户名称，然后选择 **Security Credentials**（安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/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 设备。要为 AWS 账户 启用 MFA 设备，您必须使用根用户凭证登录 AWS。

**配置和启用虚拟 MFA 设备以用于您的根用户（控制台）**

1. 打开 [AWS 管理控制台](https://console.aws.amazon.com/)，使用根用户凭证登录。

   有关说明，请参阅《AWS 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html)。

1. 在导航栏右侧，选择您的账户名称，然后选择 **Security Credentials**（安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 在 **Multi-Factor Authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在向导中，键入**设备名称**，选择**身份验证器应用程序**，然后选择**下一步**。

   IAM 将生成并显示虚拟 MFA 设备的配置信息，包括 QR 代码图形。此图形是秘密配置密钥的表示形式，适用于不支持 QR 代码的设备上的手动输入。

1. 在设备上打开虚拟 MFA 应用程序。

   如果虚拟 MFA 应用程序支持多个虚拟 MFA 设备或账户，请选择相应的选项以创建新的虚拟 MFA 设备或账户。

1. 要配置应用程序，最简单的方法是使用应用程序扫描 QR 代码。如果您无法扫描代码，则可手动键入配置信息。IAM 生成的二维码和私有配置密钥与您的 AWS 账户 关联，不能用于其他账户。但是，如果您失去对原始 MFA 设备的访问权，可以重新使用它们为您的账户配置新的 MFA 设备。
   + 要使用 QR 代码配置虚拟 MFA 设备，请在向导中，选择 **Show QR code (显示 QR 代码)**。然后，按照应用程序说明扫描代码。例如，您可能需要选择摄像头图标或选择**扫描账户条形码**等命令，然后使用设备的摄像头扫描 QR 代码。
   + 在 **Set up device**（设置设备）向导中，选择 **Show secret key**（显示私有密钥），然后在您的 MFA 应用程序中键入私有密钥。
**重要**  
对二维码或私有配置密钥进行安全备份，或确保为您的账户启用多台 MFA 设备。您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 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 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html)。

1. 在导航栏的右侧，选择您的账户名称，然后选择 **Security Credentials**（安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 展开 **Multi-factor authentication (MFA) (多重验证)** 部分。

1. 选择 **Assign MFA device**（分配 MFA 设备）。

1. 在向导中，键入 **Device name**（设备名称），选择 **Hardware TOTP token**（硬件 TOTP 令牌），然后选择 **Next**（下一步）。

1. 在 **Serial Number (序列号)** 框中，键入在 MFA 设备背面找到的序列号。

1. 在 **MFA code 1 (MFA 代码 1)** 框中，输入 MFA 设备显示的六位数编码。您需要按设备正面的按钮来显示编码。  
![\[IAM 控制面板，MFA 设备\]](http://docs.aws.amazon.com/zh_cn/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 登录页面上的 **Forgot password?** 来重置您的密码。

要更改根用户密码，您必须以AWS 账户根用户登录，而非以 IAM 用户身份登录。要了解如何重置已经*忘记的*根用户密码，请参阅 [重置丢失或遗忘的根用户密码](reset-root-password.md)。

为保护您的密码，请务必遵循以下最佳实践：
+ 定期更改密码。
+ 妥善保管密码，因为任何知道您密码的人都可以访问您的账户。
+ 不要为 AWS 使用您在其他网站上使用的密码。
+ 不要使用容易猜到的密码。此类密码包括 `secret`、`password`、`amazon`、`123456` 等。此外还应避免使用字典中的单词、姓名、电子邮件地址或可以轻松获取的其他个人信息。

**重要**  
使用 AWS Organizations 管理的 AWS 账户可能为成员账户启用了[集中的根访问](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 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](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 个字符。
   + 必须至少包含以下字符类型中三种的组合：大写字母、小写字母、数字，以及 \$1 @ \$1 \$1 % ^ & \$1 () <> [] \$1\$1 \$1 \$1\$1-= 符号。
   + 不得与您的 AWS 账户名称或电子邮件地址相同。

1. 选择**保存更改**。

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

AWS CLI 或来自任何一种 AWS 的 API 操作均不支持此任务。您只能使用 AWS 管理控制台执行此任务。

------

# 重置丢失或遗忘的根用户密码
<a name="reset-root-password"></a>

当您首次创建 AWS 账户 时，您提供了电子邮件地址和密码。这些是您的 AWS 账户根用户凭证。如果您忘记根用户密码，可以从 AWS 管理控制台 重置密码。

使用 AWS Organizations 管理的 AWS 账户可能为成员账户启用了[集中的根访问](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 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html)。
**注意**  
 如果您已使用 *IAM 用户*凭证登录到 [AWS 管理控制台](https://console.aws.amazon.com/)，则必须注销，然后才能重置根用户密码。如果您看到特定于账户的 IAM 用户登录页面，请选择页面底部附近的**使用根账户凭证登录**。如有必要，请提供您的账户电子邮件地址并选择**下一步**来访问**根用户登录**页面。

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 SDK 使用 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 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](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 登录 User Guide》**中的 [Sign in to the AWS 管理控制台 as the root user](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-root-user-sign-in-tutorial.html)。

1. 在控制台的右上角选择您的账户名称或账号，然后选择**安全凭证**。

1. 在**访问密钥**部分中，选择要删除的访问密钥，然后在**操作**下选择**删除**。
**注意**  
您也可以**停用**访问密钥，而不是将其永久删除。这样，您将来可以继续使用它，而无需更改密钥 ID 或私有密钥。密钥处于非活动状态时，任何在 AWS API 请求中使用该密钥的尝试都会失败，并返回访问被拒绝错误。

1. 在**删除 <访问密钥 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 Organizations 的独立 AWS 账户需要根凭证才能关闭账户。借助 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 支持 请求 AWS GovCloud (US) 账户根用户访问密钥。

**Amazon EC2 任务**
+ 已在预留实例 Marketplace 中[注册为卖家](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 用户。建议您仅在联合用户不支持的[特定用例](gs-identities-iam-users.md)中使用 IAM 用户。

*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 资源名称 (ARN) 中，因此不建议在 IAM 名称中包含个人识别信息。有关 IAM 名称的要求和限制，请参阅 [IAM 名称要求](reference_iam-quotas.md#reference_iam-quotas-names)。
+ IAM 用户的 Amazon 资源名称（ARN）。当您需要跨所有 AWS 唯一标识 IAM 用户时，可以使用 ARN。例如，您可以使用 ARN 在 Amazon S3 存储桶的 IAM policy 中将 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>

您可以通过不同方式访问 AWS，具体取决于 IAM 用户凭证：
+ [**控制台密码**](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 Console Mobile Application 进行访问。
+ [**与 CodeCommit 结合使用的 SSH 密钥**](id_credentials_ssh-keys.md)：可用于向 CodeCommit 进行身份验证的采用 OpenSSH 格式的 SSH 公有密钥。
+ [**服务器证书**](id_credentials_server-certs.md)：您可用于向某些 AWS 服务进行身份验证的 SSL/TLS 证书。我们建议您使用 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）。使用 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 用户并向其授予初始凭证和权限的过程，请参阅[在 AWS 账户 中创建 IAM 用户](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 开发工具包和 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 用户时，他们应该已经向您发送了登录凭证，其中包括您的用户名和账户登录页面的 URL，内含您的账户 ID 或账户别名。

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

**提示**  
要在 Web 浏览器中为您的账户登录页面创建书签，您应在标签条目中手动键入您的账户的登录 URL。不要使用 Web 浏览器的书签功能，因为重定向会掩盖登录 URL。

您也可以在以下常规登录端点登录，然后手动键入您的账户 ID 或账户别名：

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

为方便起见，AWS 登录页面使用浏览器 Cookie 记住 IAM 用户名和账户信息。下次用户转到 AWS 管理控制台 中的任何页面时，控制台会使用 cookie 将用户重定向到账户登录页面。

您只能访问您的管理员在附加到您的 IAM 用户身份的策略中指定的 AWS 资源。要在控制台开展工作，您必须有权限执行控制台执行的操作（例如列出和创建 AWS 资源）。有关更多信息，请参阅 [适用于 AWS 资源的 Access Management](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 登录用户指南》[https://docs.aws.amazon.com/signin/latest/userguide/what-is-sign-in.html](https://docs.aws.amazon.com/signin/latest/userguide/what-is-sign-in.html)本指南可帮助您了解不同类型的用户登录 Amazon Web Services（AWS）的不同方式。
+ 在 AWS 管理控制台中的单个 Web 浏览器中，您最多可以同时登录五个不同的身份。有关详细信息，请参阅《AWS 管理控制台入门指南》**中的[登录多个账户](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。

**重要**  
如果您通过 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 调用并使用访问密钥和私有密钥凭证直接访问 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)。

有关支持 AWS 所支持的 WebAuthn 和 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)。

# 在 AWS 账户 中创建 IAM 用户
<a name="id_users_create"></a>

**重要**  
 IAM [最佳实践](best-practices.md)建议您您要求人类用户使用与身份提供商的联合身份验证才能使用临时凭证访问 AWS，而不是使用具有长期凭证的 IAM 用户。我们建议您仅在联合用户不支持的[特定用例](gs-identities-iam-users.md)中使用 IAM 用户。

创建 IAM 用户并使该用户能够执行任务的过程包含以下步骤：

1. [在 AWS 管理控制台、AWS CLI、Tools for Windows PowerShell 中或使用 AWS API 操作创建用户](getting-started-workloads.md)。如果您在 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. 在导航窗格中，选择 **Users**（用户）。

控制台会显示 AWS 账户 中的 IAM 用户。

------
#### [ 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. 选择用户组的名称。

**Users**（用户）选项卡上列出了属于该群组的 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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择 IAM 用户的名称。

1. 选择 **Groups**（群组）选项卡，以显示包含当前用户的群组的列表。

------
#### [ 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 Identity Service 的用户，或任何使用通过身份源提供的凭证来访问 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 中创建用户和组的信息。

亚马逊云科技提供多种工具来管理 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 policy 的更多信息，请参阅 [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)建议您从 AWS 账户 中移除未使用的 IAM 用户。如果您想保留 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 用户的任何托管策略，但不会删除托管策略。
+ 任何关联的 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. 在确认对话框的文本输入字段中输入用户名，以确认移除用户。选择 **Delete**（移除）。

控制台显示状态消息，通知 IAM 用户已被移除。

------

## 移除 IAM 用户 (AWS CLI)
<a name="id_users_deleting_cli"></a>

与 AWS 管理控制台 不同，在使用 AWS CLI 移除 IAM 用户时，您必须手动删除附加到该 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>

具有权限的 IAM 用户通过 AWS 管理控制台 登录到 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)。  
您可以通过删除 IAM 用户的密码来阻止其访问 AWS 管理控制台。这样可以阻止他们使用其登录凭证登录 AWS 管理控制台。这不会更改他们的权限，也不会阻止他们使用担任的角色访问控制台。如果该用户具有有效的访问密钥，它们将继续起作用并允许通过 AWS CLI、Tools for Windows PowerShell、AWS API，或 AWS Console Mobile Application 进行访问。

**您的 AWS 资源（例如 Amazon EC2 实例、Amazon S3 存储桶等）**  
即使您的 IAM 用户持有密码，也仍需拥有访问您的 AWS 资源的权限。当您创建 IAM 用户时，该用户默认没有任何权限。若要为 IAM 用户授予所需的权限，您需要为其附加策略。如果您有许多使用相同资源来执行相同任务的 IAM 用户，则可将这些 IAM 用户分配至一个组。然后将权限分配给该组。有关创建 IAM 用户和组的信息，请参阅 [IAM 身份](id.md)。有关使用策略来设置许可的信息，请参阅 [适用于 AWS 资源的 Access Management](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 policy 控制访问不受接口限制。例如，您可以为用户提供密码以访问 AWS 管理控制台。该用户（或该用户所属的任何组）的策略将控制用户可在 AWS 管理控制台 中执行的操作。或者，您可以为用户提供 AWS 访问密钥以对 AWS 进行 API 调用。这些策略将控制用户可以通过使用这些访问密钥进行身份验证的数据库或客户端可以调用哪些操作。

# 更改 IAM 用户的权限
<a name="id_users_change-permissions"></a>

您可以更改您 AWS 账户 中的 IAM 用户的权限，方法是更改用户的组成员资格、复制现有用户的权限、直接为用户附加策略或设置[权限边界](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 policy。IAM 访问分析器会查看您的 AWS CloudTrail 日志并生成一个策略模板，其中包含实体在指定日期范围内使用的权限。您可以使用模板创建具有精细权限的托管策略，然后将其附加到 IAM 实体。这样，您仅需授予用户或角色与特定使用案例中的 AWS 资源进行交互所需的权限。要了解更多信息，请参阅 [IAM Acess 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 用户添加到组来添加权限
<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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择 IAM 用户的名称。

1. 选择 **Groups**（群组）选项卡，以显示包含当前用户的群组的列表。

1. 选择 **Add user to groups**（将用户添加到群组）。

1. 选中您希望用户加入的每个组对应的复选框。列表显示了每个组的名称以及用户在成为该组成员后获得的策略。

1. （可选）您可以选择 **Create group**（创建群组）来定义新的群组。如果您想将用户添加到与现有群组具有不同附加策略的群组中，这将非常有用：

   1. 在新选项卡中，对于 **User group name**（用户组名），键入您的新组名称。
**注意**  
AWS 账户中 IAM 资源的数量和大小是有限的。有关更多信息，请参阅 [IAM 和 AWS STS 配额](reference_iam-quotas.md)。组名称可以是最多由 128 个字母、数字和以下字符构成的组合：加号 (\$1)、等号 (=)、逗号 (,)、句点 (.)、at 符号 (@) 和连字符 (-)。账户中的名称必须唯一。名称不区分大小写。例如，您不能创建名为 *TESTGROUP* 和 *testgroup* 的两个组。

   1. 选中您要附加到组的托管式策略对应的一个或多个复选框。您还可以通过选择 **Create policy** 来创建新的托管策略。如果您这样做，请在创建新的策略之后返回到此浏览器选项卡或窗口；选择 **Refresh**，然后选择新策略以将其附加到您的组。有关更多信息，请参阅 [使用客户管理型策略定义自定义 IAM 权限](access_policies_create.md)。

   1. 选择**创建用户组**。

   1. 返回到原始选项卡，刷新您的组列表。然后选中您的新组对应的复选框。

1. 选择 **Add user to group(s)**（将用户添加到群组）。

控制台会显示一条状态消息，通知您用户已添加到您指定的群组中。

------

### 要通过从其他 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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择 IAM 用户的名称。

1. 在 **Permissions**（权限）选项卡中，选择 **Add permissions**（添加权限）。

1. 在 **Add permissions**（添加权限）页面上，选择 **Copy permissions**（复制权限）。列表显示了可用 IAM 用户以及其组成员资格和附加的策略。

1. 选择您想要复制其权限的用户旁边的单选按钮。

1. 选择 **Next**（下一步），以查看要对用户所做的更改列表。然后选择 **Add permissions**（添加权限）。

控制台会显示一条状态消息，通知您权限已从您指定的 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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择 IAM 用户的名称。

1. 在 **Permissions**（权限）选项卡中，选择 **Add permissions**（添加权限）。

1. 在 **Add permissions**（添加权限）页面上，选择 **Attach policies directly**（直接附加策略）。**Permissions policies**（权限策略）列表显示可用策略及其策略类型和附加实体。

1. 选择要附加的 **Policy name**（策略名称）旁边的单选按钮。

1. 选择 **Next**（下一步），以查看要对用户所做的更改列表。然后选择 **Add permissions**（添加权限）。

控制台会显示一条状态消息，通知您已将策略添加到指定的 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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择要更改其权限边界的 IAM 用户的名称。

1. 选择 **Permissions**（权限）选项卡。如有必要，打开 **Permissions boundary** （权限边界）部分，然后选择 **Set permissions boundary**（设置权限边界）。

1. 在 **Set permissions boundary**（设置权限边界）页面中的 **Permissions policies**（权限策略）下，选择您要用于权限边界的策略。

1. 选择 **Set boundary**（设置边界）。

控制台会显示一条状态消息，通知您权限边界已添加。

------

## 更改用户的权限（控制台）
<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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择要更改其权限边界的 IAM 用户的名称。

1. 选择 **Permissions**（权限）选项卡。如有必要，打开 **Permissions boundary**（权限边界）部分。

1. 请选择要编辑的策略的名称以查看有关该策略的详细信息。选择 **Entities attached**（附加的实体）选项卡，查看编辑策略后可能受影响的其他实体（IAM 用户、组和角色）。

1. 选择 **Permissions**（权限）选项卡并查看策略授予的权限。要更改权限，请选择 **Edit**（编辑）。

1. 编辑该策略并解决任何[策略验证](access_policies_policy-validator.md)建议。有关更多信息，请参阅 [编辑 IAM 策略](access_policies_manage-edit.md)。

1. 选择 **Next**（下一步），查看策略摘要，然后选择 **Save changes**（保存更改）。

控制台会显示一条状态消息，通知您策略已更新。

------

### 要为用户更改权限边界
<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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择要更改其权限边界的 IAM 用户的名称。

1. 选择 **Permissions**（权限）选项卡。如有必要，打开 **Permissions boundary**（权限边界）部分，然后选择 **Change boundary**（更改边界）。

1. 选择要用于权限边界的策略。

1. 选择 **Set boundary**（设置边界）。

控制台会显示一条状态消息，通知您权限边界已更改。

------

## 要从用户删除权限策略（控制台）
<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. 在导航窗格中，选择 **Users**（用户）。

1. 选择要删除其权限策略的用户的名称。

1. 选择**权限**选项卡。

1. 如果要通过移除现有策略来撤消权限，请查看 **Attached via**（附加方式）来了解用户如何获取该策略，然后再选择 **Remove**（删除）以删除策略：
   + 如果该策略因组成员资格而适用，则选择 **Remove**（删除），从组中删除该用户。请记住，可向单个组中附加多个策略。如果您从组中删除某个用户，该用户将失去对其通过组成员资格接收的*所有*策略的访问权限。
   + 如果该策略是直接附加到该用户的托管策略，则选择 **Remove**（删除），从该用户中分离该策略。这不会影响该策略本身或该策略可能附加到的任何其他实体。
   + 如果该策略是内联嵌入式策略，则选择 **Remove**（删除），从 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. 在导航窗格中，选择 **Users**（用户）。

1. 在 **Users**（用户）列表中，选择要删除其权限边界的 IAM 用户的名称。

1. 选择**权限**选项卡。如有必要，打开 **Permissions boundary**（权限边界）部分。

1.  选择 **Change boundary**（更改边界）。要确认要删除权限边界，请在确认对话框中选择 **Remove 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 管理控制台。利用 AWS CLI、Tools for Windows PowerShell、AWS SDK 或 API，用户无需密码即可以编程方式访问 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 用户，其密码将过期。这些用户必须在下次登录时更改其密码。

在尝试指定的登录失败次数后，您将无法创建“锁定策略”来锁定账户用户。为了增强安全性，我们建议您将强密码策略与 Multi-Factor Authentication (MFA) 相结合。有关 MFA 的更多信息，请参阅 [IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)。

## 设置密码策略时所需的权限
<a name="default-policy-permissions-required"></a>

您必须配置权限以允许 IAM 实体（用户或角色）查看或编辑其账户密码策略。您可以在 IAM policy 中包含以下密码策略操作：
+ `iam:GetAccountPasswordPolicy` - 允许实体查看其账户的密码策略
+ `iam:DeleteAccountPasswordPolicy` - 允许实体删除其账户的自定义密码策略并恢复到默认密码策略
+ `iam:UpdateAccountPasswordPolicy` - 允许实体为其账户创建或更改自定义密码策略

以下策略允许查看和编辑账户密码策略的完全访问权限。要了解如何使用该示例 JSON 策略文档创建 IAM policy，请参阅。[使用 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 个字符
+ 至少包含以下三种字符类型的组合：大写、小写、数字，以及非字母数字字符（`! @ # $ % ^ & * ( ) _ + - = [ ] { } | '`）
+ 与您的 AWS 账户 名称或电子邮件地址不同
+ 密码永不过期

## 自定义密码策略选项
<a name="password-policy-details"></a>

为账户配置自定义密码策略时，可以指定以下条件：
+ **密码最小长度** - 您可以指定最少 6 个字符和最多 128 个字符。
+ **密码强度** - 您可以选中以下任一复选框来定义 IAM 用户密码的强度：
  + 至少需要一个大写拉丁字母（A-Z）
  + 至少需要一个小写拉丁字母（a-z）
  + 至少需要一个数字
  + 至少需要一个非字母数字字符 `! @ # $ % ^ & * ( ) _ + - = [ ] { } | '` 
+ **Turn on password expiration**（打开密码过期）– 您可以选择并指定 IAM 用户密码设置后的有效期：至少 1 天和最多 1095 天。例如，如果您指定的过期时间为 90 天，则会立即影响所有用户。对于密码超过 90 天的用户，更改后登录控制台时，必须设置新密码。密码为 75-89 天的用户会收到有关密码过期的 AWS 管理控制台 警告。IAM 用户可以随时更改其密码（如有权限）。密码的有效期从用户设置新密码时起计算。IAM 用户同时只能有一个有效密码。
+ **Password expiration requires administrator reset**（密码过期需要管理员重置）– 选择此选项可防止 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)。
+ **Prevent password reuse**（防止密码重复使用）- 您可以阻止 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. 在导航窗格中，选择 **Account settings**（账户设置）。

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. 在导航窗格中，选择 **Account settings**（账户设置）。

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. 在导航窗格中，选择 **Account settings**（账户设置）。

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 用户的密码。

向用户分配密码后，该用户可使用您的账户的登录 URL 登录 AWS 管理控制台，如下所示：

```
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. 选择 **Security credentials**（安全凭证）选项卡，然后在 **Console sign-in**（控制台登录）下选择 **Enable console access**（启用控制台访问权限）。

1. 在 **Enable console access**（启用控制台访问权限）对话框中，选择 **Reset password**（重置密码），然后选择是让 IAM 生成密码还是创建自定义密码：
   + 要让 IAM 生成密码，请选择 **Autogenerated password**（自动生成的密码）。
   + 要创建自定义密码，请选择 **Custom password**（自定义密码），然后键入密码。
**注意**  
您创建的密码必须符合账户的[密码策略](id_credentials_passwords_account-policy.md)。

1. 若要求用户在登录时创建新密码，请选择 **Require password change at the next sign-in**（必须在下次登录时更改密码）。

1. 若要求用户立即使用新密码，请选择 **Revoke active console sessions**（撤消活动控制台会话）。这会向 IAM 用户附加一个内联策略，如果用户的凭证超过了策略指定的时间，则该策略就会拒绝用户访问资源。

1. 选择 **Reset password**（重置密码）。

1. **Console password**（控制台密码）对话框通知您已启用用户的新密码。要查看密码以便与用户共享它，请在 **Console password**（控制台密码）对话框中选择 **Show**（显示）。选择 **Download .csv file**（下载 .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. 选择 **Security credentials**（安全凭证）选项卡，然后在 **Console sign-in**（控制台登录）下选择 **Manage console access**（管理控制台访问权限）。

1. 在 **Manage console access**（管理控制台访问权限）对话框中，选择 **Reset password**（重置密码），然后选择是让 IAM 生成密码还是创建自定义密码：
   + 要让 IAM 生成密码，请选择 **Autogenerated password**（自动生成的密码）。
   + 要创建自定义密码，请选择 **Custom password**（自定义密码），然后键入密码。
**注意**  
您创建的密码必须符合账户的[密码策略](id_credentials_passwords_account-policy.md)。

1. 若要求用户在登录时创建新密码，请选择 **Require password change at the next sign-in**（必须在下次登录时更改密码）。

1. 若要求用户立即使用新密码，请选择 **Revoke active console sessions**（撤消活动控制台会话）。这会向 IAM 用户附加一个内联策略，如果用户的凭证超过了策略指定的时间，则该策略就会拒绝用户访问资源。

1. 选择 **Reset password**（重置密码）。

1. **Console password**（控制台密码）对话框通知您已启用用户的新密码。要查看密码以便与用户共享它，请在 **Console password**（控制台密码）对话框中选择 **Show**（显示）。选择 **Download .csv file**（下载 .csv 文件），下载包含用户凭证的文件。
**重要**  
出于安全原因，在完成该步骤后您无法访问该密码，但您可以随时创建新密码。

控制台会显示一条状态消息，通知您控制台访问权限已更新。

------

### 要删除（禁用）IAM 用户的密码（控制台）
<a name="id_credentials_passwords_admin-change-user-section-3"></a>

使用此步骤删除与用户名关联的密码，从而取消用户的控制台访问权限。

**重要**  
您可以通过删除 IAM 用户的密码来阻止其访问 AWS 管理控制台。这样可以阻止他们使用其登录凭证登录 AWS 管理控制台。这不会更改他们的权限，也不会阻止他们使用担任的角色访问控制台。如果该用户具有有效的访问密钥，它们将继续起作用并允许通过 AWS CLI、Tools for Windows PowerShell、AWS API，或 AWS Console Mobile Application 进行访问。

------
#### [ 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. 若要求用户立即停止使用控制台，请选择 **Revoke active console sessions**（撤消活动控制台会话）。这会向 IAM 用户附加一个内联策略，如果用户的凭证超过了策略指定的时间，则该策略就会拒绝用户访问资源。

1. 然后选择 **Disable access**（禁用访问）。

控制台会显示一条状态消息，通知您控制台访问已禁用。

------

### 创建、更改或删除 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 policy 仅向某些用户授予权限。这种方法允许这些用户更改自己的密码和可选的其他凭证，例如他们自己的访问密钥。

**重要**  
我们建议您[设置自定义密码策略](id_credentials_passwords_account-policy.md)，要求 IAM 用户创建强密码。

## 允许所有 IAM 用户更改自己的密码
<a name="proc_letalluserschangepassword"></a>

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

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，单击 **Account settings**（账户设置）。

1. 在 **Password policy**（密码策略）部分中，确保未选择 **Allow users to change their own password**（允许用户更改其密码）。如果已选中此复选框，则所有用户均可更改其密码。（请参阅上一个过程。） 

1. 创建允许更改其密码的用户（如果之前没有这样的用户）。有关更多信息，请参阅 [在 AWS 账户 中创建 IAM 用户](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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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 开发工具包）。有关更多信息，请参阅 [使用 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>

创建访问密钥后：
+ 使用 AWS CloudTrail 监控访问密钥的使用情况，并检测任何未经授权的访问尝试。有关更多信息，请参阅 [使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用](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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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"
           }
         }
       }
     ]
   }
   ```

------

   此策略示例拒绝使用应用该策略的 IAM 用户访问密钥，除非请求来自（以 CIDR 表示法指定的）网络“203.0.113.0/24”、“2001:DB8:1234:5678::/64”或特定 IP 地址“203.0.114.1” 

1. 选择**下一步**，进入**查看并创建**页面。在**策略**详细信息的**策略名称**下，输入策略的名称，然后选择**创建策略**。

创建策略后，策略将显示在用户的**权限**选项卡上。

您还可以将该策略作为服务控制策略 (SCP) 应用于 AWS Organizations 中的多个 AWS 账户，我们建议使用附加条件 `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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择用户名称转到用户详细信息页面。

1. 在 ‭**‬Security credentials‭**‬（安全凭证）选项卡的 **Access keys**（访问密钥）部分中，选择‭ **Create access key**‬（创建访问密钥）。

   如果按钮已停用，则必须先删除现有密钥中的一个，然后才能创建新密钥。

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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择用户名称转到用户详细信息页面。

1. 在 **Security credentials**（安全凭证）选项卡的 **Access keys**（访问密钥）部分，选择 **Actions**（操作）下拉菜单，然后选择 **Deactivate**（停用）。

1. 在 **Deactivate**（停用）对话框中，选择 **Deactivate**（停用），确认要停用访问密钥。

停用访问密钥后，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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择用户名称转到用户详细信息页面。

1. 在 **Security credentials**（安全凭证）选项卡的 **Access keys**（访问密钥）部分，选择 **Actions**（操作）下拉菜单，然后选择 **Activate**（激活）。

激活访问密钥后，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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择用户名称转到用户详细信息页面。

1. 在 **Security credentials**（安全凭证）选项卡的 **Access keys**（访问密钥）部分，选择非活动访问密钥的 **Actions**（操作）下拉菜单，然后选择 **Delete**（删除）。

1. 在 **Delete**（删除）对话框中，通过在文本输入字段中输入访问密钥 ID，然后选择 **Delete**（删除），确认要删除访问密钥。

访问密钥删除后，将无法恢复。

------
#### [ 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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择用户名称转到用户详细信息页面。

1. 在 **Security credentials**（安全凭证）选项卡中的 **Access keys**（访问密钥）部分列出了用户的访问密钥。

每个 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://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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择用户名称转到用户详细信息页面。

1. 如有必要，可通过完成以下步骤来将 **Access key ID** 列添加到用户表中：

   1. 在表格最右侧上方，选择 **Preferences**（首选项）图标 (![\[Preferences icon\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在 **Preferences**（首选项）对话框的 **Select visible columns**（选择可见列）下，打开 **Access key ID**（访问密钥 ID）。

   1. 选择**确认**，返回到用户列表。更新列表以包含访问密钥 ID。

1. **Access key ID**（访问密钥 ID）列显示每个访问密钥的状态，后跟其 ID；例如，**`Active - AKIAIOSFODNN7EXAMPLE`** 或 **`Inactive - AKIAI44QH8DHBEXAMPLE`**。

   您可以利用该信息查看和复制具有一个或两个访问密钥的用户的访问密钥 ID。对于没有访问密钥的用户，该列显示 **`-`**。
**注意**  
秘密访问密钥只能在创建密钥时检索到。

每个 IAM 用户最多可以拥有两个访问密钥。

------

## 要使用访问密钥 ID 查找用户
<a name="admin-find-user-access-keys"></a>

您可以使用访问密钥 ID 来查找您 AWS 账户 中的用户。

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

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格的搜索框中，输入**访问密钥 ID**，例如 AKIAI44QH8DHBEXAMPLE。

1. 与访问密钥 ID 关联的 IAM 用户将显示在导航窗格中。选择用户名称转到用户详细信息页面。

------

## 要查找访问密钥 ID 的最新使用情况
<a name="admin-find-most-recent-use-access-keys"></a>

访问密钥的最新使用情况会显示在用户详情页面中 IAM 用户页面的用户列表中，并且是凭证报告的一部分。

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

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在用户列表中，参阅 **Access key last used**（上次使用的访问密钥）列。

   如果未显示该列，请选择 **Preferences**（首选项）图标 (![\[Preferences icon\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/console-settings-icon.console.png))，然后在 **Select visible columns** （选择可见列）下打开 **Access key last used**（上次使用的访问密钥），以显示列。

1. （可选）在导航窗格的 **Access reports**（访问报告）下，选择 **Credential report**（凭证报告）以下载一份报告，其中包含您账户中所有 IAM 用户的访问密钥的上次使用信息。

1. (可选）选择 IAM 用户以查看用户详细信息。**Summary**（摘要）部分包括访问密钥 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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 在导航窗格中，选择**用户**。

   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**（完成）。

      为用户创建访问密钥时，默认情况下，密钥对处于活动状态，并且您可以立即使用此密钥对。此时，用户拥有两个访问密钥。

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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 在导航窗格中，选择**用户**。

   1. 选择预期用户的名称，然后选择**安全凭证**选项卡。

   1. 在要删除的访问密钥的 **Access keys**（访问密钥）部分中，选择 **Actions**（操作），然后选择 **Delete**（删除）。按照对话框中的说明先 **Deactivate**（停用），然后确认删除。

**确定需要更新或删除的访问密钥（控制台）**

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 如有必要，可通过完成以下步骤来将 **Access key age** 列添加到用户表中：

   1. 在最右侧的表上方，选择设置图标 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_cn/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 用户指南》中的 [Getting started](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 角色和临时安全凭证：
+ **您在 Amazon EC2 实例上运行一个应用程序或 AWS CLI 脚本。**请勿直接在应用程序中使用访问密钥。请勿采取以下做法：将访问密钥传递给应用程序、将访问密钥嵌入到应用程序中、让应用程序从任何源读取密钥。相反，请定义一个对您的应用程序具有适当权限的 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 软件开发工具包和 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 凭证文件。**AWS 开发工具包和 AWS CLI 自动使用您存储在 AWS 凭证文件中的凭证。

    有关使用 AWS 证书文件的信息，请参阅软件开发工具包文档。示例包括：*适用于 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 Store。有关更多信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的[使用 SDK 存储](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 policy，可以指定用户可调用哪些 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 Console Mobile Application](https://aws.amazon.com/console/mobile/)。

您可以使用控制台密码或访问密钥登录移动应用程序。作为最佳实践，不建议使用根用户访问密钥。相反，除在移动设备上使用密码或生物识别锁外，我们强烈建议您还应使用移动应用程序创建一个专门的 IAM 用户来管理 AWS 资源。如果您的移动设备丢失了，您可以删除 IAM 用户的访问权限。

**使用访问密钥登录（移动应用程序）**

1. 在移动设备上打开该应用程序。

1. 如果这是您第一次向设备添加身份，请选择 **Add an identity (添加身份)**，然后选择 **Access keys (访问密钥)**。

   如果您已使用其他身份登录，请选择菜单图标并选择 **Switch identity (切换身份)**。然后选择 **Sign in as a different identity (以其他身份登录)**，然后选择 **Access keys (访问密钥)**。

1. 在 **Access keys (访问密钥)** 页面上输入您的信息。
   + **Access key ID (访问密钥 ID)** – 输入您的访问密钥 ID。
   + **Secret access key (秘密访问密钥)** – 输入您的秘密访问密钥。
   + **Identity name (身份名称)** – 输入将在移动应用程序中显示的身份名称。此名称不需要与您的 IAM 用户名一致。
   + **Identity PIN (身份 PIN)** – 创建将来在登录时使用的个人身份识别码（PIN）。
**注意**  
如果您为 AWS 移动应用程序启用了生物识别技术，系统将提示您使用指纹或面部识别（而非 PIN）进行验证。如果生物识别失败，系统可能会提示您输入 PIN。

1. 选择 **Verify and add keys (验证并添加密钥)**。

   现在，您就可以使用移动应用程序访问一组选定的资源。

## 相关信息
<a name="more-resources"></a>

以下主题提供了有关设置 AWS SDK 和 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（AWS SDK for Python）文档中的[配置](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 管理控制台，而不仅限于 AWS CLI。可以通过 AWS STS [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetFederationToken.html) API 调用来实现这一目的。只需使用 `GetFederationToken` 提供的临时凭证和令牌构建一个控制台 URL，即可让 IAM 主体访问控制台。有关更多信息，请参阅 [使自定义身份凭证代理程序能够访问 AWS 控制台](id_roles_providers_enable-console-custom-url.md)。

应注意，在启用 MFA 的情况下使用 IAM 或根用户凭证直接登录控制台时，将必须使用 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` 开头的访问密钥 ID 是 IAM 用户或 AWS 账户根用户 的长期凭证。以 `ASIA` 开头的访问密钥 ID 是使用 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)。

该操作不指示访问密钥的状态。密钥可能处于活动状态、非活动状态或已删除状态 非活动密钥可能没有执行操作的权限。提供删除的访问密钥可能会返回“密钥不存在”错误。

# IAM 中的 AWS 多重身份验证
<a name="id_credentials_mfa"></a>

为增强安全性，我们建议您配置 Multi-Factor Authentication (MFA) 以帮助保护 AWS 资源。您可以为所有 AWS 账户 的 AWS 账户根用户（包括独立账户、管理账户和成员账户）以及您的 IAM 用户启用 MFA。我们建议您尽可能使用防网络钓鱼的 MFA，例如通行密钥和安全密钥。这些基于 Fido 的身份验证器使用公钥加密技术，可抵御网络钓鱼、中间人和重放攻击，比基于 TOTP 的选项具有更强的安全级别。

对于根用户的所有账户类型，均强制实施 MFA。有关更多信息，请参阅 [保护您的 AWS Organizations 账户的根用户凭证](root-user-best-practices.md#ru-bp-organizations)。

当您为根用户启用 MFA 时，这只会影响根用户凭证。账户中的 IAM 用户是具有自己的凭证的不同身份，并且每个身份具有自己的 MFA 配置。有关使用 MFA 保护根用户的更多信息，请参阅 [AWS 账户根用户 的多重身份验证](enable-mfa-for-root.md)。

您的 AWS 账户根用户 和 IAM 用户最多可以注册 8 台任何类型的 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 MacBook 上的 Touch ID）来解锁凭证管理器并登录 AWS。通行密钥是通过您选择的提供商使用您的指纹、面部或设备 PIN 创建的。您还可以使用一台设备（如移动设备或硬件安全密钥）上的跨设备身份验证 (CDA) 密钥在另一台设备（如笔记本电脑）上登录。有关更多信息，请参阅[跨设备身份验证](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda) (CDA)。

您可以跨设备同步通行密钥以方便登录 AWS，从而增强可用性和可恢复性。有关启用通行密钥和安全密钥的更多信息，请参阅 [为根用户启用密钥或安全密钥（控制台）](enable-fido-mfa-for-root.md)。

FIDO 联盟维护一份与 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 设备的说明，请参阅 [在 AWS 管理控制台 中分配虚拟 MFA 设备](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) call 调用。
要停用虚拟 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 令牌的说明，请参阅 [在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)。

**注意**  
**基于 SMS 短信的 MFA** – AWS 已终止对短信多重身份验证（MFA）的支持。我们建议拥有使用基于短信的 MFA 的 IAM 用户的客户切换到以下替代方法之一：[密码或安全密钥](id_credentials_mfa_enable_fido.md)、[虚拟（基于软件）MFA 设备](id_credentials_mfa_enable_virtual.md)或[硬件 MFA 设备](id_credentials_mfa_enable_physical.md)。您可以确定账户中拥有已分配短信 MFA 设备的用户。在 IAM 控制台中，从导航窗格中选择**用户**，然后在表的 **MFA** 列中查找具有 **SMS** 的用户。

## MFA 建议
<a name="id_credentials_mfa-recommendations"></a>

为了帮助保护您的 AWS 身份，请遵循以下 MFA 身份验证建议。
+ 我们建议您使用防网络钓鱼的 MFA（例如通行密钥和安全密钥 ）作为 MFA 设备。这些基于 Fido 的身份验证器可针对网络钓鱼等攻击提供最强大的保护。
+ 我们建议您在您的 AWS 账户 中为 AWS 账户根用户 和 IAM 用户启用多台 MFA 设备。这可以使您提高 AWS 账户 中的安全门槛，简化对高权限用户（例如 AWS 账户根用户）的访问管理。
+ 您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。注册多台 MFA 设备后，只需一台 MFA 设备即可以该用户的身份登录 AWS 管理控制台 或通过 AWS CLI 创建会话。IAM 用户必须使用现有的 MFA 设备进行身份验证，然后才能启用或禁用其他 MFA 设备。
+ 如果 MFA 设备丢失、被盗或无法访问，您可以使用剩余 MFA 设备中的一台访问 AWS 账户，而无需执行 AWS 账户 恢复程序。如果 MFA 设备遗失或被盗，应将解除该设备与所关联 IAM 主体的关联。
+ 通过使用多个 MFA，在地理位置上分散或进行远程办公的员工可以使用基于硬件的 MFA 访问 AWS，同时无需在员工之间协调单个硬件设备的实物交换。
+ 通过为 IAM 主体使用额外的 MFA 设备，您使用一个或多个 MFA 来满足日常需要，同时在安全的物理位置（例如保管库或保险柜）保存物理 MFA 设备，以满足备份和冗余的需要。

**备注**  
您无法将安全密钥或通行密钥的 MFA 信息传递给 AWS STS API 操作来请求临时凭证。使用安全密钥或通行密钥时，您可通过运行 `aws login` 命令获取与 AWS CLI 和 AWS SDK 配合使用的凭证。
您无法使用 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 集成应用以及 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 等第一方凭证管理器以及第三方凭证管理器（例如1 Password、Dashlane 和 Bitwarden）作为第二个因素。还可以使用设备上的生物识别技术（如 TouchID、FaceID）来解锁选择的凭证管理器以使用密钥。

或者，设备绑定密钥绑定到 FIDO 安全密钥，您可以其插入计算机的 USB 端口，然后在出现提示时点击以安全地完成登录过程。如果您已将 FIDO 安全密钥用于其他服务，它将有一个 [AWS 支持的配置](id_credentials_mfa_fido_supported_configurations.md)（例如，来自 Yubico 的 YubiKey 5 Series），您也可以将其用于 AWS。否则，如果要在 AWS 中使用面向 MFA 的 WebAuthn，您需要购买 FIDO 安全密钥。此外，FIDO 安全密钥可以在同一台设备上支持多个 IAM 用户后根用户，从而增强在保护账户安全方面的实用性。有关这两种设备类型的规格和购买信息，请参阅[多重身份验证](https://aws.amazon.com/iam/details/mfa/)。

您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 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>

您只能从 AWS 管理控制台 为您自己的 IAM 用户启用密钥或安全密钥，而不能从 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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台 安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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 的密钥或安全密钥。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

## 为其他 IAM 用户启用密钥或安全密钥（控制台）
<a name="enable-fido-mfa-for-iam-user"></a>

您只能从 AWS 管理控制台 为其他 IAM 用户启用密钥或安全密钥，而不能从 AWS CLI 或 AWS API 启用。

**为其他 IAM 用户启用密钥或安全密钥（控制台）**

1. 登录 AWS 管理控制台，单击 [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 的密钥或安全密钥。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

## 替换密钥或安全密钥
<a name="replace-fido-mfa"></a>

您一次最多可以向 AWS 账户根用户 和 IAM 用户分配 8 台 [ 当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。如果用户丢失 FIDO 身份验证器或者出于某种原因需要进行替换，必须先停用旧的 FIDO 身份验证器。然后，您可以为用户添加新 MFA 设备。
+ 要停用当前与 IAM 用户关联的设备，请参阅 [停用 MFA 设备](id_credentials_mfa_disable.md)。
+ 要为 IAM 用户添加新的 FIDO 安全密钥，请参阅 [为您自己的 IAM 用户启用密钥或安全密钥（控制台）](#enable-fido-mfa-for-own-iam-user)。

如果无权访问新的密钥或安全密钥，则可以启用新的虚拟 MFA 设备或硬件 TOTP 令牌。有关说明，请参阅以下章节之一：
+ [在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md) 
+ [在 AWS 管理控制台 中分配硬件 TOTP 令牌](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 的扩展，基于公有密钥加密提供同样高级别的安全性。FIDO2 由 W3C Web 身份验证规范（WebAuthn API）和 FIDO 联盟客户端到身份验证器协议（CTAP，一种应用程序层协议）组成。CTAP 支持客户端或平台（如浏览器或操作系统）与外部身份验证器之间进行通信。当您在 AWS 中启用经 FIDO 认证的身份验证器时，安全密钥会创建仅适用于 AWS 的新密钥对。首先，输入您的凭证。出现提示时，点击安全密钥，这会响应 AWS 发出的身份验证质询。要了解有关 FIDO2 标准的更多信息，请参阅 [FIDO2 项目](https://en.wikipedia.org/wiki/FIDO2_Project)。

## AWS 支持的 FIDO2 设备
<a name="id_credentials_mfa_fido_supported_devices"></a>

IAM 支持 FIDO2 安全设备，这些设备可通过 USB、Bluetooth或 NFC 连接到您的设备。IAM 还支持 TouchID 或 FaceID 等平台身份验证器。IAM 不支持 Windows Hello 的本地密钥注册。若要创建和使用密钥，Windows 用户应使用[跨设备身份验证](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda)，即使用来自一台设备（例如移动设备）的密钥或硬件安全密钥在另一台设备（如笔记本电脑）上登录。

**注意**  
AWS 需要访问您的计算机上的物理 USB 端口以验证您的 FIDO2 设备。安全密钥不支持虚拟机、远程连接或浏览器的无痕模式。

FIDO 联盟维护一份与 FIDO 规范兼容的所有 [FIDO2 产品](https://fidoalliance.org/certification/fido-certified-products/)的列表。

## 支持 FIDO2 的浏览器
<a name="id_credentials_mfa_fido_browsers"></a>

FIDO2 安全设备能否在 Web 浏览器中运行，取决于具体的浏览器和操作系统组合。以下浏览器当前支持使用安全密钥：


****  

| 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 上使用通行密钥登录。

要详细了解支持 FIDO2 认证设备（如 YubiKey）的浏览器，请参阅 [Operating system and web browser support for FIDO2 and U2F](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 policy 中指定特定身份验证器的注册。有关更多信息，请参阅下面的策略。

### 设备认证策略示例
<a name="id_credentials_mfa_fido_certifications_policies"></a>

以下用例显示允许您为 MFA 设备注册 FIPS 认证的示例策略。

**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)。

# 在 AWS 管理控制台 中分配虚拟 MFA 设备
<a name="id_credentials_mfa_enable_virtual"></a>

**重要**  
AWS 建议您在登录 AWS 时，尽可能使用通行密钥或安全密钥作为 MFA。有关更多信息，请参阅 [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md)。

您可以将手机或其他设备作为虚拟多重身份验证（MFA）设备。为此，请安装符合 [RFC 6238](https://datatracker.ietf.org/doc/html/rfc6238) 的移动应用程序，这是一种基于标准的 TOTP（基于时间的一次性密码）算法。这些应用程序生成六位数的身份验证代码。由于身份验证器可以在不安全的移动设备上运行，而且代码有可能与未经授权的各方共享，因此基于 TOTP 的 MFA 无法提供与 [FIDO2](https://en.wikipedia.org/wiki/FIDO_Alliance#FIDO2) 安全密钥和通行密钥等防网络钓鱼选项相同的安全级别。我们建议您使用通行密钥或安全密钥进行 MFA，以最有效地防范网络钓鱼等攻击。

如果您还不能使用通行密钥或安全密钥，我们建议您在等待硬件购买批准或等待硬件到达时，使用虚拟 MFA 设备作为临时措施。

大多数虚拟 MFA 应用程序支持创建多个虚拟设备，从而允许您在多个 AWS 账户 或用户中使用相同的应用程序。您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台 [MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。只需一台 MFA 设备即可登录 AWS 管理控制台 或通过 AWS CLI 创建会话。建议注册多个 MFA 设备。对于身份验证器应用程序，我们还建议您启用云备份或同步功能，以帮助避免在设备丢失或损坏时失去对账户的访问权限。

AWS 需要可产生六位数 OTP 的虚拟 MFA 应用程序。有关您可以使用的虚拟 MFA 应用程序的列表，请参阅 [Multi-Factor Authentication](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 用户的虚拟 MFA 设备，您必须具有以下策略中的权限：[AWS：允许使用 MFA 完成身份验证的 IAM 用户在“安全凭证”页面上管理自己的 MFA 设备。](reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.md)。

## 为 IAM 用户启用虚拟 MFA 设备（控制台）
<a name="enable-virt-mfa-for-iam-user"></a>

您可在 AWS 管理控制台 中使用 IAM 为您账户中的 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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 在 **用户**列表中，选择 IAM 用户的名称。

1. 选择 **Security Credentials (安全凭证)** 选项卡。在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在向导中，键入**设备名称**，选择**身份验证器应用程序**，然后选择**下一步**。

   IAM 将生成并显示虚拟 MFA 设备的配置信息，包括 QR 代码图形。此图形是秘密配置密钥的表示形式，适用于不支持 QR 代码的设备上的手动输入。

1. 打开您的虚拟 MFA 应用程序。有关可用于托管虚拟 MFA 设备的应用程序的列表，请参阅[多重身份验证](https://aws.amazon.com/iam/details/mfa/)。

   如果虚拟 MFA 应用程序支持多个虚拟 MFA 设备或账户，请选择相应的选项以创建新的虚拟 MFA 设备或账户。

1. 确定 MFA 应用程序是否支持 QR 代码，然后执行以下操作之一：
   + 在向导中，选择 **Show QR 代码 (显示 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 一起使用了。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 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 用户最多可以注册 **8** 台 MFA 类型任意组合的 MFA 设备。如果用户丢失设备或出于任何原因需要更换设备，请先停用旧设备。然后，您可以为用户添加新设备。
+ 要停用当前与其他 IAM 用户关联的设备，请参阅 [停用 MFA 设备](id_credentials_mfa_disable.md)。
+ 要为其他 IAM 用户添加替换虚拟 MFA 设备，请按照上述 [为 IAM 用户启用虚拟 MFA 设备（控制台）](#enable-virt-mfa-for-iam-user) 过程中的步骤进行操作。
+ 要为 AWS 账户根用户添加替换虚拟 MFA 设备，请按照 [为根用户启用虚拟 MFA 设备（控制台）](enable-virt-mfa-for-root.md) 过程中的步骤操作。

# 在 AWS 管理控制台 中分配硬件 TOTP 令牌
<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 设备会在您登录 AWS 时生成 TOTP 验证码来验证身份。此类设备需要使用电池，并且随着时间推移可能需要更换以及与 AWS 重新同步。FIDO 安全密钥采用公钥加密技术，不需要电池，并且可提供无缝的身份验证流程。我们建议使用 FIDO 安全密钥，是因为此类密钥能够抵御网络钓鱼攻击，是 TOTP 设备的更安全替代方案。此外，FIDO 安全密钥可以在同一台设备上支持多个 IAM 用户后根用户，从而增强在保护账户安全方面的实用性。有关这两种设备类型的规格和购买信息，请参阅[多重身份验证](https://aws.amazon.com/iam/details/mfa/)。



您可以从 AWS 管理控制台、命令行或 IAM API 为 IAM 用户启用硬件 TOTP 令牌。要为 AWS 账户根用户 启用 MFA 设备，请参阅[为根用户启用硬件 TOTP 令牌（控制台）](enable-hw-mfa-for-root.md)。

您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台 安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-user.shared.console.png)

1. 在 **AWS IAM 凭证**选项卡的**多重身份验证（MFA）**部分中，选择**分配 MFA 设备**。

1. 在向导中，键入 **Device name**（设备名称），选择 **Hardware TOTP token**（硬件 TOTP 令牌），然后选择 **Next**（下一步）。

1. 键入设备序列号。序列号通常位于设备的背面。

1. 在 **MFA code 1 (MFA 代码 1)** 框中，输入 MFA 设备显示的六位数编码。您需要按设备正面的按钮来显示编码。  
![\[IAM 控制面板，MFA 设备\]](http://docs.aws.amazon.com/zh_cn/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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择要为其启用 MFA 的用户的名称。

1. 选择 **Security Credentials (安全凭证)** 选项卡。在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在向导中，键入 **Device name**（设备名称），选择 **Hardware TOTP token**（硬件 TOTP 令牌），然后选择 **Next**（下一步）。

1. 键入设备序列号。序列号通常位于设备的背面。

1. 在 **MFA code 1 (MFA 代码 1)** 框中，输入 MFA 设备显示的六位数编码。您需要按设备正面的按钮来显示编码。  
![\[IAM 控制面板，MFA 设备\]](http://docs.aws.amazon.com/zh_cn/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 用户分配 8 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。如果用户丢失设备或出于任何原因需要替换它，您必须先停用旧设备。然后，您可以为用户添加新设备。
+ 要停用当前与用户关联的设备，请参阅[停用 MFA 设备](id_credentials_mfa_disable.md)。
+ 要为 IAM 用户添加替代用硬件 TOTP 令牌，请按照本主题前面部分的过程 [为其他 IAM 用户启用硬件 TOTP 令牌（控制台）](#enable-hw-mfa-for-iam-user) 中的步骤进行操作。
+ 要为 AWS 账户根用户 添加替代用硬件 TOTP 令牌，请按照本主题前面部分的过程 [为根用户启用硬件 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 CLI、AWS API、Tools for Windows PowerShell 或任何其他命令行工具为 AWS 账户根用户 启用 MFA 设备。不过，可以使用 AWS 管理控制台 为根用户启用 MFA 设备。

当您从 AWS 管理控制台启用 MFA 设备时，控制台会为您执行多个步骤。如果您改用 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) 的 **Examples**（示例）部分。对于物理设备，您可以跳过创建步骤，直接同步该设备并将其与用户关联。

您可以将标签附加到 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 设备。要成功执行此操作，用户必须首先调用 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 并使用一个现有的 MFA 设备提交 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. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。

1. 在 **Multi-Factor Authentication (MFA)** 下查看 MFA 是已启用还是已禁用。如果尚未激活 MFA，系统会显示一个提醒符号 (![\[Alert icon\]](http://docs.aws.amazon.com/zh_cn/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_cn/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 已终止对短信多重身份验证（MFA）的支持。我们建议拥有使用基于短信的 MFA 的 IAM 用户的客户切换到以下替代方法之一：[虚拟（基于软件）MFA 设备](id_credentials_mfa_enable_virtual.md)、[FIDO 安全密钥](id_credentials_mfa_enable_fido.md)或[硬件 MFA 设备](id_credentials_mfa_enable_physical.md)。您可以确定账户中拥有已分配短信 MFA 设备的用户。为此，请转到 IAM 控制台，从导航窗格中选择**用户**，然后在表的 **MFA** 列中查找具有 **SMS** 的用户。

1. 要查看有关用户的 MFA 设备的其他信息，请选择要检查其 MFA 状态的用户的名称，然后选择 **Security credentials** 选项卡。

1. 如果用户没有处于活动状态的 MFA 设备，控制台将显示**无 MFA 设备。在**多重身份验证（MFA）**部分中分配 MFA 设备以提高 AWS 环境的安全性**。如果用户启用了 MFA 设备，则 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分显示有关这些设备的详细信息：
   + 设备名称
   + 设备类型
   + 设备的标识符，例如物理设备的设备序列号或虚拟设备的 AWS 中的 ARN
   + 何时创建设备

要删除或重新同步设备，请选择设备旁边的单选按钮，然后选择 **Remove**（删除）或 **Resync**（重新同步）。

有关启用 MFA 的更多信息，请参阅以下章节：
+ [在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md)
+ [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md)
+ [在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)

# 重新同步虚拟和硬件 MFA 设备
<a name="id_credentials_mfa_sync"></a>

您可以使用 AWS 重新同步虚拟和硬件 Multi-Factor Authentication (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) 和 [IAM 中的 AWS 多重身份验证](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**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **Users**，然后选择其 MFA 设备需要重新同步的用户的名称。

1. 选择**安全凭证**选项卡。在**多重身份验证（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**（亚马逊云科技使用身份验证设备登录）页面上，选择 **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. 选择 **Root user**（根用户）并输入您的 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. 在导航栏的右侧选择您的账户名称，然后选择 **Security credentials**（安全凭证）。如有必要，选择 **Continue to Security Credentials**（继续使用安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 展开页面上的 **Multi-factor authentication (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 用户的虚拟或硬件 MFA 设备 (AWS API)**
+ 发送 [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 设备，请参阅 [IAM 中的 AWS 多重身份验证](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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 要停用用户的 MFA 设备，请选择要删除其 MFA 的用户的名称。

1. 选择**安全凭证**选项卡。

1. 在**多重身份验证（MFA）**下，选择 MFA 设备旁边的单选按钮，选择**删除**，然后选择**删除**。

   随即从 AWS 中删除该设备。该设备将不能用于登录或验证请求，直到它重新激活并与 AWS 用户或 AWS 账户根用户 相关联。<a name="deactivate-mfa-for-root"></a>

**取消激活 AWS 账户根用户的 MFA 设备（控制台）**

1. 选择 **Root user**（根用户）并输入您的 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. 在导航栏的右侧选择您的账户名称，然后选择 **Security credentials**（安全凭证）。如有必要，选择 **Continue to Security Credentials**（继续使用安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/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 用户最多可以注册 8 台任何类型的 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 方法，然后选择**下一步**。
**注意**  
可能会显示替代文本，例如 **Sign in using MFA**（使用 MFA 登录）、**Troubleshoot your authentication device**（对身份验证设备进行故障排除）或 **Troubleshoot 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 打来的电话，请选择 **Sign in (登录)** 以再次登录到控制台并重新开始。或者，请参阅[多重身份验证（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) 页面并删除旧的 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 设备 (如[停用 MFA 设备](id_credentials_mfa_disable.md)中所述)，以便您能够登录。

1. 下一步取决于您使用的 MFA 的类型：
   + 对于虚拟 MFA 设备，请从您的设备中删除账户。然后，启用虚拟设备，如[在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md)中所述。
   + 对于 FIDO 安全密钥，请联系第三方提供商帮助您更换设备。当您收到新的 FIDO 安全密钥时，请将其启用，如 [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md) 中所述。
   + 对于硬件 TOTP 令牌，请联系第三方提供商以帮助您修复或更换设备。在您拥有新的物理 MFA 设备后，请启用设备，如[在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)中所述。
**注意**  
不必将丢失或被盗的 MFA 设备替换为相同类型的设备。您最多可以拥有 8 台任意组合的 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 policy，可以指定用户可调用哪些 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>

向 API 操作添加 MFA 保护包括以下任务：

1. 管理员为每个用户配置 AWS MFA 设备，这些用户必须发出要求 MFA 身份验证的 API 请求。有关更多信息，请参阅 [IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)。

1. 管理员为用户创建包含 `Condition` 元素的策略，以检查用户是否已使用 AWS MFA 设备进行身份验证。

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 policy
<a name="MFAProtectedAPI-policies"></a>

带 MFA 条件的策略可附加到以下项：
+ 对于 IAM 用户或组：
+ Amazon S3 存储桶、Amazon SQS 队列或 Amazon SNS 主题等资源
+ 可由用户担任的 IAM 角色的信任策略

可使用策略中的 MFA 条件检查以下属性：
+ Existence（存在性）- 如果只是验证用户是否已使用 MFA 进行身份验证，请检查 `aws:MultiFactorAuthPresent` 密钥在 `Bool` 条件中是否为 `True`。仅当用户使用短期凭证验证时，才会有该键。长期凭证，例如访问密钥，不包括此键。
+ Duration (持续时间) - 如果您只希望在 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` 用于以下方案：**
+ 调用访问 AWS 账户 中的资源的 API 操作，该账户与发出请求的 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 信息包含在上下文中，因此您无法检查单个 API 操作的 MFA。这就是您必须使用 `GetSessionToken` 限制对受基于资源的策略保护的资源的访问的原因。

**注意**  
IAM 用户使用 MFA 登录时，AWS CloudTrail 日志将包含 MFA 信息。如果 IAM 用户代入某个 IAM 角色，CloudTrail 还将在利用代入角色执行操作的 `sessionContext` 属性中记录 `mfaAuthenticated: true`。但是，当使用代入角色的凭证进行 API 调用时，CloudTrail 日志记录与 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` 获取。
+ 无法将受 MFA 保护的 API 访问与 AWS 账户根用户凭证配合使用。
+ 无法将受 MFA 保护的 API 访问与 U2F 安全密钥配合使用。
+ 将 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 创建一个名为 `CrossAccountRole` 的 IAM 角色，并将该角色的信任策略中的主体设置为账户 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 中，管理员确保已使用 AWS MFA 设备配置 IAM 用户 Richard，并且该用户知道设备的 ID。设备 ID 是序列号（如果是硬件 MFA 设备）或设备的 ARN（如果是虚拟 MFA 设备）。

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 账户 中的用户已使用 AWS MFA 设备进行身份验证后才能访问敏感 API 操作。

假设您拥有账户 A，其中包含一组需要使用 EC2 实例的开发人员。普通开发人员可以使用实例，但他们未获得 `ec2:StopInstances` 或 `ec2:TerminateInstances` 操作的权限。您希望仅允许几个受信任用户执行这些“破坏性”特权操作，因此您将 MFA 保护添加到允许这些敏感 Amazon EC2 操作的策略中。

在此方案中，用户 Sofía 是受信任用户之一。用户 Anaya 是账户 A 中的管理员。

1. Anaya 确保已使用 AWS MFA 设备配置 Sofía，并且 Sofía 知道该设备的 ID。设备 ID 是序列号（如果是硬件 MFA 设备）或设备的 ARN（如果是虚拟 MFA 设备）。

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 中，管理员确保已使用 AWS MFA 设备配置用户 Nikhil，并且该用户知道设备的 ID。设备 ID 是序列号（如果是硬件 MFA 设备）或设备的 ARN（如果是虚拟 MFA 设备）。

1. 在账户 C 中，Nikhil（或他正在运行的应用程序）将调用 `GetSessionToken`。此调用包括 MFA 设备的 ID 或 ARN 以及 Nikhil 从其设备中获取的当前 TOTP。

1. 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 ]

**适用于 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 Reference (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 Reference (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 参考》**中的 [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 Command Reference**》中的 [AssumeRole](https://docs.aws.amazon.com/goto/aws-cli/sts-2011-06-15/AssumeRole)。

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 查看 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，则可以设置与角色关联的命名配置文件。使用配置文件时，AWS CLI 将调用 assume-role 并为您管理凭证。有关更多信息，请参阅《AWS CLI 用户指南》**中的[在 AWS CLI 中使用 IAM 角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)。  
+  有关 API 详细信息，请参阅《AWS CLI 命令参考》**中的 [AssumeRole](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)。

------
#### [ Java ]

**适用于 Java 的 SDK 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 ]

**适用于 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 Reference (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 Reference (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 ]

**适用于 Ruby 的 SDK**  
 查看 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 详细信息，请参阅《AWS SDK for Rust API Reference》**中的 [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 详细信息，请参阅《AWS SDK for Swift 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>

服务专用凭证旨在与第三方库、SDK、工具或应用程序兼容，这些库、SDK、工具或应用程序与 AWS 凭证、AWS SDK 或 AWS API 本身不兼容。此类用例包括从自托管基础设施或其他提供商托管的服务迁移到 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 日志中有关使用凭证的服务的事件。有关更多信息，请参阅 [使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用](cloudtrail-integration.md)。

为了提高安全性，请考虑设置 CloudWatch 警报，以便通知您可能表明未经授权访问或其他安全问题的特定凭证使用模式。有关更多信息，请参阅《*AWS CloudTrail 用户指南*》中的 [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 管理控制台 访问 Amazon Bedrock，也可以使用 AWS CLI 或 AWS API 以编程方式访问。向 Amazon Bedrock 发出编程请求时，您可以使用[临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)或 Amazon Bedrock API 密钥进行身份验证。Amazon Bedrock 支持两种类型的 API 密钥：
+ **短期 API 密钥** – 短期 API 密钥是使用 AWS 签名版本 4 的预签名 URL。短期 API 密钥与生成 API 密钥的身份的凭证具有相同的权限和过期时间，有效期最长为 12 小时或控制台会话的剩余时间（以较短者为准）。您可以使用 Amazon Bedrock 控制台、Python 包 `aws-bedrock-token-generator` 和其他编程语言的包来生成短期 API 密钥。有关更多信息，请参阅《*Amazon Bedrock 用户指南*》中的 [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 控制台、AWS CLI 或者 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 用户指南》**中的[使用 Amazon Bedrock API 密钥](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 用户的说明，请参阅[在 AWS 账户 中创建 IAM 用户](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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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>

要使用 AWS CLI 生成 Amazon Bedrock 长期 API 密钥，请按照以下步骤进行操作：

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 密钥元数据，请使用带有 `--user-name` 参数的 [list-service-specific-credentials](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-service-specific-credentials.html) 命令：

```
aws iam list-service-specific-credentials \
    --service-name bedrock.amazonaws.com \
    --user-name BedrockAPIKey_1
```

要列出账户中的所有 Amazon Bedrock 长期 API 密钥元数据，请使用带有 `--all-users` 参数的 [list-service-specific-credentials](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-service-specific-credentials.html) 命令：

```
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 的长期 API 密钥 (AWS 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 开发工具包、AWS Command Line Interface（AWS CLI）或带有 SiGv4 插件的开源 Cassandra 驱动程序。要了解更多信息，请参阅**《Amazon Keyspaces (for Apache Cassandra) Developer Guide》中的 [Create and configure AWS credentials for Amazon Keyspaces](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 (for Apache Cassandra) 开发人员指南*中的 [Amazon Keyspaces (for Apache Cassra) 基于身份的策略示例](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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **Users (用户)**，然后选择需要凭证的用户的名称。

1. 在 **Credentials for Amazon Keyspaces (for Apache Cassandra)**（Amazon Keyspaces (for Apache Cassandra) 凭证）下方的 **Security Credentials**（安全凭证）选项卡中，选择 **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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 如有必要，请将 **Console last sign-in** 列添加到用户表中：

   1. 在最右侧的表上方，选择设置图标 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在**选择可见列**中，选择**控制台上次登录**。

   1. 选择**确认**，返回到用户列表。

1. **Console last sign-in**（控制台上次登录时间）列显示用户上次通过控制台登录 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（太平洋时间）之后登录的用户，所返回的上次使用密码的日期准确无误。  
如果您使用上次使用密码的信息来识别未使用的凭证以将其删除（如删除在过去 90 天内未登录过 AWS 的用户），建议您调整评估时段以纳入 2018 年 5 月 23 日之后的日期。或者，如果您的用户使用访问密钥以编程方式访问 AWS，则您可以参阅上次使用访问密钥的信息，因为其中的所有日期都准确无误。

**通过下载凭证报告查找未使用的密码 (控制台)**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**凭证报告**。

1. 选择 **Download Report** 以下载名为 `status_reports_<date>T<time>.csv` 的逗号分隔值 (CSV) 文件。第五列包含具有日期或下列项之一的 `password_last_used` 列：
   + **N/A** - 根本未获得密码的用户。
   + **no\$1information** - 自 在 2014 年 10 月 20 日 IAM 开始跟踪密码使用期限以来未使用其密码的用户。

**查找未使用的密码 (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://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 如有必要，将 **Access key last used** 列添加到用户表中：

   1. 在最右侧的表上方，选择设置图标 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在**选择可见列**中，选择**上次使用的访问密钥**。

   1. 选择**确认**，返回到用户列表。

1. **Access key last used (访问密钥上次使用)** 列显示用户上次以编程方式访问 AWS 以来经过的天数。您可以利用该信息查找超过指定时间段未使用访问密钥的用户。对于没有访问密钥的用户，该列显示 **–**。最近未使用的访问密钥可能适合做删除处理。

**通过下载凭证报告来查找未使用的访问密钥 (控制台)**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**凭证报告**。

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 开发工具包](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) API。

您可以使用凭证报告帮助您进行审核和合规性工作。您可以使用该报告来审计凭证生命周期要求的效果，如密码和访问密钥更新要求。您可以向外部审核员提供报告，或向审核员授予权限，以便他或她可以直接下载报告。

您可以按每四小时一次的频率生成凭证报告。请求报告时，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（太平洋时间）之后登录的用户，所返回的上次使用密码的日期准确无误。  
如果您使用上次使用密码的信息来识别未使用的凭证以将其删除（如删除在过去 90 天内未登录过 AWS 的用户），建议您调整评估时段以纳入 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**  
如果对用户启用了[多重验证](id_credentials_mfa.md) (MFA) 设备，则此值为 `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 服务。此字段的值使用服务的命名空间，例如 `s3` 表示 Amazon S3，`ec2` 表示 Amazon 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 服务。此字段的值使用服务的命名空间，例如 `s3` 表示 Amazon S3，`ec2` 表示 Amazon 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**凭证报告**。

1. 选择**下载报告**。

## 获取凭证报告 (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 存储库通信。作为此配置的一部分，您需要提供 IAM 凭证，CodeCommit 将用该凭证来对您进行身份验证。IAM 支持具有三种凭证的 CodeCommit：
+ Git 凭证 - 一种由 IAM 生成的用户名和密码对，供您通过 HTTPS 与 CodeCommit 存储库进行通信。
+ SSH 密钥 - 一种本地生成的公有-私有密钥对，供您关联至 IAM 用户，以通过 SSH 与 CodeCommit 存储库进行通信。
+  [AWS 访问密钥](id_credentials_access-keys.md) - 供您配合 AWS CLI 中包含的凭证辅助程序使用，以通过 HTTPS 与 CodeCommit 存储库通信。

**注意**  
您无法使用 SSH 密钥或 Git 凭证来访问另一个 AWS 账户中的存储库。要了解如何在其他 AWS 账户 中为 IAM 用户和组配置对 CodeCommit 存储库的访问权限，请参阅《*AWS CodeCommit 用户指南*》[使用角色配置对 AWS CodeCommit 存储库的跨账户访问](https://docs.aws.amazon.com/codecommit/latest/userguide/cross-account.html)。

请参阅下面几节了解有关每个选项的更多信息。

## 将 Git 凭证和 HTTPS 与 CodeCommit 配合使用（推荐）
<a name="git-credentials-code-commit"></a>

借助 Git 凭证，您可以为 IAM 用户生成静态用户名和密码对，然后使用这些凭证进行 HTTPS 连接。您还可以将这些凭证与支持静态 Git 凭证的任何第三方工具或集成开发环境 (IDE) 配合使用。

这些凭证对所有支持的操作系统来说是通用的，并且兼容大多数凭证管理系统、开发环境及其他软件开发工具，因此，这是我们推荐使用的方法。您可以随时重置 Git 凭证的密码。如果不再需要凭证，您还可以停用或删除它们。

**注意**  
您无法为 Git 凭证选择自己的用户名或密码。IAM 会为您生成这些凭证，以帮助确保它们符合 AWS 的安全标准和 CodeCommit 中的安全存储库。凭证生成之后，您只能下载它们一次。因此，请务必将凭证保存在安全的位置。如有必要，您可以随时重置密码，但这会使通过旧密码配置的所有连接失效。您必须使用新密码重新配置连接，然后才能再次进行连接。

请参阅以下主题了解更多信息：
+ 要创建 IAM 用户，请参阅 [在 AWS 账户 中创建 IAM 用户](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 用户，请参阅 [在 AWS 账户 中创建 IAM 用户](id_users_create.md)。
+ 要创建 SSH 公有密钥并将其与 IAM 用户相关联，请参阅 *AWS CodeCommit 用户指南*中的[适用于 Linux、macOS 或 Unix 上的 SSH 连接](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-ssh-unixes.html)或请参阅[适用于 Windows 上的 SSH 连接](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-ssh-windows.html)。

**注意**  
公有密钥必须采用 ssh-rsa 格式或 PEM 格式进行编码。公有密钥的最小位长度为 2048 位，最大长度为 16384 位。这独立于您上传的文件大小。例如，您可以生成 2048 位密钥，但生成的 PEM 文件大小为 1679 字节。如果您采用其他格式或大小提供公有密钥，则系统会显示一条错误消息，指出该密钥格式无效。

## 将 HTTPS 与 AWS CLI 凭证辅助程序和 CodeCommit 配合使用
<a name="access-keys-code-commit"></a>

作为使用 Git 凭证进行 HTTPS 连接的替代方法，您可以允许 Git 在需要进行 AWS 身份验证以与 CodeCommit 存储库交互时使用 IAM 用户凭证的加密签名版本或 Amazon EC2 实例角色。这是唯一一种不需要 IAM 用户就能连接 CodeCommit 存储库的方法。这也是唯一一种适用于联合访问和临时凭证的方法。请参阅以下主题了解更多信息：
+ 有关联合访问的更多信息，请参阅[身份提供程序和 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 连接](https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-https-unixes.html)或使用 [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>

要在 AWS 中启用与您的网站或应用程序的 HTTPS 连接，您需要 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 中的复制命令或 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
```
 

**将证书包从 PKCS\$112 (PFX) 转换为 PEM**  
使用 [OpenSSL **pkcs12** 命令](https://openssl.org/docs/manmaster/man1/pkcs12.html)，如以下示例所示。在以下示例命令中，将 `CertificateBundle.p12` 替换为包含您的 PKCS\$112 编码的证书包的文件的名称。将 `CertificateBundle.pem` 替换为要包含 PEM 编码的证书捆绑包的输出文件的首选名称。  

```
openssl pkcs12 -in CertificateBundle.p12 -out CertificateBundle.pem -nodes
```
 

**将证书包从 PKCS\$17 转换为 PEM**  
使用 [OpenSSL **pkcs7** 命令](https://openssl.org/docs/manmaster/man1/pkcs7.html)，如以下示例所示。在以下示例命令中，将 `CertificateBundle.p7b` 替换为包含您的 PKCS\$17 编码的证书包的文件的名称。将 `CertificateBundle.pem` 替换为要包含 PEM 编码的证书捆绑包的输出文件的首选名称。  

```
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 账户 内所有用户的用户组。如果希望有这样的用户组，则需要创建该组，然后将每个新用户分配给它。
+ AWS 账户 中 IAM 资源的数量和大小（例如组的数量和用户可加入的组的数量）是有限的。有关更多信息，请参阅 [IAM 和 AWS STS 配额](reference_iam-quotas.md)。

下图以一家小型公司作为简单示例。随着公司的发展，公司所有者为用户创建了一个 `Admins` 用户组来创建和管理其他用户。`Admins` 用户组会创建一个 `Developers` 用户组和 `Test` 用户组。这两个 IAM 组都包含可与 AWS 交互的用户（Jim、Brad、DevApp1 等）。每个用户均拥有一组单独的安全证书。在此示例中，每个用户均属于单一用户组。不过，用户可归属于多个 IAM 组。

![\[AWS 账户、用户和 IAM 组之间的关系示例\]](http://docs.aws.amazon.com/zh_cn/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 Identity Service 的用户，或任何使用通过身份源提供的凭证来访问 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **User groups**（用户组），然后选择 **Create group**（创建组）。

1. 对于 **User group name**（用户组名称），键入组的名称。
**注意**  
AWS 账户中 IAM 资源的数量和大小是有限的。有关更多信息，请参阅 [IAM 和 AWS STS 配额](reference_iam-quotas.md)。组名称可以是一个最多由 128 个字母、数字和以下字符构成的组合：加号 (\$1)、等号 (=)、逗号 (,)、句点 (.)、at 符号 (@)、下划线 (\$1) 和连字符 (-)。账户中的名称必须唯一。名称不区分大小写。例如，您无法同时创建名为 **ADMINS** 和 **admins** 的组。

1. 在用户列表中，选中要添加到组中的每个用户对应的复选框。

1. 在策略列表中，选中要应用于组中的所有成员的每个策略的复选框。

1. 选择**创建群组**。

------
#### [ 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 组：
+ 在导航窗格中，选择 **Users**（用户）。然后选择用户名称，以打开用户详细信息页面。选择**组**选项卡可查看用户所属组的列表。

------
#### [ 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，请选择 **User groups**（用户组），然后选择组的名称。

1. 选择**用户**选项卡。选中要移除的用户旁边的复选框，然后选择 **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 Management](access.md)。

## 将策略附加到 IAM 组
<a name="id_groups_manage_attach-policy-section-1"></a>

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

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，请选择 **User groups**（用户组），然后选择组的名称。

1. 选择 **Permissions（权限）**选项卡。

1. 选择**添加权限**，然后选择**附加策略**。

1. 附加到用户组的当前策略显示在 **Current permissions policies**（当前权限策略）列表。在 **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. 在**资源**列中查找您的用户组名称。

1. 选择**编辑**以在策略中更改您的用户组名称。

## 更改 IAM 用户组的名称
<a name="id_groups_manage_rename-section-1"></a>

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

1. 在导航窗格中，选择 **用户组**，然后选择组的名称。

1. 选择**编辑**。键入新的用户组名称，然后选择 **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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 管理员可以查看但不能编辑服务关联角色的权限。  
您必须先删除角色的相关资源，之后才能删除服务相关角色。这可以保护您的资源，因为您不会无意中删除对资源的访问权限。  
有关哪些服务支持使用服务相关角色的信息，请参阅 [使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md) 并查找其在**服务相关角色**列中为**是**的服务。请选择**是**与查看该服务的服务关联角色文档的链接。

**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 来存储您的代码，则可以使用具有 SSH 密钥或服务特定凭证的 IAM 用户对 CodeCommit 进行存储库身份验证。我们建议您除了使用 IAM Identity Center 中的用户进行普通身份验证之外，再执行此操作。IAM Identity Center 中的用户是您的员工队伍中需要访问您的 AWS 账户 或云应用程序的人员。要在不配置 IAM 用户的情况下授予用户访问您 CodeCommit 存储库的权限，您可以配置 **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 (for Apache Cassandra) access**（Amazon Keyspaces（Apache Cassandra 兼容）访问）– 在您无法使用 IAM Identity Center 中的用户的情况下，如出于测试 Cassandra 兼容性的目的，您可以使用具有服务特定凭证的 IAM 用户向 Amazon Keyspaces 进行身份验证。IAM Identity Center 中的用户是您的员工队伍中需要访问您的 AWS 账户 或云应用程序的人员。您还可以使用临时凭证连接到 Amazon Keyspaces。有关更多信息，请参阅《Amazon Keyspaces（Apache Cassandra 兼容）开发人员指南》中的[使用临时凭证连接到使用 IAM 角色和 SigV4 插件的 Amazon Keyspaces](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>

以下是可帮助您开始使用角色的一些基本术语。

**** 角色****  
可在账户中创建的具有特定权限的 IAM 身份。IAM 角色与 IAM 用户有一些相似之处。角色和用户都是具有权限策略的 AWS 身份，该策略可确定身份在 AWS 中可执行和不可执行的操作。但是，角色旨在让需要它的任何人代入，而不是唯一地与某个人员关联。此外，角色没有关联的标准长期凭证（如密码或访问密钥）。相反，当您代入角色时，它会为您提供角色会话的临时安全凭证。  
角色可由以下用户代入：  
+ 相同 AWS 账户 或另一个 AWS 账户 中的 IAM 用户
+ 同一账户中的 IAM 角色
+ 服务主体，用于 AWS 服务和功能，例如：
  + 允许您在计算服务上运行代码的服务，如 Amazon EC2 或 AWS Lambda
  + 代表您对资源执行操作的功能，如 Amazon S3 对象复制
  + 为在 AWS 外部运行的应用程序提供临时安全凭证的服务，如 IAM Roles Anywhere 或 Amazon ECS Anywhere
+ 由与 SAML 2.0 或 OpenID Connect 兼容的外部身份提供者（IdP）服务进行身份验证的外部用户

****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)。
有关哪些服务支持使用服务相关角色的信息，请参阅 [使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md) 并查找其在**服务相关角色**列中为**是**的服务。请选择**是**与查看该服务的服务关联角色文档的链接。有关更多信息，请参阅 [创建服务相关角色](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 角色会话限制为最长 1 小时。无论为各个角色配置的最长会话持续时间如何，此限制均适用。在使用 [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)。不过，如果您使用角色链代入角色并提供大于 1 小时的 `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)中，您可以定义您*信任*代入该角色的主体。角色信任策略是必需的[基于资源的策略](access_policies.md#policies_resource-based)（将附加到 IAM 中的角色）。您可以在信任策略中指定的[主体](reference_policies_elements_principal.md)包括用户、角色、账户和服务。有关更多信息，请参阅 *AWS 安全博客*中的[如何在 IAM 角色中使用信任策略](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) 队列。要了解哪些服务支持基于资源的策略，请参阅 [使用 IAM 的 AWS 服务](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 提供者的现有身份。AWS 在通过[身份提供者](id_roles_providers.md)请求访问权限时，将为联合主体分配角色。

  有关 SAML 和 OIDC 联合主体的更多信息，请参阅 [联合用户会话和角色](introduction_access-management.md#intro-access-roles)。
+ **权限策略**是基于身份的策略，用于定义角色可使用的操作和资源。该文档是根据 IAM policy 语言的规则编写的。

  有关更多信息，请参阅 [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 以写入位于不同 AWS 账户的中央 Amazon S3 存储桶。通过为 `cloudtrail.amazonaws.com` 添加允许声明，调用服务 CloudTrail 可以使用 S3 存储桶的策略访问您的 S3 存储桶。

当来自呼叫服务的 AWS 服务主体访问来自被叫服务的资源时，来自被叫服务的资源策略仅授权 AWS 服务主体，而不是配置呼叫服务的角色。例如，不附带任何条件地信任 CloudTrail 服务主体的 S3 存储桶可以从受信任的管理员配置的 AWS 账户接收 CloudTrail 日志，但如果他们知道 S3 存储桶的名称，也可以从其 AWS 账户中的未经授权角色那里接收 CloudTrail 日志。

当某个角色利用 AWS 服务主体的信任来获得对他们本来不打算访问的资源的访问权限时，就会出现混淆的代理问题。

## 跨账户混淆代理人预防
<a name="mitigate-confused-deputy"></a>

下图阐明了跨账户混淆代理人问题。

![\[混淆代理人问题的描述。\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/confuseddeputyproblem2.png)


此场景假定：
+ **AWS1** 是您的 AWS 账户。
+ **AWS1:ExampleRole** 是您账户中的一个角色。该角色的信任策略通过将 Example Corp 的 AWS 账户指定为可担任该角色的账户来信任 Example Corp。

将发生以下情况：

1. 在您开始使用 Example Corp 的服务时，您将向 Example Corp 提供 **AWS1:ExampleRole** 的 ARN。

1. Example Corp 使用该角色 ARN 获取临时安全凭证以访问您的 AWS 账户 中的资源。这样一来，您将信任 Example Corp 作为可代表您执行操作的“代理人”。

1. 另一个 AWS 客户也开始使用 Example Corp 的服务，而且此客户还为 Example Corp 提供了 **AWS1:ExampleRole** 的 ARN 以供其使用。另一个客户可能已了解或猜到已不是机密信息的 **AWS1:ExampleRole**。

1. 当另一个客户要求 Example Corp 访问（它声称的）其账户中的 AWS 资源时，Example Corp 使用 **AWS1:ExampleRole** 访问您的账户中的资源。

这就是其他客户可对您的资源进行未授权访问的方式。由于此客户能够诱使 Example Corp 无意中操作您的资源，因此 Example Corp 现在是一个“混淆代理人”。

Example Corp 可以通过在角色信任策略中加入 `ExternalId` 条件检查来解决混淆的代理问题。Example Corp 为每个客户生成唯一的 `ExternalId` 值，并在其请求中使用该值来承担该角色。在 Example Corp 的客户中，`ExternalId` 值必须是独一无二的，并由 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。即使另一个客户向 Example Corp 提供您的 ARN，也无法控制 Example Corp 包括在其发送给 AWS 的请求中的外部 ID。这有助于防止未经授权的客户获取对您的资源的访问权限。

下图阐明了此过程。

![\[如何缓解混淆代理人问题。\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/confuseddeputymitigation2.png)


1. 和之前一样，在您开始使用 Example Corp 的服务时，您将向 Example Corp 提供 **AWS1:ExampleRole** 的 ARN。

1.  在 Example Corp 使用该角色 ARN 来代入角色 **AWS1:ExampleRole** 时，Example Corp 将在 AssumeRole API 调用中包含您的外部 ID（12345）。该外部 ID 与角色的信任策略匹配，因此 AssumeRole API 调用将成功，并且 Example Corp 将获取用于访问您的 AWS 账户 中的资源的临时安全凭证。

1. 另一个 AWS 客户也开始使用 Example Corp 的服务，而且如之前一样，此客户还为 Example Corp 提供了 **AWS1:ExampleRole** 的 ARN 以供其使用。

1. 但这一次，在 Example Corp 尝试代入角色 **AWS1:ExampleRole** 时，它提供了与另一个客户关联的外部 ID（67890）。另一个客户无法更改此外部 ID。Example Corp 这样做是因为另一个客户请求使用该角色，因此 67890 表示 Example Corp 正在其中操作的环境。由于您已将具有您自己的外部 ID（12345）的条件添加到 **AWS1: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_cn/IAM/latest/UserGuide/images/cross-service-confused-deputy1.png)


为了帮助防止未经授权的角色利用 AWS 主体的信任来访问您的资源，AWS 服务主体会提供有关他们所代表的 AWS 资源、AWS 账户和 AWS 组织的信息。

此信息以全局条件键值的形式提供，这些键值可用于资源策略或 AWS 服务主体发出的请求的资源控制策略。建议在您的资源策略中使用 [aws:SourceArn](reference_policies_condition-keys.md#condition-keys-sourcearn)、[aws:SourceAccount](reference_policies_condition-keys.md#condition-keys-sourceaccount)、[aws:SourceOrgID](reference_policies_condition-keys.md#condition-keys-sourceorgid) 或 [aws:SourceOrgPaths](reference_policies_condition-keys.md#condition-keys-sourceorgpaths)，只要 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_cn/IAM/latest/UserGuide/images/cross-service-confused-deputy2.png)


在策略中使用 `aws:SourceArn`、`aws:SourceAccount`、`aws:SourceOrgID` 和 `aws:SourceOrgPaths` 全局条件键可帮助您确保服务主体代表您访问您的资源。建议每当向 AWS 服务主体授予对其中一个资源的访问权限时，都使用这些条件键。

**注意**  
某些 AWS 服务交互具有额外的控件，可帮助防止测试用户对资源访问的跨服务混淆代理问题。例如，当向 AWS 服务发放 KMS 密钥授予时，AWS KMS 会使用与资源关联的加密上下文以及密钥授予来帮助防止跨服务的混淆代理问题。  
有关帮助避免跨服务的混淆代理风险的更多信息，以及是否支持 `aws:SourceArn`、`aws:SourceAccount`、`aws:SourceOrgID` 和 `aws:SourceOrgPaths`，请参阅您使用是服务的文档。

## 使用基于资源的策略进行跨服务混淆代理保护
<a name="cross-service-confused-deputy-prevention-resource"></a>

仅当服务主体代表 AWS 账户 111122223333 行事时，以下示例策略授予服务主体 `cloudtrail.amazonaws.com` 访问 Amazon S3 存储桶，arn:aws:s3:::amzn-s3-demo-bucket1 的权限。

------
#### [ 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` 通过使用 `aws:SourceArn` 指定实例集 ARN 来代表指定的 Amazon AppStream 实例集行事时，才授予服务主体访问 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 的 RCP、组织单位（OU）或组织中的 AWS 账户一起使用，而无需在基于资源的特定策略中添加声明。有关 RCP 和支持的服务更多信息，请参阅《AWS Organizations 用户指南》**中的[资源控制策略（RCP）](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)。

以下示例 RCP 拒绝 AWS 服务主体在 `aws:SourceOrgID` 不等于 o-ExampleOrg 时访问您的成员账户中的 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 资源请求中。这些证书提供向分配的角色授予的权限。

本部分提供了以下方案的概述：
+ [为您拥有的一个 AWS 账户 中的 IAM 用户提供对您拥有的其他账户中的资源的访问权限](id_roles_common-scenarios_aws-accounts.md)
+ [提供对非 AWS 工作负载的访问权限](id_roles_common-scenarios_non-aws.md)
+ [为第三方拥有的 AWS 账户 中的 IAM 用户提供访问权限](id_roles_common-scenarios_third-party.md)
+ [为 AWS 提供的服务提供对 AWS 资源的访问权限](id_roles_common-scenarios_services.md)
+ [为经过外部身份验证的用户（联合身份验证）提供访问权限](id_roles_common-scenarios_federated-users.md)

# 在您拥有的其他 AWS 账户 中 IAM 用户的访问权限
<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_cn/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 控制台：用户选择导航栏上的账户名并选择 **Switch Role (切换角色)**。用户指定账户 ID (或别名) 和角色名称。或者，用户可以单击管理员在电子邮件中发送的链接。通过该链接，用户可以转到已填写详细信息的 **Switch Role** 页面。
   + AWS API/AWS CLI：开发账户中开发人员组的用户调用 `AssumeRole` 函数以获取 `UpdateApp` 角色的凭证。用户将 `UpdateApp` 角色的 ARN 指定为调用的一部分。如果测试人员组中的用户发出相同请求，请求将失败，因为测试人员没有针对 `UpdateApp` 角色 ARN 调用 `AssumeRole` 的权限。

1. AWS STS 返回临时凭证：
   + AWS 控制台：AWS STS 使用角色的信任策略来验证请求，以确保请求来自受信任实体（即开发账户）。验证完成后，AWS STS 向 AWS 控制台返回[临时安全凭证](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html)。
   + 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)的对象。当您[担任的角色](id_roles_manage-assume.md)使用 IAM 身份或来自 AWS 外部的身份时，它会为您提供角色会话的临时安全凭证。您的工作负载可能在数据中心或其他 AWS 外部必须访问您 AWS 资源的基础设施中运行。除了创建、分发和管理长期访问密钥之外，您可以使用 AWS Identity and Access Management Roles Anywhere（IAM Roles Anywhere）来验证您的非 AWS 工作负载。IAM Roles Anywhere 使用您的证书颁发机构（CA）颁发的 X.509 证书对身份进行验证，并安全地使用 IAM 角色提供的临时证书提供对 AWS 服务 的访问权限。

**使用 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 用户指南》中的[什么是 AWS Identity and Access Management Roles Anywhere](https://docs.aws.amazon.com/rolesanywhere/latest/userguide/introduction.html)。
+ 要了解如何设置 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)。

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 账户的多租户环境中，我们建议每个 AWS 账户 使用一个外部 ID。此 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 个字符，最多为 1224 个字符。该值必须是字母数字，没有空格。它还可以包含以下符号：加号 (\$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 Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 和 [AWS Mobile SDK for Android and Fire OS](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>

在移动和基于 Web 的场景下尽可能使用 Amazon Cognito。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 联合身份验证服务，则您可以使用 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_cn/IAM/latest/UserGuide/images/enterprise-authentication-with-identity-broker-application.diagram.png)


此方案有以下属性：
+ 该身份代理应用程序具有访问 IAM 的令牌服务 (STS) API 以创建临时安全凭证的权限。
+ 该身份代理应用程序可确认员工在现有的身份验证系统中经过身份验证。
+ 用户可获得一个临时 URL，通过它可访问 AWS 管理控制台 (称为单点登录)。

有关创建临时安全凭证的信息，请参阅[比较 AWS STS 凭证](id_credentials_sts-comparison.md)。有关获取对 AWS 管理控制台的访问权限的 SAML 联合主体的更多信息，请参阅 [使 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 登录，您可以向这些外部身份授予使用您的账户中的 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在控制台的导航窗格中，选择 **Roles**，然后选择 **Create role**。

1. 选择 **AWS 账户** 角色类型。

1. 要为您的账户创建角色，请选择 **This account**（此账户）。要为其他账户创建角色，请选择**其他 AWS 账户**，然后输入要向其授予资源访问权限的**账户 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 的更多信息，请参阅[IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)

1. 选择**下一步**。

1. IAM 包括您的账户中的 AWS 托管策略和客户托管策略的列表。选择要用于权限策略的策略，或选择**创建策略**以打开新的浏览器选项卡并从头开始创建新策略。有关更多信息，请参阅 [创建 IAM 策略](access_policies_create-console.md#access_policies_create-start)。在您创建策略后，关闭该选项卡并返回到您的原始选项卡。选中您希望担任角色的任何人具有的权限策略旁边的复选框。如果您愿意，此时可以不选择任何策略，稍后将策略附加到角色。默认情况下，角色没有权限。

1. （可选）设置[权限边界](access_policies_boundaries.md)。这是一项高级功能。

   打开**设置权限边界**部分，然后选择**使用权限边界控制最大角色权限**。选择要用于权限边界的策略。

1. 选择**下一步**。

1. 对于**角色名称**，请为您的角色输入一个名称。角色名称在您的 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. 检查角色，然后选择**创建角色**。
**重要**  
请注意，这只是所需配置的前半部分。您还必须向受信任账户中的各个用户授予在控制台中切换到此角色或以编程方式担任此角色的权限。有关这一步骤的更多信息，请参阅[向用户授予切换角色的权限](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 的更多信息，请参阅 [IAM 中的 AWS 多重身份验证](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:` 文件夹。然后，使用名称 `PolicyForRole` 将上述权限策略保存为您的 AWS 账户 中的客户管理型策略。然后您可以使用以下命令来创建角色并附加托管策略。

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

有关在 AWS CloudFormation 中创建 IAM 角色的信息，请参阅 *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)。

有关 AWS CloudFormation 中的 IAM 模板的更多信息，请参阅*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)。要查看哪些服务支持使用服务相关角色，或服务是否支持任何形式的临时凭证，请参阅 [使用 IAM 的 AWS 服务](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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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. 检查该角色，然后选择**创建角色**。

------

## 创建用于服务的角色 (AWS CLI)
<a name="roles-creatingrole-service-cli"></a>

从 AWS CLI 创建角色涉及几个步骤。当您使用控制台创建角色时，很多步骤会自动完成，但是使用 AWS CLI 时，您必须自行完成每一个步骤。您必须创建角色，然后为角色分配权限策略。如果您使用的服务是 Amazon EC2，则还必须创建实例配置文件并向其添加角色。（可选）您还可以为您的角色设置[权限边界](access_policies_boundaries.md)。

**从 AWS CLI 为 AWS 服务创建角色**

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` 的权限策略保存到您的本地 `C:` 驱动器中的 `policies` 目录。然后，您可以使用以下命令来创建角色，附加策略，创建实例配置文件，并将角色添加到实例配置文件中。

```
# 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 控制台，请在 **Configure Instance Details (配置实例详细信息)** 页面中指定实例配置文件名称。如果使用 `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 实体。

您必须先删除角色的相关资源，之后才能删除角色。这有助于防止您无意中删除访问这些资源的权限。

**提示**  
有关哪些服务支持使用服务相关角色的信息，请参阅 [使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md) 并查找其在**服务相关角色**列中为**是**的服务。请选择**是**与查看该服务的服务关联角色文档的链接。

## 服务相关角色权限
<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 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 手动创建服务相关角色。有关哪些服务支持使用服务相关角色的信息，请参阅 [使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md) 并查找其在**服务相关角色**列中为**是**的服务。要了解服务是否支持创建服务相关角色，请选择 **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 管理控制台，打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**。然后，选择**创建角色**。

1. 选择**AWS 服务**角色类型。

1. 选择用于您的服务的用例。使用案例由服务定义以包含服务所需的信任策略。然后选择**下一步**。

1. 选择一个或多个要附加到角色的权限策略。根据您选择的使用案例，服务可能执行以下任意操作：
   + 定义角色所使用的权限。
   + 允许您从一组有限的权限中进行选择。
   + 允许您从任意权限中进行选择。
   + 允许您此时不选择策略，稍后创建策略，然后将这些策略附加到角色。

   选中分配您希望角色具有的权限的策略旁边的复选框，然后选择**下一步**。
**注意**  
使用角色的任何实体都可以使用您指定的权限。默认情况下，角色没有权限。

1. 对于**角色名称**，角色名称自定义的程度由服务定义。如果服务定义角色的名称，则此选项不可编辑。在其他情况下，服务可能定义角色的前缀并让您输入可选的后缀。

   如果可能，请输入要添加到默认名称的角色名称后缀。该后缀可帮助您确定角色的用途。角色名称在您的 AWS 账户内必须是唯一的。名称不区分大小写。例如，您无法同时创建名为 **<service-linked-role-name>\$1SAMPLE** 和 **<service-linked-role-name>\$1sample** 的角色。由于多个单位可能引用该角色，角色创建完毕后无法编辑角色名称。

1. （可选）对于 **Description**（描述），编辑新服务相关角色的描述。

1. 您无法在创建过程中将标签附加到服务相关角色。有关在 IAM 中使用标签的更多信息，请参阅 [AWS Identity and Access Management 资源的标签](id_tags.md)。

1. 检查角色，然后选择**创建角色**。

### 创建服务相关角色(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>

您可以使用身份提供程序而不必在 AWS 账户 中创建 IAM 用户。利用身份提供程序 (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 账户 中创建 AWS Identity and Access Management 用户。利用身份提供程序 (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 或受众 ID，该 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 IdP，我们建议您使用 [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"}
           }
       }
   }
   ```

------

   将 `us-east-2:12345678-abcd-abcd-abcd-123456` 替换为由 Amazon Cognito 分配给您的身份池 ID。

   如果您手动配置 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 IdP 的 Amazon 资源名称（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 开发人员指南*》中的[基本（经典）身份验证中的 IAM 角色的信任策略](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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**，然后选择**创建角色**。

1. 选择 **Web 身份**作为可信实体类型，然后选择**下一步**。

1. 对于 **Identity provider**（身份提供程序），请为您的角色选择 IdP：
   + 如果要为单个 web IdP 创建角色，请选择 **Login with Amazon**、**Facebook** 或 **Google**。
**注意**  
您必须为想要支持的每个 IdP 创建单独的角色。
   + 如果要为 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 操作创建角色，您需要首先将 GitHub OIDC 提供者添加到 IAM。将 GitHub OIDC 提供商添加到 IAM 后，选择 **token.actions.githubusercont.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 创建角色，请在 **Application ID**（应用程序 ID）框中输入应用程序 ID。
     + 如果要为 Facebook 创建角色，请在 **Application ID**（应用程序 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. 检查角色，然后选择**创建角色**。

## 为 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 文章“使用环境进行部署”中的 [部署分支和标签](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 和 ?）或者为空。创建或更新信任策略时，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 联合身份验证而不必在 AWS 账户 中创建 IAM 用户。利用身份提供程序 (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 联合的角色包含两个策略。一个是指定谁可以代入角色的角色信任策略。另一个是指定允许或拒绝 SAML 联合主体访问的 AWS 操作和资源的 IAM 权限策略。

   在为角色创建信任策略时，必须使用三个值来确保只有您的应用程序可以代入此角色：
   + 对于 `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 收件人属性。您可以添加特定区域内的登录 URL。AWS 建议使用区域端点而不是全局端点，以提高联合身份验证的韧性。有关可能的 *region-code* 值的列表，请参阅 [AWS 登录端点](https://docs.aws.amazon.com/general/latest/gr/signin-service.html)中的 **Region**（区域）列。

     如果需要 SAML 加密，则登录 URL 必须包含 AWS 分配给您的 SAML 提供商的唯一标识符。您可以通过在 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，依次选择**角色**和**创建角色**。

1. 选择 **SAML 2.0 federation** 角色类型。

1. 对于 **Select a SAML provider**（选择 SAML 提供商），请为您的角色选择提供商。

1. 选择 SAML 2.0 访问级别方法。
   + 选择 **Allow programmatic access only (只允许编程访问)** 以创建可从 AWS API 或 AWS CLI 以编程方式担任的角色。
   + 选择**允许编程访问和 AWS 管理控制台 访问**以创建可以编程方式和从 AWS 管理控制台 中担任的角色。

   通过这两种方法创建的角色类似，但也可从控制台担任的角色包括包含带特定条件的信任策略。该条件可以显式的方式确保将 SAML 受众（`SAML:aud` 属性）设置为 SAML 提供商的 AWS 登录端点。

1. 定义属性的过程因访问权限类型而异。
   + 如果创建用于编程访问的角色，请从**属性**列表中选择一个属性。然后在 **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.  要使**登录 URL 包含唯一标识符**，请选择登录端点是否包含 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. 检查角色，然后选择**创建角色**。

创建角色后，通过使用有关 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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. 对于**角色名称**，角色名称自定义的程度由服务定义。如果服务定义角色的名称，则此选项不可编辑。在其他情况下，服务可能定义角色的前缀并允许您键入可选的后缀。某些服务允许您指定角色的整个名称。

   如果可能，输入角色名称或角色名称后缀。角色名称在您的 AWS 账户 内必须是唯一的。名称不区分大小写。例如，您无法同时创建名为 **PRODROLE** 和 **prodrole** 的角色。由于其他 AWS 资源可能引用该角色，角色创建完毕后无法编辑角色名称。

1. （可选）对于 **Description**（描述），输入新角色的描述。

1. （可选）在**步骤 1：选择受信任的实体**或**步骤 2：添加权限**部分中选择**编辑**，以编辑角色的自定义策略和权限。

1. （可选）通过以键值对的形式附加标签来向角色添加元数据。有关在 IAM 中使用标签的更多信息，请参阅 [AWS Identity and Access Management 资源的标签](id_tags.md)。

1. 检查角色，然后选择**创建角色**。

# 委派访问权限的策略示例
<a name="id_roles_create_policy-examples"></a>

以下示例演示了如何允许或授权 AWS 账户 访问其他 AWS 账户 中的资源。要了解如何使用这些示例 JSON 策略文档创建 IAM policy，请参阅。[使用 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。保存策略时，AWS 将该 ARN 转换为唯一主体 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 对名为 执行 *queue1* 的账户 A 的队列执行 `SendMessage`和 `ReceiveMessage` 操作的权限，但只在 2014 年 11 月 30 日中午至下午 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)。) 

Account 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 控制台中创建角色，则除最长可达 64 个字符的 `RoleName` 外，您还可以选择添加最长 512 个字符的 `Path`。不过，如果您打算通过 AWS 管理控制台 中的 **Switch Role**（切换角色）功能使用角色，则组合的 `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 policy。IAM 访问分析器会查看您的 AWS CloudTrail 日志并生成一个策略模板，其中包含实体在指定日期范围内使用的权限。您可以使用模板创建具有精细权限的托管策略，然后将其附加到 IAM 实体。这样，您仅需授予用户或角色与特定使用案例中的 AWS 资源进行交互所需的权限。要了解更多信息，请参阅 [IAM Acess 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 联合身份角色登录，上述情形均适用。例如，如果您切换到角色 A，则 IAM 使用您的原始用户或联合角色凭证确定是否允许您担任角色 A。如果您在*使用 RoleA 时*尝试切换到 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`。
+ 如果您以编程方式创建角色，则您可以添加最长 512 个字符的 `Path` 以及 `RoleName`。角色名称最多可以有 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 policy，您为在实例上运行的应用程序定义权限。该应用程序每次需要执行角色允许的操作时都会担任该角色。

要将角色（及其权限）传递至 AWS 服务，用户必须具有*传递角色* 至服务的权限。这有助于管理员确保仅批准的用户可配置具有能够授予权限的角色的服务。要允许用户将角色传递至 AWS 服务，您必须向用户的 IAM 用户、角色或组授予 `PassRole` 权限。

**警告**  
只能使用 `PassRole` 权限将 IAM 角色传递给使用同一 AWS 账户的服务。要将账户 A 中的角色传递给账户 B 中的服务，必须首先在账户 B 中创建一个可以代入账户 A 中角色的 IAM 角色，然后才能将账户 B 中的角色传递给该服务。有关更多信息，请参阅 [IAM 中的跨账户资源访问](access_policies-cross-account-resource-access.md)。
请勿试图通过标记角色然后在带有 `iam:PassRole` 操作的策略中使用 `ResourceTag` 条件键来控制谁可以传递角色。这种方法没有可靠的结果。

设置 `PassRole` 权限时，应确保用户所传递角色的权限不会超过您希望该用户拥有的权限。例如，可能不允许 Alice 执行任何 Amazon S3 操作。如果 Alice 可以将角色传递给允许 Amazon S3 操作的服务，则该服务可以在执行作业时代表 Alice 执行 Amazon S3 操作。

在指定服务相关角色时，您还必须拥有将该角色传递给服务的权限。在某些服务中执行操作时，该服务自动在您的账户中创建一个服务相关角色。例如，在首次创建自动扩缩组时，Amazon EC2 Auto Scaling 会为您创建 `AWSServiceRoleForAutoScaling` 服务相关角色。如果您在创建自动扩缩组时尝试指定服务相关角色，但您没有 `iam:PassRole` 权限，则会收到错误。如果您没有明确指定角色，则不需要 `iam:PassRole` 权限，默认情况下，对该组执行的所有操作都使用 `AWSServiceRoleForAutoScaling` 角色。要了解哪些服务支持服务相关角色，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)。要了解在哪些服务中执行操作时自动创建服务相关角色，请选择**是**链接并查看该服务的服务相关角色文档。

在任何使用角色分配服务权限的 API 操作中，用户都可以将角色 ARN 作为参数进行传递。该服务随后检查该用户是否拥有 `iam:PassRole` 权限。要限制用户只传递批准的角色，您可以使用 IAM policy 语句的 `iam:PassRole` 元素筛选 `Resources` 权限。

您可以在 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 *permissions policy*（权限策略），允许该用户仅传递已获批准的那些策略。您通常将 `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) 支持名为 **Enhanced Monitoring**（增强监控）的功能。此功能使 Amazon RDS 能够使用代理监控数据库实例。它还允许 Amazon RDS 将指标记录到 Amazon CloudWatch Logs 中。要启用此功能，您必须创建一个服务角色，以便为 Amazon RDS 提供监控指标和将指标写入日志的权限。

**为 Amazon RDS 增强监控创建角色**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 选择 **角色**，然后选择 **创建角色**。

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. 检查角色，然后选择**创建角色**。

角色自动获得授予 `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-*"
```

## AWS CloudTrail 日志中的 `iam:PassRole` 操作
<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 操作和资源的访问将被拒绝。这会导致用户丢失未保存的工作。

在允许用户访问具有较长的会话持续时间（例如 12 小时）的 AWS 管理控制台 时，用户的临时凭证不会很快过期。如果用户无意中向未授权第三方公开其凭证，则第三方在会话的持续时间内将具有访问权限。不过，如果需要，可以撤销对某个特定时间点之前发布的角色凭证的所有权限。指定时间之前发布的该角色的所有临时凭证将变得无效。这将强制所有用户重新进行身份验证并请求新的凭证。

 

**注意**  
您无法撤销*[服务相关角色](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 用户指南*》中的[撤消由权限集创建的活动 IAM 角色会话](https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#revoke-user-permissions)。

**立即拒绝对角色凭证的任何当前用户的所有权限**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 在策略的 Condition 元素中指定 `aws:TokenIssueTime` 键的值，随时撤消会话权限。

当 `aws:TokenIssueTime` 的值早于指定的日期和时间时，该策略会拒绝所有权限。`aws:TokenIssueTime` 的值对应于临时安全凭证的确切创建时间。`aws:TokenIssueTime` 值仅存在于使用临时安全凭证签署的 AWS 请求的上下文中，因此，该策略中的 Deny 语句不会影响使用该 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 编辑任何角色的描述。

有关哪些服务支持使用服务相关角色的信息，请参阅 [使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md) 并查找其在**服务相关角色**列中为**是**的服务。要了解服务是否支持编辑服务相关角色，请选择 **Yes** 链接以查看该服务的服务相关角色文档。

## 编辑服务相关角色描述（控制台）
<a name="edit-service-linked-role-iam-console"></a>

您可以使用 IAM 控制台编辑服务相关角色的描述。

**编辑服务相关角色的描述（控制台）**

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 以下代码示例显示如何将 IAM 策略附加到用户。

1. 在 **Role description** 的最右侧，选择 **Edit**。

1. 在框中输入新描述，然后选择 **Save（保存）**。

## 编辑服务相关角色描述 (AWS CLI)
<a name="edit-service-linked-role-iam-cli"></a>

您可以从 AWS CLI 使用 IAM 命令编辑服务相关角色的描述。

**更改服务相关角色描述 (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 指定为角色信任策略中的主体。提供计算资源（例如 Amazon EC2、Amazon ECS、Amazon EKS 和 Lambda）的 AWS 服务会提供临时凭证并自动更新这些凭证。这样可以确保您始终拥有一组有效的凭证。对于这些服务，无需重新代入当前角色即可获得临时凭证。但是，如果您需要传递 [会话标签](id_session-tags.md) 或者 [会话策略](access_policies.md#policies_session)，则需要重新代入当前角色。


## 更新角色信任策略（控制台）
<a name="id_roles_update-trust-policy-console"></a>

**更改 AWS 管理控制台 中的角色信任策略**

1. 登录 AWS 管理控制台，打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 在您的账户的角色列表中，选择要修改的角色的名称。

1. 选择 **Trust relationships**（信任关系）选项卡，然后选择 **Edit trust policy**（编辑信任策略）。

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. 请执行以下操作之一：
   + 要编辑某个客户 托管策略，请选择该策略的名称，选择**编辑策略**，然后选择 **JSON** 选项卡。您不能编辑 AWS 托管策略。AWS 托管策略随 AWS 图标 (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/policy_icon.png)) 一起显示。有关 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)*的权限策略。您可能能够修改依赖角色的服务中的权限策略。要检查服务是否支持此功能，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)并查找**服务相关角色**中列为**是**的服务。请选择**是**与查看该服务的服务关联角色文档的链接。

### 更新角色权限策略（控制台）
<a name="id_roles_update-role-permissions-policy-console"></a>

**更改角色允许的权限 (控制台)**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 选择要修改的角色的名称，然后选择**权限**选项卡。

1. 请执行以下操作之一：
   + 要编辑某个现有客户托管策略，请选择该策略的名称，然后选择 **Edit policy**。
**注意**  
您不能编辑 AWS 托管策略。AWS 托管策略随 AWS 图标 (![\[Orange cube icon indicating a policy is managed by AWS.\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/policy_icon.png)) 一起显示。有关 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)*的权限策略。您可能能够修改依赖角色的服务中的权限策略。要检查服务是否支持此功能，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)并查找**服务相关角色**中列为**是**的服务。请选择**是**与查看该服务的服务关联角色文档的链接。

**更改角色允许的权限 (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)*的权限策略。您可能能够修改依赖角色的服务中的权限策略。要检查服务是否支持此功能，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)并查找**服务相关角色**中列为**是**的服务。请选择**是**与查看该服务的服务关联角色文档的链接。

**更改角色允许的权限 (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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 选择具有您要更改的 [权限边界](access_policies_boundaries.md) 的角色名称。

1. 选择**权限**选项卡。如有必要，打开 **Permissions boundary**（权限边界）部分，然后选择 **Change boundary**（更改边界）。

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 管理控制台，打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 以下代码示例显示如何将 IAM 策略附加到用户。

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 管理控制台，打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在 IAM 控制台的导航窗格中，选择**角色**。

1. 以下代码示例显示如何将 IAM 策略附加到用户。

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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 查找要查看其活动的角色的行。您可以使用搜索字段缩小结果范围。查看**上一个活动**列以查看距离上次使用角色的天数。如果在跟踪周期内未使用该角色，则表将显示**无**。

1. 选择角色的名称可查看更多信息。角色的**摘要**页面还包括**上一个活动**，显示上次使用角色的日期。如果在过去 400 天内未使用该角色，则**上一个活动**中显示**在跟踪期间未被访问**。

**查看上次使用角色的时间 (AWS CLI)**  
`[aws iam get-role](https://docs.aws.amazon.com/cli/latest/reference/iam/get-role.html)` – 运行此命令返回有关角色的信息，包括 `RoleLastUsed` 对象。此对象包含上次使用角色的 `Region` 和 `LastUsedDate`。如果存在 `RoleLastUsed` 但不包含值，则在跟踪周期内未使用该角色。

**查看上次使用角色的时间 (AWS API)**  
`[GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/GetRole.html)` – 调用此操作以返回有关角色的信息，包括 `RoleLastUsed` 对象。此对象包含上次使用角色的 `Region` 和 `LastUsedDate`。如果存在 `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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**，然后选中要删除的角色旁的复选框。

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 管理控制台、适用于 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 控制台中创建角色，则除最长可达 64 个字符的 `RoleName` 外，您还可以选择添加最长 512 个字符的 `Path`。不过，如果您打算通过 AWS 管理控制台 中的 **Switch Role**（切换角色）功能使用角色，则组合的 `Path` 和 `RoleName` 不能超过 64 个字符。

用于代入角色的方法决定了谁可以代入该角色，以及角色会话可以持续多长时间。使用 `AssumeRole*` API 操作时，您所担任的 IAM 角色为资源。调用 `AssumeRole*` API 操作的用户或角色是主体。

下表比较了代入角色的方法。


|  担任角色的方法 |  **谁可以担任角色**  | **用于指定凭证生命周期的方法** |  **凭证生命周期 (最小值 \$1 最大值 \$1 默认值)**  | 
| --- | --- | --- | --- | 
| AWS 管理控制台 | 用户或角色¹（通过[切换角色](id_roles_use_switch-role-console.md)） | Role（角色）“Summary（摘要）”页面上的 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  | 用户或角色 | URL 中的 SessionDuration HTML 参数 | 15 分钟 \$1 12 小时 \$1 1 小时  | 
| 使用 [ 构造的](id_roles_providers_enable-console-custom-url.md)控制台 URLAssumeRoleWithSAML  | 使用 SAML 验证的任何用户 | URL 中的 SessionDuration HTML 参数 | 15 分钟 \$1 12 小时 \$1 1 小时 | 
| 使用 [ 构造的](id_roles_providers_enable-console-custom-url.md)控制台 URLAssumeRoleWithWebIdentity  | 使用 OIDC 提供者验证身份的任何用户 | URL 中的 SessionDuration HTML 参数 | 15 分钟 \$1 12 小时 \$1 1 小时  | 

¹ 使用一个角色的凭证代入其他角色称为[角色链](id_roles.md#iam-term-role-chaining)。使用角色链时，角色的会话持续时间限制为 1 小时。这适用于 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 小时（默认最多 12 小时）的 IAM 用户切换到该角色。可用角色会话持续时间为 2 小时。要了解如何查看您的角色的最大值，请参阅本页后面的[更新角色的最长会话持续时间](id_roles_update-role-settings.md#id_roles_update-session-duration)。

**备注**  
最大会话持续时间设置不限制 AWS 服务建立的会话。
Amazon EC2 IAM 角色凭证不受角色中配置的最长会话持续时间的限制。
要允许用户在角色会话中重新代入当前角色，请将角色 ARN 或 AWS 账户 ARN 指定为角色信任策略中的主体。提供计算资源（例如 Amazon EC2、Amazon ECS、Amazon EKS 和 Lambda）的 AWS 服务会提供临时凭证并自动更新这些凭证。这样可以确保您始终拥有一组有效的凭证。对于这些服务，无需重新代入当前角色即可获得临时凭证。但是，如果您需要传递 [会话标签](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 管理控制台中切换角色时，控制台总是使用您的原始凭证对切换操作进行授权。例如，如果您切换到角色 A，则 IAM 使用您的原始凭证确定是否允许您担任角色 A。如果随后*在使用角色 A* 时尝试切换到角色 B，AWS 仍会使用您的**原始**凭证对切换进行授权，而不是使用角色 A 的凭证。

**注意**  
当您以 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)。使用角色链时，无论为各个角色配置的最长会话持续时间设置如何，会话持续时间都限制为 1 小时。这适用于 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 登录 用户指南*》中的 [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 管理控制台入门指南》**中的[登录多个账户](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. （可选）您可以输入显示名称，并选择在控制台导航栏中突出显示该角色的显示颜色。
   + 对于**显示名称**，键入您希望在此角色处于活动状态时将在导航栏上显示，以替代您的用户名的文本。系统会基于账户和角色信息提供建议名称，但是您可以将它更改为对您有意义的任何名称。
   + 在**显示颜色**中，选择用于突出显示名称的颜色。

   名称和颜色可帮助提醒您此角色处于活动状态的时间，这将更改您的权限。例如，对于向您提供对测试环境的访问权限的角色，您可以将 **Display name**（显示名称）指定为 **Test**，并选择绿色的 **Color**（颜色）。对于向您授予对生产环境的访问权限的角色，您可以将 **Display name**（显示名称）指定为 **Production**，并选择红色作为 **Color**（颜色）。

1. 选择**切换角色**。显示名称和颜色会在导航栏上替换您的用户名，您可以开始使用角色向您授予的权限。

1. 完成需要 IAM 角色的任务之后，您可以切换回原始会话。这将移除该角色提供的其他权限，并使您恢复到标准权限。

   1. 在 IAM 控制台中，在右上角的导航栏中选择角色的 **Display Name**（显示名称）。

   1. 选择**切换回**。

      例如，假设您使用用户名 `123456789012` 登录账号 `Richard`。在使用 `admin-role` 角色后，您要停止使用该角色并返回到您的原始权限。要停止使用该角色，请选择 **admin-role @ 123456789012**，然后选择**切换回**。  
![\[平面定位“切换回”功能以停止使用 IAM 角色并返回原始用户。\]](http://docs.aws.amazon.com/zh_cn/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 命令。在以已使用角色的 [externally authenticated user](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) — 您还可以使用角色链，这将使用来自一个角色的权限访问另一个角色。

默认情况下，您的角色会话持续 1 小时。在使用 `assume-role*` CLI 操作担任该角色时，您可以为 `duration-seconds` 参数指定一个值。该值的范围在 900 秒 (15 分钟) 到角色的最大会话持续时间设置之间。如果您在控制台中切换角色，则会话持续时间最长为一小时。要了解如何查看您的角色的最大值，请参阅[更新角色的最长会话持续时间](id_roles_update-role-settings.md#id_roles_update-session-duration)。

如果使用角色链，您的会话持续时间限制为最多 1 小时。如果您随后使用 `duration-seconds` 参数提供大于 1 小时的值，操作将失败。

## 示例方案：切换到生产角色
<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` 的配置文件，它切换到 `123456789012` 账户中的 `ProductionAccessRole` 角色。您从创建该角色的账户管理员处获取角色 ARN。在调用此配置文件时，AWS CLI 使用 `source_profile` 的凭证请求该角色的凭证。因此，引用为 `source_profile` 的身份必须具有 `role_arn` 中指定的角色的 `sts:AssumeRole` 权限。

   ```
   [profile prodaccess]
       role_arn = arn:aws:iam::123456789012:role/ProductionAccessRole
       source_profile = default
   ```

1. 在创建新的配置文件后，将使用附加到 IAM 角色 `ProductionAccessRole`（而不是默认用户）的权限运行指定 `--profile prodaccess` 参数的任何 AWS CLI 命令。

   ```
   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"}
        }
    ]
}
```

------

要在 `222222222222` 账户中运行 AWS CLI 命令，您必须更新 CLI 配置文件。在 AWS CLI 配置文件中将 `efgh` 角色指定为“配置文件”，并将 `abcd` EC2 实例配置文件角色指定为“凭证源”。然后，将使用 `efgh` 角色的权限运行 CLI 命令，而不是使用原始 `abcd` 角色。

**注意**  
出于安全原因，您可以使用 AWS CloudTrail 审核角色在账户中的使用。要在 CloudTrail 日志中由不同主体使用角色时区分角色会话，可以借助角色会话名称。在 AWS CLI 按照本主题所述代表用户担任某个角色时，将自动创建一个 `AWS-CLI-session-nnnnnnnn` 形式的角色会话名称。其中，*nnnnnnnn* 是一个表示 [Unix 纪元时间](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` 配置文件，它切换到 `222222222222` 账户中的 `efgh` 角色。在调用该配置文件时，AWS CLI 使用 EC2 实例配置文件元数据的凭证请求该角色的凭证。因此，EC2 实例配置文件角色必须具有 `role_arn` 中指定的角色的 `sts:AssumeRole` 权限。

   ```
   [profile instancecrossaccount]
   role_arn = arn:aws:iam::222222222222:role/efgh
   credential_source = Ec2InstanceMetadata
   ```

1. 在创建新的配置文件后，将使用附加到 `222222222222` 账户中的 `efgh` 角色的权限运行指定 `--profile instancecrossaccount` 参数的任何 AWS CLI 命令。

   ```
   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，这会将新角色的 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_cn/IAM/latest/UserGuide/images/role_passed_policy_permissions.png)


在以 IAM 用户或已使用角色的 [externally authenticated user](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 账户根用户身份登录时，您无法担任角色。

默认情况下，您的角色会话持续 1 小时。在使用 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)。

如果使用角色链，您的会话限制为最多 1 小时。如果您随后使用 `DurationSeconds` 参数提供大于 1 小时的值，操作将失败。

**注意**  
为了安全起见，管理员可以[查看 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 ]

**适用于 Go 的 SDK 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 Reference》**中的以下主题。
  + [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 ]

**适用于 Java 的 SDK 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 Reference》**中的以下主题。
  + [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 Reference》**中的以下主题。
  + [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 ]

**适用于 Kotlin 的 SDK**  
 查看 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 ]

**适用于 PHP 的 SDK**  
 查看 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 ]

**适用于 Python 的 SDK（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 ]

**适用于 Ruby 的 SDK**  
 查看 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 Reference》**中的以下主题。
  + [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 ]

**适用于 Rust 的 SDK**  
 查看 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 凭证包含在其 AWS API 请求中。您可以让开发人员将 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 最佳实践指南》中的 [Using IAM roles with Amazon ECS tasks](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_cn/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 开发工具包的文档介绍该软件开发工具包支持的凭证管理功能。）

   应用程序也可以直接从 Amazon EC2 实例的实例元数据中获取临时凭证。凭证和相关值可从元数据的 `iam/security-credentials/role-name` 类别（在本例中为 `iam/security-credentials/Get-pics`）获得。如果应用程序从实例元数据获取凭证，则它可对凭证进行缓存。

1. 通过使用检索到的临时凭证，应用程序可以访问照片存储桶。由于附加到 **Get-pics** 角色的策略，应用程序具有只读权限。

   实例上提供的临时安全凭证会在过期之前自动更新，因此始终具有有效的凭证集。应用程序只需要确保在当前凭证过期之前从实例元数据获取新的凭证集。可以使用 AWS 开发工具包管理凭证，这样应用程序就不需要包含额外的逻辑来刷新凭证。例如，使用实例配置文件凭证提供程序实例化客户端。但是，如果应用程序从实例元数据获取临时安全凭证并对它们进行缓存，则它应在当前凭证集过期之前，每隔一小时 (或至少每隔 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_cn/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 演示。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 开发人员指南》**中的[使用 SDK for .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 实例的角色的更多信息，请参阅以下信息：
+ 有关[将 IAM 角色与 Amazon EC2 实例结合使用](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 用户指南*》中的[通过实例元数据检索安全凭证](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 用户指南》**中的[适用于 Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

## 管理实例配置文件（控制台）
<a name="instance-profiles-manage-console"></a>

如果使用 AWS 管理控制台 创建 Amazon EC2 的角色，则控制台自动创建实例配置文件，将其命名为与角色相同的名称。当您随后通过 IAM 角色使用 Amazon EC2 控制台启动实例时，可以选择一个角色与该实例关联。在控制台中，显示的列表实际上是实例配置文件名称的列表。控制台不会为不与 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 角色，不过一个角色可以包含在多个实例配置文件中。不能提高每个实例配置文件一个角色这一限制。您可以删除实例配置文件中的现有角色，然后添加另一角色。由于[最终一致性](https://en.wikipedia.org/wiki/Eventual_consistency)，您必须等待此更改在整个 AWS 中出现。要强制进行更改，您必须[取消关联实例配置文件](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 资源，而不是在您的 AWS 账户 中创建单独的 IAM 用户。利用身份提供程序 (IdP)，您可以管理 AWS 外部的用户身份，并向这些外部用户身份授予使用您账户中的 AWS 资源的权限。如果您的组织已有自己的身份系统（如企业用户目录），这将十分有用。如果要创建需要访问 AWS 资源的移动应用程序或 Web 应用程序，这也十分有用。

**注意**  
您还可以使用外部 SAML 身份提供商在 [IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/what-is.html) 中管理人类用户，而不是在 IAM 中使用 SAML 联合身份验证。IAM Identity Center 与身份提供商的联合身份验证使您能够允许人员访问组织中的多个 AWS 账户和多个 AWS 应用程序。要了解需要使用 IAM 用户的特定情况，请参阅 [何时创建 IAM 用户（而非角色）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html#id_which-to-choose)。

如果您喜欢在不启用 IAM Identity Center 的情况下使用单个 AWS 账户，则可以将 IAM 与外部 IdP 结合使用，后者会使用 [OpenID Connect（OIDC）](http://openid.net/connect/)或 [SAML 2.0（安全断言标记语言 2.0）](https://wiki.oasis-open.org/security)向 AWS 提供身份信息。OIDC 将不在 AWS 上运行的应用程序（例如 GitHub Actions）连接到 AWS 资源。知名的 SAML 身份提供者的示例如 Shibboleth 和 Active Directory 联合身份验证服务。

使用身份提供商时，您不必创建自定义登录代码或管理自己的用户身份。IdP 将向您提供它们。您的外部用户通过 IdP 登录，您可以向这些外部身份授予使用您的账户中的 AWS 资源的权限。身份提供者可帮助您确保 AWS 账户 的安全，因为您不必再在应用程序中分配或嵌入长期安全凭证（如访问密钥）。

查看下表，以帮助确定哪种 IAM 联合身份验证类型最适合您的使用案例：IAM、IAM Identity Center 还是 Amazon Cognito。以下摘要和表格概述了您的用户可以用来获得对 AWS 资源的联合访问权限的方法。


| IAM 联合身份验证类型 | 账户类型 | 对……的访问管理 | 支持的身份源 | 
| --- | --- | --- | --- | 
|  使用 IAM Identity Center 的联合身份验证  |  由 AWS Organizations 管理的多个账户  |  您的人力的人类用户  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles_providers.html)  | 
|  使用 IAM 的联合身份验证  |  单一独立账户  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles_providers.html)  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/id_roles_providers.html)  | 
|  使用 Amazon Cognito 身份池的联合身份验证  |  任何  |  需要 IAM 授权才能访问资源的应用程序的用户  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/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，您可以将用户属性（例如成本中心、职务或区域设置）从您的 IdP 传递给 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，您需要创建 IAM 身份提供者实体，以在您的 AWS 账户 和 IdP 之间建立信任关系。IAM 支持与 [OpenID Connect (OIDC)](http://openid.net/connect/) 或者 [SAML 2.0 (Security Assertion Markup Language 2.0)](https://wiki.oasis-open.org/security) 兼容的 IdPs。有关通过 AWS 使用这些 IdP 之一的更多信息，请参阅以下部分：
+ [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 可以使用 OpenID Connect（OIDC）或安全断言标记语言（SAML）向 AWS 提供身份信息。OIDC 通常在不在 AWS 上运行的应用程序需要访问 AWS 资源时使用。

如果要使用外部 IdP 配置联合身份验证，可以创建 IAM *身份提供商*，以将外部 IdP 及其配置告知 AWS。这样将在您的 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 首先向她选择的 IdP 注册一个开发人员 ID。她还按其中某个提供商的要求配置该应用程序。在她的包含该游戏的 Amazon S3 存储桶和 DynamoDB 表的 AWS 账户 中，Adele 使用 Amazon Cognito 创建了精确定义该游戏所需权限的 IAM 角色。如果她使用的是 OIDC IdP，她还可创建 IAM OIDC 身份提供商实体以在其 AWS 账户 中的 [Amazon Cognito 身份池](https://docs.aws.amazon.com/cognito/latest/developerguide/external-identity-providers.html)和该 IdP 之间建立信任关系。

在应用程序的代码中，Adele 调用其先前配置的 IdP 的登录接口。IdP 处理让用户登录的所有详细信息，然后应用程序从提供商那里获得 OAuth 访问令牌或 OIDC ID 令牌。Adele 的应用程序可使用此身份验证信息换取一组临时安全凭证 (包括 AWS 访问密钥 ID、私有访问密钥和会话令牌)。然后，应用程序可以使用这些凭证访问 AWS 提供的 Web 服务。该应用程序仅获得在其担任的角色中定义的权限。

下图以 Login with Amazon 作为 IdP，展示此过程运行方式的简化流程。对于步骤 2，该应用程序还可以使用 Facebook、Google 或任何与 OIDC 兼容的 IdP，但此处不进行说明。

![\[使用 Amazon Cognito 为移动应用程序用户进行联合身份验证的示例工作流\]](http://docs.aws.amazon.com/zh_cn/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 ID 令牌交换成 Amazon Cognito 令牌。Amazon Cognito 已配置为信任 Login with Amazon 项目，它会生成一个令牌，用于与 AWS STS 交换临时会话凭证。

1. 该应用程序从 Amazon Cognito 接收临时安全凭证。您的应用程序还可使用 Amazon Cognito 中的基本（经典）工作流程，通过 `AssumeRoleWithWebIdentity` 从 AWS STS 中检索令牌。有关更多信息，请参阅《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 将创建一个或两个定义 Amazon Cognito 用户的权限的 IAM 角色（一个角色针对经过身份验证的身份，另一个角色针对未经身份验证的“来宾”身份）。

1. 将 [AWS](https://docs.amplify.aws) Amplify 与您的应用程序集成，然后导入使用 Amazon Cognito 所需的文件。

1. 创建一个 Amazon Cognito 凭证提供程序实例，并传递身份池 ID、您的 AWS 账户 账号，以及与身份池关联的角色的 Amazon 资源名称（ARN）。AWS 管理控制台 中的 Amazon Cognito 向导提供了可帮助您入门的示例代码。

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>

为获得最佳效果，请在几乎所有 OIDC 联合身份验证场景中将 Amazon Cognito 用作身份凭证代理程序。Amazon Cognito 易于使用，并提供了额外功能，如匿名（未经身份验证的）访问，以及跨设备和提供商同步用户数据。但是，如果您已通过手动调用 `AssumeRoleWithWebIdentity` API 创建了使用 OIDC 联合身份验证的应用程序，也可继续使用它，您的应用程序仍能正常工作。

在***不*** 使用 Amazon Cognito 的情况下使用 OIDC 联合身份验证的过程遵循此概要：

1. 以开发人员身份注册到外部身份提供程序 (IdP)，然后使用向您提供应用程序的唯一 ID 的 IdP 来配置您的应用程序。（不同的 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 身份提供程序，请勿在 AWS 管理控制台 中创建单独的 IAM 身份提供程序，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 公开的内容和用户愿意共享的信息。可在应用程序中使用这些信息。

1. 在应用程序中，对 * 操作进行*未签名 `AssumeRoleWithWebIdentity` 调用以请求临时安全凭证。在该请求中，传递 IdP 的身份验证令牌，然后指定为该 IdP 创建的 IAM 角色的 Amazon Resource Name (ARN)。AWS 将验证令牌是否可信和有效，如果是这样，则会将临时安全凭证返回到具有从您在请求中命名的角色的权限的应用程序。响应中还包括来自 IdP 的用户相关元数据，例如，IdP 将其与用户关联的唯一用户 ID。

1. 通过使用来自 `AssumeRoleWithWebIdentity` 响应的临时安全凭证，应用程序向 AWS API 操作发出已签名的请求。IdP 中的用户 ID 信息可以区分您的应用程序中的用户。例如，您可以将对象放入 Amazon S3 文件夹中，其包含用户 ID 作为前缀或后缀。这样可创建锁定该文件夹的访问控制策略，以使仅具有该 ID 的用户能够访问该文件夹。有关更多信息，请参阅 [AWS STS 联合用户主体](reference_policies_elements_principal.md#sts-session-principals)。

1. 您的应用程序应缓存临时安全凭证，这样您就不需要每次在应用程序需要对 AWS 发出请求时获取新凭证。默认情况下，证书的有效期为 1 小时。当凭证到期时 (或在此之前)，再次调用 `AssumeRoleWithWebIdentity` 以获取新的一组临时安全凭证。根据 IdP 及其管理其令牌的方式，可能必须先刷新 IdP 的令牌，然后再对 `AssumeRoleWithWebIdentity` 进行新的调用，因为 IdP 的令牌通常也在固定的一定时间后到期。如果使用的是 AWS SDK for iOS 或 AWS SDK for Android，则可使用 [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 Actions。

当您使用这些工作流时，将向必须使用 AWS 访问密钥进行签名的 AWS 服务提出请求。但是，我们**强烈**建议您**不要**将 AWS 凭证长期存储在 AWS 之外的应用程序中。相反，使用 *OIDC 联合身份验证*将应用程序配置为在需要时动态请求临时 AWS 安全凭证。提供的临时凭证会映射到一个 AWS 角色，该角色将只拥有执行该应用程序所需任务的必要权限。

借助 OIDC 联合身份验证，您不需要创建自定义登录代码或管理自己的用户身份。相反，您可以在应用程序（例如 GitHub Actions 或任何其他兼容 [OpenID Connect（OIDC）](http://openid.net/connect/)的 IdP）中使用 OIDC 进行 AWS 身份验证。他们会接收身份验证令牌（称为 JSON Web 令牌，JWT），然后用该令牌交换 AWS 中的临时安全凭证，这些凭证映射到有权使用您 AWS 账户 中资源的 IAM 角色。使用 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` 声明中包含指定令牌何时过期的过期时间。在 [OpenID Connect (OIDC) Core 1.0 标准](https://openid.net/specs/openid-connect-core-1_0.html)允许的情况下，IAM 在 JWT 中指定的到期时间之外提供五分钟的时段来解决时钟偏差。这意味着将接受 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 中的一个实体，它没有自己的凭证（与用户一样）。但在此上下文中，角色将动态分配给由组织的 IdP 验证的 OIDC 联合主体。该角色允许组织的 IdP 请求临时安全凭证以便访问 AWS。分配给该角色的策略决定了用户可在 AWS 中执行的操作。要为第三方身份提供程序创建角色，请参阅 [为第三方身份提供者创建角色](id_roles_create_for-idp.md)。

**重要**  
为支持 `oidc-provider` 资源的操作配置基于身份的策略时，IAM 会评估完整的 OIDC 身份提供者 URL，包括任何指定的路径。如果 OIDC 身份提供者 URL 包含路径，则必须将该路径作为 `Resource` 元素值包含在 `oidc-provider` ARN 中。您还可以选择将正斜杠和通配符（`/*`）附加到 URL 域，或者在 URL 路径中的任何位置使用通配符（`*` 和 `?`）。如果请求中的 OIDC 身份提供者 URL 与策略中 `Resource` 元素设置的值不匹配，请求将会失败。

要解决有关 IAM OIDC 联合身份验证的常见问题，请参阅 AWS re:Post 上的[解决与 OIDC 相关的错误](https://repost.aws/knowledge-center/iam-oidc-idp-federation)。

**Topics**
+ [先决条件：验证身份提供商的配置](#manage-oidc-provider-prerequisites)
+ [创建和管理 OIDC 提供商（控制台）](#manage-oidc-provider-console)
+ [创建和管理 IAM OIDC 身份提供程序 (AWS CLI)](#manage-oidc-provider-cli)
+ [创建和管理 OIDC 身份提供程序 (AWS API)](#manage-oidc-provider-api)

## 先决条件：验证身份提供商的配置
<a name="manage-oidc-provider-prerequisites"></a>

在创建 IAM OIDC 身份提供商之前，您必须从 IdP 处获得以下信息。有关获取 OIDC 提供商配置信息的更多信息，请参阅 IdP 的文档。

1. 确定您的 OIDC 身份提供商的公开可用 URL。该 URL 必须以 https:// 开头。根据 OIDC 标准，允许使用路径组件，但不允许使用查询参数。通常，该 URL 只包含一个主机名，如 https://server.example.org 或 https://example.com。URL 不应包含端口号。

1. 在 OIDC 身份提供商的 URL 末尾添加 **/.well-known/openid-configuration**，以查看该提供商的公开可用配置文档和元数据。您必须有一个 JSON 格式的发现文档，其中包含提供商的配置文档和元数据，这些文档和元数据可以从 [OpenID Connect 提供商发现端点 URL](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfig) 中检索。

1. 确认以下值包含在提供商的配置信息中。如果 openid 配置缺少这些字段中的任何一个，则必须更新发现文档。此过程可能因身份提供商而异，因此请按照 IdP 文档完成此任务。
   + issuer：域的 URL。
   + jwks\$1uri：IAM 获取公钥的 JSON Web 密钥集 (JWKS) 端点。您的身份提供商必须在 openid 配置中包含一个 JSON Web 密钥集 (JWKS) 端点。此 URI 定义了从何处获取用于验证来自身份提供商的签名令牌的公钥。
**注意**  
JSON Web 密钥集 (JWKS) 必须至少包含一个密钥，最多可以有 100 个 RSA 密钥和 100 个 EC 密钥。如果 OIDC 身份提供商的 JWKS 中包含超过 100 个 RSA 密钥或 100 个 EC 密钥，则在搭配使用 [AssumeRolewithEbidentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API 操作以及由超过 100 个密钥限制的密钥类型签名的 JWT 时，将返回 `InvalidIdentityToken` 异常。例如，如果 JWT 使用 RSA 算法进行签名，而提供商的 JWKS 中含有超过 100 个 RSA 密钥，则会返回 `InvalidIdentityToken` 异常。
   + claims\$1supported：有关用户的信息，可帮助确保来自 IdP 的 OIDC 身份验证响应包含 IAM 策略中 AWS 用于检查 OIDC 联合主体的必需属性。有关可用于声明的 IAM 条件键的列表，请参阅 [AWS OIDC 联合身份验证的可用键](reference_policies_iam-condition-keys.md#condition-keys-wif)。
     + aud：必须在 JSON Web 令牌 (JWT) 中确定 IdP 发布的受众声明值。受众 (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：public
   + id\$1tokeninging\$1alg\$1values\$1suirted：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 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 AWS 将回退到指纹验证。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序），然后选择 **Add provider**（添加提供商）。

1. 对于 **Configure provider**（配置提供商），选择 **OpenID Connect**。

1. 对于 **Provider URL**，键入 IdP 的 URL。该 URL 必须遵从以下限制：
   + 该 URL 区分大小写。
   + URL 必须以 **https://** 开头。
   + URL 不应包含端口号。
   + 在您的 AWS 账户 中，每个 IAM OIDC 身份提供程序都必须有唯一的 URL。如果尝试提交的 URL 已用于 AWS 账户 中的 OpenID Connect 提供商，则会出现错误。

1. 对于 **Audience**，键入您向 IdP 注册的、在[Step 1](#idpoidcstep1) 中接收的并且将向 AWS 发出请求的应用程序的客户端 ID。如果您对于此 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 Series 网站上的 [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 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 IdP 配置中设置的指纹来保护通信。如果我们无法检索 TLS 证书或需要 TLS v1.3，则 AWS 将回退到指纹验证。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 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 注册的、在 [Step 1](#idpoidcstep1) 中接收的并且将向 AWS 发出请求的应用程序的客户端 ID。然后选择 **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. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 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)**

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 身份提供程序中添加新的客户端 ID，请运行以下命令：
   + [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 身份提供程序 (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 提供商中添加或删除客户端 ID (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 身份提供程序中添加新的客户端 ID，请调用以下操作：
   + [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 需要对外部身份提供者（IdP）使用的证书进行签名的顶级中间证书颁发机构（CA）的指纹。该指纹是用于为 OIDC 兼容 IdP 颁发证书的 CA 证书的签名。在创建 IAM OIDC 身份提供程序时，您信任该 IdP 验证的身份有权访问您的 AWS 账户。通过使用 CA 的证书指纹，您信任该 CA 颁发的任何证书，并且其 DNS 名称与注册的名称相同。这样，在续订 IdP 的签名证书时，无需在每个账户中更新信任关系。

**重要**  
在大多数情况下，联合身份验证服务器使用两个不同的证书：  
第一个证书将在 AWS 与您的 IdP 之间建立 HTTPS 连接。这应由已知公有根 CA（如 AWS Certificate Manager）发布。这使客户端能够检查证书的可靠性和状态。
第二个证书将用于加密令牌，且应由私有或公有*根* CA 签署。

您可以使用 [AWS Command Line Interface、Tools for Windows PowerShell 或 IAM API](id_roles_providers_create_oidc.md#manage-oidc-provider-cli) 创建一个 IAM OIDC 身份提供程序。使用这些方法时，您可以选择手动提供指纹。如果您选择不包含指纹，IAM 将检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。如果您选择包含指纹，则必须手动获取指纹并将它提供给 AWS。

当您使用 [IAM 控制台](id_roles_providers_create_oidc.md)创建 OIDC 身份提供者时，IAM 会尝试为您检索 OIDC IdP 服务器证书的顶级中间 CA 指纹。

此外，建议您手动获取 OIDC IdP 的指纹，并验证 IAM 是否检索了正确的指纹。有关获取证书指纹的更多信息，请参阅以下部分：

**注意**  
AWS 使用我们的受信任根证书颁发机构（CA）库来保护与 OIDC 身份提供者（IdP）之间的通信，从而验证JSON Web 密钥集（JWKS）端点的 TLS 证书。如果您的 OIDC IdP 依赖的证书不是由其中某个受信任的 CA 签名，则仅在此时我们会使用 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 Series 网站上的 [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：源、Tarball](https://openssl.org/source/) (https://openssl.org/source/)。

1. 下载最新源并构建包。

**如要在 Windows 系统上安装 OpenSSL**

1. 转到 [OpenSSL：二进制分布](https://wiki.openssl.org/index.php/Binaries) (https://wiki.openssl.org/index.php/Binaries)，了解您可以从中安装 Windows 版本的站点列表。

1. 按照所选站点上的说明开始安装。

1. 如果系统要求您安装 **Microsoft Visual C\$1\$1 2008 Redistributables** 并且该程序尚未安装在您的系统上，请选择适合您环境的下载链接。按照 **Microsoft Visual C\$1\$1 2008 Redistributable 安装向导**中的说明操作。
**注意**  
如果您不确定您的系统上是否已安装 Microsoft Visual C\$1\$1 2008 Redistributables，则可以尝试先安装 OpenSSL。如果尚未安装 Microsoft Visual C\$1\$1 2008 Redistributables，OpenSSL 安装程序将显示提示。请确保安装与您安装的 OpenSSL 版本匹配的体系架构（32 位或 64 位）。

1. 在安装 Microsoft Visual C\$1\$1 2008 Redistributables 后，为您的环境选择适当的 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. 打开 **Command Prompt**（命令提示符窗口）。

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
   ```
**注意**  
通过 **Command Prompt**（命令提示符）对 Windows 环境变量所做的任何更改只对当前的命令行会话有效。您可以通过将环境变量设置为系统属性来对其进行持久性更改。确切的流程取决于您使用的 Windows 版本。（例如，在 Windows 7 中，打开 **Control Panel**（控制面板）、**System and Security**（系统和安全性）、**System**（系统）。然后选择 **Advanced system settings**（高级系统设置）、**Advanced**（高级）选项卡，**Environment Variables**（环境变量）。） 有关更多信息，请参阅 Windows 文档。

# 适用于共享 OIDC 提供者的身份提供者控制
<a name="id_roles_providers_oidc_secure-by-default"></a>

对于公认的共享 OpenID Connect（OIDC）身份提供者（IdP），IAM 要求对角色信任策略中的特定声明进行明确评估。这些必需的声明名为*身份提供者控制*，由 IAM 在角色创建和信任策略更新期间进行评估。如果角色信任策略未对共享 OIDC IdP 所需的控制进行评估，则角色创建或更新将失败。这样可以确保，只有预期组织的授权身份才能代入角色和访问 AWS 资源。这种安全控制在多个 AWS 客户共享 OIDC 提供者时至关重要。



IAM 不会针对现有 OIDC 角色信任策略对身份提供者控制进行评估。对于针对现有 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 提供者 | 
| --- | --- | --- | 
|  Issuer  |  归组织独有  |  在多个组织之间共享  | 
|  租赁信息  |  通过唯一的颁发者进行沟通  |  通过 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 操作](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 审核日志流式传输](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_cn/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_cn/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 全局端点](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)支持联合身份验证，SAML 2.0 是许多身份验证提供商 (IdP) 使用的一种开放标准。此功能可实现联合单点登录（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 的联合身份验证来对 AWS 进行 API 访问](#CreatingSAML-configuring)
+ [配置基于 SAML 2.0 的联合身份验证的概述](#CreatingSAML-configuring-IdP)
+ [用于允许对 AWS 资源进行 SAML 联合访问的角色的概述](#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 的联合身份验证来对 AWS 进行 API 访问
<a name="CreatingSAML-configuring"></a>

假设您想要为员工提供一种将数据从他们的计算机中复制到备份文件夹的方法。您可以构建一个可在用户的计算机上运行的应用程序。在后端，该应用程序可在 Amazon S3 存储桶中读写对象。用户没有直接访问 AWS 的权限。而应使用以下过程：

![\[获得基于 SAML 断言的临时安全证书\]](http://docs.aws.amazon.com/zh_cn/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>

在使用前面方案和图表中所述的基于 SAML 2.0 的联合身份验证之前，您必须先配置组织的 IdP 和您的 AWS 账户，使之相互信任。以下步骤介绍了用于配置此信任的一般过程。组织内部必须有[支持 SAML 2.0 的 IdP](id_roles_providers_saml_3rd-party.md)，例如 Microsoft Active Directory 联合身份验证服务 (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. 将 AWS 注册为您组织的 IdP 的服务提供商（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 元数据互操作性配置文件 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 身份提供商。在此过程中，您将上传 SAML 元数据文档和私有解密密钥，这些文档和私有解密密钥是由贵组织中的 IdP 在 [Step 2](#createxml) 中生成的。有关更多信息，请参阅 [在 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，将其传递给您在[Step 3](#samlovrcreateentity) 中创建的 SAML 提供商的 ARN、您在[Step 4](#samlovrcreaterole) 中创建的要代入的角色的 ARN 以及从您的 IdP 处获取的有关当前用户的 SAML 断言。AWS 确保代入角色的请求来自 SAML 提供商所引用的 IdP。

   有关更多信息，请参阅[https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html) API 参考*中的 AWS Security Token ServiceAssumeRoleWithSAML*。

1. 如果请求成功，API 会返回一组临时安全凭证，您的应用程序即可用其向 AWS 发出已签名的请求。您的应用程序具有有关当前用户的信息并可访问 Amazon S3 中用户特定的文件夹，如上一方案中所述。

## 用于允许对 AWS 资源进行 SAML 联合访问的角色的概述
<a name="CreatingSAML-configuring-role"></a>

您在 IAM 中创建的角色将确定您组织中的 SAML 联合主体在 AWS 中允许执行的操作。当您为角色创建信任策略时，您可以将先前创建的 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 必须与您的身份提供者的收件人属性相匹配。您可以添加特定区域内的登录 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 包含要求在登录路径后附加 /acs/ 的 IdP 唯一标识符。

`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 控制台或 AWS CLI 创建存储桶 (`amzn-s3-demo-bucket`) 和文件夹 (`app1`)，因为这些都是静态值。但是，用户特定文件夹（*user1*、*user2*、*user3* 等）必须在运行时使用代码创建，因为在用户首次通过联合流程登录之前，用来标识用户的值是未知的。

要编写在资源名称中引用特定于用户的详细信息的策略，必须在可以用于策略条件的 SAML 密钥中提供用户身份。以下密钥可用于基于 SAML 2.0 的联合身份验证，以便在 IAM policy 中使用。您可以使用以下键返回的值为资源 (如 Amazon S3 文件夹) 创建唯一的用户标识符。
+ `saml:namequalifier`. 哈希值，基于 `Issuer` 响应值 (`saml:iss`)、包含 `AWS` 账户 ID 的字符串和 IAM 中 SAML 提供商的友好名称（ARN 的最后一部分）的串联。账户 ID 与 SAML 提供商的易记名称的串联可作为键 `saml:doc` 供 IAM policy 使用。账户 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` 代表生成哈希输出的 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`（字符串）。这是该陈述的主题，其中包含唯一标识组织中某个用户的值 (例如 `_cbb88bf52c2510eabe00c1642d4643f41430fe25e3`)。
+ `saml:sub_type`（字符串）。此键可以是 `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) 服务。如果您希望在与 SAML 兼容的 IdP（例如 Shibboleth 或 Active Directory 联合身份验证服务）和 AWS 之间建立信任，以便企业中的用户能够访问 AWS 资源，则需要使用 IAM 身份提供者。IAM SAML 身份提供程序用作 IAM 信任策略中的主体。

有关此方案的更多信息，请参阅[SAML 2.0 联合身份验证](id_roles_providers_saml.md)。

您可以在 AWS 管理控制台 中或通过使用 AWS CLI、Tools for Windows PowerShell 或 AWS API 调用，创建和管理 IAM 身份提供程序。

创建 SAML 提供商后，必须创建一个或多个 IAM 角色。角色是 AWS 中的一个实体，它没有自己的凭证（与用户一样）。但在此情况下，角色将动态分配给由 IdP 验证的 SAML 联合主体。该角色允许您的 IdP 请求临时安全凭证以便访问 AWS。分配给该角色的策略决定了用户可在 AWS 中执行的操作。要创建用于 SAML 联合的角色，请参阅[为第三方身份提供者创建角色](id_roles_create_for-idp.md)。

最后，在创建角色后，您可通过配置包含有关 AWS 的信息的 IdP 以及希望 SAML 联合主体使用的角色来完成 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>

在创建 SAML 身份提供商之前，您必须从 IdP 处获得以下信息。
+ 从 IdP 中获取 SAML 元数据文档。此文档包括发布者名称、过期信息以及可用来验证从 IdP 处收到的 SAML 身份验证响应（断言）的密钥。要生成元数据文档，请使用外部 IdP 提供的身份管理软件。
**重要**  
此元数据文件包括颁发者名称、过期信息以及可用来验证从 IdP 处收到的 SAML 身份验证响应 (断言) 的密钥。元数据文件必须采用不含字节顺序标记 (BOM) 的 UTF-8 格式编码。要删除 BOM，您可以使用 Notepad\$1\$1 等文本编辑工具以 UTF-8 格式对文件进行编码。  
作为 SAML 元数据文档的一部分，X.509 证书必须使用长度至少为 1024 位的密钥。此外，X.509 证书也不能有任何重复的扩展名。您可以使用扩展程序，但扩展程序只能在证书中显示一次。如果 X.509 证书不符合任一条件，则 IdP 将创建失败，并返回“Unable to parse metadata”这一错误消息。  
如 [SAML V2.0 元数据互操作性配置文件 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 提供的证书进行加密的断言。

有关如何配置许多可用 IdP 以使用 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **Identity providers**（身份提供程序）。

1. 选中要删除的身份提供程序旁边的单选按钮。

1. 选择**删除**。此时会打开一个新窗口。

1. 通过在字段中键入 `delete` 一词以确认您要删除此提供商。然后选择 **Delete**(删除)。

## 管理 SAML 加密密钥
<a name="id_federation_manage-saml-encryption"></a>

您可以将 IAM SAML 提供商配置为在来自外部 IdP 的 SAML 响应中接收加密断言。用户可以通过调用 `[sts:AssumeRoleWithSAML](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithSAML.html)` 来使用加密的 SAML 断言在 AWS 中代入角色。

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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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)**

您可以更新 IAM SAML 提供商的元数据文件、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)**

您可以更新 IAM SAML 提供商的元数据文件、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>

当您创建 IAM 身份提供程序和用于 SAML 访问的角色时，您实际上将告知 AWS 关于外部身份提供程序 (IdP) 的信息以及允许其用户执行的操作。下一步是让 IdP 知道 AWS 作为服务提供商。这称为在 IdP 和 AWS 之间添加*依赖方信托*。添加信赖方信任的具体步骤取决于您使用的 IdP。有关详细信息，请参阅身份管理软件对应的文档。

许多 IdP 允许指定一个 URL，他们可从中读取包含信赖方信息和证书的 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 软件。

您还需要在指定 AWS 作为信赖方的 IdP 中，创建相应的声明规则。当 IdP 向 AWS 终端节点发送 SAML 响应时，它包括具有一个或多个*索赔* 的 SAML *断言*。断言是有关用户及其组的信息。断言规则将该信息映射到 SAML 属性中。这可确保来自 IdP 的 SAML 身份验证响应包含 IAM 策略中 AWS 用于检查 SAML 联合主体权限的必要属性。有关更多信息，请参阅以下主题：
+  [用于允许对 AWS 资源进行 SAML 联合访问的角色的概述](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 Support 工程师可以帮助有商业和企业支持计划的客户完成涉及第三方软件的一些集成任务。有关受支持的平台和应用程序的最新列表，请参阅《AWS Support 常见问题》中的[支持哪些第三方软件？](https://aws.amazon.com/premiumsupport/faqs/#what3rdParty)。


****  

| 解决方案 | 更多信息 | 
| --- | --- | 
| Auth0 |  [与 Amazon Web Services 集成](https://auth0.com/docs/integrations/aws) – Auth0 文档网站上的此页面包含了介绍如何使用 AWS 管理控制台 来设置单点登录（SSO）的资源的链接，并提供了一个 JavaScript 示例。您可以配置 Auth0 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [Auth0 宣布与 AWS 合作开发 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 | [Configure Centrify and Use SAML for SSO to AWS](https://docs.centrify.com/Content/Applications/AppsWeb/AmazonSAML.htm)（配置 Centrify 并对亚马逊云科技使用 SAML SSO）- 此 Centrify 网站页面说明如何配置 Centrify 以对 AWS 使用 SAML SSO。 | 
| CyberArk | 配置 [CyberArk](https://docs.cyberark.com/Product-Doc/OnlineHelp/Idaptive/Latest/en/Content/Applications/AppsWeb/AmazonSAML.htm)，以便为从 CyberArk 用户门户通过 SAML 单点登录(SSO)登入的用户提供 Amazon Web Services (AWS) 访问。 | 
| 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 站点的文章描述了如何将 Google Workspace 配置为 SAML 2.0 IdP，并使用 AWS 作为服务提供程序。 | 
| 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 单点登录（SSO）授予通过 IAM 角色进行访问的权限AWS](https://support.jumpcloud.com/support/s/article/Granting-Access-via-IAM-Roles-for-Single-Sign-On-SSO-with-Amazon-AWS) – 这篇有关 JumpCloud 网站的文章将描述如何为 AWS 设置与启用基于 IAM 角色的 SSO。 | 
| Matrix42 | [MyWorkspace 入门指南](https://myworkspace.matrix42.com/documents/MyWorkspace-Getting-Started-with-AWS.pdf) - 本指南介绍如何将 AWS 身份服务与 Matrix42 MyWorkspace 集成。 | 
| Microsoft Active Directory 联合身份验证服务 (AD FS) |  [现场记录：将 Active Directory 联合身份验证服务与 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 Command Line Interface](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 网站上的此部分介绍如何为 AWS 设置和启用 IAM Identity Center。 | 
| OneLogin | 从 [OneLogin 知识库](https://onelogin.service-now.com/support)中，搜索 SAML AWS 以获取文章列表，这些文章介绍了如何在 OneLogin 与 AWS 之间设置 IAM Identity Center 功能，以实现单角色和多角色方案。您可以配置 OneLogin 来传递[会话标签](id_session-tags.md)。有关更多信息，请参阅 [OneLogin 和会话标签：AWS 资源的基于属性的访问控制](https://www.onelogin.com/blog/aws-session-tags-integration)。 | 
| Ping Identity |  [PingFederate AWS Connector](https://support.pingidentity.com/s/marketplace-integration-details?recordId=a7i1W0000004HBwQAM) – 查看有关 PingFederate AWS Connector 的详细信息，快速连接模板来轻松设置单点登录 (SSO) 和预配置连接。阅读文档，并下载最新的 PingFederate AWS Connector，以便与 AWS 集成。您可以配置 Ping Identity 来传递 [会话标签](id_session-tags.md)。有关更多信息，请参阅[宣布推出针对 AWS 中的基于属性的访问控制的 Ping 身份支持](https://support.pingidentity.com/s/document-item?bundleId=integrations&topicId=pon1571779451105.html)。  | 
| RadiantLogic | [Radiant Logic 技术合作伙伴](http://www.radiantlogic.com/about/partners/technology-partners/) - Radiant Logic 的 RadiantOne Federated Identity Service 与 AWS 进行了集成，可以为基于 SAML 的 SSO 提供身份中心。 | 
| RSA | 《[Amazon Web Services - RSA Ready 实施指南](https://community.rsa.com/s/article/Amazon-Web-Services-RSA-Ready-Implementation-Guide)》为集成 AWS 和 RSA 提供了指导。有关 SAML 配置的更多信息，请参阅 [Amazon Web Services - SAML 我的页面 SSO 配置 - RSA Ready 实施指南](https://community.rsa.com/s/article/Amazon-Web-Services-SAML-My-Page-SSO-Configuration-RSA-Ready-Implementation-Guide)。 | 
| Salesforce.com |  [How to configure SSO from Salesforce to AWS](https://developer.salesforce.com/page/Configuring-SAML-SSO-to-AWS) - 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 网站上的该文章介绍了如何设置 SAML 以与 SecureAuth 设备的 AWS 集成在一起。 | 
| Shibboleth |  [如何使用 Shibboleth 对 AWS 管理控制台 进行 SSO](https://aws.amazon.com/blogs/security/how-to-use-shibboleth-for-single-sign-on-to-the-aws-management-console) - AWS 安全博客中的这篇文章提供分步教程，介绍如何设置 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 policy 中使用 `Condition` 元素检查这些上下文密钥。可用映射的列表如[将 SAML 属性映射到 AWS 信任策略上下文密钥](#saml-attribute-mapping)部分中所示。

## `Subject` 和 `NameID`
<a name="saml_subject-name-id"></a>

响应必须恰好具有一个 `SubjectConfirmation` 元素，该元素具有同时包含 `NotOnOrAfter` 和 `Recipient` 属性的 `SubjectConfirmationData` 元素。收件人属性必须包含与 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>

（可选）您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/PrincipalTag:{TagKey}` 的 `Attribute` 元素。此元素允许您将属性作为 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`。这是一个可选的多值属性，可将您的会话标签设置为可传递。当您使用 SAML 会话代入 AWS 中的另一个角色时，可传递标签将保留。这称为[角色链](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>

您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/Role` 的 `Attribute` 元素。此元素包含一个或多个 `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>

您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/RoleSessionName` 的 `Attribute` 元素。该元素包含一个为临时凭证提供标识符的 `AttributeValue` 元素，这些凭证是针对 SSO 颁发的。您可以使用此选项将临时凭证与正在使用您应用程序的用户相关联。该元素用于在 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>

（可选）您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/SessionDuration"` 的 `Attribute` 元素。该元素包含一个 `AttributeValue` 元素，它指定用户在必须请求新的临时凭证之前可访问 AWS 管理控制台的时间长度。该值是一个表示会话秒数的整数。该值的范围是 900 秒 (15 分钟) 到 43200 秒 (12 小时)。如果该属性不存在，则凭证持续时间为 1 小时 (`DurationSeconds` API 的 `AssumeRoleWithSAML` 参数的默认值)。

要使用该属性，您必须配置 SAML 提供商，以通过控制台登录 Web 终端节点 (`https://region-code.signin.aws.amazon.com/saml`) 提供对 AWS 管理控制台的单一登录访问。有关可能的 *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` 属性，则两个属性的 ***lesser***（较小值）（`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>

（可选）您可使用将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/SourceIdentity` 的 `Attribute` 元素。该元素包含一个 `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`  |  字符串  | 

下表显示 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_cn/IAM/latest/UserGuide/images/saml-based-sso-to-console.diagram.png)


下图说明了以下步骤：

1. 用户浏览到您的组织的门户网站，并选择转到 AWS 管理控制台的选项。在企业中，门户网站通常充当处理您企业与 AWS 之间的信任交换的 IdP。例如，在 Active Directory 联合身份验证服务中，门户网站 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 凭证。

有关如何配置此行为的概述以及指向详细步骤的链接，请参阅以下章节。

## 将网络配置为适用于 AWS 的 SAML 提供商
<a name="fedconsole-config-network-as-saml"></a>

在组织的网络中，配置身份存储（例如 Windows Active Directory）以使用基于 SAML 的 IdP，例如 Windows Active Directory 联合身份验证服务、Shibboleth 等。通过使用 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 控制台创建该角色。在创建指示谁可以代入角色的信任策略时，您可以将先前创建的 SAML 提供商指定为 IAM。您还可以指定用户要代入角色必须匹配的一个或多个 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` 或 `https://signin.aws.amazon.com/static/saml-metadata.xml` 的 `saml-metadata.xml` 文件，通知 SAML IdP AWS 是您的服务提供商。如果需要 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. （可选）如果 **Method**（方法）列在 **Developer Tools**（开发人员工具）的 **Network**（网络）日志窗格中不可见，右击任何列标签并选择 **Method**（方法）以添加列。

1. 在 **Developer Tools**（开发人员工具）的 **Network**（网络）日志窗格中查找 **SAML Post**。选择该行，然后查看顶部的 **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. （可选）如果 **Method**（方法）列在 **Web 开发人员工具**的 **Network**（网络）日志窗格中不可见，右击任何列标签并选择 **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 检查器）。

1. 选择 **Network** 选项卡。

1. 在 **Web Inspector**（Web 检查器）窗口的左上角，选择选项（包含三条横线的小圆圈图标）。选择 **Preserve Log**（保留日志）。

1. （可选）如果 **Method**（方法）列在 **Web Inspector**（Web 检查器）的**Network**（网络）日志窗格中不可见，右击任何列标签并选择 **Method**（方法）以添加列。

1. 重现问题。

1. 在表中查找 **POST** **SAML**。选择该行，然后查看 Headers（标头）选项卡。

1. 查找包含编码请求的 **SAMLResponse** 元素。向下滚动，查找名为 `Request Data` 的 `SAMLResponse`。关联值为 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（AWS STS）请求短期的 JSON Web 令牌（JWT）。这些令牌经过加密签名，可公开验证，并包含一组全面的声明，用于向外部服务声明 AWS 工作负载的身份。您可以将这些令牌用于各种第三方云提供商、SaaS 平台和自托管应用程序。外部服务使用在知名端点发布的 AWS 验证密钥来验证令牌的真实性，并使用令牌中的信息进行身份验证和授权决策。

出站身份联合验证无需在应用程序代码或环境变量中存储 API 密钥或密码等长期凭证，从而改善了您的安全状况。您可以使用 IAM 策略控制对令牌生成的访问权限并强制执行签名算法、允许的受众和持续时间等令牌属性。所有令牌请求均已在 AWS 中记录，从而为安全监控与合规性报告提供完整的审计跟踪记录。您还可以使用显示为自定义声明的标签自定义令牌，从而使外部服务能够实现基于属性的精细访问控制。

## 常见使用案例
<a name="outbound-federation-use-cases"></a>

使用出站身份联合验证，您的 AWS 工作负载可以安全地实现以下功能：
+ 访问外部云提供商中的资源和服务。例如，处理数据的 Lambda 函数可以将结果写入外部云提供商的存储服务或查询其数据库。
+ 与外部软件即服务（SaaS）提供商集成，以进行分析、数据处理、监控等。例如，您的 Lambda 函数可以向可观测性平台发送指标。
+ 使用托管在 AWS、外部云提供商或本地数据中心上的自有应用程序进行身份验证，从而实现安全的混合云和多云架构。例如，您的 AWS 工作负载可以与在本地 Kubernetes 集群中运行的容器化应用程序进行交互。

## 工作方式
<a name="outbound-federation-how-it-works"></a>

![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/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（AWS STS）请求 JSON Web 令牌（JWT）。

1. AWS STS 验证请求并向 Lambda 函数返回已签名的 JWT。

1. Lambda 函数将 JWT 发送到外部服务。

1. 外部服务从令牌中提取发布者 URL，验证其是否与已知的可信发布者匹配，并从 OIDC 发现端点获取 AWS 的验证密钥和元数据。

1. 外部服务使用验证密钥来验证令牌的签名，并验证过期时间、主题和受众等声明。

1. 成功验证后，外部服务将授予对 Lambda 函数的访问权限。

# 开始使用出站身份联合验证
<a name="id_roles_providers_outbound_getting_started"></a>

本指南向您展示如何为您的 AWS 账户启用出站身份联合验证以及如何获取您的第一个 JSON Web 令牌（JWT）（使用 [GetWebIdentityToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetWebIdentityToken.html) API）。您将启用该功能，与外部服务建立信任关系，配置 IAM 权限，并使用 AWS CLI 或适用于 Python 的 AWS SDK（Boto3）请求令牌。

## 先决条件
<a name="outbound-federation-prerequisites"></a>

在开始之前，请确保您满足以下条件：
+ 已安装最新版本的 AWS CLI 或 Python 3.8（或更高版本）和 Boto3（适用于 AWS SDK 示例）
+ 可以在其中配置信任关系的外部服务帐户（例如外部云提供商、SaaS 提供商或测试应用程序）

**注意**  
`GetWebIdentityToken` API 在 STS 全局端点上不可用。
`GetWebIdentityToken` API 生成的 JSON Web 令牌（JWT）不能用于通过 OpenID Connect（OIDC）联合身份验证登录 AWS（通过 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html) API）。

## 为您的账户启用出站身份联合验证
<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_cn/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_cn/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>

收到令牌后，将其包含在对外部服务的请求中。方法因服务而有所不同，但大多数服务都接受 Authorization 标头中的令牌。外部服务应实现令牌验证逻辑，以在授予对 AWS 工作负载的访问权限之前，从发布者的知名端点获取 JWKS 密钥，验证令牌的签名并验证基本声明。

## 从 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 账户。维护可信发布者 URL 列表。

应尽可能验证其他 AWS 特定声明，以在外部服务中实现精细访问控制。例如，验证 org\$1id 声明以限制 AWS Organization 中 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 令牌（JWT），其中包含一组代表 IAM 主体身份的声明。这些令牌均符合 [RFC 7519](https://datatracker.ietf.org/doc/html/rfc7519)。了解这些令牌的结构和内容可帮助您实现安全的身份验证流程，在外部服务中配置适当的声明验证，并有效地使用自定义声明实现精细的访问控制。

JWT 包含标准 OpenID Connect（OIDC）声明，例如主题（“sub”）、受众（“aud”）、发布者（“iss”），以便于实现不同外部服务之间的互操作性。在适用的情况下，AWS STS 会使用 AWS 身份特定的声明（如 AWS 账户 ID 和主体标签）和会话上下文声明（如 EC2 实例 ARN）填充令牌。您还可以通过将自定义声明作为请求标签传递给 [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 | Issuer | 账户特定的发布者 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 | 过期 | 标识过期时间的 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 主体的详细信息。


| 声明 | 说明 | 条件键映射 | 示例值 | 
| --- | --- | --- | --- | 
| 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"environment": "production", "team": "data-engineering", "cost-center":"engineering"\$1 | 

### 会话上下文声明
<a name="session-context-claims"></a>

这些声明提供有关发起令牌请求的计算环境和会话的信息。AWS AWS STS 会根据请求主体的会话上下文自动包含这些声明（如果适用）。


| 声明 | 说明 | 条件键映射 | 示例值 | 
| --- | --- | --- | --- | 
| original\$1session\$1exp | 原始角色会话凭证过期时间（适用于代入的角色） | 不适用 | 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 | Glue 作业的 AWS 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)（SCP）使您能够对 AWS Organizations 中所有账户的令牌生成强制执行组织范围的限制。[资源控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)（RCP）控制资源级别的访问权限。您还可以使用 [VPC 端点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)限制哪些主体可以通过您的 VPC 端点访问 AWS STS `GetWebIdentityToken` API，从而为您的安全状况添加网络级控制。本节说明如何使用这些策略类型和条件键实现精细的访问控制。

要请求身份令牌，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 策略中提供的条件键，请参阅 [IAM 和 AWS STS](reference_policies_iam-condition-keys.md) 条件键。

此示例身份策略组合了多个条件键：

```
{
    "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 区域中的 AWS STS](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）联合身份验证** - 您可让移动或 Web 应用程序的用户使用已知的第三方身份提供者（例如，Login with Amazon、Facebook、Google 或任何 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 开发工具包搭配使用，为用户创建唯一的身份，并对其进行身份验证，以使其安全地访问您的 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 用户指南》**中的 [Amazon EC2 的 IAM 角色](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)。

### 其他 AWS 服务
<a name="other-services"></a>

可使用临时安全凭证访问大多数 AWS 服务。有关接受临时安全凭证的服务的列表，请参阅[使用 IAM 的 AWS 服务](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 管理临时安全凭证，可下载以下示例应用程序，其中实现完整的示例方案：
+ [使用 Windows Active Directory、ADFS 和 SAML 2.0 启用 AWS 的联合身份验证](https://aws.amazon.com/blogs/security/enabling-federation-to-aws-using-windows-active-directory-adfs-and-saml-2-0/)。演示如何使用 Windows Active Directory（AD）、Active Directory 联合身份验证服务（ADFS）2.0 和 SAML（安全断言标记语言）2.0，通过企业联合身份验证将访问权限授予 AWS。
+ [使自定义身份凭证代理程序能够访问 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 SDK 搭配使用。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/)集成。本文向您介绍当使用 Okta、Ping 或 OneLogin 作为 IdP 时如何设置 AWS STS `SourceIdentity` 属性。
+  [OIDC 联合身份验证](id_roles_providers_oidc.md)。本节讨论如何在使用 OIDC 联合身份验证和 `AssumeRoleWithWebIdentity` API 时配置 IAM 角色。
+ [使用 MFA 保护 API 访问](id_credentials_mfa_configure-api-require.md). 本主题介绍如何使用角色要求多重身份验证 (MFA)，以保护您账户中的敏感 API 操作。

有关 AWS 中的策略和权限的更多信息，请参阅以下主题：
+ [适用于 AWS 资源的 Access Management](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>

下表比较了 AWS STS 中返回临时安全凭证的 API 操作的功能。要了解在担任角色以请求临时安全凭证时使用的各种方法，请参阅[担任角色的方法](id_roles_manage-assume.md)。要了解允许您传递会话标签的不同 AWS STS API 操作，请参阅[在 AWS STS 中传递会话标签](id_session-tags.md)。

**注意**  
您可以将 AWS STS API 调用发送到全球终端节点或某个区域终端节点。如果您选择更靠近您的终端节点，则可减少延迟并改善 API 调用的性能。如果您不再能与原始终端节点进行通信，也可选择将调用定向到替代的区域终端节点。如果您使用某种 AWS SDK，请先使用该开发工具包的方法指定一个区域，然后再进行 API 调用。如果您正在手动构建 HTTP API 请求，则必须自行将请求定向到正确的终端节点。有关更多信息，请参阅[*区域和终端节点*和 [管理 AWS 区域中的 AWS STS](id_credentials_temp_enable-regions.md) 的 AWS STS 部分](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)。


|  **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` 之外的 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` 或 `GetCallerIdentity` 之外的 AWS STS API 操作。 不允许通过 SSO 登录到控制台。⁶  | 

 ¹ **MFA 支持**。在调用 AssumeRole 和 GetSessionToken API 操作时，可以包含有关 Multi-Factor Authentication (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**。无需权限即可执行该操作。如果管理员为您的 IAM 用户或角色添加明确拒绝访问 `sts:GetCallerIdentity` 操作的策略，您仍然可以执行该操作。不需要权限，因为在拒绝 IAM 用户或角色访问时返回相同的信息。要查看示例响应，请参阅[我没有权限执行：iam:DeleteVirtualMFADevice](troubleshoot.md#troubleshoot_general_access-denied-delete-mfa)。

⁵ **通过单一登录 (SSO) 登录到控制台**。为了支持 SSO，AWS 可让您调用联合终端节点 (`https://signin.aws.amazon.com/federation`) 并传递临时安全凭证。终端节点将返回一个令牌，可使用该令牌构建一个让用户直接登录到控制台而无需使用密码的 URL。有关更多信息，请参阅[使 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 管理控制台。有关更多信息，请参阅 [使自定义身份凭证代理程序能够访问 AWS 控制台](id_roles_providers_enable-console-custom-url.md)。

# 服务持有者令牌
<a name="id_credentials_bearer"></a>

某些 AWS 服务需要您有权获取 AWS STS 服务持有者令牌，然后您才能以编程方式访问它们的资源。这些服务支持一种协议，该协议要求您使用持有者令牌，而不是使用传统的 [适用于 API 请求的 AWS 签名版本 4](reference_sigv.md)。当您执行需要持有者令牌的 AWS CLI 或 AWS API 操作时，AWS 服务将代表您请求持有者令牌。该服务将为您提供令牌，然后您可以使用该令牌在该服务中执行后续操作。

AWS STS 服务持有者令牌包括来自您的原始主体身份验证的信息，这些信息可能会影响您的权限。这些信息可以包括主体标签、会话标签和会话策略。令牌的访问密钥 ID 以 `ABIA` 前缀开头。这可帮助您在 CloudTrail 日志中识别使用服务持有者令牌执行的操作。

**重要**  
持有者令牌只能用于对生成它的服务的调用以及生成它的区域。您不能使用持有者令牌在其他服务或区域中执行操作。

支持持有者令牌的服务示例是 AWS CodeArtifact。在使用 NPM、Maven 或 PIP 等程序包管理器与 AWS CodeArtifact 进行交互之前，您必须调用 `aws codeartifact get-authorization-token` 操作。此操作返回可用于执行 AWS CodeArtifact 操作的持有者令牌。或者，您可以使用 `aws codeartifact login` 命令完成相同的操作，然后自动配置您的客户端。

如果您在为您生成持有者令牌的 AWS 服务中执行操作，则您的 IAM policy 中必须具有以下权限：

------
#### [ 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 SDK](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 区域使用 AWS STS
<a name="using_sts_regions"></a>

您可以将 AWS STS API 调用发送到全球终端节点或某个区域终端节点。如果您选择更靠近您的终端节点，则可减少延迟并改善 API 调用的性能。如果您不再能与原始终端节点进行通信，也可选择将调用定向到替代的区域终端节点。如果您使用某种 AWS SDK，请先使用该开发工具包的方法指定一个区域，然后再进行 API 调用。如果您正在手动构建 HTTP API 请求，则必须自行将请求定向到正确的终端节点。有关更多信息，请参阅[*区域和终端节点*和 [管理 AWS 区域中的 AWS STS](id_credentials_temp_enable-regions.md) 的 AWS STS 部分](https://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)。

下面是让您可以用来获取临时凭证以用于您的 AWS 环境和应用程序的 API 操作。

## 请求通过自定义身份凭证代理程序进行跨账户委派和联合身份验证的凭证
<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 请求，请参阅《Amazon Web Services 一般参考》中的 [使用签名版本 4 签署 AWS 请求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)**，以了解如何签署请求。

除了临时安全凭证之外，该响应还包括联合身份用户的 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 操作或 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` 时，AWS 会使用通过 IdP 的 JSON Web 密钥集（JWKS）提供的公钥验证数字签名，从而验证所提供的令牌。如果令牌有效，并且满足 IAM 角色信任策略中规定的所有条件，则 AWS 会向您返回以下信息：
   + 一组临时安全凭证。这些证书由访问密钥 ID、秘密访问密钥和会话令牌组成。
   + 所担任角色的角色 ID 和 ARN。
   + 一个 `SubjectFromWebIdentityToken` 值，其中包含独一无二的用户 ID。

1. 然后，您的应用程序可以使用响应中返回的临时安全凭证进行 AWS API 调用。该过程与使用长期安全凭证进行 AWS API 调用相同。不同之处在于，您必须包含会话令牌，以便 AWS 验证临时安全凭证是否有效。

您的应用程序应缓存 AWS STS 返回的凭证，并根据需要刷新凭证。如果您的应用程序是使用 AWS SDK 构建的，则 SDK 的凭证提供者可以在凭证过期之前处理调用 `AssumeRoleWithWebIdentity` 和刷新 AWS 凭证。有关更多信息，请参阅《AWS SDK 和工具参考指南》**中的《AWS SDK 和工具标准化凭证提供者》[https://docs.aws.amazon.com/sdkref/latest/guide/standardized-credentials.html](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](https://www.oasis-open.org/standards#samlv2.0) 2.0（安全断言标记语言）将身份验证和授权信息传递给 AWS。对于将身份系统 (如 Windows Active Directory 或 OpenLDAP) 与可生成 SAML 断言的软件集成在一起的组织，该 API 操作是非常有用的。此类集成提供有关用户身份和权限 (如 Active Directory 联合身份验证服务或 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` 元素值。
   + `NameQualifier` 元素，包含通过 `Issuer` 值、AWS 账户 ID 以及 SAML 提供商的易记名称生成的哈希值。与 `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 验证临时安全凭证是否有效。

您的应用程序应缓存凭证。默认情况下，凭证在 1 小时后到期。如果未使用 [ 软件开发工具包中的 ](https://aws.amazon.com/blogs/mobile/using-the-amazoncredentialsprovider-protocol-in-the-aws-sdk-for-ios)AmazonSTSCredentialsProviderAWS 操作，则由您和您的应用程序负责再次调用 `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 分钟）到 129600 秒（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` 调用将返回临时安全凭证，其中包括会话令牌、访问密钥、私有密钥和到期时间。如果要在组织内管理权限 (例如，使用代理应用程序分配权限)，则可使用 `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 请求，请访问《Amazon Web Services 一般参考》中的 [使用签名版本 4 签署 AWS 请求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)**，以了解如何签署请求。

除了临时安全凭证之外，该响应还包括联合身份用户的 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 的临时安全凭证不包括该存储桶的策略。在这种情况下，您需要确保该存储桶的策略具有与 Susan 的 ARN (如 `arn:aws:sts::111122223333:federated-user/Susan`) 匹配的 ARN。

## 为不受信任的环境中的用户请求凭证
<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 用户返回一组临时安全凭证。此 API 对提高安全性非常有用，例如在已针对 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 请求，请访问《Amazon Web Services 一般参考》中的 [使用签名版本 4 签署 AWS 请求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)**，以了解如何签署请求。

**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` 请求可能包括 `SerialNumber` 和 `TokenCode` 值以进行 AWS Multi-Factor Authentication (MFA) 验证。如果提供的值有效，AWS STS 将提供包含 MFA 身份验证状态的临时安全凭证。然后，可以使用临时安全凭证访问受 MFA 保护的 API 操作或 AWS 网站，但前提是 MFA 身份验证有效。

下例展示一个 `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 请求，请参阅《Amazon Web Services 一般参考》中的 [使用签名版本 4 签署 AWS 请求](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html)**，以了解如何签署请求。

# 将临时凭证用于 AWS 资源
<a name="id_credentials_temp_use-resources"></a>

借助 AWS CLI 或 AWS API（使用 [AWS SDK](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)，则获取和使用临时安全凭证的方式随上下文而不同。如果您在 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 区域中的 AWS STS](id_credentials_temp_enable-regions.md)。

**Contents**
+ [在 Amazon EC2 实例中使用临时凭证](#using-temp-creds-sdk-ec2-instances)
+ [将临时安全凭证用于 AWS SDK。](#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 命令将能够从该实例的元数据获取自动临时安全凭证。您无需明确获取临时安全凭证。AWS SDK、AWS CLI 和 Tools for Windows PowerShell 自动从 EC2 实例元数据服务 (IMDS) 获取凭证并使用它们。临时凭证具有您为与该实例关联的角色定义的权限。

有关更多信息及示例，请参阅：
+  [使用 IAM 角色授予对 Amazon Elastic Compute Cloud 上 AWS 资源的访问权](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/java-dg-roles.html) — 适用于 Java 的 AWS SDK
+  [使用 IAM 角色授予访问权限 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 SDK。
<a name="using-temp-creds-sdk"></a>

要在代码中使用临时安全凭证，可以编程方式调用类似于 AWS STS 的 `AssumeRole` API，提取生成的凭证和会话令牌。然后，您可以使用这些值作为对 AWS 的后续调用的凭证。以下示例说明了有关使用 AWS 开发工具包时如何使用临时安全凭证的伪代码：

```
assumeRoleResult = AssumeRole(role-arn);
tempCredentials = new SessionAWSCredentials(
   assumeRoleResult.AccessKeyId, 
   assumeRoleResult.SecretAccessKey, 
   assumeRoleResult.SessionToken);
s3Request = CreateAmazonS3Client(tempCredentials);
```

有关用 Python 编写的示例（使用 [AWS SDK for Python (Boto)](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/)。有关从结果中获取临时安全凭证和会话令牌的信息，请参阅所用开发工具包的文档。可以在主 [AWS 文档页](https://aws.amazon.com/documentation)上的 **SDKs and Toolkits**（开发工具包和工具箱）部分中找到所有 AWS SDK 的文档。

您必须确保在旧凭证到期之前，获得一组新的凭证。在某些开发工具包中，可让提供商为您管理刷新凭证的过程；并可检查所用开发工具包的文档。

## 将临时安全凭证用于 AWS CLI。
<a name="using-temp-creds-sdk-cli"></a>

可将临时安全凭证用于 AWS CLI。这对于测试策略来说很有用。

借助 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/)，您可以调用 `AssumeRole` 或 `GetFederationToken` 之类的 [AWS STS API](https://docs.aws.amazon.com/STS/latest/APIReference/)，然后捕获输出结果。下面的示例说明了一个将输出发送至文件的 `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>

如果是直接向 AWS 发出 HTTPS API 请求，则可以使用从 AWS Security Token Service (AWS STS) 获取的临时安全凭证对这些请求进行签名。为此，您可以使用接收自 AWS STS 的访问密钥 ID 和秘密访问密钥。您使用访问密钥 ID 和秘密访问密钥的方式，与使用长期凭证对请求签名是一样的。此外，还要将您从 AWS STS 获得的会话令牌添加到 API 请求中。将会话令牌添加到 HTTP 标头或名为 `X-Amz-Security-Token` 的查询字符串参数中。将会话令牌添加到 HTTP 标头*或* 查询字符串参数，但不是同时添加到这两者。有关签署 HTTPS API 请求的更多信息，请参阅《AWS 一般参考》中的 [签署 AWS API 请求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)**。

## 更多信息
<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 Notification 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**。请参阅 *Amazon SimpleDB 开发人员指南*中的[使用临时安全凭证](https://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/index.html?UsingTemporarySecurityCredentials_SDB.html)。

# 临时安全凭证的权限
<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 Management](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_cn/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 身份或来自 AWS 以外的身份[担任该角色](id_roles_manage-assume.md)时，将会收到具有分配给该角色的权限的会话。

当您在 AWS 中执行操作时，则有关您会话的信息可以记录到 AWS CloudTrail 以便您的账户管理员进行监控。管理员可以配置角色以要求身份来传递自定义字符串，该字符串标识在 AWS 中执行操作的个人或应用程序，称为源身份。此身份信息在 AWS CloudTrail 中存储为*源身份*。当管理员查看 CloudTrail 中的活动时，他们可以查看源身份信息，以确定谁通过担任角色会话执行了操作或执行了哪些操作。

设置源身份后，它会出现在任何在角色会话期间执行的 AWS 操作的请求中。当角色用于通过 AWS CLI 或者 AWS API 担任其他角色时，设置的值仍然存在，这称为[角色链](id_roles.md#iam-term-role-chaining)。在角色会话期间无法更改已设置的值。管理员可以根据源身份的存在或值配置精细权限，以进一步控制使用共享角色执行的 AWS 操作。您可以决定是否可以使用源身份属性、是否需要该属性以及可以使用哪些值。



使用源身份的方式与使用角色会话名称和会话标签的方式大有不同。设置后，源身份值无法更改，并且对角色会话执行的任何其他操作将持续存在。以下是如何使用会话标签和角色会话名称的说明：
+ **Session tags**（会话标签）- 您也可以在代入角色或联合身份用户时传递会话标签。担任角色时会出现会话标签。您可以定义策略，这些策略使用标签条件键来根据主体的标签向其授予权限。然后您可以使用 CloudTrail 查看为代入角色或联合身份用户而发出的请求。要了解会话标签的更多信息，请参阅 [在 AWS STS 中传递会话标签](id_session-tags.md)。
+ **Role session name**（角色会话名称）- 您可以在角色信任策略中使用 `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` 操作。如果您具有企业身份（也称为人力身份），则他们可能会使用 `AssumeRoleWithSAML` 访问您的 AWS 资源。如果终端用户访问您的移动应用程序或 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` 的凭证，用户将尝试担任使用以下 AWS CLI 请求的 `DeveloperRole`。

**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 评估请求时，请求上下文将包含 `DevUser` 的 `sts:SourceIdentity`。

## 在担任角色时指定源身份
<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 安全博客中的[使用 Active Directory AWS 联合身份验证服务 (ADFS)](https://aws.amazon.com/blogs/security/aws-federated-authentication-with-active-directory-federation-services-ad-fs/) 的亚马逊云科技联合身份验证。

作为管理员，您可以使用 AWS STS `AssumeRoleWithSAML` 操作，允许公司目录的成员联合身份到 AWS 中。要执行此操作，您必须完成以下任务：

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` 元素，并将 `Name` 属性设置为 `https://aws.amazon.com/SAML/Attributes/SourceIdentity`。使用 `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 Token (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 资源。再假设您使用 `AssumeRoleWithSAML` 向您的工作人员身份授予了 AWS 访问权限。您只希望高级开发人员 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`。该角色正在以跨账户边界的形式担任。因此，`sts:SetSourceIdentity` 权限必须在权限策略中授予 `CriticalRole`，在角色信任策略中授予 `CriticalRole_2`。

**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"]
        }
      }
    }
  ]
}
```

------

用户使用从担任 CriticalRole 获得的角色会话凭证进行以下调用。源身份是在担任 CriticalRole 期间设置的，因此无需再次显式设置。如果用户尝试设置与担任 `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 日志文件包括有关所代入角色或联合身份用户会话的源身份集的信息。有关更多信息，请参阅 [使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用](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_cn/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 附加到 IAM 用户 `token-app` 并调用 `GetFederationToken` 的示例策略**    
****  

```
{
  "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 具有队列，您可以向这些内容附加策略。有关支持基于资源的策略的所有服务的列表，请参阅[使用 IAM 的 AWS 服务](reference_aws-services-that-work-with-iam.md)并回顾表的“基于资源的策略”列。您可以使用基于资源的策略将权限直接分配给 AWS STS 联合用户。为此，请在基于资源的策略的 `Principal` 元素中指定 AWS STS 联合用户的 Amazon 资源名称（ARN）。以下示例说明了这一点，并使用名为 `productionapp` 的 S3 存储桶进一步阐述上述示例。

以下基于资源的策略附加到存储桶。此存储桶策略允许名为 Carol 的 AWS STS 联合用户访问该存储桶。当之前介绍的示例策略被附加至 `token-app` IAM 用户时，名为 Carol 的 AWS STS 联合用户将具有对名为 `productionapp` 的存储桶执行 `s3:GetObject`、`s3:PutObject` 和 `s3:DeleteObject` 操作的权限。即使未将任何会话策略作为 `GetFederationToken` API 调用的参数传递，Carol 也能够执行此操作。这是因为，在此示例中，以下基于资源的策略已向名为 Carol 的 AWS STS 联合用户明确授予权限。

请记住，只有向 IAM 用户***和*** AWS STS 联合用户都进行显式授权时，AWS STS 联合用户才具有这些权限。另外，也可通过在策略的 `Principal` 元素中对 AWS STS 联合用户进行显式命名的基于资源的策略授予这些权限（在账户内），如下例所示。

**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 命令主要发生在用户必须使用 Multi-Factor Authentication (MFA) 进行身份验证时。可以编写一条策略，只允许特定操作，且仅当这些操作是由经过 MFA 身份验证的用户请求时，才予以放行。为成功通过 MFA 身份验证检查，用户必须先调用 `GetSessionToken`，并包含可选的 `SerialNumber` 和 `TokenCode` 参数。如果用户成功通过 MFA 设备的身份验证，则 `GetSessionToken` API 调用返回的凭证将包含 MFA 上下文。此上下文指示用户已使用 MFA 进行了身份验证，并已获得了需要 MFA 身份验证的 API 操作的授权。

## 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>

如果调用 `GetSessionToken` 时使用的是 IAM 用户的凭证，则临时安全凭证将具有与该 IAM 用户相同的权限。同样，如果使用 AWS 账户根用户 凭证调用 `GetSessionToken`，临时安全凭证将拥有根用户权限。

**注意**  
我们建议您不要使用根用户凭证来调用 `GetSessionToken`。相反，请遵循我们的[最佳实践](best-practices-use-cases.md)，并创建具有所需权限的 IAM 用户。然后使用这些 IAM 用户执行与 AWS 的日常交互工作。

您在调用 `GetSessionToken` 时获得的临时凭证具有以下功能和限制：
+ 您可以通过将凭证传递到 `https://signin.aws.amazon.com/federation` 上的联合身份验证单一登录终端节点来访问 AWS 管理控制台。有关更多信息，请参阅 [使自定义身份凭证代理程序能够访问 AWS 控制台](id_roles_providers_enable-console-custom-url.md)。
+ 您**无法**使用凭证调用 IAM 或 AWS STS API 操作。您**可以**使用它们来调用其他 AWS 服务的 API 操作。

请参阅 [比较 AWS STS 凭证](id_credentials_sts-comparison.md)，将此 API 操作及其限制和功能与创建临时安全凭证的其他 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 分钟）到最长 129600 秒（36 小时）之间。默认会话持续时间为 43200 秒（12 小时）。您可以撤消这些凭证，但还须更改 IAM 用户或角色的权限，以阻止他人通过泄露的凭证进行恶意账户活动。每次使用临时安全凭证发出 AWS 请求时，系统都会评估分配给该凭证的权限。从凭证中删除所有权限后，使用这些权限的 AWS 请求会失败。

可能需要几分钟时间，策略更新才能生效。对于 IAM 角色会话，可以撤消角色的临时安全凭证，以强制担任该角色的所有用户重新进行身份验证并请求新的凭证。有关更多信息，请参阅[撤销 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 用户指南*》中的[撤消由权限集创建的活动 IAM 角色会话](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. 在**审核**页面上，检查策略**摘要**，然后选择**保存更改**进行保存。

更新策略时，所做的更改会影响与该角色关联的所有临时安全凭证的权限，包括在更改该角色的权限策略之前颁发的凭证。

更新策略后，您可以[撤消角色的临时安全凭证](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 日志查找联合用户的 ARN。有关更多信息，请参阅 [How to Easily Identify Your Federated Users by Using 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 资源名称（ARN）来拒绝访问特定主体。为此，您可以在策略的 Condition 元素中指定与临时安全凭证关联的 IAM 用户、角色或 AWS STS 联合用户会话。

**根据 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. 在**审核**页面上，检查策略**摘要**，然后选择**保存更改**进行保存。

### 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。如果在 caller-specified-role-session-name 部分中将 IAM 角色的唯一 ID 和通配符 (\$1) 指定为上下文键 `aws:userid` 的值，这将拒绝与该角色关联的所有会话。
+ `AROAXROLE2:<caller-specified-role-session-name>` 表示担任角色的会话的唯一 ID。在担任角色的唯一 ID 的 caller-specified-role-session-name 部分中，如果使用 StringLike 条件运算符，则可指定角色会话名称或通配符。如果您指定角色会话名称，则将拒绝已命名的角色会话，而不会影响已创建凭证的角色的权限。如果您为角色会话名称指定通配符，则将拒绝与该角色关联的所有会话。
**注意**  
调用者指定的角色会话名称，是担任角色会话唯一标识符的一部分，在角色链接期间可能会发生变化。当一个角色担任另一个角色时，就会发生角色链接。角色会话名称是在主体使用 AWS STS `AssumeRole` API 操作担任角色时使用 `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` 条件键时，您可以在策略的 Condition 元素中指定与临时安全凭证关联的 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. 请参阅 [使用 IAM 的 AWS 服务](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 联合用户会话或角色创建临时安全凭证的权限，应附加一个策略，该策略授予以下一项或两项权限：
+ 对于要访问 IAM 角色的 OIDC 和 SAML 联合主体，请授予对 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 为授予担任角色的权限的示例策略**  
以下示例策略为 AWS 账户 `123123123123` 中的 `UpdateApp` 角色授予调用 `AssumeRole` 的权限。在使用 `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": "*"
  }]
}
```

**重要**  
使用 `GetFederationToken` 向 IAM 用户授予为 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 用户登录时将用户和会话 ID 包含在他们的 AWS 控制台会话中。例如，Amazon Q Developer Pro 使用身份增强控制台会话来个性化服务体验。有关身份增强控制台会话的更多信息，请参阅《*AWS IAM Identity Center 用户指南*》中的 [Enabling identity-enhanced console sessions](https://docs.aws.amazon.com/singlesignon/latest/userguide/identity-enhanced-sessions.html)。有关 Amazon Q 开发者版设置的信息，请参阅《*Amazon Q 开发者版用户指南*》中的[设置 Amazon Q 开发者版](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/setting-up.html)。

要使身份增强控制台会话可供用户使用，您必须使用基于身份的策略向 IAM 主体授予对代表其控制台会话的资源的 `sts:SetContext` 权限。

**重要**  
默认情况下，用户无权为其身份增强控制台会话设置上下文。要允许这样做，您必须在基于身份的策略中向 IAM 主体授予 `sts:SetContext` 权限，如以下策略示例所示。

以下示例基于身份的策略向 IAM 主体授予 `sts:SetContext` 权限，允许主体为自己的 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 区域中的 AWS STS
<a name="id_credentials_temp_enable-regions"></a>

区域端点是 AWS Web 服务在特定区域内入口点的 URL。AWS 建议使用区域 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 区域 中激活和停用 AWS STS](#sts-regions-activate-deactivate)
+ [编写代码以使用 AWS STS 区域](#id_credentials_temp_enable-regions_writing_code)
+ [管理全球端点会话令牌](#sts-regions-manage-tokens)

## 在 AWS 区域 中激活和停用 AWS STS
<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)** 部分的 **Endpoints**（端点）中，找到要配置的区域，然后在 **STS status**（STS 状态）列中选择 **Active**（活动）或 **Inactive**（非活动）。

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` 对象实例化，并将端点的 URL 和 AWS 区域 作为参数传递。

要了解如何使用 AWS SDK 的环境变量设置 AWS STS 区域端点，请参阅 *AWS SDK 和工具参考指南*中的 [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)** 部分的 **Session Tokens from the STS endpoints**（来自 STS 端点的会话令牌）。**全球端点** 表示 `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_cn/IAM/latest/UserGuide/id_credentials_temp_region-endpoints.html)

您必须[启用区域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)才能使用它。这会自动激活 AWS STS。您无法在这些区域中手动激活或停用 AWS STS。

²要在中国使用 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 全局端点的请求将在与您部署的 AWS STS 工作负载相同的区域中处理。如果您的请求源自选择加入区域，或者使用 Amazon DNS 服务器以外的 DNS 解析程序解析您的请求，则发往 AWS STS 全局端点的请求将继续在美国东部（弗吉尼亚州北部）区域处理。有关 Amazon DNS 的更多信息，请参阅《*Amazon Virtual Private Cloud 用户指南*》中的 [Amazon DNS 服务器](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#AmazonDNS)。

下表显示了如何根据您的 DNS 提供商路由发往 AWS STS 全局端点的请求。


| DNS 解析程序 | 发往 AWS STS 全局端点的请求是否路由到本地 AWS 区域？ | 
| --- | --- | 
|  默认启用的区域中的 Amazon VPC 中的 Amazon DNS 解析程序  |  是  | 
|  选择加入区域中的 Amazon VPC 中的 Amazon DNS 解析程序  |  不，请求将路由到美国东部（弗吉尼亚州北部）区域  | 
|  由您的 ISP、公共 DNS 提供商或任何其他 DNS 提供商提供的 DNS 解析程序  |  不，请求将路由到美国东部（弗吉尼亚州北部）区域  | 

为了确保最大限度地减少对现有流程的干扰，AWS 已实施以下措施：
+ 对 AWS STS 全局端点发出的请求的 AWS CloudTrail 日志将发送到美国东部（弗吉尼亚州北部）区域。由 AWS STS 区域端点处理的请求的 CloudTrail 日志将继续记录到 CloudTrail 中的相应区域。
+ AWS STS 全局端点和区域端点执行的操作的 CloudTrail 日志将包含附加字段 `endpointType` 和 `awsServingRegion`，以指示哪个端点和区域处理了请求。有关 CloudTrail 日志示例，请参阅[CloudTrail 日志文件中使用全局端点的示例 AWS STS 事件](cloudtrail-integration.md#stscloudtrailexample-assumerole-sts-global-endpoint)。
+ 无论哪个区域处理请求，发往 AWS STS 全局端点的请求的 `aws:RequestedRegion` 条件键的值都将为 `us-east-1`。
+ AWS STS 全局端点处理的请求不会与区域 AWS STS 端点共享每秒请求数配额。

如果您在选择加入区域中拥有工作负载并且仍在使用 AWS STS 全局端点，我们建议您迁移到 AWS STS 区域端点以提高恢复能力和性能。有关配置区域 AWS STS 端点的更多信息，请参阅《*AWS SDK 和工具参考指南*》中的 [AWS STS Regional endpoints](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)  
有关更多信息，请参阅 [使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用](cloudtrail-integration.md)。

# 使自定义身份凭证代理程序能够访问 AWS 控制台
<a name="id_roles_providers_enable-console-custom-url"></a>

您可以通过编写和运行代码来创建 URL 以使登录到您组织网络的用户能够安全访问 AWS 管理控制台。该 URL 包含您从 AWS 获得的登录令牌，而令牌则用于对访问 AWS 的用户进行身份验证。由于联合身份验证的原因，显示的控制台会话可能包含不同的 `AccessKeyId`。要通过相关 CloudTrail 事件跟踪联合身份验证登录的访问密钥使用情况，请参阅 [使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用](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` 参数可以是 16524 秒或 4 小时 59 秒。
使用 `GetFederationToken` 获取临时凭证时，请不要使用 `SessionDuration` HTTP 参数。该操作将失败。
使用一个角色的凭证担任其他角色称为 [*role chaining*](id_roles.md#iam-term-role-chaining)（角色链）。在使用角色链时，新凭证的最大持续时间限制为 1 小时。当您使用角色[向 EC2 实例上运行的应用程序授予权限](id_roles_use_switch-role-ec2.md)时，则这些应用程序不受制于此限制。
通过角色串联获取临时凭证时，请不要使用 `SessionDuration` HTTP 参数。该操作将失败。

1. 将 URL 分配给用户或代表用户调用 URL。

联合终端节点提供的 URL 在创建后的 15 分钟内有效。这不同于与 URL 关联的临时安全凭证会话的持续时间 (以秒为单位)。这些凭证在创建时指定的持续时间内有效，从创建时算起。

**重要**  
如果您在关联的临时安全凭证中启用了权限，则该 URL 授予通过 AWS 管理控制台访问您的 AWS 资源的权限。因此，您应该视 URL 为机密。我们建议您通过安全的重定向返回 URL，例如，在 SSL 连接上使用 302 HTTP 响应状态代码。有关 302 HTTP 响应状态代码的详细信息，请参阅 [RFC 2616，第 10.3.3 节](https://datatracker.ietf.org/doc/html/rfc2616#section-10.3.3)。

要完成这些任务，您可以使用适用于 AWS Identity and Access Management 的 [HTTPS 查询 API (IAM)](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，此 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` 的最大值指定为 43200（12 小时）。如果缺少 `SessionDuration` 参数，则会话默认为在步骤 2 中从 AWS STS 检索的凭证的持续时间（默认为 1 小时）。有关如何使用 `DurationSeconds` 参数指定持续时间的详细信息，请参阅 [`AssumeRole` API 的文档](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html)。创建超过 1 小时的控制台会话的功能是联合终端节点的 `getSigninToken` 操作所固有的。
**注意**  
您的 `SessionDuration` 不能大于或等于您所代入的角色的最大会话持续时间设置。例如，您将要代入的角色的最大会话持续时间设置为 5 小时。您的 `SessionDuration` 参数可以是 16524 秒或 4 小时 59 秒。
使用 `GetFederationToken` 获取临时凭证时，请不要使用 `SessionDuration` HTTP 参数。该操作将失败。
使用一个角色的凭证担任其他角色称为 [*role chaining*](id_roles.md#iam-term-role-chaining)（角色链）。在使用角色链时，新凭证的最大持续时间限制为 1 小时。当您使用角色[向 EC2 实例上运行的应用程序授予权限](id_roles_use_switch-role-ec2.md)时，则这些应用程序不受制于此限制。
通过角色串联获取临时凭证时，请不要使用 `SessionDuration` HTTP 参数。该操作将失败。

   在启用具有更长持续时间的控制台会话时，您增加了凭证外泄的风险。为了帮助缓解这种风险，您可以通过在 IAM 控制台页面的 **Role Summary**（角色摘要）上选择 **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 最终形式的示例。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 以编程方式构造授予用户 AWS 管理控制台直接访问权限的 URL。以下是两个示例：
+ 通过 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 AAWS 账户,
# 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 以编程方式构造授予用户 AWS 管理控制台直接访问权限的 URL。下列代码段使用 [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 以编程方式构造授予用户 AWS 管理控制台直接访问权限的 URL。下列代码段使用 [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 policy 中使用标签，帮助控制哪些人可以查看并与您的资源交互。要了解有关使用标签控制访问的更多信息，请参阅 [使用标签控制对 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 竞价型实例请求。
+ `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 代入角色会话和 AWS STS 联合身份用户会话制定标签命名约定时，请遵守以下约定：

**字符要求** - 标签键和值可以包含字母、数字、空格以及 \$1 . : / = \$1 - @ 符号的任意组合。

**区分大小写** - 标签键是否区分大小写根据标记的 IAM 资源的类型而不同。IAM 用户和角色的标签键值不区分大小写，但会保留大小写。这意味着您不能拥有单独的 **Department** 和 **department** 标签键。如果您已使用 **Department=finance** 标签标记用户并添加 **department=hr** 标签，则它会替换第一个标签。不会添加第二个标签。

对于其他 IAM 资源类型，标签键值区分大小写。这意味着您可以有单独的 **Costcenter** 和 **costcenter** 标签键。例如，如果您使用 **Costcenter = 1234** 标签为客户托管的策略添加了标签，并且添加了 **costcenter = 5678** 标签，策略将同时拥有 **Costcenter** 和 **costcenter** 标签键。

作为最佳实践，我们建议您避免使用大小写处理不一致的类似标签。我们建议您确定利用标签的策略，并在所有资源类型中一致地实施该策略。要了解有关标记最佳实践的更多信息，请参阅《AWS 一般参考》中的 [标记 AWS 资源](https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html)。

以下列表显示了附加到 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** 标签键值对附加到该用户。这将导致 **department** 标签键的 **Engineering** 值被替换为 **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 policy 中指定以下一项或所有 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 policy 元素：变量和标签](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 policy 中指定以下一项或所有 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在控制台的导航窗格中，选择**角色**，然后选择要编辑的角色的名称。

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 policy 元素：变量和标签](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 policy 中指定以下一项或所有 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 policy 元素：变量和标签](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 OIDC 实体（用户或角色）标记 IAM OIDC 身份提供程序。您可以在 IAM policy 中指定以下一项或所有 IAM 标签操作：
+ `iam:ListOpenIDConnectProviderTags`
+ `iam:TagOpenIDConnectProvider`
+ `iam:UntagOpenIDConnectProvider`

**允许 IAM 实体添加、列出或删除 IAM OIDC 身份提供者的标签**  
将以下语句添加到需要管理标签的 IAM 实体的权限策略。使用您的账号并将 *<OIDCProviderName>* 替换为需要管理其标签的 OIDC 提供商的名称。要了解如何使用该示例 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` 操作。

要使用此策略，请将 *<OIDCProviderName>* 替换为需要管理其标签的 OIDC 提供商的名称。要了解如何使用该示例 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 policy 元素：变量和标签](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 policy 中指定以下一项或所有 IAM 标签操作：
+ `iam:ListSAMLProviderTags`
+ `iam:TagSAMLProvider`
+ `iam:UntagSAMLProvider`

**要允许 IAM 实体（用户或角色）添加、列出或删除 SAML 身份提供程序的标签**  
将以下语句添加到需要管理标签的 IAM 实体的权限策略。使用您的帐号并将 *<SAMLProviderName>* 替换为需要管理其标签的 SAML 提供商的名称。要了解如何使用该示例 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 身份提供程序添加标签**  
将以下语句添加到需要为特定 SAML 提供商添加而不是删除标签的 IAM 实体的权限策略。

**注意**  
`iam:TagSAMLProvider` 操作要求您也包含 `iam:ListSAMLProviderTags` 操作。

要使用此策略，请将 *<SAMLProviderName>* 替换为需要管理其标签的 SAML 提供商的名称。要了解如何使用该示例 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 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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 policy 元素：变量和标签](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 policy 中指定以下一项或所有 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 policy 元素：变量和标签](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 policy 中指定以下一项或所有 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 policy 元素：变量和标签](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 policy 中指定以下一项或所有 IAM 标签操作：
+ `iam:ListMFADeviceTags`
+ `iam:TagMFADevice`
+ `iam:UntagMFADevice`

**要允许 IAM 实体（用户或角色）添加、列出或删除虚拟 MFA 设备的标签**  
将以下语句添加到需要管理标签的 IAM 实体的权限策略。使用您的账号并将 *<MFATokenID>* 替换为需要管理其标签的虚拟 MFA 设备的名称。要了解如何使用该示例 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 设备添加标签**  
将以下语句添加到需要为特定 MFA 设备添加而不是删除标签的 IAM 实体的权限策略。

**注意**  
`iam:TagMFADevice` 操作要求您也包含 `iam:ListMFADeviceTags` 操作。

要使用此策略，请将 *<MFATokenID>* 替换为需要管理其标签的虚拟 MFA 设备的名称。要了解如何使用该示例 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 policy 元素：变量和标签](reference_policies_variables.md)。

# 在 AWS STS 中传递会话标签
<a name="id_session-tags"></a>

会话标签是您在代入 IAM 角色或联合 AWS STS 用户身份时传递的键/值对属性。您可以通过 AWS STS 或您的身份提供程序 (IdP) 发出 AWS CLI 或 AWS API 请求来完成此操作。当您使用 AWS STS 请求临时安全凭证时，会生成会话。会话过期并具有[凭证](https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html)，例如访问密钥对和会话令牌。当您使用会话凭证发出后续请求时，[请求上下文](reference_policies_elements_condition.md#AccessPolicyLanguage_RequestContext)包含 `aws:PrincipalTag` 上下文密钥。您可以使用策略的 `Condition` 元素中的 `aws:PrincipalTag` 键，基于这些标签来允许或拒绝访问。

当您使用临时凭证发出请求时，您的主体可能会包含一组标签。这些标签来自以下来源：

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 STS 中使用以下 AWS CLI 或 AWS API 操作来传递会话标签。*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 教程：将 SAML 会话标签用于 ABAC](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) 条件运算符。
  + 第二个条件块仅允许用户为 `Department` 会话标签传递 `Engineering` 或 `Marketing` 值。
  + 第三个条件块列出可以设置为可传递的最大一组标签。用户可以选择将一部分标签设置为可传递，也可以不将任何标签设置为可传递。他们不能将其他标签设置为可传递。您可以通过添加包含 `"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 安全博客 中的[使用 Active Directory 联合身份验证服务 (ADFS)](https://aws.amazon.com/blogs/security/aws-federated-authentication-with-active-directory-federation-services-ad-fs/) 的 AWS 联合身份验证。

作为管理员，您可以使用 AWS STS `AssumeRoleWithSAML` 操作，允许公司目录的成员联合身份到 AWS 中。要执行此操作，您必须完成以下任务：

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 包括身份提供程序，通过其身份解决方案提供经认证的端到端会话标签体验。要了解如何使用这些身份提供程序配置会话标签，请参阅[将第三方 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)。

对于在 JWT 中包含会话标签的情况，AWS 支持两种声明格式：
+ 嵌套声明格式
+ 展平声明格式

### 嵌套声明格式
<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>

展平声明格式与 Microsoft Entra ID 等不支持 JWT 声明中嵌套对象的身份提供商兼容。在这种格式中：
+ 主体标签显示为带有前缀 `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 示例都显示了使用 `Project`、`CostCenter` 和 `Department` 会话标签对 `AssumeRoleWithWebIdentity` 的调用。两个令牌都将 `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 如何在角色链中，将会话标签、可传递标签和角色标签传递到后续会话。

在以下示例角色链场景中，您在 AWS CLI 中使用 IAM 用户的访问密钥代入名为 `Role1` 的角色。然后，您可以使用生成的会话凭证代入名为 `Role2` 的第二个角色。接下来，您可以使用第二个会话凭证代入名为 `Role3` 的第三个角色。这些请求作为三个单独的操作发生。每个角色均已在 IAM 中标记。在每个请求过程中，您都会传递额外的会话标签。

![\[角色链\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/session-tags-chaining-simple.png)


链接角色时，您可以确保来自较早会话的标签保留到后续会话。要使用 `assume-role` CLI 命令执行此操作，您必须将标签作为会话标签传递，并将标签设置为可传递。您传递标签 `Star` = `1` 作为会话标签。此命令还将标签 `Heart` = `1` 附加到角色，并在您使用会话时作为主体标签应用。但是，您还希望自动将 `Heart` = `1` 标签传递给第二个或第三个会话。为此，您可以手动将其包含为会话标签。生成的会话主体标记包括这两个标记，并将它们设置为可传递。

![\[代入角色链中的第一个角色\]](http://docs.aws.amazon.com/zh_cn/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_cn/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_cn/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) 管理用户实体，则可以配置 SAML 断言，将会话标记传递给 AWS。例如，对于公司用户身份，当您的员工联合到 AWS，AWS 会将其属性应用于其生成的主体。然后，您可以使用 ABAC 来允许或拒绝基于这些属性的权限。有关更多信息，请参阅 [IAM 教程：将 SAML 会话标签用于 ABAC](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 日志文件包括有关所代入角色或联合身份用户会话的主体标签的信息。有关更多信息，请参阅 [使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用](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)