【问题标题】:How to implement HTTP Strict Transport Security (HSTS) on AWS Elastic Load Balancer?如何在 AWS Elastic Load Balancer 上实施 HTTP 严格传输安全 (HSTS)?
【发布时间】:2018-04-12 00:48:00
【问题描述】:

我想在我的应用程序中实现 HSTS。

我有一个 ELB 终止 SSL 并将流量转发到我的应用程序,这是一个用作反向代理的 apache 服务器。

我知道为了实现 HSTS,我需要将标头 Strict-Transport-Security 添加到我的请求中。

不幸的是,我似乎无法在我的 Apache 服务器上实现它,因为它必须添加到 HTTPS 虚拟主机,而我的 Apache 只配置了 http 虚拟主机,因为 SSL 在 ELB 上终止。

这意味着 ELB 在转发请求时必须将标头 Strict-Transport-Security 添加到请求中。

我该怎么做?我可以添加某种安全策略来为我做这件事吗?

【问题讨论】:

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


    【解决方案1】:

    我询问了 AWS Support,得到的答案是目前 ELB 无法在来自客户端的请求中添加 HSTS 标头。因此,我决定使用我的 Apache 服务器找到一种解决方法。这是我找到的解决方案:

    HSTS RFC 声明

    HSTS 主机不得在通过非安全传输传输的 HTTP 响应中包含 STS 标头字段。

    然后我所做的是在 Apache 中设置标头 AFTER http=>https 重定向。由于此重定向带有标志 [L],这意味着 301 重定向将不包含标头,但任何 https 请求都会包含。我的 apache 配置如下所示:

    <VirtualHost *:80>
    ...
        #http=>https
        RewriteCond %{HTTP:X-Forwarded-Proto} =http
        RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
    
        #hsts
        Header set Strict-Transport-Security "max-age=31536000"
    

    【讨论】:

      【解决方案2】:

      如果您使用 Apache 2.4+,您可能熟悉 expressions 和指令 &lt;If&gt;&lt;ElseIf&gt;&lt;Else&gt;

      我在开发、登台和生产环境之间有一个复杂的配置,所以依赖 [L] 标志和 RewriteRule 对我来说并不合适。

      这让我想到了以下解决方案,我把它放在我的 .htaccess 中:

      <IfModule mod_headers.c>
          <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
              Header set Strict-Transport-Security "max-age=31536000"
          </If>
      </IfModule>
      

      它在我的环境中效果更好,我觉得它满足 RFC 更可靠。

      如果您从不直接点击您的实例,您可以删除 "%{REQUEST_SCHEME} == 'https' 部分,但这是我在开发环境中调试过程的一部分。

      非常感谢Pedreiro 为我指明了 HSTS RFC 实际规范的正确方向。

      【讨论】:

        【解决方案3】:

        请注意,由于 Apache <IfVersion >= 2.4> 中,如下所示:

            <IfVersion >= 2.4> 
                <IfModule mod_headers.c>
                    <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">
                        Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
                    </If>
                </IfModule>
            </IfVersion>
        

        【讨论】:

          【解决方案4】:

          Maybe? - 确实解决了我过去遇到的类似情况。

          【讨论】:

          • 感谢您的文章。它在它的顶部说“与 HTTP 严格传输安全 (HSTS) 相结合,这对你的 ELB 来说是一个非常可靠的设置。”。所以,我猜这并没有实现 HSTS,而是禁用了 SSLv2 和 SSLv3。
          猜你喜欢
          • 2020-11-30
          • 1970-01-01
          • 2021-09-16
          • 2015-09-14
          • 1970-01-01
          • 2014-03-20
          • 2017-04-23
          • 2017-05-10
          • 2015-10-24
          相关资源
          最近更新 更多