首页 文章

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

提问于
浏览
6

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

我帐户中的

  • 用户可以通过用户政策进行访问,因此不需要专门授予他们的访问权限

  • 匿名用户(或我的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/*"
        }
    ]
}

(其中 123456789012 是我的AWS账号),但是我拒绝了具有该存储桶策略的所有用户的访问权限 . 我想NotPrincipal在这种情况下不起作用?

谢谢你的任何建议!

罗里

更新:在AWS论坛上交叉发布here,并回答了!

1 回答

  • 12

    非常感谢来自AWS Forums的this answer的IP,我已经确认这对我有用:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::BucketName/temp_public/*"
            }
        ]
    }
    

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

    {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:GetObject",
        "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
    }
    

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

    {
        "Effect": "Deny",
        "NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" },
        "Action": "s3:GetObject",
        "NotResource": "arn:aws:s3:::BucketName/temp_public/*"
    }
    

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

    有's still problem: the statement above denies access to all IAM users (except root account). You'想要排除所有的IAM用户,但这很棘手 . 出于某些原因,Amazon S3不支持通配符来指定存储桶策略中的IAM用户 . 您不能将 "arn:aws:iam::XXXXYYYYZZZZ:user/*" 写为Principal(它会给出错误:"Invalid principal in policy") . 您必须指定确切的用户名:

    {
        "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/*"
    }
    

    来自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/*"
            }
        ]
    }
    

相关问题