一、EC2

针对 EC2 上面的应用程序,不要分配 User Credentials,使用 IAM Role Attachment。 可以访问 EC2 的 meatdata 查看赋予的 Role 权限

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

二、Software on local laptop

针对在自己电脑上面开发测试的用户,用户需要 S3 的访问权限,不给用户分配权限,这样可以避免 AK/SK 丢失造成的损失,我们可以给 User 分配一个 cross-account IAM roles,让用户使用接口 assume-role 获取临时的 AK/SK,然后去访问AWS 资源。

2.1、创建用户 alice

不给用户分配任何权限。

image-20200426135904601

image-20200426135949777

最后得到用户的 AK/SK

Access key ID :AKIA5NAGHF6N3XUJY3FR
Secret access key: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

2.2、创建一个跨账户 Role(同账户下)

我们创建一个跨账户的角色,我们此次操作在自己的账户下面,其他的账户如此操作也是可以的,我们也可以增加 Require external ID 作为 Assume role 的 Conditation,会更加安全。

image-20200426140404747

给角色增加权限。

image-20200426140638223

审核

image-20200426140748237

生成的 Role ARN:arn:aws:iam::921283538843:role/alice-sts

image-20200426140851545

我们需要把生成的 Role 的 trust relationship policy 修改一下,默认这个角色是给 root 用户 assumerole 的,我们修改一下,使 alice 这个用户可以 assumerole 这个角色,

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::921283538843:user/alice"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "wzlinux"
        }
      }
    }
  ]
}

2.3、测试用户权限

直接使用 AK/SK,查看用户是否有相应的权限。 使用 aws configure 配置。

wangzan:~/.aws $ aws configure --profile alice
AWS Access Key ID [None]: AKIA5NAGHF6N3XUJY3FR
AWS Secret Access Key [None]: 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
Default region name [None]: us-east-1
Default output format [None]: json 
# 查看一下我们目前的请求是数据那个用户和角色
wangzan:~/.aws $ aws sts get-caller-identity --profile alice
aws sts get-caller-identity --profile alice
{
    "Account": "921283538843", 
    "UserId": "AIDA5NAGHF6NRQOZ6SREB", 
    "Arn": "arn:aws:iam::921283538843:user/alice"
}
# 尝试使用这个 profile 获取资源
wangzan:~/.aws $ aws s3 ls --profile alice
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

直接使用是获取不到权限的,那我们使用 assume-role

wangzan:~ $ aws sts assume-role --role-arn arn:aws:iam::921283538843:role/alice-sts --role-session-name alice1233 --profile alice

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::921283538843:user/alice is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::921283538843:role/alice-sts

但是我们发现,还是没有权限去 assume 这个 role,我们忘记了,我们还增加了一个Require external ID,所以,我们在 assume 的时候,也需要加上这个。

aws sts assume-role \
    --role-arn arn:aws:iam::921283538843:role/alice-sts \
    --role-session-name alice345 \
    --external-id wzlinux \
    --profile alice

返回结果如下,我们可以看到成功 assume role 了。

{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA5NAGHF6NV5GXLXWM7:alice345", 
        "Arn": "arn:aws:sts::921283538843:assumed-role/alice-sts/alice345"
    }, 
    "Credentials": {
        "SecretAccessKey": "O0IzLL3eBOlCLjXOx6NdPI7EjJKfFL+iAEFPcJCt", 
        "SessionToken": "IQoJb3JpZ2luX2VjEHcaCXVzLWVhc3QtMSJHMEUCIQCpLr3S6JL3EWufCqWaMF5QFA35NDLWbNeSspPERzE/wwIgOIrKoQIE+xFPTBkw0QYWebn/QOg01nYtiYSQbrHwepEq2AEIoP//////////ARABGgw5MjEyODM1Mzg4NDMiDHglcpWVJPtOCBeQ1CqsAbwoLqUwR9q45RDmjk6r5SvhwAQzmH8ldcts0gTZdJJe8LxAA5HJSzFRI+0j6vjiCP8AYCNXf3Nr+RiFjcyKzRHHAo97GqG4cp65eUJ00jdltmODZPG5y7iL5SoTZgzxn3s3DT7jiF3FZSiyxf9LmV+Qp+vfSg91gCos128ezLT4a6bdd5o/LiJX7bUpQ+sznsY3NgMoZOTIIDHbHFuH2Q8rUh93ZxfwQoapM3Uwh9GU9QU64wE5s2s3QecbhMCUUHAN+td30IVqX4iVYzlY6xr/oetEFZQHorc1mwzuF7J0MWmVkju3tbkLwQUn/IH3cZuQL+yhJo/Sqe0KcHsRA2VOuN+HRbnqnsna83FgI3h2bvKM1jm8X5Ni3eYJhYl5sDP6DCc62CDtdAmX0Vfdf9LOYInVQVmc3PcKluMMJ9fR4P8qTYjAG+Kb5VfiRPmb636271VSYMTmF89DGrUQeh3E39/zwgzwflzJ+G6bfvdXlp/SqJqd9Op/8mwK51F3dp33h8Y4GedYKCZP+OTa8aFqydseUq4FsQ==", 
        "Expiration": "2020-04-26T07:21:59Z", 
        "AccessKeyId": "ASIA5NAGHF6NTTWXBNO3"
    }
}

