AWS Command Line Interface
用户指南

在 AWS CLI 中代入 IAM 角色

AWS Identity and Access Management (IAM) 角色是一种授权工具,可让 IAM 用户获得额外(或不同)的权限或者获取使用其他 AWS 账户执行操作的权限。

通过在 ~/.aws/config 文件中为某个角色定义配置文件,您可以配置 AWS Command Line Interface (AWS CLI) 以使用 IAM 角色。

以下示例显示了一个名为 marketingadmin 的角色配置文件。如果使用 --profile marketingadmin(或使用 AWS_DEFAULT_PROFILE 环境变量指定它)运行命令,则 CLI 使用分配给配置文件 user1 的权限代入 Amazon 资源名称 (ARN) 为 arn:aws:iam::123456789012:role/marketingadminrole 的角色。您可以运行分配给该角色的权限所允许的任何操作。

[profile marketingadmin] role_arn = arn:aws:iam::123456789012:role/marketingadminrole source_profile = user1

您必须指定一个指向单独的命名配置文件的 source_profile,此配置文件包含 IAM 用户凭证及代入该角色的权限。在上一个示例中,marketingadmin 配置文件使用 user1 配置文件中的凭证。当您指定某个 AWS CLI 命令将使用配置文件 marketingadmin 时,CLI 会自动查找链接的 user1 配置文件的凭证,并使用它们为指定的 IAM 角色请求临时凭证。CLI 在后台使用 sts:AssumeRole 操作来完成该操作。然后,使用这些临时凭证来运行请求的 CLI 命令。指定的角色必须附加有允许运行请求的 CLI 命令的 IAM 权限策略。

如果要在 Amazon EC2 实例中运行 CLI 命令,可以使用附加到 Amazon EC2 实例配置文件的 IAM 角色或 Amazon ECS 容器角色。这让您能够避免在实例上存储长时间生存的访问密钥。为此,请使用 credential_source(而不是 source_profile)指定如何查找凭证。credential_source 属性支持以下值:

  • Environment – 从环境变量检索凭证。

  • Ec2InstanceMetadata – 使用附加到 Amazon EC2 实例配置文件的 IAM 角色。

  • EcsContainer – 使用附加到 Amazon ECS 容器的 IAM 角色。

以下示例显示通过引用 Amazon EC2 实例配置文件来代入同一个 marketingadminrole 角色:

[profile marketingadmin] role_arn = arn:aws:iam::123456789012:role/marketingadminrole credential_source = Ec2InstanceMetadata

有关更多信息,请参阅 AWS CLI 配置变量

配置和使用角色

在使用指定 IAM 角色的配置文件运行命令时,AWS CLI 将使用源配置文件的凭证调用 AWS Security Token Service (AWS STS) 并为指定角色请求临时凭证。源配置文件中的用户必须具有为指定配置文件中的角色调用 sts:assume-role 的权限。该角色必须具有允许源配置文件中的用户代入角色的信任关系。检索角色的临时凭证然后使用临时凭证的过程通常称为代入角色

您可以通过执行 AWS Identity and Access Management 用户指南 中的创建向 IAM 用户委派权限的角色下的过程,在 IAM 中创建一个您希望用户代入的具有该权限的新角色。如果该角色和源配置文件的 IAM 用户在同一个账户中,在配置角色的信任关系时,您可以输入自己的账户 ID。

在创建角色后,请修改信任关系以允许 IAM 用户(或 AWS 账户中的用户)代入该角色。

以下示例显示了一个可附加到角色的信任策略。该策略允许账户 123456789012 中的任何 IAM 用户代入该角色,前提 是该账户的管理员向该用户显式授予了 sts:assumerole 权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "sts:AssumeRole" } ] }

信任策略不会实际授予权限。账户管理员必须通过附加具有适当权限的策略才能将代入角色的权限委派给各个用户。以下示例显示了一个可附加到 IAM 用户的策略,该策略仅允许用户代入 marketingadminrole 角色。有关授予用户代入角色的访问权限的更多信息,请参阅 IAM 用户指南 中的向用户授予切换角色的权限

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::123456789012:role/marketingadminrole" } ] }

IAM 用户无需拥有任何附加权限即可使用角色配置文件运行 CLI 命令。相反,运行命令的权限来自附加到角色 的权限。您可以将权限策略附加到角色,以指定可以针对哪些 AWS 资源执行哪些操作。有关向角色附加权限(与向 IAM 用户附加权限的操作相同)的更多信息,请参阅 IAM 用户指南 中的更改 IAM 用户的权限

