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

时间:2014-09-29 18:18:56

标签: amazon-web-services amazon-s3

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

  • 我帐户中的用户可以通过用户政策进行访问,因此不需要专门授予他们的权限
  • 匿名用户(或我的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 个答案:

答案 0 :(得分:12)

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

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

此语句将授予任何人对temp_public文件夹内对象的读访问权限,而不管这些文件上的ACL。 要覆盖所有其他文件的公共访问权限,您应该提供+ 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)

仍有问题:上述声明拒绝访问所有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/*"
}
来自Rory的

NB: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/*"
        }
    ]
}