我们知道 S3 有多种权限管理方法,下面主要介绍如何使用 role 来进行跨账户访问 S3 的资源:
我们假设有两个 account,Account A 和 Account B
Account A: 有一个 S3 bucket: test-a
Account B: 有一个 role-b
Account B 的 role 希望可以访问到 Account A 的 S3 的资源
1. 使用 S3 bucket policy + IAM policy
1) 获取 Account B 的 IAM role(role-b) 的 ARN。
2)在 Account A 中附加以下的 bucket policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::Account B:role/role-b"},
"Action": ["s3:ListBucket","s3:GetObject"],
"Resource": [
"arn:aws:s3:::test-a/*",
"arn:aws:s3:::test-a"
]
}
]
}
3)在 Account B 中允许 role-b 访问 Account A中的 bucket(test-a) 的对象, 对 role-b 附加以下 policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::test-a",
"arn:aws:s3:::test-a/*"
]
}
]
}
2. 基于身份的 IAM role
- 在 Account A 中创建一个 IAM 角色 role-a。然后,向该角色授予执行所需 S3 操作的权限。在角色的信任策略中,信任 Account B 中的 role-b:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AccountB:role/role-b"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::bucket-a/*"
}
]
}
- 在 Account B 中允许的 role-b assume Account A 中创建的 role-a。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::AccountA:role/role-a"
}
}
3)Account B role-b 去 assume role-a:
aws sts assume-role --role-arn arn:aws:iam::Account A:role/role-a --role-session-name s3-access-example
然后带入返回的 credential:
export AWS_ACCESS_KEY_ID=$AccessKeyId
export AWS_SECRET_ACCESS_KEY=$SecretAccessKey
export AWS_SESSION_TOKEN=$SessionToken