限制按国家/地区访问网站

时间:2016-01-29 09:18:35

标签: 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的入站流量(当然,我还必须指定来自边缘位置的入站流量以及我的静态内容,但是这不是问题)?

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

谢谢。

4 个答案:

答案 0 :(得分:4)

此处的简单解决方案可在CloudFront中找到。实际上有两种解决方案:

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

  

当用户请求您的内容时,无论用户位于何处,CloudFront通常都会提供所请求的内容。如果您需要阻止特定国家/地区的用户访问您的内容,您可以使用CloudFront地理位置限制功能[...]

     

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

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

<强> ...或...

CloudFront可以使用CloudFront-Viewer-Country:标头将位置信息传递回您的服务器,您的应用程序代码可以根据该标头附带的内容进行阻止。传入的请求看起来像这样(为了清楚起见,一些标题被删除或删除):

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会根据 所请求页面和查看者所在国家/地区以及任何其他列入白名单的标题的组合来缓存响应,因此它会正确缓存您拒绝的回复以及您允许的回复,独立。

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

  

如果您希望CloudFront根据请求来自的国家/地区缓存对象的不同版本,请配置CloudFront以将CloudFront-Viewer-Country标头转发到您的源。 CloudFront会自动将请求来自的IP地址转换为双字母国家/地区代码。

     

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

或者,当然,您可以启用这两项功能,让CloudFront执行阻止,同时仍然为您的应用提供有关允许通过的位置的国家/地区代码的预告。

但是,如果您的负载均衡器仍然向全世界开放,您如何解决这个问题呢?

CloudFront最近也使用Custom Origin Headers解决了这个问题。这些是由CloudFront通过每个请求发送到您的源服务器的秘密自定义标头。

  

您可以识别CloudFront转发到您的自定义来源的请求。如果您想知道用户是否绕过CloudFront [...]

,这非常有用      

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

因此,我们假设您向CloudFront添加了自定义标头:

X-Yes-This-Request-Is-Legit: TE9MIHdoYXQgd2VyZSB5b3UgZXhwZWN0aW5nIHRvIHNlZT8=

所有线路噪音是什么?没有,真的,只是一个只有你的服务器和CloudFront知道的秘密价值。配置您的Web服务器,以便如果传入请求中不存在此标头和值,则拒绝访问 - 这是一个不通过CloudFront的请求。

不要使用上述秘密,当然......制作自己的秘密。这完全是武断的。

适用于任何 GeoIP限制策略的警告:它并不完美。 CloudFront claims 99.8% accuracy

答案 1 :(得分:1)

实施地理IP限制的最可靠方法是使用地理位置数据库或服务API,并在应用程序级别实施。

例如,对于几乎任何语言的网站,在每个页面请求开始时添加测试非常简单,并将客户端IP与geo ip数据库或服务进行比较,并从那里处理响应。

在应用程序级别,您可以更轻松地管理您接受/拒绝的国家/地区,并根据需要记录这些事件,而不是在网络级别。

基于IP的地理位置数据通常是可靠的,并且此数据有许多来源。虽然您可能信任AWS很多东西,但我认为有许多可靠的第三方geo IP数据源,专注于这些数据。

  • freegeoip.net提供了一个公共HTTP API来搜索IP地址的地理位置。每小时最多允许10,000个查询。
  • ip2location.com LITE是一个免费的IP地理位置数据库,供个人或商业用途使用。

如果您的应用程序使用数据库,则可以在您的应用程序中轻松导入和引用这些地理数据库。

答案 2 :(得分:0)

我有一篇帖子详细解释了Route53的白名单/黑名单位置:https://www.devpanda.me/2017/10/07/DNS-Blacklist-of-locations-countries-using-AWS-Route53/

就您的ELB暴露于公众而言不应该是一个问题,因为通过端口80/443对ELB的任何请求的Host头将与您的域名不匹配,这意味着大多数Web服务器都是404将被退回或类似。

答案 3 :(得分:0)

有一种使用AWS WAF的方法 您可以选择-资源类型以将Web ACL关联为ELB。 选择您的ELB并创建条件,例如地理匹配,IP地址等。 如果将来有任何更改,您也可以随时更新。 谢谢