![如何将 S3 对象访问限制为仅限 CloudFront?](https://linux22.com/image/725038/%E5%A6%82%E4%BD%95%E5%B0%86%20S3%20%E5%AF%B9%E8%B1%A1%E8%AE%BF%E9%97%AE%E9%99%90%E5%88%B6%E4%B8%BA%E4%BB%85%E9%99%90%20CloudFront%EF%BC%9F.png)
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 具有对这些对象的读取访问权限。