一、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
不给用户分配任何权限。
最后得到用户的 AK/SK
Access key ID :AKIA5NAGHF6N3XUJY3FR
Secret access key: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
2.2、创建一个跨账户 Role(同账户下)
我们创建一个跨账户的角色,我们此次操作在自己的账户下面,其他的账户如此操作也是可以的,我们也可以增加 Require external ID 作为 Assume role 的 Conditation,会更加安全。
给角色增加权限。
审核
生成的 Role ARN:arn:aws:iam::921283538843:role/alice-sts
我们需要把生成的 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"
}
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