跨帐号assume Role

步骤

假如B帐号要Assume A帐号的Role:

  1. 先在A帐号下创建一个IAM Role,同时定义哪些帐号可以访问这个Role
  2. 在B帐号下使用STS取回Role的访问凭证
  3. 访问凭证生效时间在1个小时到12个小时

实践

登录到A帐号,新建一个Role,由于是授予其他帐号访问,所以信任实体选择其他AWS帐户,并输入B帐户的id::

image-20231211191547255

这里直接给它添加AmazonS3FullAccess Policy, 为Role命名,比如s3-access-for-assume-role,然后点击创建。

创建完成后,将这个role的ARN复制出来(这个ARN要在另一个帐号中使用):

image-20231211191810668

登录到B帐号,在当前用户下增加一条内联策略:

{
  "Version": "2012-10-17",
  "Statement":{
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::256659126572:role/s3-access-for-assume-role"
  }
}

现在,当前用户就可以切换角色来访问A帐户下的bucket(注意root帐户不能进行切换)。

Switch Roles (Console)

在A帐号下创建完成Role时,同时显示了一条链接,用于控制台切换Role:

image-20231211192216202

https://signin.aws.amazon.com/switchrole?roleName=s3-access-for-assume-role&account=kongpingfan2

在B帐号下访问上面链接,然后进行Role切换:

image-20231211192321076

现在在B帐号下可访问A帐号的s3:

image-20231211192508177

Switch Roles (AWS CLI)

在B帐号下运行:

aws sts assume-role --role-arn "arn:aws:iam::256659126572:role/s3-access-for-assume-role" --role-session-name "s3-access"

得到类似结果:

image-20231211192707953

得到AccessKeyId, SecretKey, SessionToken后,生存时间只有1h, 直接写到环境变量里:

export AWS_ACCESS_KEY_ID=ASxxxxxxxxL7UXY7XL
export AWS_SECRET_ACCESS_KEY=JxFsx0KSIKmnYHxxxxxxxAU8THFXQJAmPRg3
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEJz//////////wEaCXVzLXdlc3QtMiJHMEUCIQDJB7y4K14FvWY4iYcgZFRagGutXsH1FPNFiaYvFjxOUAIgM9LUojct2EYM1zsqUO4H1Fb6yNQTO+3LmPWCcKv85iQqlgIIFRACGgwyNTxxxxxxxxxxxxxxxxxxxwMPyrzAajFKLUkj6u+o0vcuQ6UI7MOI6/xmKvkQOfPHZ88nUk3gq08rdeZ63Krrh9YQXJfH0ZvxVJNX/lloE7LBMOqwXjfl3U805Viwb4nlQ6R4eb/txUgXKVuj+gWFG1e2epFYXECTU0PgDPHXbBr/+nYTyvV5qrCoYAMjDJefpgQIpf7RyA2t7LQUJRHmBr8lP11Kmo1xTTGG8g5GlR56Opu7+fkd30JmxroFpxPrkVXo9PS7tXuMnui8zryxzGHV06ocXgxKWpDhvRNRm5eg/7oG4HTjh7+pvpGxj5opFkxxQp1n6uHsT3CpxwUlFE99VUGMQlw4TCz5turBjqdAVnTkAqo6igrkKBS+F4SMSbCy1BdiR9xSCLii/J8iksDINyWtwW8Cdb/J0SuUWmtu3ttLF8q7ECiL1OTIvCW6IQhmczY0df2fjj77ZFSzdNLskwnkLljiJGvpVpzZLELm3dl2DvGj3AxHt9V9lmF0l4yuYjPWgvWmRIH6pjdbJmYiEewtTiKVY0d9bl3JzyAUKtW+RIYUrN41y1em3M=

image-20231211193352507

此时,运行任何命令,都是另一个帐户的role权限。

例如运行ls,获取到另一个帐号下的所有桶:

aws s3 ls

自动获取最新的STS

我们之前执行的命令是:

aws sts assume-role --role-arn "arn:aws:iam::256659126572:role/s3-access-for-assume-role" --role-session-name "s3-access"

如果过期需要重新运行上面命令并设置环境变量,有没有方法自动获取到最新的凭证信息,并给CLI来使用呢?

./aws/config中加入:

[profile automation]
role_arn=arn:aws:iam::256659126572:role/s3-access-for-assume-role
source_profile=default
region=us-east-1

最后一行设置region很关键,否则执行aws cli有可能在其他region跑,报没有权限的错误

然后执行aws s3 ls --profile automation

image-20231211194123867

参考: https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html