【问题标题】:Enabling HSTS in AWS ELB application load balacer在 AWS ELB 应用程序负载均衡器中启用 HSTS
【发布时间】:2019-01-25 03:54:15
【问题描述】:

我们希望为我们的 IIS 部署的 Web 应用程序启用 HSTS。

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

目前,ALB 似乎不会将自定义标头从 IIS 传递给 ALB,再传递给最终用户。我们想看看是否有办法在 ALB 级别启用 HSTS,它可以接受自定义标头,或者是否可以在 IIS 级别设置它并且 ALB 可以通过 HSTS 标头到浏览器?

【问题讨论】:

    标签: amazon-web-services ssl iis amazon-elb hsts


    【解决方案1】:

    HSTS 是一种由后端而非负载平衡器控制的策略。有人可能会争辩说 AWS 可以实现这一点,但还有其他问题使这变得更加复杂(违反规范、HTTP 的永久重定向等)

    HSTS 的问题是您不能(不应该)通过 HTTP 发送 Strict-Transport-Security。规范说仅通过安全连接发送标头。 HTTP 不安全。由于负载均衡器通过 HTTP 与后端通信,因此 IIS 不会发送标头。您需要在后端使用 HTTPS 来启用 HSTS。

    RFC6797

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

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

    【讨论】:

    • 是的,我们通过在 IIS 中使用 URL 重写模块启用 HSTS 实现了类似的方法。但他的问题是 ALB 没有通过 HSTS 标头传递给浏览器。
    • 我推荐选项 #1,即在负载均衡器中使用第 4 层侦听器。现在您的后端可以完全控制 HTTPS 配置。
    • @PrasannaBR 您关于 ALB 没有将自定义标头传递给浏览器的断言是不正确的。由后端 注入响应的任何标头都将由 ALB 传送到浏览器。您将需要调查为什么这对您不起作用,因为它应该。
    • 我已使用 RFC 6797 中的详细信息更新了我的答案。
    【解决方案2】:

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

    完全可以通过 HTTP 在后端服务器上设置 HSTS 标头。归根结底,它只是一个和其他任何标题一样的标题,服务器会很高兴地发送它。

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

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

    然后,假设 Application Load Balancer 正在侦听 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 section 7.2,您不应通过纯 HTTP 将 HSTS 标头发送回浏览器。您应该做的是根据X-Forwarded-Proto 请求标头值对标头进行条件设置。

    【讨论】:

    • 反对这样做的论据只有在您支持 HTTPS HTTP 时才有效。如果您启用 HSTS,您通常只想让 HTTP 始终在 ELB 处重定向到 HTTPS。这可以保护您的后端无法通过纯文本访问。
    • 同意,如果您在 ELB 上进行重定向,那么您永远不会通过 HTTP 发送 HSTS 标头。正如您所说,最好在请求到达后端之前在 ELB 重定向。
    猜你喜欢
    • 2018-02-26
    • 2017-01-25
    • 2017-09-27
    • 2022-06-23
    • 1970-01-01
    • 2018-08-18
    • 2017-12-29
    • 2019-06-22
    • 2018-02-21
    相关资源
    最近更新 更多