我需要将AWS WAF用于我在AWS上托管的Web应用程序,以便为其提供额外的基于规则的安全性。我无法找到任何方法直接使用WAF与ELB和WAF需要Cloudfront添加WEB ACL来阻止基于规则的操作。 因此,我将我的应用程序ELB CNAME添加到了cloudfront,只有域名,带有IP块规则和HTTPS协议的WebACL已使用cloudfront进行了更新。休息全部都是默认的。一旦添加了带有ELB CNAME的WAF和Cloudfront,我就试图从WAF中的block ip规则中的一个ip地址访问CNAME ELB。我仍然可以从该IP地址访问我的Web应用程序。此外,我尝试检查创建的Web ACL的cloudwatch指标,我发现它甚至没有被点击。 首先,有没有什么好方法可以实现我正在做的事情,第二,是否有一种特定的方式在cloudfront上添加ELB CNAME。
谢谢和问候, 杰
答案 0 :(得分:16)
服务更新:下面的orignal,扩展答案在编写时是正确的,但现在主要适用于Classic ELB,因为 - 截至2016-12-07 - 申请负载均衡器(elbv2)现在可以直接与Web应用程序防火墙(Amazon WAF)集成。
启动[2016-12-07] AWS WAF(Web应用程序防火墙)在应用程序负载均衡器(ALB)上可用。您现在可以直接在VPC中的应用程序负载均衡器(内部和外部)上使用AWS WAF,以保护您的网站和Web服务。通过此次发布,客户现在可以在Amazon CloudFront和Application Load Balancer上使用AWS WAF。
似乎你需要对这些部分如何组合起来做一些澄清。
因此,请说明您要保护的实际网站是app.example.com
。
听起来好像你有一个CNAME elb.example.com指向ELB的指定主机名,类似于例如example-123456789.us-west-2.elb.amazonaws.com。如果您访问这些主机名中的任何一个,则无需直接连接到ELB - 无论在CloudFront或WAF中配置了什么。这些机器仍可通过互联网访问。
这里的诀窍是将流量路由到CloudFront,WAF可以对其进行防火墙处理,这意味着还需要做一些额外的事情:首先,这意味着需要一个额外的主机名,因此您需要配置app.example。在DNS中作为CNAME(或Alias,如果您正在使用Route 53)指向分配给您的发行版的dxxxexample.cloudfront.net主机名。
您还可以直接使用指定的CloudFront主机名访问您的sitr进行测试。现在,从被阻止的IP地址访问此端点确实会导致请求被拒绝。
因此,CloudFront端点是您需要发送流量的地方 - 而不是直接发送给ELB。
不会让您的ELB仍然暴露在外吗?
是的,它确实......所以下一步是插上那个洞。
如果您使用自定义来源,则可以使用自定义标头来阻止用户绕过CloudFront并直接从您的来源请求内容。
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html
这里的想法是,您将建立仅为您的服务器和CloudFront知道的秘密值。 CloudFront将在标头中发送此请求以及每个请求,并且您的服务器将要求存在该值,否则它们将播放愚蠢并抛出错误 - 例如503 Service Unavailable或403 Forbidden或甚至404 Not Found。
因此,您构建了一个标题名称,如X-My-CloudFront-Secret-String
和一个随机字符串,如o+mJeNieamgKKS0Uu0A1Fqk7sOqa6Mlc3
,并将其配置为CloudFront中的自定义源标题。这里显示的值是任意的例子 - 这可以是任何东西。
然后配置您的应用程序Web服务器以拒绝此标头和匹配值不存在的任何请求 - 因为您知道该请求来自您的特定CloudFront分配。除了ELB运行状况检查之外,您需要做出异常的其他任何事情都不是来自您的CloudFront分配,因此根据定义是未经授权的,因此您的服务器需要通过错误拒绝它,但是没有在错误信息。
此标头及其预期值仍然是秘密,因为它不会被CloudFront发送回浏览器 - 它只会在CloudFront发送给您的ELB的请求中向前发送。
请注意,您应该获得ELB的SSL证书(对于elb.example.com主机名),并配置CloudFront以使用HTTPS将所有请求转发到ELB。 CloudFront和ELB之间拦截流量的可能性很低,但这是您应该考虑实施的保护措施。
您可以选择还通过仅允许ELB安全组中的CloudFront IP地址范围阻止所有无法从CloudFront到达的请求来减少(但不能消除)大多数未经授权的访问 - - CloudFront地址范围为documented(在JSON中搜索指定为CLOUDFRONT
的块,并仅允许在ELB安全组中使用这些块)但请注意,如果执行此操作,仍需要设置上面讨论过的自定义源标头配置,因为如果您只在IP级别阻止,那么您仍然在技术上允许任何人的 CloudFront分配来访问您的ELB。您的CloudFront分配与其他CloudFront分配共享池中的IP地址,因此请求从CloudFront到达的事实不足以保证它来自您的 CloudFront分配。另请注意,您需要注册更改通知,以便在将新地址范围添加到CloudFront时,您就会知道将它们添加到您的安全组。