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

上次更新时间:2020 年 5 月 15 日

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

解决方法

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

创建有权代入角色的 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

注意:默认区域名称中,请指定您的 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 角色

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 的身份返回。

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


这篇文章对您有帮助吗?


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