logo

AWS IAM Delegation 代理实现跨账户访问

作者:皮皮的皮2021.06.19 23:32浏览量:134

简介:本文是“AWS IAM 权限相关 下篇 实战”一文中,引申部分“Delegation”的展开,测试通

目录
环境(配置)
AWS STS 简介
实战步骤
直接配置 aws 文件
获取临时 credentials
测试 session 权限
在生产 Account 中创建 Role
在开发 Account 中为 user 增加 assume role 权限
界面测试 assume role
AWS Cli 测试 assume role
总结
引申
后记

环境(配置)

AWS 中国或 Global 帐号,可在官网申请,一年内使用指定资源免费
AWS cli,Win10 + terminal

AWS STS 简介

AWS Security Token Service(STS)是 AWS 提供的,用来为 IAM user 或者 federated user 申请临时 credentials 的服务。
本文中会利用 sts 获取用户信息,以及生成临时 credentials。

实战步骤

1. 在生产 Account 中创建 Role
我们先在生产 Account 中创建一个 Role,这个 Role 允许开发 Account 中的用户访问 S3。
下面只截取了主要步骤的图片,创建 Role,User, policy 的详细步骤请参考“AWS IAM 权限相关 下篇 实战”一文
进入生产 Account IAM 控制台,选择 Role 后,点击“Create role”,注意选择“Another AWS account”,然后在 Account ID 中添加开发 Account,点击“Next: Permission”
图 1图片

这里我们为测试方便,添加了 S3FullAccess policy,点击“Next:Tags”
图2
1624115347028.jpg
添加 Role 名称“tsAssumedRole”,点击“Create role”
图3
1624115401322.jpg
创建成功,记下 Role ARN,在下文中会用到。“Give this link to users who can switch roles in the console”中的链接随后可以发给开发人员,可以通过这个链接直接进入切换 role 的界面。
图4
1624115444731.jpg
点击“Edit trust relationship”,可以看到 Principal 是开发 Account root,这里不用修改
图16
1624115458917.jpg
2. 在开发 Account 中为 user 增加 assume role 权限
我们在开发 Account 中已经建了一个 IAM 用户 Tstest,现在我们给这个用户增加 assume role 的权限。
在开发 Account 的 IAM 控制界面,点击“Users”,进入“Tstest”用户,点击“Add inline policy”
图15
1624115481222.jpg
增加如下权限
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “VisualEditor0”,
“Effect”: “Allow”,
“Action”: “sts:AssumeRole”,
“Resource”: “arn:aws-cn:iam::Prod-account-XXX:role/tsAssumedRole”
}
]
}
说明:这个 policy 允许“Tstest”用户 assume 生产 Account 的 role “tsAssumedRole
点击“Review policy”
图5
1624115507400.jpg
添加 inline policy 名称“tsAssumeRole”,点击“Create policy”
图6
1624115524201.jpg
3. 界面测试 assume role
在开发 Account,登录“Tstest”用户,点击右上角用户名,点击“Switch Role”
图7
1624115540962.jpg
点击“Switch Role”
图8
1624115563120.jpg
进入 Switch Role 界面,这个和上面的“Give this link to users who can switch roles in the console”中的链接是一样的。
添加以下信息
Account Prod Account
Role 上面在 Prod Account 中创建的 Role 名称“tsAssumedRole”
Display Name 选添,这里添的是 prod
点击“Switch Role”
图9
1624115578882.jpg
现在切换到了生产 Account 环境,右上角的用户变为 Display Name “prod”。因为“tsAssumedRole”没有访问 IAM 的权限,所以这里看不到 IAM 的信息
图 10
1624115593210.jpg
从中控台进入 S3 界面,可以正常查看 S3,因为我们的“tsAssumedRole”中对 S3 有全部的权限
图 11
1624115606786.jpg
当需要退出当前 Prod role 时,点击右上角“prod”,点击“Back to Tstest”
图 12
1624115629137.jpg

说明:
当用户从开发 Account 切换到生产 Account 后,用户之前的权限会暂时取消,由 assume 的 Role 决定当前的权限。当用户退出切换的 Role 后,原来的权限会自动恢复。

4. AWS Cli 测试 assume role
直接配置 aws 文件
在~/.aws/credentials 中添加以下信息
如何产生 access key 请参考“AWS IAM 权限相关 下篇 实战”一文

[Dev_account_XXXX:user/Tstest]
output = json
region = cn-north-1
aws_access_key_id = AKIA2B
aws_secret_access_key = dVkUp

[Prod_account_XXXX:role/tsAssumedRole]
region = cn-north-1
role_arn = arn:aws-cn:iam::Prod_account_XXXX:role/tsAssumedRole
source_profile = Dev_account_XXXX:user/Tstest

说明:
[Dev_account_XXXX:user/Tstest] 添加开发 Account 用户的 Access Key/Secret
[Prod_account_XXXX:role/tsAssumedRole] 指定 assume 生产中 role 的信息(role_arn),以及开发用户的信息(source_profile)
注意替换对应的 account number
我们利用如下命令测试:

export AWS_PROFILE=XXXX:user/Tstest
aws sts get-caller-identity

