【问题标题】:How to set S3 bucket policy to (mostly) private when object acl is public?当对象 acl 为公共时,如何将 S3 存储桶策略设置为(大部分)私有?
【发布时间】:2014-11-24 05:21:52
【问题描述】:

我不知道如何设置我的存储桶策略以实现我想要的。任何帮助将非常感激!我想要的规则是:

  • 我帐户中的用户可以通过用户策略访问,因此不需要专门授予他们访问权限
  • 匿名用户(或我的 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,并回答了!

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

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

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

    此语句将授予任何人对 temp_public 文件夹中对象的读取权限,而不管这些文件上的 ACL。 要覆盖所有其他文件的公共访问权限,您应该提供 +Deny+-type 语句。显式拒绝会覆盖任何允许访问,因此您必须排除已授予的权限。所以使用 NotResource 作为排除掩码(还没有最终确定,请阅读下文):

    {
        "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 用户(根账户除外)。 您也想排除所有 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/*"
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多