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

上次更新日期:2023 年 1 月 6 日

我想使用 AWS 命令行界面(AWS CLI)代入 AWS Identity and Access Management(IAM)角色。

解决方法

要使用 AWS CLI 代入 IAM 角色并对 Amazon Elastic Compute Cloud(Amazon EC2)实例进行只读访问,请执行以下操作:

注意:如果您在运行 AWS CLI 命令时收到错误,请确认您正在运行最新版本的 AWS CLI

重要提示:运行以下步骤中的命令会以明文形式显示您的凭证,例如密码。在您代入 IAM 角色后,最佳做法是更改密码。

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

1.    运行以下命令来使用 AWS CLI 创建 IAM 用户

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

aws iam create-user --user-name Bob

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

注意: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 policy基于身份的 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 policy 的 ARN(Amazon 资源名称),如下所示:

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

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

2.    记下输出信息中的 IAM policy 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": "123456789012"
    },
    "Action": "sts:AssumeRole"
  }
}

如果账户 123456789012 的用户和角色在其权限策略中允许 sts:AssumeRole 操作,则此信任策略允许他们代入此角色。您还可以限制信任关系,以便只有特定 IAM 用户才能代入 IAM 角色。您可以通过指定类似于 arn:aws:iam::123456789012:user/example-username 的主体来执行此操作。有关更多信息,请参阅 AWS JSON 策略元素:主体

创建 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

        注意:对于 Windows 系统,请在此命令中将 export 替换为 set

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

注意:对于 Windows 系统,请按照以下方式将环境变量设置为空字符串以清除内容:

SET AWS_ACCESS_KEY_ID=
SET AWS_SECRET_ACCESS_KEY=
SET AWS_SESSION_TOKEN=

这篇文章对您有帮助吗?


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