尽管有 CloudFront 源身份访问策略,S3 存储桶仍然 Public

S3 Bucket Still Public Despite CloudFront Origin Identity Access Policy

我已按照有关设置 CloudFront (CF) Web 分发以从我的 s3 存储桶中提供私人内容的文档进行操作,但是尽管调整了我的分发中的设置来这样做,我的 s3 存储桶文件仍然可以通过 s3.amazonaws.com/bucket-name/file-name.ext。我很好奇为什么这仍然发生,因为当我创建一个 CF Origin Access Identity 时,我选择了 Yes, Update Bucket Policy,我认为这会关闭通过我的 s3 存储桶 url 的读取访问,但它没有。我是否错过了应该进行的调整?我假设我在 CF 上所做的设置应该调整我的 s3 存储桶并使其无法通过 GET 请求访问。

这是我的 s3 存储桶策略:

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *My-Key-ID*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}

但是,我注意到了对各个文件的权限,但不确定它们与什么有关。

这是我的 CF 设置:

分布:

来源:(在最初创建身份时我选择了 "Yes, Update Bucket Policy")

行为(上半场):

行为(下半部分):

存储桶策略和对象 ACL 协同工作。

策略 对象 ACL 允许的任何内容仍然允许...除非被存储桶策略明确拒绝。

您的策略允许通过 CloudFront 下载。

您的对象 ACL 允许 "Everyone" 到 "open/download" 它们,因此,仍然允许匿名 直接 访问存储桶中的对象。

最正确的解决方案是修改对象 ACL 以删除 "Everyone" 到 "open/download," 的能力,如果您不希望匿名从 S3 访问对象,这显然是不正确的用户。在控制台中,单击对象的 "Everyone" 条目上的 ×,然后单击保存。您应该会发现这可以解决问题。

未来的对象不应上传为公开可读。

这也可以使用自定义存储桶策略来覆盖对象 ACL 来完成,但这是一种高级配置,如果操作不当,将会破坏您在控制台中操作对象的能力,并且会使事情不必要地复杂化。