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

Posted

技术标签:

【中文标题】用于多个账户的跨账户访问的通用 S3 存储桶策略【英文标题】:Generic S3 bucket policy for cross-account access for muliple acounts 【发布时间】:2021-02-17 09:49:03 【问题描述】:

我想允许一堆 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 不可用,只是我正在寻找的东西的虚构占位符。有人有想法吗?

【问题讨论】:

必须是桶策略吗?为什么不创建一个角色,让其他账户可以访问您的存储桶? 这是 B 计划。我想避免这种情况。因为有几十个帐户和大量角色需要调整。我想减少管理开销,并希望将访问限制在可用的***别。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于用于多个账户的跨账户访问的通用 S3 存储桶策略的主要内容,如果未能解决你的问题,请参考以下文章

收到我的 AWS 账户的 S3 存储桶安全通知电子邮件?

如何将驻留在账户 A 中的 s3 存储桶的访问权限授予来自多个 aws 账户的不同 iam 用户?

使用 Amazon S3 阻止公有访问

主账户内的 Amazon S3 存储桶未在成员账户中列出

如何为多个 IAM 用户设置 S3 策略,以便每个人只能访问他们的个人存储桶文件夹?

查找谁在联合 AWS 账户中创建了 s3 存储桶