HTTPS漏洞检测(HSTS、HPKP)和修复

SSL  Nginx  

HTTPS能给网站带来更安全的保护,主要体现在以下几个方面:


  1. 更好地保护用户的隐私。

  2. 避免用户访问到伪造的服务器。

  3. HTTPS 还可以防止流量劫持


HTTPS安全检测可以通过以下链接进行检测:


HTTPS最佳安全部署实践


我的检测结果:


1.png


可以看到没有进行HSTS头部署HPKP头部署。 通过旁边的链接,可以进入相关的修复帮助页面,以下是修复的重点。


HSTS头部署

       通过在加密的HTTP响应中包含


       Strict-Transport-Security头来实现网站HSTS,例如


Strict-Transport-Security: max-age=63072000; includeSubdomains;preload;


       最佳的部署方案是部署在离用户最近的位置,例如架构有前端反向代理和后端web服务器,在前端代理处配置HSTS是最好的,否则就需要在web服务器层配置HSTS。如果web服务器不明确支持HSTS,可以通过增加响应头的机制,但需要阅读各种服务器的附属细则。如果其他方法都失败了,可以在应用程序层增加HSTS。


       Apache


       #启用HTTP严格传输安全


Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"


       #HSTS策略只能在加密通道的HTTP响应中进行设置,因此需要把http重定向到https,如果明文响应中允许设置HSTS头,中间人攻击者就可以通过在普通站点中注入HSTS信息来执行DoS攻击


<VirtualHost *:80>

  ServerName www.abclogs.com

  ServerAlias abclogs.com

  …

 #将所有访问者重定向到加密的网站

 RedirectPermanent / https://www.abclogs.com/

<VirtualHost>


      IIS


        第三方模块  http://hstsiis.codeplex.com/ 


      Nginx


server {

   listen xxxx:443 ssl;

   server_name www.abclogs.com;

   add_header Strict-Transport-Security "max-age=31536000;includeSubdomains;preload";

   ….

}

server {

   listen xxxx:80;

   server_name www.abclogs.com;

   return 301 https://www.abclogs.com$request_uri;

   …

}

        注意:addheader指令只会将HTTP头添加到非错误响应中(2xx和3xx)


HPKP头部署

下面你可以看到三个主流 Web 服务器的配置方法。这只是一个 HTTP 响应头,绝大多数 Web 服务器都可以设置它。它只需要设置到 HTTPS 网站上。


下面的例子固定到 COMODO RSA Domain Validation Secure Server CA 及备份的 Comodo PositiveSSL CA 上,30天失效期,包括所有的子域。


Apache


编辑你的 Apache 配置文件(如 /etc/apache2/sites-enabled/website.conf 或 /etc/apache2/httpd.conf),并添加下列行到你的 VirtualHost 中:


# 如需要,载入 headers 模块。

LoadModule headers_module modules/mod_headers.so

Header set Public-Key-Pins "pin-sha256=\"klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=\"; pin-sha256=\"633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q=\"; max-age=2592000; includeSubDomains"


Lighttpd


Lighttpd 更简单一些,将下列行添加到你的 Lighttpd 配置文件(如 /etc/lighttpd/lighttpd.conf):


server.modules += ( "mod_setenv" )

$HTTP["scheme"] == "https" {

    setenv.add-response-header  = ( "Public-Key-Pins" => "pin-sha256=\"klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=\"; pin-sha256=\"633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q=\"; max-age=2592000; includeSubDomains")

}


NGINX


NGINX 的配置更简短。添加以下行到你的 HTTPS 配置的 server 块中:


add_header Public-Key-Pins 'pin-sha256="klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY="; pin-sha256="633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q="; max-age=2592000; includeSubDomains';


报告功能


HPKP 报告功能允许浏览器报告任何违例给你。


如果你在响应头中添加了附加的 report-uri="http://www.abclogs.com/hpkp-report" 参数,并用该 URI 处理接收到的数据的话,客户端会在发现违例时发送报告给你。这个报告是以 POST 方式发送到你指定的 report-uri 上,并以类似下面的 JSON 格式:


{

    "date-time": "2014-12-26T11:52:10Z",

    "hostname": "www.abclogs.com",

    "port": 443,

    "effective-expiration-date": "2014-12-31T12:59:59",

    "include-subdomains": true,

    "served-certificate-chain": [

        "-----BEGINCERTIFICATE-----\nMIIAuyg[...]tqU0CkVDNx\n-----ENDCERTIFICATE-----"

    ],

    "validated-certificate-chain": [

        "-----BEGINCERTIFICATE-----\nEBDCCygAwIBA[...]PX4WecNx\n-----ENDCERTIFICATE-----"

    ],

    "known-pins": [

        "pin-sha256=\"dUezRu9zOECb901Md727xWltNsj0e6qzGk\"",

        "pin-sha256=\"E9CqVKB9+xZ9INDbd+2eRQozqbQ2yXLYc\""

    ]

}


非强制,只报告


HPKP 也可以设置为非强制的,可以使用 Public-Key-Pins-Report-Only 来只发送违例报告给你。

这样可以让你在网站不可访问或 HPKP 配置不正确时不固定,之后你可以将这个响应头改为 Public-Key-Pins 来强制固定。


修补完成后:

2.png


延伸阅读


百度在2015年3月将搜索服务全站HTTPS化以来,HTTPS正被越来越多的网站和企业使用。但是我们发现,进行正确的HTTPS配置和安全部署情况并不乐观,安全指数分析了全网13288198个网站,其中有1089693个网站使用了HTTPS,占比8.2%。使用HTTPS的网站中有1080884个网站存在配置或安全问题,占比99.19%。(2017年3月1日数据)


        中国互联网网站HTTPS使用和安全情况:     

    

        我们希望:通过使用HTTPS带来的安全改善、HTTPS证书有效性、HTTPS安全部署、HTTPS漏洞等多个角度,推进中国互联网网站提升HTTPS安全,避免被浏览器HTTPS危险、不安全提示和访问拦截。


参考链接:

https://bsi.baidu.com/topic/https/hpkp.html

https://linux.cn/article-5282-1.html

https://bsi.baidu.com/topic/https/hsts.html

时间:2017年04月22日    作者:孟德    分类:Linux   浏览:4119    评论:0

链接地址:https://www.abclogs.com/linux_https_hsts_hpkp.html