然后去编辑 ~/.aws/credentials,把生成的Credentials放到里面,如下:

[alice-sts]
aws_access_key_id = ASIA5NAGHF6NTTWXBNO3
aws_secret_access_key = O0IzLL3eBOlCLjXOx6NdPI7EjJKfFL+iAEFPcJCt
aws_session_token = IQoJb3JpZ2luX2VjEHcaCXVzLWVhc3QtMSJHMEUCIQCpLr3S6JL3EWufCqWaMF5QFA35NDLWbNeSspPERzE/wwIgOIrKoQIE+xFPTBkw0QYWebn/QOg01nYtiYSQbrHwepEq2AEIoP//////////ARABGgw5MjEyODM1Mzg4NDMiDHglcpWVJPtOCBeQ1CqsAbwoLqUwR9q45RDmjk6r5SvhwAQzmH8ldcts0gTZdJJe8LxAA5HJSzFRI+0j6vjiCP8AYCNXf3Nr+RiFjcyKzRHHAo97GqG4cp65eUJ00jdltmODZPG5y7iL5SoTZgzxn3s3DT7jiF3FZSiyxf9LmV+Qp+vfSg91gCos128ezLT4a6bdd5o/LiJX7bUpQ+sznsY3NgMoZOTIIDHbHFuH2Q8rUh93ZxfwQoapM3Uwh9GU9QU64wE5s2s3QecbhMCUUHAN+td30IVqX4iVYzlY6xr/oetEFZQHorc1mwzuF7J0MWmVkju3tbkLwQUn/IH3cZuQL+yhJo/Sqe0KcHsRA2VOuN+HRbnqnsna83FgI3h2bvKM1jm8X5Ni3eYJhYl5sDP6DCc62CDtdAmX0Vfdf9LOYInVQVmc3PcKluMMJ9fR4P8qTYjAG+Kb5VfiRPmb636271VSYMTmF89DGrUQeh3E39/zwgzwflzJ+G6bfvdXlp/SqJqd9Op/8mwK51F3dp33h8Y4GedYKCZP+OTa8aFqydseUq4FsQ==

然后再去请求 S3。

wangzan:~/.aws $ aws sts get-caller-identity --profile alice-sts
{
    "Account": "921283538843", 
    "UserId": "AROA5NAGHF6NV5GXLXWM7:alice345", 
    "Arn": "arn:aws:sts::921283538843:assumed-role/alice-sts/alice345"
}

image-20200426142725494

2.4、自动更换临时权限

修改 ~/.aws/credentials,增加如下字段,

[alice-auto]
role_arn = arn:aws:iam::921283538843:role/alice-sts
source_profile = alice
external_id = wzlinux

可以看下目前的 Role。

wangzan:~ $ aws sts get-caller-identity --profile alice-auto
{
    "Account": "921283538843", 
    "UserId": "AROA5NAGHF6NV5GXLXWM7:botocore-session-1587882701", 
    "Arn": "arn:aws:sts::921283538843:assumed-role/alice-sts/botocore-session-1587882701"
}

参考文档: https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-role.html

欢迎大家扫码关注,获取更多信息