假设我正在构建一个 Dropbox 克隆:Filebox。我使用 S3 存储所有用户的文件,并且使用 Cloudfront 作为我的 CDN。
因此,我有一个受限制的 S3 存储桶 ( files.filebox.com
),其存储桶策略只s3:GetObject
允许我通过 Cloudfront 创建的源访问身份。这会强制所有“文件”请求通过 Cloudfront,并禁止任何人通过 S3 URL 访问文件。
files.filebox.com 的存储桶策略
{
"Version": "2008-10-17",
"Id": "AllowCloudfrontGet",
"Statement": [
{
"Sid": "AllowCloudFrontGet",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::files.filebox.com/*"
}
]
}
意外的行为
假设,为简单起见,我将所有文件都存储为public-read
.
所以这个 URL 应该可以工作:
https://files.filebox.com/<userID>/some-file.txt
但这应该导致 403:
https://s3.amazonaws.com/files.filebox.com/<userID>/some-file.txt
但我看到了相反的结果。S3 URL 工作正常,但files.filebox.com
通过 Cloudfront 的 URL 引发MissingKey
错误。
该files.filebox.com
URL确实有效,但前提是我签署了该 URL,即使对于具有 ACL 的对象也是如此public-read
。
问题
鉴于存储桶策略仅允许s3:GetObject
CF OAI,即使对象具有public-read
ACL,S3 URL 是否不应该失败并显示 403?
除了模糊的语言之外,我在文档中找不到任何关于此的信息,这似乎表明对于未通过 Cloudfront进行的任何请求,受限存储桶应为 403。
当我将对象的 ACL 设置public-read
为时,即使在受限制的存储桶上,是否也不需要签署 Cloudfront URL?
我是否需要在Statement
我的存储桶策略中添加另一个允许未签名 URL 访问public-read
对象的策略?
我尝试了这个,但没有奏效。我Statement
什至不知道如何写这样的......
如何真正拒绝通过 S3 URL 发出的任何请求?
我想为通过 S3 URL 的任何请求抛出 403,即使是 ACL 为public-read
.