只允许 CloudFront 从源服务器读取?

Posted

技术标签:

【中文标题】只允许 CloudFront 从源服务器读取?【英文标题】:Allow only CloudFront to read from origin servers? 【发布时间】:2014-02-23 18:23:08 【问题描述】:

我在 CloudFront(而不是 s3)上使用带有签名 URL 的源服务器。我需要一种方法来确保对我的服务器的请求仅来自 CloudFront。也就是说,一种防止有人绕过 CloudFront 并直接在我的服务器上请求资源的方法。如何做到这一点?

【问题讨论】:

我是否有可能知道您为使签名 URL 启用了哪些配置步骤,使自定义来源与云前端的 s3 相对应。我设法用 s3 做到了,现在我想用自定义来源是配置设置类似希望你能提供一些关于它的信息 【参考方案1】:

根据文档,目前尚不支持。我唯一能想到的就是你可以限制更多的访问,虽然不完全是通过只允许亚马逊 IP 地址访问你的网络服务器。他们应该能够将它们提供给您(IP 地址范围),就像他们提供给我们一样。

文档是这样说的:

对私有内容使用 HTTP 服务器

您可以将签名 URL 用于任何 CloudFront 分配,无论源是 Amazon S3 存储桶还是 HTTP 服务器。但是,要让 CloudFront 访问您在 HTTP 服务器上的对象,这些对象必须保持可公开访问的状态。由于对象可公开访问,因此在您的 HTTP 服务器上拥有对象 URL 的任何人都可以访问该对象,而无需 CloudFront 签名 URL 提供的保护。如果您使用签名 URL 并且您的源是 HTTP 服务器,请不要将您的 HTTP 服务器上的对象的 URL 提供给您的客户或您组织之外的其他人。

【讨论】:

这也是我从 AWS 论坛获得的信息。不幸的是,它们确实提供了保护 S3 服务器的机制,但不要让您为非 S3 服务器启用它。【参考方案2】:

我刚刚为自己做了这件事,我想我会在我开始搜索的地方留下答案。

这是您需要在 .htaccess 中添加的几行代码(假设您已经打开了重写引擎):

 RewriteCond %HTTP_HOST ^www-origin\.example\.com [NC]
 RewriteCond %HTTP_USER_AGENT !^Amazon\ CloudFront$ [NC]
 RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

这会将所有访问者重定向到您的 Cloudfront 分配 - 在这个,嗯,示例中为 https://example.com - 并且只让 www-origin.example.com 为 Amazon CloudFront 工作。如果您的网站代码也在不同的 URL 上(例如,开发或登台服务器),这不会妨碍您。

注意:用户代理是可猜测和可欺骗的;实现此目的的更安全方法是在 Cloudfront 中设置自定义 HTTP 标头,并在 .htaccess 中检查其值。

【讨论】:

【参考方案3】:

我最终创建了 3 个完全由 CloudFront IP 地址填充的安全组。

我在这个AWS docs page 上找到了list of IPs。

如果您只想将 IP 范围复制并粘贴到控制台中,可以使用我创建的此列表:

地区: 13.113.196.64/26, 13.113.203.0/24, 52.199.127.192/26, 13.124.199.0/24, 3.35.130.128/25, 52.78.247.128/26, 13.233.177.192/26, 15.207.13.128/25, 15.207.213.128/25, 52.66.194.128/26, 13.228.69.0/24, 52.220.191.0/26, 13.210.67.128/26, 13.54.63.128/26, 99.79.169.0/24, 18.192.142.0/23, 35.158.136.0/24, 52.57.254.0/24, 13.48.32.0/24, 18.200.212.0/23, 52.212.248.0/26, 3.10.17.128/25, 3.11.53.0/24, 52.56.127.0/25, 15.188.184.0/24, 52.47.139.0/24, 18.229.220.192/26, 54.233.255.128/26, 3.231.2.0/25, 3.234.232.224/27, 3.236.169.192/26, 3.236.48.0/23, 34.195.252.0/24, 34.226.14.0/24, 13.59.250.0/26, 18.216.170.128/25, 3.128.93.0/24, 3.134.215.0/24, 52.15.127.128/26, 3.101.158.0/23, 52.52.191.128/26, 34.216.51.0/25, 34.223.12.224/27, 34.223.80.192/26, 35.162.63.192/26, 35.167.191.128/26, 44.227.178.0/24, 44.234.108.128/25, 44.234.90.252/30

全球: 120.52.22.96/27, 205.251.249.0/24, 180.163.57.128/26, 204.246.168.0/22, 205.251.252.0/23, 54.192.0.0/16, 204.246.173.0/24, 54.230.200.0/21, 120.253.240.192/26, 116.129.226.128/26, 130.176.0.0/17, 99.86.0.0/16, 205.251.200.0/21, 223.71.71.128/25, 13.32.0.0/15, 120.253.245.128/26, 13.224.0.0/14, 70.132.0.0/18, 13.249.0.0/16, 205.251.208.0/20, 65.9.128.0/18, 130.176.128.0/18, 58.254.138.0/25, 54.230.208.0/20, 116.129.226.0/25, 52.222.128.0/17, 64.252.128.0/18, 205.251.254.0/24, 54.230.224.0/19, 71.152.0.0/17, 216.137.32.0/19, 204.246.172.0/24, 120.52.39.128/27, 118.193.97.64/26, 223.71.71.96/27, 54.240.128.0/18, 205.251.250.0/23, 180.163.57.0/25, 52.46.0.0/18, 223.71.11.0/27, 52.82.128.0/19, 54.230.0.0/17, 54.230.128.0/18, 54.239.128.0/18, 130.176.224.0/20, 36.103.232.128/26, 52.84.0.0/15, 143.204.0.0/16, 144.220.0.0/16, 120.52.153.192/26, 119.147.182.0/25, 120.232.236.0/25, 54.182.0.0/16, 58.254.138.128/26, 120.253.245.192/27, 54.239.192.0/19, 18.64.0.0/14, 120.52.12.64/26, 99.84.0.0/16, 130.176.192.0/19, 52.124.128.0/17, 204.246.164.0/22, 13.35.0.0/16, 204.246.174.0/23, 36.103.232.0/25, 119.147.182.128/26, 118.193.97.128/25, 120.232.236.128/26, 204.246.176.0/20, 65.8.0.0/16, 65.9.0.0/17, 120.253.241.160/27, 64.252.64.0/18

我想指出,默认情况下,安全组每个最多只允许 60 个入站和出站规则,这就是我将这 122 个 IP 分成 3 个安全组的原因。

创建 3 个安全组后,将它们附加到您的 EC2(您可以将多个安全组附加到一个 EC2)。我离开了 EC2 的默认安全组,只允许来自我的 IP 地址的 SSH 流量。

那么你应该很高兴!这会强制用户使用您的 CloudFront 分配并保持 EC2 的 IP/DNS 私有。

【讨论】:

以上是关于只允许 CloudFront 从源服务器读取?的主要内容,如果未能解决你的问题,请参考以下文章

源请求 lambda 不会从源返回任何内容

对象删除后 CloudFront 失效

Amazon Cloudfront 允许所有备用域名 (CNAMES)

允许用户从 AWS s3 或 Cloudfront 批量下载文件

通过 IP 限制对 CloudFront 的访问

AWS CloudFront 签名 Cookie CORS 问题