如何将 S3 对象访问限制为仅限 CloudFront?

如何将 S3 对象访问限制为仅限 CloudFront?

TL;DR - 如何https://s3-eu-west-1.amazonaws.com/BUCKET-NAME/FILE.EXT在允许通过 CloudFront 发出的请求的同时阻止请求?

我遵循了 AWS 文档“使用源访问身份限制对 Amazon S3 内容的访问“并且这似乎已经过测试并且几乎完美地运行(在我的情况下使用备用域名设置),但是当我尝试 URL 时......

https://s3-eu-west-1.amazonaws.com/BUCKET-NAME/index.html

...返回了 index.html 文档!更糟糕的是,我可以通过遵循此约定来访问存储桶中的任何对象。我的理解是,这不应该发生,只有 CloudFront URL 才应该返回对象。

S3 存储桶的静态网站托管已禁用。访问 S3 端点 URLhttp://BUCKET-NAME.s3-website-eu-west-1.amazonaws.com/index.html会返回 404(代码为“NoSuchWebsiteConfiguration”),这是预期结果。有人能解释一下为什么其他链接可以正常工作,而不是返回 403 或 404 错误吗?

当我设置 CloudFront 分发时,对于选项“授予存储桶读取权限”,我选择了“是,更新存储桶策略”,这产生了现在正在使用的 S3 存储桶策略:

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": " Grant a CloudFront Origin Identity access to support private content",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXX"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::BUCKET-NAME/*"
    }
  ]
}

答案1

如果您在上传对象时将其设置为公开(或随后将其设置为公开),则这将是预期结果。如果它们是公开的,那么它们民众,因此 S3 允许访问它们。

Origin 访问标识实际上并不“限制访问”。它们允许通过 CloudFront 访问非公开的对象。

您引用的文档页面中提到了这一点。

更改您的 Amazon S3 存储桶或存储桶中对象的权限,以便只有原始访问身份具有读取权限(或读取和下载权限)。

这句话不太恰当。它的实际含义如下。

如果您已授予任何权限(通过存储桶策略授予 Amazon S3 存储桶的权限、通过对象 ACL 授予存储桶中对象的权限,或同时授予这两者)以允许公共访问,则必须先删除所有此类权限,然后创建存储桶策略声明,以便 OAI 具有对这些对象的读取访问权限。

相关内容