尽管已启用对存储桶对象的所有公共访问,但我的 Cloudfront 发行版仍显示访问被拒绝

尽管已启用对存储桶对象的所有公共访问,但我的 Cloudfront 发行版仍显示访问被拒绝

我在我的 S3 存储桶中使用以下 CF 策略:

{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipal",
                "Effect": "Allow",
                "Principal": {
                    "Service": "cloudfront.amazonaws.com"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::<mybucket>/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::xxxxxxxxxxx:distribution/E3KFW1xxxxxxx"
                    }
                }
            }
        ]
      }

使用 Origin 访问控制。

错误:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>WB810TMZGMYRRE6N</RequestId>
<HostId>
EU8t4ysVGXo6TpYMNhmypgBWzZ4TMnlbEgYABlF/sK2hm70octviejQocM3zx0z/Sf4cSk/1nNh2u5zK5EeYDw==
</HostId>
</Error>

答案1

先做简单的事情。

确保对象确实存在于您请求它的位置。这似乎很明显,但如果您在 CF 行为上定义了“路径模式”,请确保对象位于相同的 [区分大小写] 路径中。

仔细检查策略中的分发 ARN 是否与您尝试从中请求资源的分发相匹配。

仔细检查 CF 分布中的 CF 原点是否配置为使用原点访问控制 (OAC)。

确保 CF 行为(可能是默认行为)选择了正确的源。如果您使用具有多个 S3 存储桶的源组,请确保将适当的访问策略应用于所有存储桶。

如果 S3 存储桶中的对象不属于该存储桶,则存储桶策略可能不适用于该对象。新创建的存储桶默认禁用 ACL,但较旧的存储桶可能仍允许非存储桶所有者拥有存储桶内的对象。如果是这种情况并且您无法禁用 ACL,则您需要复制对象(以更改所有者)或深入了解允许公开读取的 ACL。

我强烈建议禁用 ACL。它们默认被禁用是有原因的。

提供 CF OAC 身份/条件 s3:ListBucket 访问权限(访问 bucket arn:aws:s3:::<mybucket>,而不是 path arn:aws:s3:::<mybucket>/*)应在对象不存在时将行为从 403 更改为 404。如果实际上是访问问题,您仍会收到 403,但如果是对象名称/位置问题,则会开始收到 404。

如果其他方法都失败了,您可以尝试 S3 访问日志(请求是否到达那里以及谁请求了什么)。

相关内容