说明:
export 设定 AWS 命令运行的用户 profile
aws sts get-caller-identity 返回当前的 IAM user/role 信息
当设定当前 profile 为开发 Account 用户,返回的信息为 Tstest 用户。此时连接的是开发环境
图 17
1624116099223.jpg
改变当前 profile 为生产的 Role,返回的信息为生产 Account 的 Role,此时连接的就是生产环境
图 18
1624116125364.jpg
我们可以用 aws s3 命令来测试对生产环境的 S3 bucket “tstest”的上传功能

aws s3 cp a s3://tstest/a
aws s3 ls s3://tstest

对生产环境中的 S3 bucket “tstest”列出和上传文件成功
图 19
1624116147029.jpg
我们在~/.aws/credentials 中配置了开发环境用户和生产 assume role,然后通过 export AWS_PROFILE 后就可以直接访问生产环境。
获取临时 credentials
下面我们介绍利用临时 credentials 访问生产环境。
运行以下命令,生成临时 credentials

export AWS_PROFILE=Dev_account_XXXX:user/Tstest
aws sts assume-role —role-arn “arn:aws-cn:iam::Prod_account_XXXX:role/tsAssumedRole” —role-session-name “tstest-ProdS3full”

说明:
export 用开发 Account 的用户 profile
aws sts assume-role 用来生成临时 credentials。role-arn 中添的是上面在生产 Account 下建的“tsAssumedRole” ARN 信息,role-session-name 是自定义的名称
运行结果如下图,记下以下信息
AccessKeyId
SecretAccessKey
SessionToken
图 20
1624116206379.jpg
说明:
生成的临时 credentials 默认有效时间是一小时,可以在命令中使用—duration-seconds 参数来设定时长,从 900 秒到 Role 设定的最大时长
Role 的最大时长在生产 Account 的 Role “tsAssumedRole”中设置,如下图
图 22
1624116274402.jpg
然后我们利用 export 使用临时 credentials
export AWS_ACCESS_KEY_ID=ASIAZEGH37QUO7IXW2UG
export AWS_SECRET_ACCESS_KEY=pJEqG+x7vH12i5ewMw5rPvUzH6MCaq77jTAQSOJy
export AWS_SESSION_TOKEN=Fwo*8ZceBws0laVJ1KJPPl1NIW4v5aEcYnlfZiKtmQICCkFj5usEoqPw==
然后用 aws sts 测试,可以看到当前用户已连接到生产环境中
图 21
1624116312607.jpg
此时可以对生产的 S3 进行删除操作
图 23
1624116327162.jpg
测试 session 权限
我们在生产的 role “tsAssumedRole”中加了 S3FullAccess 权限,所以利用临时 credentials 连接 AWS 的进程有对 S3 的全部权限。
下面我们在生成临时 credentials 的命令中加入 session policy,限制利用临时 credentials 连接 AWS session 的权限。
新开一个 Linux 窗口,或者用如下命令把之前设定的环境变量清空

export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export AWS_SESSION_TOKEN=
运行下列命令

export AWS_PROFILE=Dev_account_XXXX:user/Tstest
aws sts assume-role \
—role-arn “arn:aws-cn:iam::Prod_account_XXXX:role/tsAssumedRole” \
—role-session-name “tstest-ProdS3full” \
—policy-arns arn=”arn:aws-cn:iam::aws:policy/AmazonS3ReadOnlyAccess” \
—duration-seconds “900”
说明:
policy-arn 指定 session policy,这里指定了 session 对 S3 只有 ReadOnly 的权限,即对 S3 能读不能上传
duration-seconds 指定临时 credentials 有效时长为 900 秒
执行结果如下
图 24
1624116360705.jpg
然后我们用新生成的临时 credentials 测试对 S3 的访问
图 25
1624116376727.jpg
说明:
s3 ls 命令运行成功,因为 tsAssumedRole 中包括对 S3 的全部访问权限,session policy 中包含对 S3 的只读权限,两者交集是对 S3 的只读权限,所以命令运行成功(运行没有结果是因为我们在上一步中把 S3 “tstest”中上传的文件 a 删除了)
s3 cp 命令运行失败,因为 tsAssumedRole 和 Session policy 的交集中不包含写的权限,所以命令运行失败
Identity-based policy,Session policy 和 Permissions boundary 的关系如下所示
图 26
1624116394926.jpg
tsAssumedRole 中的 S3fullAccess policy 就是下图的 Identity-based policy
policy-arn 指定的 policy 就是下图的 session policy

总结

本文实现的是“AWS IAM 权限相关 基础篇上 理论”一文中下面内容
Delegation 允许其他用户访问你的 AWS 资源。Delegation 涉及到两个 account,拥有 AWS 资源的 trusting account(本文中的生产 account) 和想访问 AWS 资源的用户所在的 trusted account(本文中的开发 account)
主要目的就是两点
方便其它帐号的用户访问自己资源
把开发,生产环境分开进行权限控制
引申

除了权限控制,我们还可以在 tsAssumedRole 中启用 MFA(multi-factor authentication)功能,强制要求用户用 MFA 来切换 Role,以此来增强安全控制。
资源下载

官网 IAM 文档,深入学习必看 https://docs.aws.amazon.com/iam/index.html

相关文章推荐

发表评论