amazon-web-services - 按国家/地区限制网站访问

标签 amazon-web-services dns geolocation amazon-route53

我正在使用 AWS 托管我的网站。

该网站位于 2 个 ec2 实例上,负载平衡器 (ELB) 在​​它们之间平衡流量。

目前,我正在使用我的 DNS(Route 53)通过使用 Route 53 的地理定位路由来限制对网站的访问:
http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-geo

(地理定位限制只是为了限制我的网站的初始发布。不是出于安全原因。这意味着限制只需要对公众有效)

这让我有点担心,因为我的负载均衡器仍然可以从任何地方访问。所以我担心我的负载均衡器会被谷歌或其他东西编入索引,然后我所在地区以外的人将能够访问该站点。

有什么解决办法吗?我是否以错误的方式限制按位置访问?有没有办法在 ELB 的安全组中指定它只接收来自我的 DNS 的入站流量(当然,那么我还必须指定允许来自边缘位置的入站流量以及我的静态内容,但这不是问题)?

注意:为安全组选择入站规则时有一个选项,在“类型”下选择“DNS(UDP)”或“DNS(TCP)”。我尝试为我的 ELB 为两种 DNS 类型(和 IP 地址 =“任何地方”)添加两个规则,但这并没有限制对 ELB 的访问只能通过我的 DNS。

谢谢你。

最佳答案

CloudFront 中提供了简单的解决方案。两种解决方案,实际上:

CloudFront 可以使用其 GeoIP 数据库为您进行阻止...

When a user requests your content, CloudFront typically serves the requested content regardless of where the user is located. If you need to prevent users in specific countries from accessing your content, you can use the CloudFront geo restriction feature[...]

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/georestrictions.html



您可以将 CloudFront 配置为允许或拒绝哪些国家/地区。您还可以配置存储在 S3 中的静态页面,这些页面显示给被拒绝的用户。 (您还可以为可能发生的其他 CloudFront 错误配置静态自定义错误页面,并将这些页面也存储在 S3 中,CloudFront 将在需要时获取它们)。

...或...

CloudFront 可以使用 CloudFront-Viewer-Country: 将位置信息传回您的服务器。 header ,并且您的应用程序代码,基于该 header 附带的内容,可以进行阻塞。传入的请求看起来像这样(为了清楚起见,一些 header 被删除或删除):
GET / HTTP/1.1
Host: example.com
X-Amz-Cf-Id: 3fkkTxKhNxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==
Via: 1.1 cb76b079000000000000000000000000.cloudfront.net (CloudFront)
CloudFront-Viewer-Country: US
CloudFront-Forwarded-Proto: https
Accept-Encoding: gzip

CloudFront 会根据请求的页面和查看者的国家/地区以及任何其他列入白名单的 header 的组合缓存响应,因此它将独立正确缓存您拒绝的响应和允许的响应。

以下是有关如何启用 CloudFront-Viewer-Country: 的更多信息标题:

If you want CloudFront to cache different versions of your objects based on the country that the request came from, configure CloudFront to forward the CloudFront-Viewer-Country header to your origin. CloudFront automatically converts the IP address that the request came from into a two-letter country code.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-location



或者,当然,您可以启用这两个功能,让 CloudFront 进行阻止,同时仍然让您的应用程序了解允许通过的位置的国家/地区代码。

但是,您如何解决负载均衡器仍然对外开放的问题呢?

CloudFront 最近也通过自定义源头解决了这个问题。这些是 CloudFront 随每个请求发送到您的源服务器的 secret 自定义 header 。

You can identify the requests that are forwarded to your custom origin by CloudFront. This is useful if you want to know whether users are bypassing CloudFront[...]

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html



因此,假设您向 CloudFront 添加了一个自定义 header :
X-Yes-This-Request-Is-Legit: TE9MIHdoYXQgd2VyZSB5b3UgZXhwZWN0aW5nIHRvIHNlZT8=

什么是线路噪音?没有什么,真的,只是一个只有您的服务器和 CloudFront 知道的虚构的 secret 值。配置您的 Web 服务器,以便如果传入请求中不存在此 header 和值,则拒绝访问——这是一个未通过 CloudFront 的请求。

不要使用上面的 secret ,当然……你自己编造。这完全是任意的。

注意事项适用于 任何 GeoIP 限制策略:它并不完美。云前线 claims 99.8% accuracy .

关于amazon-web-services - 按国家/地区限制网站访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35080803/

相关文章:

php - 如何在 Laravel 5 中按地理位置查询?

facebook - 使用地理定位搜索 Facebook 场所

php - Amazon S3 避免覆盖同名对象

amazon-web-services - 如何将 AWS Cognito 用户与 DynamoDB 同步

python - 如何使用 boto 创建存储桶时输入位置名称

linux - Docker 容器可以访问 DNS 但不能解析主机

java - 通过 IP 获取地理位置(Spigot 1.8 和 1.13.2)

amazon-web-services - 在 AWS-CDK 中销毁堆栈时不要删除现有资源

linux - 获取广域网 IP : difference between HTTP and DNS

标记为垃圾邮件的电子邮件 - SPF 通过、DKIM 通过、发件人 ID 通过