OSSN/OSSN-0039
配置 OpenStack 部署以防止 POODLE 攻击
总结
POODLE (CVE-2014-3566) 是一种针对 SSLv3 的新型攻击,允许主动的网络攻击者从安全的连接中恢复明文,使用 CBC 模式的密码。不幸的是,SSLv3 中的所有其他密码模式也不安全。因此,推荐的解决方案是禁用 SSLv3。我们还在下面讨论一个替代方案。适当的缓解措施需要在 SSLv3 客户端和服务器上解决此问题。
受影响的服务 / 软件
任何使用 SSLv3 的服务。根据后端 SSL 库的不同,这可能包括 OpenStack 云的许多组件
- OpenStack 服务
- OpenStack 客户端
- Web 服务器(Apache、Nginx 等)
- SSL/TLS 终结器(Stud、Pound 等)
- 代理服务(HAProxy 等)
- 其他服务(eventlet、syslog、ldap、smtp 等)
讨论
POODLE 攻击于 2014 年 10 月 14 日首次公布 [1]。有关 POODLE 的更深入的技术讨论,请参阅 openssl.org 上的安全公告 [2] 和 Daniel Franke 的文章 [3]。POODLE 影响任何可以降级到 SSLv3 的 SSL/TLS 连接。这需要客户端和服务器都支持 SSLv3。由于协议协商的方式,位于客户端和服务器之间的网络上的攻击者可以通过选择性地丢弃网络数据包来强制降级到 SSLv3。
针对 POODLE 的最佳修复方法是在您控制的所有客户端和服务器上禁用 SSLv3。这将保护您,而不管连接另一端的缓解状态如何。另一种选择是部署 TLS_FALLBACK_SCSV,这将防止降级攻击,但如果客户端和服务器之间唯一支持的协议是 SSLv3,仍然可能允许 SSLv3 连接。任何使用 CBC 模式密码通过 SSLv3 发生的连接仍然会受到攻击。
您可以使用 OpenSSL s_client 工具来测试服务器是否允许 SSLv3 连接
openssl s_client -connect <domain name>:<port> -ssl3
如果服务器不支持 SSLv3,您将看到握手失败消息。这表明服务器不接受 SSLv3 连接。假设此服务器也禁用了 SSLv2,这在今天是一种常见的默认设置,则无需进一步配置。如果 s_client 的握手完成,则服务器需要进行一些配置。请注意,您可以对启用了 SSL/TLS 的任何服务执行此步骤,包括 OpenStack API 端点。
测试客户端稍微麻烦一些,因为云中服务器的数量可能远多于客户端。但是,此测试遵循类似的模式。使用 OpenSSL s_server 工具,您可以创建一个仅接受 SSLv3 的端点
openssl s_server -cert <filename> -key <filename> -state \
-ssl3 -no_ssl2 -no_tls1 -no_tls1_1 -no_tls1_2 \
-tlsextdebug
如果客户端可以连接到此端点,则客户端需要更新其配置,如下所述。
建议的操作
我们建议完全禁用 SSLv3,并将在下面提供有关如何执行此操作的更多指导。
如果由于客户端兼容性问题,您的系统仍然需要 SSLv3,那么 TLS_FALLBACK_SCSV 是您的唯一选择。在这种情况下,您需要一个支持 TLS_FALLBACK_SCSV 的底层库(例如 OpenSSL 1.0.1j)。使用 OpenSSL 的应用程序在更新 OpenSSL 后将自动开始使用 TLS_FALLBACK_SCSV。您应该在您的云中进行审核,以验证所有 SSL/TLS 服务是否都使用这个新的库
ldd <path to binary that uses OpenSSL> | grep ssl
查看输出并确保它链接到包含 TLS_FALLBACK_SCSV 支持的新版本的 OpenSSL。
可以在应用程序级别或库级别禁用 SSLv3。在库级别执行此操作可确保整个云的一致性。但是,如果您尚未编译 OpenSSL,则这可能不适合您的部署工作流程。在这种情况下,您必须依次考虑每个应用程序。
如果您能够重新编译您的 SSL/TLS 库,那么这可能是最佳选择。在库级别禁用 SSLv3 可确保系统的一致性。对于 OpenSSL,您可以使用“no-ssl3”构建选项。然后将该库部署到您的云中,并使用上面讨论的 ldd 命令验证所有 SSL/TLS 服务是否都使用该库。
如果您无法重新编译您的 SSL/TLS 库,那么您应该重新配置每个使用 SSL/TLS 的应用程序。每个应用程序都有不同的处理此配置的方式。我们为一些更常见的应用程序提供了配置选项,如下所示
Apache
SSLProtocol All -SSLv2 -SSLv3
Nginx
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Stud
需要代码更改,请参阅 [4]。代码更改后使用 --tls 选项。
Pound
需要代码更改,请参阅 [5]。代码更改后使用 DisableSSLv3 选项。
HAProxy
仅版本 1.5+ 支持 SSL/TLS。取决于配置,请参阅 [6]。
Postfix SMTP
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
OpenStack 服务和 python 客户端当前没有配置 SSL/TLS 协议版本的选项。因此,今天使用 OpenStack 代码避免 SSLv3 的最佳方法是确保底层 SSL/TLS 库(在本例中为 OpenSSL)在没有 SSLv3 支持的情况下进行编译,如上所述。
更新云中的所有必要软件后,我们建议使用上面描述的 s_client 和 s_server 测试程序来验证每个服务是否已按预期配置。
联系方式 / 参考文献
- 作者:Bryan D. Payne,Nebula
- 此 OSSN:https://wiki.openstack.org/wiki/OSSN/OSSN-0039
- 原始 Launchpad Bug:https://bugs.launchpad.net/ossn/+bug/1382270
- OpenStack Security ML:openstack-security@lists.openstack.org
- OpenStack Security Group:https://launchpad.net/~openstack-ossg
- CVE:CVE-2014-3566
- [1]: http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html
- [2]: https://www.openssl.org/~bodo/ssl-poodle.pdf
- [3]: https://www.dfranke.us/posts/2014-10-14-how-poodle-happened.html
- [4]: https://github.com/bumptech/stud/pull/138
- [5]: http://www.apsis.ch/pound/pound_list/archive/2014/2014-10/1413471803000
- [6]: http://blog.haproxy.com/2014/10/15/haproxy-and-sslv3-poodle-vulnerability/