如何使用 AWS CLI 代入 IAM 角色?

上次更新时间:2021 年 5 月 11 日

我想使用 AWS 命令行界面(CLI)代入 AWS Identity and Access Management(IAM)角色。我该如何操作?

解决方法

请按照以下说明使用 AWS CLI 代入 IAM 角色。在本示例中,遵照以下步骤后,用户对 Amazon Elastic Compute Cloud (Amazon EC2) 实例具有只读访问权限,并有权代入 IAM 角色。

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

创建有权代入角色的 IAM 用户

1.    使用 AWS CLI 创建 IAM 用户

注意:Bob 替换为您的 IAM 用户名。

aws iam create-user --user-name Bob

2.    使用 AWS CLI 创建用于向 Bob 授予权限的 IAM 策略。您可以使用您喜欢的文本编辑器创建用于定义 IAM 策略的 JSON 文件。本示例使用的是 Linux 中常用的 vim:

注意:example 替换为您自己的策略名称、用户名、角色、JSON 文件名、配置文件名称和密钥。

vim example-policy.json

3.    example-policy.json 文件的内容应与以下内容类似:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*",
                "iam:ListRoles",
                "sts:AssumeRole"
            ],
            "Resource": "*"
        }
    ]
}

有关创建 IAM 策略的更多信息,请参阅创建 IAM 策略基于身份的 IAM 策略示例IAM JSON 策略参考

创建 IAM 策略

1.    使用 aws iam create-policy 命令:

aws iam create-policy --policy-name example-policy --policy-document file://example-policy.json

aws iam create-policy 命令输出了多条信息,包括 IAM 策略的 ARN(Amazon 资源名称):

arn:aws:iam::123456789012:policy/example-policy

注意:123456789012 替换为您自己的账户。

2.    记下输出信息中的 IAM 策略 ARN,并使用 attach-user-policy 命令将此策略附加到 Bob然后,使用 list-attached-user-policies 检查附件以确保附件已准备就绪:

aws iam attach-user-policy --user-name Bob --policy-arn "arn:aws:iam::123456789012:policy/example-policy"
aws iam list-attached-user-policies --user-name Bob

创建用于定义 IAM 角色的信任关系的 JSON 文件

1.    创建用于定义信任关系的 JSON 文件:
vim example-role-trust-policy.json

2.    example-role-trust-policy.json 文件的内容应与以下内容类似:

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

您还可以限制信任关系,以便只有特定 IAM 用户才能代入 IAM 角色。您可以通过指定类似于 arn:aws:iam::123456789012:user/example-username 的委托人来执行此操作。有关更多信息,请参阅 AWS JSON 策略元素:Principal

创建 IAM 角色并附加策略

创建一个可由具有 Amazon Relational Database Service (Amazon RDS) 实例只读访问权限的 Bob 代入的 IAM 角色。由于该 IAM 角色由 IAM 用户代入,因此您必须指定一个委托人,允许 IAM 用户代入该角色。例如,类似于 arn:aws:iam::123456789012:root 的委托人允许账户的所有 IAM 身份代入该角色。有关更多信息,请参阅创建向 IAM 用户委派权限的角色

1.    创建对 Amazon RDS 数据库实例具有只读访问权限的 IAM 角色。根据您的安全要求,向您的 IAM 角色附加 IAM 策略。

aws iam create-role 命令用于创建 IAM 角色,并根据 JSON 文件的内容定义信任关系。aws iam attach-role-policy 命令用于向该角色附加 AWS 管理策略 AmazonRDSReadOnlyAccess。根据您的安全要求,可以附加不同的策略(管理策略和自定义策略)。aws iam list-attached-role-policies 命令用于显示向 IAM 角色 example-role 附加的 IAM 策略。

aws iam create-role --role-name example-role --assume-role-policy-document file://example-role-trust-policy.json
aws iam attach-role-policy --role-name example-role --policy-arn "arn:aws:iam::aws:policy/AmazonRDSReadOnlyAccess"
aws iam list-attached-role-policies --role-name example-role

注意:验证 Bob 对 EC2 实例具有只读访问权限,并且能够代入 example-role

2.    使用此命令来创建 Bob 的访问密钥:

aws iam create-access-key --user-name Bob

AWS CLI 命令输出的是访问密钥 ID 和秘密访问密钥。请务必记下这些密钥。

