Azure网站安全系列 — HTTP Strict Transport Security


HSTS协议

HTTP Strict Transport Security (HSTS)(RFC 6797)定义了一个安全协议。通过HSTS,Web服务器端(网站)声明自己只接受安全连接访问(HTTPS),禁止明文访问(HTTP)。通过强制HTTPS安全连接访问,HSTS可以防止man-in-middle安全问题。比如,通过公共wifi访问敏感信息。

Wiki中描述了具体的攻击情景。

 

HSTS

工作原理

Web服务器端通过在HTTP回复的头部信息(HTTP Response Header)中设置名为“Strict-Transport-Security”的域告诉客户端服务器只接受安全连接访问。 Strict-Transport-Security允许的值包含两部分:max-age和includeSubDomains。

max-age:单位为秒,该值告诉客户端在指定的时间内都需要强制使用HSTS访问。

includeSubDomains:该策略同时应用到子域访问中。

下面的例子告诉客户端一年之内必须采用HTTPS方式访问。

Strict-Transport-Security: max-age=31536000; includeSubDomains

如果max-age设置为0,客户端应该立即取消强制安全连接访问策略。

 

配置

很多文章提到了通过下面的方法自动添加HSTS的Strict-Transport-Security信息。

<configuration>

    <system.webServer>
       <httpProtocol>

         <customHeaders>

                <add name=“Strict-Transport-Security” value=“max-age=31536000” />

         </customHeaders>

       </httpProtocol>
<system.webServer>
</configuration>

但是该方法有可能导致在HTTP明文访问中包含Strict-Transport-Security信息。这导致安全漏洞,违反了协议规定,客户端会忽略改信息。

7.2. HTTP Request Type

If an HSTS Host receives an HTTP request message over a non-secure
transport, it SHOULD send an HTTP response message containing a
status code indicating a permanent redirect, such as status code 301
(Section 10.3.2 of [RFC2616]), and a Location header field value
containing either the HTTP request’s original Effective Request URI
(see Section 9 (“Constructing an Effective Request URI”)) altered as
necessary to have a URI scheme of “https”, or a URI generated
according to local policy with a URI scheme of “https”.

 

该问题可以通过HSTS IIS Module来解决,该模块可以在GitHub上下载。

HSTS IIS Module

另外一个方法就是通过URLRewrite解决。在前面,我介绍了如何通过URLRewrite实现强制HTTPS访问。这样无需HSTS IIS模块即可实现安全的HSTS配置。完整的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
     <rewrite>
          <rules>
               <rule name="Redirect to https">
                    <match url="(.*)" />
                    <conditions>
                         <add input="{HTTPS}" pattern="Off" />
                    </conditions>
                    <action type="Redirect" url="https:// {HTTP_HOST}/{R:1}" />
               </rule>
           </rules>
     </rewrite>

     <httpProtocol>
          <customHeaders>
               <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
          </customHeaders>
     </httpProtocol>
</system.webServer>
</configuration>

这样,HTTP请求被自动重定向到HTTPS请求,HTTPS请求的回复中会包含Strict-Transport-Security信息。

HSTS的优势

URLRewrite重定向本身即可实现强制HTTPS访问,流程如下:
1. 客户端HTTP请求
2. 服务器端返回302,重定向到HTTPS
3. 客户端重新发送HTTPS请求

HSTS的流程如下:
1. 客户端发送HTTPS请求
2. 服务器端返回Strict-Transport-Security信息
3. 此后,如果客户端诊断到有HTTP链接,客户端自动用HTTPS替代。

由此可见,HSTS强制客户端发送HTTPS请求,可以抵御SSL剥离攻击。而URLRewrite的方式,是在服务器端强制重定向,无法抵御该攻击。此外,相比HSTS方式多了一次额外的请求。

 

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注