您已正确配置角色配置文件、角色权限、角色信任关系和用户权限,可以通过调用 --profile 选项在命令行中使用该角色了。例如,下面的命令使用附加到 marketingadmin 角色(由本主题开头的示例定义)的权限调用 Amazon S3 ls 命令。

$ aws s3 ls --profile marketingadmin

要对多个调用使用角色,您可以从命令行设置当前会话的 AWS_DEFAULT_PROFILE 环境变量。定义该环境变量后,就不必对每个命令都指定 --profile 选项。

Linux, macOS, or Unix

$ export AWS_DEFAULT_PROFILE=marketingadmin

Windows

C:\> setx AWS_DEFAULT_PROFILE marketingadmin

有关配置 IAM 用户和角色的更多信息,请参阅 IAM 用户指南 中的用户和组角色

使用多重验证

为了提高安全性,当用户尝试使用角色配置文件进行调用时,您可以要求用户提供从多重验证 (MFA) 设备(一种 U2F 设备)或移动应用程序生成的一次性密钥。

首先,您可以选择将与 IAM 角色有关的信任关系修改为需要 MFA。这可以防止任何人在未首先使用 MFA 进行身份验证的情况下使用该角色。有关示例,请参阅下面示例中的 Condition 行。此策略允许名为 anika 的 IAM 用户代入策略所附加的角色,但前提是她使用 MFA 进行身份验证。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:user/anika" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:multifactorAuthPresent": true } } } ] }

其次,为角色配置文件添加一行,用来指定用户的 MFA 设备的 ARN。以下示例 config 文件条目显示两个角色配置文件,它们都使用访问密钥为 IAM 用户 anika 请求角色 cli-role 的临时凭证。用户 anika 有权代入角色,这是由角色的信任策略授予的。

[profile role-without-mfa] region = us-west-2 role_arn= arn:aws:iam::128716708097:role/cli-role source_profile=cli-user [profile role-with-mfa] region = us-west-2 role_arn= arn:aws:iam::128716708097:role/cli-role source_profile = cli-user mfa_serial = arn:aws:iam::128716708097:mfa/cli-user [profile anika] region = us-west-2 output = json

mfa_serial 设置可以采取如图所示的 ARN 或硬件 MFA 令牌的序列号。

第一个配置文件 role-without-mfa 不需要 MFA。但是,由于附加到角色的先前示例信任策略需要 MFA,因此使用此配置文件运行命令的任何尝试都将失败。

$ aws iam list-users --profile cli-role An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied

第二个配置文件条目 role-with-mfa 标识要使用的 MFA 设备。当用户尝试使用此配置文件运行 CLI 命令时,CLI 会提示用户输入 MFA 设备提供的一次性密码 (OTP)。如果 MFA 身份验证成功,则此命令会执行请求的操作。OTP 未显示在屏幕上。

$ aws iam list-users --profile cli-role-mfa Enter MFA code for arn:aws:iam::123456789012:mfa/cli-user: { "Users": [ { ...

跨账户角色

通过将角色配置为跨账户角色,您可以让 IAM 用户代入属于不同账户的角色。在创建角色期间,将角色类型设置为 Another AWS account (其他 AWS 账户)(如创建向 IAM 用户委派权限的角色中所述)。(可选)选择 Require MFA (需要 MFA)Require MFA 选项将按照使用多重验证中所述在信任关系中配置相应条件。

如果使用外部 ID 来加强控制可跨账户代入角色的人员,则还必须将 external_id 参数添加到角色配置文件。通常情况下,仅应在其他账户由公司或组织外部的人员控制时才使用该功能。

[profile crossaccountrole] role_arn = arn:aws:iam::234567890123:role/SomeRole source_profile = default mfa_serial = arn:aws:iam::123456789012:mfa/saanvi external_id = 123456

有关更多信息,请参阅 AWS CLI 配置变量

清除缓存凭证

当您代入一个角色时,AWS CLI 会在本地缓存临时凭证,直到这些凭证过期。如果您的角色的临时凭证已撤销,则您可以删除缓存以强制 AWS CLI 检索新凭证。

Linux, macOS, or Unix

$ rm -r ~/.aws/cli/cache

Windows

C:\> del /s /q %UserProfile%\.aws\cli\cache