配置访问密钥

1.    要配置访问密钥,请使用默认配置文件或特定配置文件。要配置默认配置文件,请运行 aws configure。要新建特定配置文件,请运行 aws configure --profile example-profile-name。在本示例中,已配置默认配置文件:

aws configure
AWS Access Key ID [None]: ExampleAccessKeyID1
AWS Secret Access Key [None]: ExampleSecretKey1
Default region name [None]: eu-west-1
Default output format [None]: json

注意:对于 Default region name(默认区域名称),请指定您的 AWS 区域

验证已调用 AWS CLI 命令,然后验证 IAM 用户访问权限

1.    运行 aws sts get-caller-identity 命令:

aws sts get-caller-identity

aws sts get-caller-identity 命令会输出三条信息,包括 ARN。该输出应显示类似于 arn:aws:iam::123456789012:user/Bob 的内容,用于验证是否以 Bob 的身份调用了 AWS CLI 命令。

2.    运行以下命令,以确认 IAM 用户对 EC2 实例具有只读访问权限,而对 Amazon RDS 数据库实例没有访问权限:

aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]"
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"

aws ec2 describe-instances 命令应显示 eu-west-1 区域中的所有 EC2 实例。由于 Bob 不具有 Amazon RDS 的访问权限,因此 aws rds describe-db-instances 命令必然会生成访问遭拒的错误消息。

代入 IAM 角色

执行以下任意一项操作:

通过在 ~/.aws/config 文件中创建配置文件来使用 IAM 角色。有关更多信息,请参阅在 AWS CLI 中使用 IAM 角色

–或者–

遵循以下步骤代入 IAM 角色。

1.    运行以下命令以获取角色的 ARN:

aws iam list-roles --query "Roles[?RoleName == 'example-role'].[RoleName, Arn]"

2.    该命令列出了 IAM 角色,但根据角色名称对输出进行了筛选。要代入 IAM 角色,请运行以下命令:

aws sts assume-role --role-arn "arn:aws:iam::123456789012:role/example-role" --role-session-name AWSCLI-Session

AWS CLI 命令输出了多条信息。在凭证块内,您需要提供 AccessKeyIdSecretAccessKeySessionToken。此示例使用环境变量 RoleAccessKeyIDRoleSecretKeyRoleSessionToken。请记下有效期字段的时间戳,它使用 UTC 时区,可指示 IAM 角色的临时凭证何时会过期。如果临时凭证已过期,您必须重新调用 sts: AssumeRole API 调用。

注意:您可以使用 DurationSeconds 参数为 IAM 角色的临时凭证延长最大会话持续时间有效期。

创建环境变量来代入 IAM 角色并验证访问权限

1.    创建三个环境变量来代入 IAM 角色。使用以下输出来填充这些环境变量:

export AWS_ACCESS_KEY_ID=RoleAccessKeyID
export AWS_SECRET_ACCESS_KEY=RoleSecretKey
export AWS_SESSION_TOKEN=RoleSessionToken

2.    运行以下命令,以验证您是否已代入 IAM 角色:

aws sts get-caller-identity

AWS CLI 命令应将 ARN 输出为 arn:aws:sts::123456789012:assumed-role/example-role/AWSCLI-Session,而非 arn:aws:iam::123456789012:user/Bob,以验证您是否已代入 example-role

3.    您创建的 IAM 角色对 Amazon RDS 数据库实例具有只读访问权限,但对 EC2 实例不具有访问权限。通过运行以下命令进行验证:

aws ec2 describe-instances --query "Reservations[*].Instances[*].[VpcId, InstanceId, ImageId, InstanceType]"
aws rds describe-db-instances --query "DBInstances[*].[DBInstanceIdentifier, DBName, DBInstanceStatus, AvailabilityZone, DBInstanceClass]"

aws ec2 describe-instances 命令应生成访问遭拒的错误消息,而 aws rds describe-db-instances 命令应返回 Amazon RDS 数据库实例。这将验证分配给 IAM 角色的权限能否正常使用。

4.    要返回 IAM 用户,请删除环境变量:

unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
aws sts get-caller-identity

unset 命令用于删除环境变量,而 aws sts get-caller-identity 命令用于验证您是否以 IAM 用户 Bob 的身份返回。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?