【发布时间】:2018-02-11 03:23:52
【问题描述】:
我正在尝试限制对 S3 存储桶的访问,并且仅允许基于引用者的列表中的某些域。
桶策略基本上是:
{
"Version": "2012-10-17",
"Id": "http referer domain lock",
"Statement": [
{
"Sid": "Allow get requests originating from specific domains",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example.com/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"*othersite1.com/*",
"*othersite2.com/*",
"*othersite3.com/*"
]
}
}
}
]
}
此 othersite1、2 和 3 调用我存储在域 example.com 下的 s3 存储桶中的对象。 我还有一个附加到存储桶的云端分发。我在字符串条件之前和之后使用 * 通配符。引用者可以是 othersite1.com/folder/another-folder/page.html。引用者也可以使用 http 或 https。
我不知道为什么会收到 403 Forbidden 错误。
我这样做主要是因为我不希望其他网站调用该对象。
任何帮助将不胜感激。
【问题讨论】:
-
我不确定是否支持前导通配符。我会尝试删除它们并再次测试。
-
在 CloudFront 缓存行为中,您是否为白名单配置了
Referer标头以便将其转发到 S3?存储桶策略将无法使用任何未转发的标头,这将是您的第一个问题......尽管问题比这更复杂,因为如果您转发Referer,您的缓存命中率不会那么高。 -
@ÇağatayGürtürk 感谢您的评论,我确实尝试删除,甚至写下我在 chrome 检查器中看到的确切引用,但仍然无法正常工作
-
@Michael-sqlbot 我没有为白名单配置“referer”标头。我去做!谢谢!希望这会奏效
-
还要注意,在 chaging 之后,您将需要 set the Error Caching TTL to 0 for 403 errrors 然后对
/*(所有对象)进行无效化,然后让一切都解决几分钟,然后再次测试,或者您可能会收到缓存的 403 响应,如果您确实解决了问题但测试仍然失败了几分钟,这可能会令人沮丧。Age:响应标头告诉您特定响应在缓存中已存在多长时间(以秒为单位),如果响应未缓存,则将不存在。
标签: amazon-web-services amazon-s3 amazon-cloudfront policy