当对象acl是公共的时,如何将S3存储桶策略设置为(大部分)私有?

Ror*_*ory 6 amazon-s3 amazon-web-services

我无法弄清楚如何设置我的存储桶策略以实现我想要的.任何帮助将非常感激!我希望的规则是:

  • 我帐户中的用户可以通过用户策略进行访问,因此不需要专门授予他们的访问权限
  • 匿名用户(或我的AWS账户以外的任何人)应该没有访问权限,除了:
  • 一个文件夹/ temp_public应该有一个公共GetObject(即如果你知道你可以获取文件的URL)
  • 这些策略应覆盖存储桶中文件的对象ACL,因为对象ACL有时设置为公共读取.

创建存储桶策略的原因是存储桶中的许多对象具有公共读取ACL(在文件上载时无意中设置,但也可能在将来发生,因此我希望使用存储桶ACL覆盖对象ACL).

忽略temp_public文件夹,我希望我可以这样做:

{
    "Version": "2008-10-17",
    "Id": "Policy123456789",
    "Statement": [
        {
            "Sid": "Stmt1",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::my-bucket-name/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

(123456789012我的AWS账号在哪里),但我对所有使用该存储桶策略的用户都拒绝访问.我想NotPrincipal在这种情况下不起作用?

谢谢你的任何建议!

罗里

更新:跨张贴在这里的AWS论坛,并回答了!

Ror*_*ory 12

非常感谢来自AWS论坛的IP ,我已经确认这个答案对我有用:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BucketName/temp_public/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

无论这些文件上的ACL如何,此语句都将为任何人提供对temp_public文件夹内对象的读访问权限.要覆盖所有其他文件的公共访问权限,您应该提供+ Deny + -type语句.显式拒绝会覆盖任何允许访问权限,因此您必须排除已经授予的权限.所以使用NotResource作为排除掩码(NOT FINAL YET,如下所示):

{
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
Run Code Online (Sandbox Code Playgroud)

但是,这将拒绝访问包括您帐户在内的所有用户,因为本金设置为"*".因此,您必须从此拒绝中排除您的帐户(仍然不是最终):

{
    "Effect": "Deny",
    "NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" },
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
Run Code Online (Sandbox Code Playgroud)

(XXXXYYYYZZZZ是您的12位AWS账户ID)

仍然存在问题:上述语句拒绝访问所有IAM用户(root帐户除外).您也希望排除所有IAM用户,但这很棘手.出于某些原因,Amazon S3不支持在存储桶策略中指定IAM用户的通配符.你不能写"arn:aws:iam::XXXXYYYYZZZZ:user/*"为Principal(它给出一个错误:"策略中的无效主体").您必须指定确切的用户名:

{
    "Effect": "Deny",
    "NotPrincipal": {
        "AWS":  [
                            "arn:aws:iam::XXXXYYYYZZZZ:root",
                            "arn:aws:iam::XXXXYYYYZZZZ:user/user1",
                            "arn:aws:iam::XXXXYYYYZZZZ:user/user2",
                            "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
                            "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ]
    }
    "Action": "s3:GetObject",
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
Run Code Online (Sandbox Code Playgroud)

来自Rory的注意事项:S3文档建议您可以arn:aws:iam::XXXXYYYYZZZZ:root用来覆盖帐户中的所有用户,但这似乎不起作用

所以最终政策将如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BucketName/temp_public/*"
        },
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS":  [
                                    "arn:aws:iam::XXXXYYYYZZZZ:root",
                                    "arn:aws:iam::XXXXYYYYZZZZ:user/user1",
                                    "arn:aws:iam::XXXXYYYYZZZZ:user/user2",
                                    "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
                                    "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ]
            }
            "Action": "s3:GetObject",
            "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)