如何使用CORS限制AWS S3访问?

时间:2016-07-20 16:57:09

标签: javascript amazon-web-services amazon-s3 cors

如何在Amazon S3上设置CORS以仅允许经过批准的域访问我的S3存储桶中的JS脚本?目前,我的S3存储桶上的CORS设置如下:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>www.someapproveddomain.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>Authorization</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

然而,任何域都可以访问并运行脚本hello.js(位于S3存储桶中)demonstrated at JSFiddle。有人说我做错了吗?或者,也许我只是误解了CORS应该做什么?

2 个答案:

答案 0 :(得分:4)

您需要使用限制访问特定HTTP引荐来源的S3 Bucket Policy来解决此问题,而不是尝试使用CORS解决此问题。记录在案here

这是AWS提供的示例存储桶策略:

{
  "Version":"2012-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests originating from www.example.com and example.com.",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::examplebucket/*",
      "Condition":{
        "StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
      }
    }
  ]
}

请注意,攻击者非常容易使用HTTP引用来欺骗。

答案 1 :(得分:2)

我认为你误解了CORS。 (编辑:没关系!)

CORS不适用于服务器端安全性。

这里有比我能解释的更好的解释,但其中一个主要目的是阻止某人创建虚假网站(如银行门户网站)并让它向真实服务器发出请求用户的真实凭据。如果服务器和真实站点启用了CORS,则服务器将仅允许来自真实站点域的请求。

您可能希望了解的是使用 IAM策略或 S3存储桶策略。来自AWS here的优秀博客文章就是这样的。您需要将EC2实例作为一种中间人来访问S3存储桶并将文件服务器提供给客户端。

纯粹的S3可能还有另一种方法可以做到这一点,但基本上如果它可以在没有身份验证的情况下公开访问,那么有人可以在技术上欺骗标题,使其看起来像来自您的CORS定义域。

相关问题