5

我需要将 AWS WAF 用于托管在 AWS 上的 Web 应用程序,以便为其提供额外的基于规则的安全性。我找不到任何方法可以直接将 WAF 与 ELB 一起使用,而 WAF 需要 Cloudfront 添加 WEB ACL 以阻止基于规则的操作。因此,我将我的应用程序 ELB CNAME 添加到云端,只有域名、带有 IP 阻止规则的 WebACL 和 HTTPS 协议使用云端进行了更新。其余所有已保留默认值。一旦添加了带有 ELB CNAME 的 WAF 和 Cloudfront,我尝试从 WAF 中的阻止 IP 规则中的 IP 地址之一访问 CNAME ELB。我仍然可以从该 IP 地址访问我的 Web 应用程序。此外,我尝试检查创建的 Web ACL 的 cloudwatch 指标,我发现它甚至没有被命中。首先,有什么好的方法可以实现我正在做的事情,其次,有没有一种特定的方法可以在云端添加 ELB CNAME。

谢谢和问候, 杰伊

4

1 回答 1

23

服务更新:下面的原始扩展答案在编写时是正确的,但现在主要适用于经典 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 时,您将知道将它们添加到您的安全组。

于 2016-11-18T00:30:45.860 回答