限制对 AWS 上特定域的访问

限制对 AWS 上特定域的访问

我们当前的设置是

ALB -> Target Group -> EC2 instances

目前,可以使用 ALB 的 IP 地址、DNS 名称(例如 xxxx-5555555555.eu-west-1.elb.amazonaws.com)以及 DNS 中指定的域(例如 aaa.bbbbbbb.com)访问负载均衡器后面的 EC2 服务器。

是否可以在使用 IP 地址或 DNS 名称时阻止对 ALB 的访问,而仅在使用域名 (aaa.bbbbbbb.com) 时允许访问?如果可以,我该如何设置?

答案1

选项1。

将 ALB 的默认目标组设为空目标组,不含任何实例。这是有效配置。

发送到该目标群体的所有请求都将失败,因此这些请求将受到欢迎503 Service Unavailable

然后添加第二个目标组,即“真实”目标组,并附加实例,并配置平衡器以仅发送Host与该组所需匹配的请求。

https://serverfault.com/a/868017/153161类似,但与此情况相反,默认组处理大多数请求,但虚拟/黑洞目标组处理您想要阻止的请求,从而导致相同的行为——被阻止的请求永远不会发送到实例。


选项 2。

亚马逊Web 应用程序防火墙(WAF) 也可以做到这一点,通过创建字符串匹配规则来与传入请求的Host标头进行比较。WAF 与 ALB 集成。

这种设置可能意味着成本增加,因为你必须支付 WAF(每百万个 Web 请求 0.60 美元,目前并非所有地区都提供)...但如果你已经将此 ALB 上的 WAF 用作其他目的(速率限制、XSS、SQL、字符串匹配等),则附加规则的成本将忽略不计或为零,具体取决于当前配置。

有一种误解认为您的流量会“通过”WAF,但事实并非如此。ALB 会克隆每个请求的前几个 KB,并向 WAF 发送一个数据包,请求 WAF 判断是否允许该请求。如果通过,则允许该请求,并且 WAF 不会进入流量循环。如果失败,ALB 将返回403。如果 ALB 根本无法从 WAF 获得答案(例如由于系统故障),则始终允许该请求,从而防止 WAF 成为故障点。


选项 3.(h/t@ceejayoz)

使用默认配置配置 Web 服务器的虚拟托管行为,以便在传入请求中出现意外/未知标头时返回错误响应Host。作为最佳实践,您的服务器不应该对此类请求做出积极响应。


这些选项没有特定的顺序。

答案2

如果您正在使用 cloudflare,这里有一个您可以使用的 terraform 模块。 https://github.com/orzarchi/terraform-aws-cloudflare-security-group

只需在此处更新您的 ALB 安全组 ID https://github.com/orzarchi/terraform-aws-cloudflare-security-group/blob/master/vars.tf#L1-L3

并更改 cron 作业启动的时间长度,以删除除 cloudflare 端点之外的所有其他访问。

那么您的 EC2 将受到完全保护。

相关内容