在AWS ELB应用程序负载平衡器中启用HSTS

Pra*_*B R 6 iis ssl amazon-web-services amazon-elb hsts

我们想对我们的IIS部署的Web应用程序启用HSTS。

我们有SSL终止ELB应用程序负载平衡器。我们已经在IIS中启用了URL重写模块,并配置了x-Forward-Proto标记来决定并启用响应中的HSTS标头。

当前,ALB似乎没有将自定义标头从IIS传递到ALB,再传递给最终用户。我们想看看是否有一种方法可以在允许接受自定义标头的ALB级别启用HSTS,还是可以在IIS级别设置HSTS并使ALB可以通过HSTS标头传递给浏览器?

And*_*dge 16

听起来这就是OP使用的方法,但由于某种原因,标头没有被传递。我只是想确认这种方法确实有效并提供更多详细信息。

完全可以通过 HTTP 在后端服务器上设置 HSTS 标头。归根结底,它只是一个像其他标头一样的标头,服务器会很乐意发送它。

然而,根据 HSTS 规范,浏览器将忽略 HTTP 响应中收到的 HSTS 标头。

但是,有一种方法可以使其工作,首先配置后端服务器以发送 HSTS 标头。

然后,假设应用程序负载均衡器正在侦听 HTTPS,但您的目标组(和后端服务器)正在使用 HTTP,则会发生以下情况:

  • 浏览器通过 HTTPS 向 ALB 发送请求
  • ALB通过HTTP将请求转发到后端
  • 后端服务器通过 HTTP 将包含 HSTS 标头的响应发送到 ALB
  • ALB通过 HTTPS 向浏览器发送相同的响应 + 标头。

因此,浏览器通过 HTTPS 接收响应和 HSTS 标头,并且它将遵守 HSTS。

反对这样做的一个论点是,您根本不应该通过 HTTP 发送 HSTS 标头。然而,同样的论点也适用于您的整个网站 - 任何人都不应该通过 HTTP 向互联网提供任何网站服务。如果您认为在 ALB 处终止 HTTPS 并在 HTTP 上运行后端服务器是安全的,那么以相同的方式发送 HSTS 标头也同样安全。


注意:如果您使用 HSTS,那么您几乎肯定已经获得了从 HTTP 到 HTTPS 的重定向。请记住,HSTS 标头将通过 HTTP 与重定向一起发送,但浏览器将忽略它。一旦发生重定向并且 HSTS 标头通过 HTTPS 传输,浏览器就会遵循它。

从技术上讲,根据RFC6707 第 7.2 节,您不应通过纯 HTTP 将 HSTS 标头发送回浏览器。您应该做的是根据请求标头值对标头进行有条件的设置X-Forwarded-Proto

  • 仅当您支持 HTTPS **和** HTTP 时,反对这样做的论据才有效。如果您启用 HSTS,您通常只想让 HTTP 始终在 ELB 处重定向到 HTTPS。这可以保护您的后端无法通过纯文本访问。 (2认同)
  • 同意,如果您在 ELB 上进行重定向,那么您永远不会通过 HTTP 发送 HSTS 标头。正如您所说,最好在请求到达后端之前在 ELB 进行重定向。 (2认同)

Joh*_*ley 5

HSTS是由后端而不是由负载均衡器控制的策略。有人可能会说AWS可以做到这一点,但是还有其他一些问题使事情变得更加复杂(违反规范,HTTP的永久重定向等)。

HSTS的问题在于您不能(不应)通过HTTP发送严格传输安全性。规范说只能通过安全连接发送标头。HTTP不安全。由于负载平衡器正在通过HTTP与后端通信,因此IIS不会发送标头。您需要在后端使用HTTPS来启用HSTS。

RFC6797

如果您的目标是向客户端发送“严格的传输安全性”,请在负载均衡器上使用第4层侦听器,并在后端处理HTTPS。如果请求通过HTTP到达,则发送永久重定向(301)。好处包括绝对控制,改进的HTTP / 2等。

另一个选择是将您的侦听器更改为使用HTTPS与后端通信。在后端设置HTTPS和SSL。

  • @PrasannaBR您关于ALB不会将自定义标头传递给浏览器的断言是不正确的。后端*注入响应中的任何标头*将由ALB传递到浏览器。您将要调查为什么这对您不起作用,因为它应该起作用。 (3认同)