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

4 分钟阅读
0

我想使用 AWS 命令行界面(AWS CLI)代入 AWS Identity and Access Management(AWS 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
  1. 使用 AWS CLI 创建能够向 Bob 授予权限的 IAM 策略。使用您最喜欢的文本编辑器创建定义 IAM 策略的 JSON 文件。例如,您可以使用在 Linux 中常用的文本编辑器 vim,如下所示:

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

vim example-policy.json
  1. 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

  1. 记下输出中的 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

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

  1. 创建可定义信任关系的 JSON 文件,如下所示:
vim example-role-trust-policy.json
  1. 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 角色并附加策略

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

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

aws iam create-role 命令根据您在上一节中创建的 JSON 文件创建 IAM 角色并定义信任关系。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

  1. 使用以下命令为 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,可通过此结果验证 AWS CLI 命令是否以 Bob 的身份进行了调用。

  1. 通过执行以下命令,确认 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 实例。aws rds describe-db-instances 命令必须生成表示“访问被拒绝”的错误消息,因为 Bob 无权访问 Amazon RDS。

代入 IAM 角色

执行以下任一操作:

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

通过执行以下操作来代入 IAM 角色:

  1. 通过执行以下命令获取角色的 ARN:
aws iam list-roles --query "Roles[?RoleName == 'example-role'].[RoleName, Arn]"
  1. 该命令列出了 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

  1. 通过执行以下命令验证您是否代入了 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

  1. 使用以下命令验证您已创建一个具有 Amazon RDS 数据库实例只读访问权限且无权访问 EC2 实例的 IAM 角色:
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 角色的权限是否正常运行。

  1. 要返回 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=

相关信息

角色术语和概念

create-role

创建角色以向 AWS 服务委派权限