多帐户跨帐户访问的通用S3桶策略



我想允许一堆AWS帐户写权限到一个S3桶。所有帐户都在不同的AWS组织中组织和分配。因此,我想根据他们的org-id限制访问。

此外,我想限制对对象级别的访问,并允许访问前缀,这应该由源AWS AccountId指定。

我不想要允许每个帐户如下所示:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:root"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::mybucket/111111111111",
"arn:aws:s3:::mybucket/111111111111/*"
]
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:root"
},
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::mybucket/222222222222",
"arn:aws:s3:::mybucket/222222222222/*"
]
}
]
}

我正在寻找的是使用源AccountId作为变量的通用策略。像这样:

{
"Version" : "2012-10-17", 
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
],
"Resource": [
"arn:aws:s3:::mybucket/${aws:SourceAccountId}",
"arn:aws:s3:::mybucket/${aws:SourceAccountId}/*"
],
"Condition": {
"ForAnyValue:StringEquals": {
"aws:PrincipalOrgID": [
"o-XXXXX",
"o-YYYYY",
"o-ZZZZZ"
]
}
}
}
]
}

不幸的是,变量${aws:SourceAccountId}不可用,只有一个假想的占位符,我正在寻找的东西。有人知道吗?

可悲的是,你不能在IAM策略语言中引入新的变量。IAM策略也没有任何循环机制来根据所提供的帐户id列表动态生成此类策略。

因此,对于这种情况,人们通常会寻找程序化的解决方案。最值得注意的是基础设施作为代码(IaC)工具,它将允许的创建和管理这些政策的代码。对于AWS的IaC,两个流行的选择是AWS CloudFormation (CFN)和Terraform (TF)。

在您的情况下,TF可能会更好,因为它已经达到并很好地开发了对循环和动态创建资源的支持,包括IAM策略及其内容。

其他选择包括常规编程语言(Python, Bash)和AWS SDK和CLI的编程解决方案。,或者使用我在评论中指出的IAM角色。

最新更新