TLS安全漏洞修复

PCI DSS合规标准将于2018年6月30日生效,该标准要求禁用SSL协议和低版本TLS协议,HTTPS配置应实施更安全的加密协议(TLS v1.1或更高版本,强烈建议使用TLS v1.2),以满足PCI DSS合规标准的要求,解决安全套接字层(SSL)和传输层安全(TLS)加密协议内的高风险漏洞,应对最新的客户支付信息面临的威胁。

注:PCI DSS 全称 Payment Card Industry Data Security Standard(支付卡行业数据安全标准),是由PCI安全标准委员会制定,力在使国际上采用一致的数据安全措施。

背景信息

TLS(Transport Layer Security)即安全传输层协议,在两个通信应用程序之间提供保密性和数据完整性,最典型的应用就是HTTPS。HTTPS即HTTP over TLS,就是更安全的HTTP,运行在HTTP层之下,TCP层之上,为HTTP层提供数据加解密服务。

协议 说明 支持的主浏览器
TLSv1.0 RFC2246,1999年发布,基于SSLv3.0,易受攻击,不符合PCI DSS合规标准 ● IE6+
● Chrome 1+
● Firefox 2+
TLSv1.1 RFC4346,2006年发布,修复TLSv1.0若干漏洞 ● IE 11+
● Chrome 22+
● Firefox 24+
● Safri 7+
TLSv1.2 RFC5246,2008年发布,目前广泛使用的版本 ● IE 11+
● Chrome 30+
● Firefox 27+
● Safri 7+
TLSv1.3 RFC8446,2018年发布,最新的TLS版本,更快、更安全 ● Chrome 70+
● Firefox 63+
  • TLS 1.0,使用的是弱加密算法和系统,比如SHA-1和MD5,这些算法和系统十分脆弱,存在重大安全漏洞,容易受到降级攻击的严重影响。
  • TLS 1.3,支持0-RTT模式(更快),只支持完全前向安全性密钥交换算法(更安全)

涉及tls的安全漏洞

  • 涉及tls的漏洞清单,主要包括如下:
漏洞名称 漏洞等级 CVE编号 漏洞描述 修复建议
启用 TLS 1.0 协议 高危 CVE-2016-2183 - 禁用TLS 1.0并替换为TLS 1.2或更高版本
启用 TLS 1.1 协议 中危 CVE-2016-2183 - 禁用TLS 1.1并替换为TLS 1.2或更高版本
POODLE攻击(支持SSLv3) 高危 CVE-2014-3566 该漏洞可以使攻击者获取到一段明文数据,通常是cookie数据 禁用SSLv3并替换为TLS 1.2或更高版本
POODLE攻击(SSLv3 with CBC cipher suites) 中危 CVE-2014-3566 - 禁用SSLv3并替换为TLS 1.2或更高版本
TLS/SSL LOGJAM attack 中危 CVE-2015-4000 - -
TLS/SSL Sweet32 attack 中危 CVE-2016-2183 允许攻击者使用64位分组密码破坏HTTPS连接 升级OpenSSL版本到1.1.1
SSL弱密码 中危 - - -

确认TLS版本

如何确认某个https站点启用了哪些 TLS 加密协议?以 www.baidu.com 为例

  • 第1步,安装nmap端口扫描工具,利用nmap扫描并确认服务器开启的TLS协议版本。示例扫描出来 TLSv1.0、TLSv1.1、TLSv1.2,则表示该站点启用了这3个协议(应该是为了兼容更多的客户端浏览器版本)。
[root@localhost ~]# yum -y install nmap

[root@localhost ~]# nmap -sV -p 443 --script ssl* www.baidu.com | grep TLSv
|   TLSv1.0: 
|   TLSv1.1: 
|   TLSv1.2:
  • 第2步,使用客户端检查
[root@localhost ~]# echo Q | openssl s_client -connect www.baidu.com:443 | egrep "(TLS|Cipher|Protocol)"
#.其他省略...

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES128-GCM-SHA256
    TLS session ticket:
  • 第3步,测试服务器的协议
curl -sSL -v https://www.baidu.com:443

漏洞修复步骤

  • 第1步,Nginx使用OpenSSL进行SSL处理,TLSv1.1与TLSv1.2要求OpenSSL版本 >= 1.0.1,而TLSv1.3则要求 >= 1.1.1,若OpenSSL低于1.1.1则不支持TLS1.3。可执行 nginx -Vopenssl version 查看openssl版本,若两者返回的版本不一致,则nginx -V 为准,示例为 1.1.1
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.0
built with OpenSSL 1.1.1g  21 Apr 2020

[root@localhost ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017
  • 第2步,通过参数 ssl_protocols(没有请添加)禁用TLS 1.0、TLS 1.1(去掉即可),并将其替换为TLS 1.2或更高版本。另外,在不需要的(带 DES的) 加解密套件(默认HIGH:!aNULL:!MD5)前加 ! 号,以禁用之
server_name  xxx.example.com;
    listen 443 ssl;
    #.其他省略...

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
}

注:若OpenSSL版本 < 1.1.1,则不支持 TLSv1.3,则只能配置 ssl_protocols TLSv1.2; 更多配置,请参考 nginx配置https证书指南

  • 第3步,执行 nginx -t 确认配置无误之后再执行 nginx 热重启
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

确认是否生效

  • 第4步,关注nginx错误日志,看是否有其他报错
tail -n100 /usr/local/nginx/logs/error_nginx.log
  • 第5步,最后进行测试,打开谷歌浏览器访问, 按F12,点击security,如果出现下面的提示说明开启了tlsv1.2,否则不行。

遇到的坑

  • 配置tls1.2不生效,原因是 nginx/conf 目录下其他站点的ssl配置不一致。所以一定要注意:所有配置了https的站点,其ssl配置(就是第2步中ssl开头的那3个参数)必须一致,要不然不会生效。
cat *.conf | egrep -r "(ssl_protocols|ssl_ciphers|ssl_prefer_server_ciphers)"
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2022-10-24 17:47:33

results matching ""

    No results matching ""