Nginx服务器SSL的安全配置及CVE-2016-2183漏洞处理
概要
OpenSSL 是⼀个强⼤的安全套接字层密码库,囊括主要的密码算法、常⽤的密钥和证书封装管理功能及SSL协议,并提供丰富的应⽤程序供测试或其它⽬的使⽤。
本⽂主要阐述如何在nginx的web服务器上设置更强的SSL。不使⽤在SSL/TLS协议中易受攻击的SSLv3以及以下版本并且设置⼀个更强的密码套件,同时启⽤HSTS和HPKP,为在可能的情况下能够实现Forward Secrecy。
配置⽂件及对应安全选项说明
1)配置⽂件位置,默认ssl端⼝采⽤443,实际中可按需修改:
Ubuntu/Debian:/etc/nginx/sited-enabled/yoursite
RHEL/CentOS:/etc/nginx/conf.f
注:修改配置⽂件之前请备份⽂件或相关选项,⽣产环境特别注意。
2)风险:
(1)BEAST攻击和RC4算法
它是通过篡改加密算法CBC密码块的加密模式,部分加密流量可以被偷偷地解密。
禁⽤RC4有⼏个结果。⼀、使⽤差劲⼉浏览器的⽤户将使⽤3DES来代替。3-DES⽐RC4更安全。但是就意味着更加昂贵。你的服务器会因为这样的⽤户开销更⼤。⼆、RC4可以缓解BEAST攻击。因此,禁⽤RC4使TLS 1⽤户容易受到攻击,通过移动他们AES-CBC(通常的服务器端的BEAST“修复”是优先考虑⾼于⼀切的RC4)。我很确信,在BEAST上RC4上的缺陷明显⼤于风险。确实,客户端的缓解(chrome和⽕狐都提供)BEAST已不再是个问题。但对于增长RC4的风险:随着时间的推移更多的密码分析将很表⾯化。
(2)FREAK攻击
FREAK是在密码专家⼩组在INRIA, Microsoft Research and IMDEA所发现的⼀种中间⼈攻击。FREAK就是“Factoring RSA-EXPORT Keys .”。这种攻击可以追溯到90世纪90年代,也就是在美国政府禁⽌出售加密软件到海外的时候,除⾮输出的密码套件中加密密钥的长度不超过512位。
被证明是⼀些先进的TLS客户端-包括苹果的SecureTransport和OpenSSL-有⼀个Bug在⾥⾯。这个Bu
g造成了它们接受了RSA密钥的输出等级甚⾄当客户端都不要求RSA的密钥输出等级。这个Bug造成的影响还是相当严重的:假如客户端是易受攻击的并且服务器⽀持输出RSA,它允许第三⼈通过⼀个活跃的攻击者来减弱连接的质量进⾏攻击。
这⾥是两部分服务器必须接受的“RSA输出等级”攻击。
(3)MITM攻击:
过程如下:
在客户端的Hello消息中,它请求⼀个标准的“RSA”密码套件。
MITM攻击者改变这个消息为了得到“RSA的输出”.
服务器返回⼀个512位的RSA输出密钥,并⽤它的永久密钥签名。
由于OpenSSL和SecureTransport存有bug,客户端就接受了这个弱密钥。
攻击者分析RSA模块为了恢复正在通信时RSA的解密密钥。
当客户端把加密的“预备主密钥”发送给服务器时,攻击者现在可以解密它从⽽得到TLS的“主密钥”。
从现在起,攻击者就可以看到明⽂了,并且可以注⼊任何他想的东西。
这个页⾯上提供密码套件但是⽀持密码输出等级。确保你的OpenSSl是最近更新过的版本⽽且你的客户端也要使⽤最新的软件。
(4)Heartbleed(⼼脏出⾎)
Hearbleed是⼀个在2014年四⽉OpenSSL密码库⾥被发现的安全漏洞,它被⼴泛⽤在运输层(TLS)协议的实施中。Heartbleed可能被使⽤不管是否使⽤了⼀个易受攻击的OpenSSL,⽐如说在⼀个服务器或者客户端使⽤。它是在DTLS⼼跳扩展(RFC6520)由不合适的输⼊确认(因为没有边界检查)所造成,因此这个漏洞的名字为“⼼跳”.这个漏洞被划为⼀个重读的缓冲区,更多超出允许的数据被读出。
哪些版本的OpenSSL被Heartbleed影响?
不同版本的情况:
OpenSSL 1.0.1 到 1.0.1f (包括) 受攻击。
OpenSSL 1.0.1g不受攻击。
OpenSSL 1.0.0的分⽀不受攻击。
OpenSSL 0.9.8 的分⽀不受攻击。
OpenSSL在2011年12⽉发现这个漏洞⽽且在2012年3⽉14⽇发布OpenSSL1.0.1之前⼀直没有采取措施。2014年4⽉7号发布的OpenSSL1.0.1g修复了这个漏洞。
nginx 配置文件通过更新OpenSSL就可以免受这个漏洞带来的攻击。
(5)SSL 压缩(犯罪攻击)
通常来说,犯罪攻击使⽤ SSL 压缩来施展它的魔法。SSL 压缩在 nginx1.1.6+/1.0.9+ 中默认是关闭的(如果使⽤ openssl 1.0.0+).
如果你正在使⽤ nginx 或者 OpenSSL 其他早期版本,并且你的发⾏版并没有回迁此选项,那么你需要重新编译不⽀持 ZLIB 的OpenSSL。这将禁⽌使⽤DEFLATE压缩⽅法来使⽤ OpenSSL。如果你这样做,那么你仍然可以使⽤常规的HTML DEFLATE压缩。
(6)SSLV2 与 SSLv3
SSL v2 并不安全,因此我们需要禁⽤它。我们也可以禁⽤ SSL v3,当 TLS 1.0 遭受⼀个降级攻击时,可以允许⼀个攻击者强迫使⽤SSL v3 来连接,因此禁⽤“向前保密”。
再次编辑此配置⽂件:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
贵宾⽝攻击和TLS-FALLBACK-SCSV
SSLv3允许利⽤“贵宾⽝ POODLE”漏洞,这是禁⽤它的⼀个主要原因。Google已经提议⼀种叫TLSFALLBACKSCSV的SSL/TLS的拓展,旨在防⽌强制SSL降级。以下是升级后⾃动启⽤的OpenSSL版本:
OpenSSL 1.0.1 有 TLSFALLBACKSCSV 在 1.0.1j 及更⾼的版本.
OpenSSL 1.0.0 有 TLSFALLBACKSCSV 在 1.0.0o 及更⾼的版本.
OpenSSL 0.9.8 有 TLSFALLBACKSCSV 在 0.9.8zc 及更⾼的版本.
(7)密码套件
Forward Secrecy 确保了在永久密钥被泄漏的事件中,会话密钥的完整性。PFS 实现这些是通过执⾏推导每个会话的新密钥来完成。
这意味着当私有密钥被泄露不能⽤来解密SSL流量记录。
密码套件提供 Perfect Forward Secrecy 暂时使⽤ Diffie-Hellman 密钥交换的形式。他们的缺点是开销⼤,这可以通过使⽤椭圆曲线的变异的改进。
eg1:
ssl_ciphers 'AES128+EECDH:AES128+EDH';
eg2:来⾃ Mozilla 基⾦会,后兼容(IE6 / WinXP)
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA25 6:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-R SA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AE S128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!a
NULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC 4";
注意:如环境中使⽤的是OpenSSL 是旧版本,不可⽤密码将被⾃动丢弃。nginx会总是使⽤完整的密码套件,让OpenSSL选它所⽀持的。密码套件的顺序也⾮常重要,它决定了通信时采⽤的优先级算法。上⾯的建议的2个密码套件⽰例,重视了算法提供完美的向前保密。⽼版本的 OpenSSL 可能不会返回算法的完整列表。AES-GCM 和⼀些 ECDHE 相当近,⽽不是出现在⼤多数版本的 Ubuntu OpenSSL 附带或 RHEL。
新版本中,可通过命令: nmap --script ssl-cert,ssl-enum-ciphers -p 443 host_ip,到如下部分信息:
|TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - strong
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - strong
| TLS_ECDHE_RSA_WITH_RC4_128_SHA - strong
| TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA - broken
| TLS_ECDH_anon_WITH_AES_128_CBC_SHA - broken
| TLS_ECDH_anon_WITH_AES_256_CBC_SHA - broken
| TLS_ECDH_anon_WITH_RC4_128_SHA - broken
| TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 - weak
| TLS_RSA_EXPORT_WITH_RC4_40_MD5 - weak
| TLS_RSA_WITH_3DES_EDE_CBC_SHA - strong
| TLS_RSA_WITH_AES_128_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA - strong
| TLS_RSA_WITH_AES_256_CBC_SHA256 - strong
| TLS_RSA_WITH_AES_256_GCM_SHA384 - strong
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA - strong
现场:A,B,C,C级属于不满⾜要求的
MD5: d272 52c0 b2ee 64ec ed34 07f1 643b 87a9
|_SHA-1: a098 6a65 4df2 cbb6 b859 e40a 953c bb91 c4f8 f639
| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C
| TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) - C
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| compressors:
| NULL
| cipher preference: server
| warnings:
| 64-bit block cipher 3DES vulnerable to SWEET32 attack
| TLSv1.2:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
| TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) - C
| TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) - C
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
上⾯的输出中,weak、strong字段,weak都是40位加密的,strong应该都在128位以上的。Nginx 的 SSL 时不指定 ssl_ciphers时,默认允许使⽤的加密算法和协议将会包括⼀些已经证实不够安全的算法及协议,如对称加密密钥不⾜ 128-bit 的算法;了保证 SSL 连接⾜够安全,将128位以下弱加密算法禁⽤,在配置时应该明确指定算法:
ssl_ciphers HIGH:!ADH:!MD5;
(8)优先级逻辑
⾸先选择 ECDHE + AESGCM 密码。这些都是 TLS 1.2 密码并没有受到⼴泛⽀持。这些密码⽬前没有已知的攻击⽬标。
PFS 密码套件是⾸选,ECDHE 第⼀,然后 DHE。
AES 128 更胜 AES 256。有讨论是否 AES256 额外的安全是值得的成本,结果远不明显。⽬前,AES128 是⾸选的,因为它提供了良好的安全,似乎真的是快,更耐时机攻击。
向后兼容的密码套件,AES 优先 3DES。暴⼒攻击 AES 在 TLS1.1 及以上,减轻和 TLS1.0 中难以实现。向后不兼容的密码套件,3DES 不存在.
RC4 被完全移除. 3DES ⽤于向后兼容。
(9)强制性的丢弃
aNULL 包含未验证 diffie - hellman 密钥交换,受到中间⼈这个攻击
eNULL 包含未加密密码(明⽂)
EXPORT 被美国法律标记为遗留弱密码
RC4 包含了密码,使⽤废弃ARCFOUR算法
DES 包含了密码,使⽤弃⽤数据加密标准
SSLv2 包含所有密码,在旧版本中定义SSL的标准,现在弃⽤
MD5 包含所有的密码,使⽤过时的消息摘要5作为散列算法
3)openssl⽀持的加密算法
(1)对称加密算法
OpenSSL⼀共提供了8种对称加密算法,其中7种是分组加密算法,仅有的⼀种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都⽀持电⼦密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常⽤的分组密码加密模式。其中,AES使⽤的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使⽤的则是64位。事实上,DES算法⾥⾯不仅仅是常⽤的DES算法,还⽀持三个密钥和两个密钥3DES算法。
(2)⾮对称加密算法
OpenSSL⼀共实现了4种⾮对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。
DH算法⼀般⽤户密钥交换。
RSA算法既可以⽤于密钥交换,也可以⽤于数字签名。
DSA算法则⼀般只⽤于数字签名。
(3)信息摘要算法
OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
4)Nginx中禁⽤DES算法:
(1)查看当前openssl⽀持的算法:openssl ciphers -V
其中,Kx表密钥交换算法 :⽤来协商回话密钥;Au表验证算法 :⽤来验证服务端⾝份;Enc对称加密算法:加密消息;Mac摘要算法:防消息篡改。nginx 默认配置是 HIGH:!aNULL:!MD5
(2)禁⽤DES加密:
执⾏nginx -t确认当前nginx配置⽂件位置,进⾏修改,nginx配置⽂件中cipher选项算法列表包含⼀个或多个:⽤冒号隔开。感叹号!表⽰禁⽌此算法,这样在浏览器使⽤不安全的算法时,会⾃动禁⽌连接。
验证:nmap -Pn --script ssl-cert,ssl-enum-ciphers -p 443 host_ip
如上所述,其中TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA (secp256r1) 和TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA (dh 2048) 和TLS_RSA_WITH_3DES_EDE_CBC_SHA(rsa 2048)
这是因为另⼀台服务器,我尚未配置,禁⽤DES加密算法后,再次测试,效果如下
5)Nginx其他安全配置
确保f⾥添加以下选项,在SSLv3或这是TLSv1握⼿时选择⼀个密码:
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论