服务更新:下面的原始扩展答案在编写时是正确的,但现在主要适用于经典 ELB,因为 - 截至 2016 年 12 月 7 日 - 应用程序负载均衡器 (elbv2) 现在可以直接与 Web 应用程序集成防火墙(亚马逊 WAF)。
自 [2016-12-07] 起 AWS WAF(Web 应用程序防火墙)可在 Application Load Balancer (ALB) 上使用。您现在可以直接在 VPC 中的 Application Load Balancer(内部和外部)上使用 AWS WAF,以保护您的网站和 Web 服务。此次发布后,客户现在可以在 Amazon CloudFront 和 Application Load Balancer 上使用 AWS WAF。
https://aws.amazon.com/about-aws/whats-new/2016/12/AWS-WAF-now-available-on-Application-Load-Balancer/ https://aws.amazon.com/about-aws/whats-new/2016/12/AWS-WAF-now-available-on-Application-Load-Balancer/
看来您确实需要澄清这些部分如何组合在一起。
假设您想要保护的实际网站是app.example.com
.
听起来好像您有一个 CNAME elb.example.com 指向 ELB 的分配主机名,类似于 example-123456789.us-west-2.elb.amazonaws.com。如果您访问这些主机名中的任何一个,您将直接连接到 ELB - 无论 CloudFront 或 WAF 中的配置如何。这些机器仍然可以通过互联网访问。
这里的技巧是将流量路由到 CloudFront,在那里可以通过 WAF 进行防火墙,这意味着必须发生一些额外的事情:首先,这意味着需要额外的主机名,因此您在 DNS 中配置 app.example.com作为指向分配给您的分配的 dxxxexample.cloudfront.net 主机名的 CNAME(或别名,如果您使用的是 Route 53)。
您还可以使用分配的 CloudFront 主机名直接访问 SITR 进行测试。访问this来自被阻止 IP 地址的端点现在确实应该导致请求被拒绝。
因此,CloudFront 端点是您需要发送流量的地方,而不是直接发送到 ELB。
这不会让你的 ELB 仍然暴露在外吗?
是的,确实如此……所以下一步就是堵住这个漏洞。
如果您使用自定义源,则可以使用自定义标头来防止用户绕过 CloudFront 并直接从您的源请求内容。
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html 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(针对 elb.example.com 主机名)获取 SSL 证书,并将 CloudFront 配置为使用 HTTPS 将所有请求转发到您的 ELB。 CloudFront 和 ELB 之间的流量被拦截的可能性很低,但您应该考虑实施这种保护。
您可以选择also通过仅允许 ELB 安全组中的 CloudFront IP 地址范围来阻止所有不是来自 CloudFront 的请求,从而减少(但不是消除)大多数未经授权的访问 - CloudFront 地址范围是有记录的 http://docs.aws.amazon.com/general/latest/gr/aws-ip-ranges.html(在 JSON 中搜索指定为的块CLOUDFRONT
,并仅允许 ELB 安全组中的这些),但请注意,如果您这样做,您仍然需要设置上面讨论的自定义源标头配置,因为如果您仅在 IP 级别进行阻止,那么从技术上讲您仍然允许任何人的用于访问您的 ELB 的 CloudFront 分配。您的 CloudFront 分配与其他 CloudFront 分配共享池中的 IP 地址,因此请求从 CloudFront 到达这一事实并不能充分保证它来自yourCloudFront 分发。另请注意,您需要注册更改通知,以便在将新地址范围添加到 CloudFront 时,您会知道将它们添加到您的安全组中。