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

Posted

技术标签:

【中文标题】如何使用 CORS 限制 AWS S3 访问?【英文标题】:How to restrict AWS S3 access using CORS? 【发布时间】:2016-11-23 23:59:43 【问题描述】:

如何在 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>

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

【问题讨论】:

把CORS www.someapproveddomain.com 改成someapproveddomain.com 看看是否生效 CORS 允许在其他源中运行的脚本读取您源上的资源。执行脚本不需要跨域脚本能够读取脚本。 (与图像相比:您可以在页面上显示跨域&lt;img&gt;,而无需脚本读取图像的内容。) “CORS 允许在其他源中运行的脚本读取您源上的资源”。嗯...根据 MDN (developer.mozilla.org/en-US/docs/Web/Security/…):“通常不允许跨域读取”。 【参考方案1】:

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

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

关于 SO 的解释比我能解释的要好得多,但这样做的主要目的之一是防止有人创建假网站(如银行门户)并让它向真实服务器发出请求用户的真实凭据。如果服务器和真实站点启用了 CORS,则服务器将只允许来自真实站点域的请求。

您可能想要研究的是使用 IAM 策略或 S3 存储桶策略。 AWS here 有一篇很棒的博客文章涵盖了这一点。您需要一个 EC2 实例作为一种中间人来访问 S3 存储桶并将文件提供给客户端。

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

【讨论】:

不会通过 IAM 策略执行此操作来限制仅通过 IAM 在 OP 的 AWS 账户中进行身份验证的用户的访问权限吗?我认为这不是他想要在这里完成的。 是的...哎呀,已修复。 “您需要一个 EC2 实例作为一种中间人来访问 S3 存储桶并将文件提供给客户端”为什么?与 S3 存储桶策略解决方案相比,这如何增加任何保护(以及如何证明增加的成本和延迟是合理的)?为什么要在链接到一篇根本不这么说的文章后马上这么说? 如果 OP 想要保持脚本不被公开,将它放在一个简单的服务器后面将是最简单的解决方案。 我不会考虑设置一个新的 EC2 服务器、保护服务器、配置 nginx 并每月为该服务器付费,作为“最简单”的解决方案。恰恰相反,我发现复制/粘贴 S3 存储桶策略并修改几行要容易得多。【参考方案2】:

您需要使用限制对特定 HTTP 引荐来源网址的访问的 S3 存储桶策略来解决此问题,而不是尝试使用 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 引荐来源网址很容易被攻击者欺骗。

【讨论】:

谢谢,马克。将脚本标记为私有,然后使用存储桶策略提供访问权限正是我想要的。我没想到会有一个防弹解决方案,因为我怀疑没有身份验证这是可能的,但我确实希望阻止未经批准的域对脚本的随意访问。我仍然对为什么 CORS 没有达到同样的效果感到困惑。 这是一个很酷的功能,但它不是很安全,因为黑客很容易欺骗引荐来源网址。见:***.com/questions/21807604/…

以上是关于如何使用 CORS 限制 AWS S3 访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决拒绝访问 aws s3 文件?

我如何监视用户对AWS S3的访问?

如何使用 html2Canvas 和 AWS S3 图像处理 CORS?

尝试访问管理字体文件时,Django 在 AWS S3 中托管静态文件导致 CORS 错误

从托管在 S3 存储桶上的站点访问 AWS API 时出现 CORS 问题 [关闭]

AWS IAM 策略:如何更改 AWSLambdaFullAccess 策略以仅允许访问一个 S3 存储桶?