【问题标题】:Prevent image hotlinking with S3 and CloudFront使用 S3 和 CloudFront 防止图像盗链
【发布时间】:2020-11-07 14:32:31
【问题描述】:

我的网站有很多页面,每个页面都有很多图片(几十个甚至几百个)。

我正在尝试避免图片盗链,但不会过多增加 AWS 成本。

到目前为止,我找到了 3 个选项:

选项1:使用WAF防止盗链,通过创建基于referer header的规则来阻止。

https://aws.amazon.com/pt/blogs/security/how-to-prevent-hotlinking-by-using-aws-waf-amazon-cloudfront-and-referer-checking/

这个方案的问题是,如果你每页加载很多图片,成本会增加太多,因为除了支付S3和CloudFront,你还需要支付WAF,每个 图片请求(例如,假设您在每个页面上有 100 张图片)。

选项 2:配置 CloudFront 以触发 Lambda@Edge 查看器请求触发器,该触发器将检查前门的每个请求,并根据引用标头阻止请求。

https://stackoverflow.com/a/46044606/2444386

这类似于上面的选项。问题是您向 EVERY 请求添加了开销,即使图像已经在 CloudFront 缓存中。 Lambda@Edge 总是会被调用,如果您网站的每个页面上都有很多图像,也会增加太多的成本。

选项 3:配置 S3 存储桶策略以根据 referer 标头阻止请求,并在 CloudFront 将 referer 标头列入白名单。

到目前为止,在我看来,这似乎是成本效益最高的选项,因为如果图像已经在 CloudFront 缓存中,您就没有任何开销,而且成本也是最便宜的,因为您不需要支付 WAF 或 Lambda@Edge。

问题在于缓存命中率会小得多,因为 CloudFront 不会提供来自缓存的响应,除非传入请求的 Referer 标头与已缓存请求的完全匹配。 p>

我尝试使用“origin”请求标头来避免此问题,但似乎浏览器不会为图像 GET 请求发送此标头。

还有更好的选择吗?

【问题讨论】:

  • 你最后采用了什么解决方案?我处于同样的位置。令人沮丧的是,当我在没有 CloudFront 的情况下使用 S3 时,我已经解决了这个问题;我的 S3 存储桶上有一个策略,它拒绝了所有不是来自我的网站的请求。但是,对于 CloudFront,我看不出有任何方法可以应用这样的策略。我可以将我的 S3 限制为仅允许来自 CloudFront 的流量,但我看不到如何将类似的策略应用于 CloudFront 以限制仅访问来自我的站点的请求。你最后做了什么?
  • 嗨@MSOACC,我发布了一个答案,详细说明了我最终做了什么。如果可以的话,我建议你使用 CloudFlare。他们有一个防盗链选项。此外,使用 CloudFront 降低了我的成本。
  • 谢谢,没看到。您应该将其标记为已接受的答案。
  • CloudFlare 的唯一缺点是您需要更改 DNS 条目。但如果可以的话,我会推荐,因为您也将获得 DDoS 保护。
  • 在你问我之后,我现在才发布答案。我将标记为已接受的答案。

标签: amazon-web-services amazon-s3 amazon-cloudfront hotlinking amazon-waf


【解决方案1】:

我最终使用了选项 3(S3 存储桶策略),另外还使用了 CloudFlare 的免费计划。 CloudFlare 即使在免费计划中也有“刮盾”中的“热链接保护”。

防止盗链的S3存储桶策略:

{
    "Version": "2012-10-17",
    "Id": "http referer policy",
    "Statement": [
        {
            "Sid": "Allow access only from my website",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::resources.mywebsite.com/*",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "https://dev.mywebsite.com:8080/*",
                        "https://staging.mywebsite.com/*",
                        "https://www.mywebsite.com/*"
                    ]
                }
            }
        }
    ]
}

在 CloudFront 中,我将 Referer 标头列入了白名单:

在 CloudFlare 中,您可以在“Scrape Shield”菜单中启用“Hotlink Protection”选项:

【讨论】:

    【解决方案2】:

    您可以通过使用 CloudFront 支持的本机选项 Signed Cookies 来避免上述情况。

    如果用户登陆非基于资产的页面(即主页),则通过添加 Lambda@Edge function,您可以生成签名 cookie。通过在 CloudFront 中强制执行此操作,只有浏览您网站的人才能访问资产。

    您也可以生成CloudFront signed URL,不过这需要为每个资产完成。

    要使用这些为您想要保护的资产创建一个次要来源/行为,并添加Restrict Viewer Access (Use Signed URLs or Signed Cookies) 的行为规则。 Lambda@Edge 将位于另一个来源。

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多