我们当前的设置是
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 将受到完全保护。