服务更新:下面的原始扩展答案在编写时是正确的,但现在主要适用于经典 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 防火墙,这意味着必须发生一些额外的事情:首先,这意味着需要一个额外的主机名,所以你在 DNS 中配置 app.example.com作为 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 地址范围(搜索 JSON块指定为CLOUDFRONT
,并且只允许 ELB 安全组中的这些)但请注意,如果您这样做,您仍然需要设置自定义源头配置,如上所述,因为如果您只在 IP 级别阻止,您在技术上仍然允许任何人的CloudFront 分配以访问您的 ELB。您的 CloudFront 分配与其他 CloudFront 分配共享池中的 IP 地址,因此请求来自 CloudFront 的事实并不能充分保证它来自您的CloudFront 分配。另请注意,您需要注册更改通知,以便在将新地址范围添加到 CloudFront 时,您将知道将它们添加到您的安全组。