服务更新:下面的原始扩展答案在编写时是正确的,但现在主要适用于经典 ELB,因为 -- 截至 2016 年 12 月 7 日 -- 应用负载均衡器 (elbv2) 现在可以直接与 Web 应用程序防火墙 (Amazon WAF) 集成。
从 [2016-12-07] 开始,AWS WAF(Web 应用程序防火墙)在应用程序负载均衡器 (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/
您似乎确实需要澄清一下这些部分是如何组合在一起的。
假设您要保护的实际网站是app.example.com。
听起来好像您有一个 CNAME elb.example.com 指向 ELB 的分配主机名,类似于 example-123456789.us-west-2.elb.amazonaws.com。如果您访问这些主机名中的任何一个,您将直接连接到 ELB——无论 CloudFront 或 WAF 中配置了什么。这些机器仍然可以通过 Internet 访问。
这里的技巧是将流量路由到 CloudFront,在那里它可以通过 WAF 进行防火墙,这意味着必须发生一些额外的事情:首先,这意味着需要额外的主机名,因此您需要配置 app.example。 com 在 DNS 中作为 CNAME(或别名,如果您使用 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(用于 elb.example.com 主机名)获取 SSL 证书,并将 CloudFront 配置为使用 HTTPS 将所有请求转发到您的 ELB。 CloudFront 和 ELB 之间的流量被拦截的可能性很低,但这是您应该考虑实施的保护措施。
您可以选择也通过仅允许 ELB 安全组中的 CloudFront IP 地址范围阻止所有未从 CloudFront 到达的请求来减少(但不是消除)大多数未经授权的访问 - CloudFront 地址范围为 documented(在 JSON 中搜索指定为 CLOUDFRONT 的块,并在 ELB 安全组中仅允许这些块)但请注意,如果您这样做,您仍然需要设置自定义源头配置,已讨论上面,因为如果您只在 IP 级别阻止,您仍然在技术上允许任何人的 CloudFront 分配访问您的 ELB。您的 CloudFront 分配与其他 CloudFront 分配共享池中的 IP 地址,因此请求来自 CloudFront 的事实并不能充分保证它来自您的 CloudFront 分配。另请注意,您需要注册更改通知,以便在将新地址范围添加到 CloudFront 时,您将知道将它们添加到您的安全组。