AWS Command Line Interface
用户指南

在 AWS CLI 中使用 IAM 角色

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

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

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

[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 实例或 Amazon ECS 容器中运行 CLI 命令,可以使用附加到实例配置文件或容器的 IAM 角色。如果未指定配置文件或未设置环境变量,则将直接使用该角色。这让您能够避免在实例上存储长时间生存的访问密钥。您也可以使用这些实例或容器角色仅获取其他角色的凭证。为此,请使用 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

当您调用角色时,您可以要求其他选项,例如使用多重身份验证、外部 ID(供第三方公司用于访问其客户的资源)以及指定可更容易地在 AWS CloudTrail 日志中进行审核的唯一角色会话名称。

配置和使用角色

在使用指定 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_PROFILE=marketingadmin

Windows

C:\> setx AWS_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 role-without-mfa 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 role-with-mfa Enter MFA code for arn:aws:iam::123456789012:mfa/cli-user: { "Users": [ { ...

跨账户角色和外部 ID

通过将角色配置为跨账户角色,您可以让 IAM 用户使用属于不同账户的角色。在创建角色期间,将角色类型设置为 Another AWS account (其他 AWS 账户)(如创建向 IAM 用户委派权限的角色中所述)。(可选)选择 Require MFA (需要 MFA)Require MFA (需要 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

指定角色会话名称以便于审核

当某个角色被许多人共享时,审核会变得比较困难。您希望将调用的每个操作与调用该操作的个人关联。但是,当个人使用角色时,个人代入角色是一项独立于调用操作的行为,您必须手动将这两者关联起来。

通过在用户代入角色时指定唯一的角色会话名称,您可以简化此过程。只需向指定某一角色的 config 文件中的每个命名配置文件添加 role_session_name 参数,即可实现这一点。role_session_name 值将传递给 AssumeRole 操作,并成为角色会话 ARN 的一部分。该值也包含在所有已记录操作的 AWS CloudTrail 日志中。

例如,您可以创建基于角色的配置文件,如下所示:

[profile namedsessionrole] role_arn = arn:aws:iam::234567890123:role/SomeRole source_profile = default role_session_name = Session_Maria_Garcia

这会导致角色会话具有以下 ARN:

arn:aws:iam::234567890123:assumed-role/SomeRole/Session_Maria_Garcia

此外,所有 AWS CloudTrail 日志都在为每个操作捕获的信息中包含角色会话名称。

通过 Web 身份代入角色

您可以配置一个配置文件,以指示 AWS CLI 应使用 Web 联合身份验证和 Open ID Connect (OIDC) 代入角色。当您在配置文件中指定此选项时,AWS CLI 会自动为您发出相应的 AWS STS AssumeRoleWithWebIdentity 调用。

注意

当您指定使用 IAM 角色的配置文件时,AWS CLI 会发出相应的调用来检索临时凭证。随后,这些凭证将存储在 ~/.aws/cli/cache 中。指定同一个配置文件的后续 AWS CLI 命令将使用缓存的临时凭证,直到它们过期。这时,AWS CLI 将自动刷新这些凭证。

要通过 Web 联合身份验证检索和使用临时凭证,您可以在共享配置文件中指定以下配置值:

role_arn

指定要代入的角色的 ARN。

web_identity_token_file

指定一个文件的路径,该文件包含由身份提供商提供的 OAuth 2.0 访问令牌或 OpenID Connect ID 令牌。AWS CLI 加载此文件,并将其内容作为 AssumeRoleWithWebIdentity 操作的 WebIdentityToken 参数传递。

role_session_name

指定应用于此代入角色会话的可选名称。

以下是使用 Web 身份配置文件配置代入角色所需的最少量配置的示例配置:

# In ~/.aws/config [profile web-identity] role_arn=arn:aws:iam:123456789012:role/RoleNameToAssume web_identity_token_file=/path/to/a/token

您也可以使用环境变量提供此配置:

AWS_ROLE_ARN

要代入的角色的 ARN。

AWS_WEB_IDENTITY_TOKEN_FILE

Web 身份令牌文件的路径。

AWS_ROLE_SESSION_NAME

应用于此代入角色会话的名称。

注意

这些环境变量当前仅适用于使用 Web 身份提供商的代入角色,而不适用于常规代入角色提供商配置。

清除缓存凭证

当您使用一个角色时,AWS CLI 会在本地缓存临时凭证,直到这些凭证过期。当您下次尝试使用它们时,AWS CLI 会尝试代表您续订这些凭证。

如果您的角色的临时凭证已吊销,它们不会自动续订,并且使用它们的尝试将失败。但是,您可以删除缓存以强制 AWS CLI 检索新凭证。

Linux, macOS, or Unix

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

Windows

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