使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?

Posted

技术标签:

【中文标题】使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?【英文标题】:How can I hide a custom origin server from the public when using AWS CloudFront? 【发布时间】:2012-10-17 02:27:20 【问题描述】:

我不确定这是否完全符合 *** 的条件,但由于我需要以编程方式执行此操作,而且我认为 SO 上有很多人使用 CloudFront,我认为它确实...所以这里是:

我想隐藏对我的自定义源服务器的公开访问。

CloudFront 从自定义源中提取,但是我找不到文档或任何类型的示例来防止用户在 CloudFront 后面代理时直接向我的源发出请求,除非我的源是 S3...产地。

我可以使用什么技术来识别/验证请求是通过 CloudFront 代理的,而不是客户端直接请求的?

CloudFront 文档仅涵盖与 S3 源一起使用时的这种情况。列出 CloudFront 的 IP 地址的 AWS 论坛帖子有一个免责声明,即不能保证该列表是最新的,不应依赖该列表。见https://forums.aws.amazon.com/ann.jspa?annID=910

我假设任何使用 CloudFront 的人都有某种方式可以从直接请求/爬虫中隐藏他们的自定义来源。我将不胜感激任何提示让我开始。谢谢。

【问题讨论】:

【参考方案1】:

我建议使用类似于 facebook 的 robots.txt 的内容,以防止所有爬虫访问您网站中的所有敏感内容。

https://www.facebook.com/robots.txt(你可能需要稍微调整一下)

之后,只需将您的应用程序..(例如 Rails)指向自定义源服务器。

现在将您网站上的所有网址重写为绝对网址,例如:

https://d2d3cu3tt4cei5.cloudfront.net/hello.html

基本上所有的 url 都应该指向你的云端分发。现在,如果有人从 https://d2d3cu3tt4cei5.cloudfront.net/hello.html 请求一个文件,但它没有 hello.html.. 它可以从您的服务器(通过 https 等加密通道)获取它,然后将其提供给用户。

因此,即使用户查看源代码,他们也不知道您的源服务器...只知道您的云端分发。

有关在此处进行设置的更多详细信息:

http://blog.codeship.io/2012/05/18/Assets-Sprites-CDN.html

【讨论】:

感谢您的回复。不过,这并不能真正解决我的问题,因为源仍然会提供直接请求,而不是将它们重定向到 CDN。 Cloudfront 基本上用作您网站的缓存。如果您的 html 文件中的所有链接都指向您的云端域上的其他资源。您的网络服务器可以提供的唯一请求是 domain.com/index。 html .. 现在查看您的代码的人可以在您的 html 页面中对您的云端 URL 进行反向工程 .. 说 link_to d2d3cu3tt4cei5.cloudfront.net/index2.html> ...然后尝试从 www.domain.com/index2.html 手动请求。 . 但只有想要查看源代码并增加服务器负载的人类用户才能做到这一点.. 而不是搜索机器人。 您可以做的另一件事是将仅从亚马逊主机名连接到您的服务器的连接列入白名单。所以除了亚马逊云端之外,没有人可以直接访问您服务器上的任何文件(home.html 除外)。这是特定于服务器的,Apache 的配置与 Thin 或 unicorn 之类的配置不同。 您可能会发现这很有用> docs.amazonwebservices.com/AmazonCloudFront/latest/…【参考方案2】:

创建仅 CloudFront 使用的自定义 CNAME。在您自己的服务器上,阻止对不是来自该 CNAME 的静态资产的任何请求。

例如,如果您的站点是 http://abc.mydomain.net,则为 http://xyz.mydomain.net 设置一个 CNAME,指向完全相同的位置,并将该新域放在 CloudFront 中作为源拉服务器。然后,根据请求,您可以判断它是否来自 CloudFront,然后做任何您想做的事情。

缺点是这是通过默默无闻的安全性。客户永远不会看到对http://xyzy.mydomain.net 的请求,但这并不意味着他们没有办法弄清楚。

【讨论】:

【参考方案3】:

[我知道这个帖子很旧,但我会为像我这样几个月后看到它的人回答它。]

根据我的阅读和所见,CloudFront 在请求中并没有始终如一地标识自己。但是您可以通过在 CloudFront 分发版中覆盖 robots.txt 来解决此问题。

1) 创建一个仅包含一个文件的新 S3 存储桶:robots.txt。这将是您的 CloudFront 域的 robots.txt。

2) 转到 AWS 控制台中的分配设置,然后单击创建源。添加存储桶。

3) 转到行为并单击创建行为: 路径模式:robots.txt 来源:(你的新桶)

4) 将 robots.txt 行为设置为较高的优先级(较小的数字)。

5) 转到失效并失效 /robots.txt。

现在 abc123.cloudfront.net/robots.txt 将从存储桶提供,其他所有内容都将从您的域提供。您可以在任一级别独立选择允许/禁止抓取。

另一个域/子域也可以代替存储桶,但为什么要麻烦。

【讨论】:

以上是关于使用 AWS CloudFront 时,如何向公众隐藏自定义源服务器?的主要内容,如果未能解决你的问题,请参考以下文章

带有签名 cookie 的 AWS Cloudfront POST 请求

如何在 Lambda 函数中使用 AWS.CloudFront.Signer

如何解决 AWS CloudFront SSL 证书不存在的问题

AWS CloudFront 如何遵循 S3 存储桶重定向规则?

如何使用 AWS CDK 将域别名添加到现有 CloudFront 分配

如何在 terraform 中使用新引入的 aws_cloudfront_cache_policy 资源