用于多账户跨账户访问的通用 S3 存储桶策略

时间:2021-02-17 09:49:03

标签: amazon-web-services amazon-s3 policy bucket

我想允许一堆 AWS 帐户将权限写入单个 S3 存储桶。 所有账户都在不同的 AWS 组织中组织和分配。因此我想根据他们的组织 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} 不可用,只是我正在寻找的东西的虚构占位符。有人有想法吗?

1 个答案:

答案 0 :(得分:0)

遗憾的是,您不能向 IAM 政策语言引入新变量。 IAM 策略也没有任何循环机制来根据提供的账户 ID 号列表动态生成此类策略。

因此,对于此类场景,人们通常会考虑程序化解决方案。最值得注意的是基础设施即代码 (IaC) 工具,它允许通过代码创建和管理此类策略。对于 AWS 的 IaC,两个流行的选择是 AWS CloudFormation (CFN) 和 Terraform (TF)。

在您的情况下,TF 可能会更好,因为它具有影响力,并且可以很好地支持循环和资源的动态创建,包括 IAM 政策及其内容。

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