切换到 IAM 角色 (AWS CLI) - AWS Identity and Access Management

切换到 IAM 角色 (AWS CLI)

角色 指定可用于访问所需的 AWS 资源的一组权限。在这种意义上,它类似于 AWS Identity and Access Management 中的用户 (IAM)。作为用户登录时,您会获取一组特定权限。不过,您不会登录到角色,但在以用户身份登录后,您可以切换到角色。这会临时搁置原始用户权限,而向您提供分配给角色的权限。角色可以在您自己的账户中或任何其他 AWS 账户 中。有关角色、其权益以及如何创建和配置角色的更多信息,请参阅IAM 角色创建 IAM 角色。要了解在担任角色时使用的各种方法,请参阅使用 IAM 角色

重要

不会累积您的 IAM 用户和担任的任何角色的权限。一次只有一组权限处于活动状态。在担任某个角色时,您将临时放弃以前的用户或角色权限并使用为该角色分配的权限。退出该角色后,您的用户权限将自动恢复。

在以 IAM 用户身份登录后,您可以使用角色来运行 AWS CLI 命令。在以已使用角色的 externally authenticated user(外部验证的用户)(SAMLOIDC)身份登录后,您也可以使用角色来运行 AWS CLI 命令。此外,您还可以使用角色从通过实例配置文件附加到角色的 Amazon EC2 实例中运行 AWS CLI 命令。在以 AWS 账户根用户身份登录时,您无法担任角色。

角色链 — 您还可以使用角色链,这将使用来自一个角色的权限访问另一个角色。

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

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

示例方案:切换到生产角色

假设您是一名在开发环境中工作的 IAM 用户。在此场景中,您有时需要使用 AWS CLI 通过命令行来使用生产环境。您已经有一组可用的访问密钥凭证。这可能是分配给您的标准 IAM 用户的访问密钥对。或者,如果您以联合身份用户身份登录,则它可能是最初为您分配的角色的访问密钥对。如果您的当前权限授予您担任特定 IAM 角色的能力,则可以在 AWS CLI 配置文件的“配置文件”中标识该角色。然后,将使用指定 IAM 角色而非原始身份的权限运行该命令。请注意,通过 AWS CLI 命令指定该配置文件时,您使用的是新角色。在这种情况下,您无法同时使用开发账户中的原始权限。原因是,一次仅一组权限能够生效。

注意

为了安全起见,管理员可以查看 AWS CloudTrail 日志以了解已在 AWS 中执行操作的人员。您的管理员可能会要求您在代入角色时指定源身份或角色会话名称。有关更多信息,请参阅 sts:SourceIdentitysts:RoleSessionName

切换到生产角色 (AWS CLI)
  1. 如果您从未使用过 AWS CLI,则您必须先配置默认的 CLI 配置文件。打开命令提示符并将您的 AWS CLI 安装设置为使用来自 IAM 用户或联合角色的访问密钥。有关更多信息,请参阅《AWS Command Line Interface 用户指南》中的配置 AWS Command Line Interface

    运行 aws 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
  2. 在 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
  3. 在创建新的配置文件后,将使用附加到 IAM 角色 ProductionAccessRole(而不是默认用户)的权限运行指定 --profile prodaccess 参数的任何 AWS CLI 命令。

    aws iam list-users --profile prodaccess

    如果分配给 ProductionAccessRole 的权限允许列出当前 AWS 账户中的用户,则此命令有效。

  4. 要返回到原始凭证授予的权限,请运行不带 --profile 参数的命令。AWS CLI 将恢复使用您在步骤 1中配置的默认配置文件中的凭证。

有关更多信息,请参阅 AWS Command Line Interface 用户指南中的代入角色

示例场景:允许实例配置文件角色切换到另一个账户中的角色

假设您使用两个 AWS 账户,并希望允许 Amazon EC2 实例上运行的应用程序在两个账户中运行 AWS CLI 命令。假设 EC2 实例位于 111111111111 账户中。该实例包含 abcd 实例配置文件角色,以允许应用程序对同一 111111111111 账户中的 my-bucket-1 存储桶执行只读 Amazon S3 任务。不过,还必须允许应用程序担任 efgh 跨账户角色以在账户 222222222222 中执行任务。为此,abcd EC2 实例配置文件角色必须具有以下权限策略:

账户 111111111111 abcd 角色权限策略

{ "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:::my-bucket-1/*", "arn:aws:s3:::my-bucket-1" ] }, { "Sid": "AllowIPToAssumeCrossAccountRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222222222222:role/efgh" } ] }

假设 efgh 跨账户角色允许对同一 222222222222 账户中的 my-bucket-2 存储桶执行只读 Amazon S3 任务。为此,efgh 跨账户角色必须具有以下权限策略:

账户 222222222222 efgh 角色权限策略

{ "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:::my-bucket-2/*", "arn:aws:s3:::my-bucket-2" ] } ] }

efgh 角色必须允许 abcd 实例配置文件角色担任该角色。为此,efgh 角色必须具有以下信任策略:

账户 222222222222 efgh 角色信任策略

{ "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 纪元时间 (自 1970 年 1 月 1 日午夜 UTC 算起的秒数) 的整数。有关更多信息,请参阅 AWS CloudTrail 用户指南中的 CloudTrail 事件引用

允许 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
  2. 在创建新的配置文件后,将使用附加到 222222222222 账户中的 efgh 角色的权限运行指定 --profile instancecrossaccount 参数的任何 AWS CLI 命令。

    aws s3 ls my-bucket-2 --profile instancecrossaccount

    如果分配给 efgh 角色的权限允许列出当前 AWS 账户 中的用户,则该命令有效。

  3. 要恢复为 111111111111 账户中的原始 EC2 实例配置文件权限,请不要使用 --profile 参数运行 CLI 命令。

有关更多信息,请参阅 AWS Command Line Interface 用户指南中的代入角色