一、漏洞信息(官方报告)
- 风险等级:高
- CVE版本号:CVE-2016-2183
- 详细描述
TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的DES及Triple DES密码或者3DES及Triple 3DES存在大约四十亿块的生日界,这可使远程攻击者通过Sweet32攻击,获取纯文本数据。 <*来源:Karthik Bhargavan Gaetan Leurent 链接:https://www.openssl.org/news/secadv/20160922.txt *>
- 解决方法
建议:避免使用DES和3DES算法 1、OpenSSL Security Advisory [22 Sep 2016] 链接:https://www.openssl.org/news/secadv/20160922.txt 请在下列网页下载最新版本: https://www.openssl.org/source/ 2、对于nginx、apache、lighttpd等服务器禁止使用DES加密算法 主要是修改conf文件 3、Windows系统可以参考如下链接: https://social.technet.microsoft.com/Forums/en-US/31b3ba6f-d0e6-417a-b6f1-d0103f054f8d/ssl-medium-strength-cipher-suites-supported-sweet32cve20162183?forum=ws2016 https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/restrict-cryptographic-algorithms-protocols-schannel
- 返回信息
DES/3DES Ciphers: TLS11_RSA_WITH_3DES_EDE_CBC_SHA TLS1_RSA_WITH_3DES_EDE_CBC_SHA TLS1_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLS12_RSA_WITH_3DES_EDE_CBC_SHA TLS12_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
二、漏洞修复方案分析
当接到安全部门下发的漏洞通告后,笔者立即组织本团队人员开展修复工作,根据OpenSSL Security Advisory提供的链接 https://www.openssl.org/news/secadv/20160922.txt 官方建议的修复方案如下:
- OpenSSL 1.1.0 用户应升级至 1.1.0a
- OpenSSL 1.0.2 用户应升级至 1.0.2i
- OpenSSL 1.0.1 用户应升级至 1.0.1u
三、现网情况摸排
根据官方建议的修复方案,那么就需要搞清楚现网所有主机操作系统上的openssl版本,需要有针对性的进行升级。
1. 查看openssl版本
openssl version -v # 如需更详细的信息,可使用-a参数 openssl version -a
说明:笔者现网的操作系统大部分是CentOS7/6以及RedHat7/8,且幸好存在openssl漏洞的主机数量较少,不然就头大咯,经过查看,笔者所处环境的openssl当前版本是OpenSSL 1.0.1e-fips 11 Feb 2013
2. 确定升级方案
笔者的openssl版本是OpenSSL 1.0.1e-fips 11 Feb 2013,也就是1.0.1,根据官方给的修复方案,结合现网的情况,那么就需采取:OpenSSL 1.0.1 用户应升级到 1.0.1u 的升级方案
事不宜迟,马上到openssl官方网站找到对应的源码包:openssl-1.0.1u.tar.gz
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz
四、开始升级操作
1. 提前创建好自定义安装路径
mkdir /usr/local/openssl-1.0.1u mkdir /usr/local/ssl-1.0.1u
笔者自定义安装在 /usr/local 下,非必须是该路径,可根据自身情况安装在其他路径也是阔以滴。
2. 解压下载好的源码包
tar -zxf openssl-1.0.1u.tar.gz
3. 开始编译和安装
# 进入解压后的源码包目录 cd openssl-1.0.1u # 配置openssl安装目录和openssldir ./config --prefix=/usr/local/openssl-1.0.1u --openssldir=/usr/local/ssl-1.0.1u # 使用2个线程进行同时编译 make -j 2 # 安装 make install # 完成安装后,可以查看下里面安装好的东东 ># ls -l /usr/local/openssl-1.0.1u/ total 12 drwx------ 2 root root 4096 Apr 26 17:17 bin drwx------ 3 root root 4096 Apr 26 17:17 include drwx------ 4 root root 4096 Apr 26 17:17 lib ># ls -l /usr/local/ssl-1.0.1u/ total 28 drwx------ 2 root root 4096 Apr 26 17:17 certs drwx------ 6 root root 4096 Apr 26 17:17 man drwx------ 2 root root 4096 Apr 26 17:17 misc -rw-r--r-- 1 root root 10835 Apr 26 17:17 openssl.cnf drwx------ 2 root root 4096 Apr 26 17:17 private
说明:在笔者的环境中,编译安装都非常顺利,没有出现任何报错,如其他盆友出现有报错,请自行解决,或联系我一起研讨。
五、软链接到新的openssl版本
非常重要的提示:这一步,非常重要,需要谨慎,一定要分析好哪些需要将新版本软链过去,而且要做好备份。
1. 查找旧版的openssl在哪
- 想知道当前操作系统上的openssl在哪,第一时间想到的是搜索,笔者在这里使用find命令进行查找
># find / -depth -name "openssl" /usr/include/openssl /usr/bin/openssl /usr/lib64/openssl /usr/local/lib/gcc/x86_64-pc-linux-gnu/8.1.0/include-fixed/openssl /opt/test/nginx-1.18.0/auto/lib/openssl /etc/pkiopd/ca-trust/extracted/openssl /home/ops/abc/python/lib/python2.7/site-packages/cryptography/hazmat/bindings/openssl /home/ops/abc/python/lib/python2.7/site-packages/cryptography/hazmat/backends/openssl
居然找到了那么多关于openssl的路径,那么到底哪些才是需要新版替换呢?那么还需要进一步分析
2. 分析哪些要做软链
# 经分析,下面这两个是需要通过软链替换的,而且要做好备份 /usr/include/openssl /usr/bin/openssl # 经分析,这个目录暂时不动,因为新版的路径下/usr/local/openssl-1.0.1u/ 没有lib64,只有lib,为了预防出现其他不可预知的问题,可先不通过软链的方式替换它 /usr/lib64/openssl # 经分析,以下这些是应用自身的,可暂且不管 /usr/local/lib/gcc/x86_64-pc-linux-gnu/8.1.0/include-fixed/openssl /opt/test/nginx-1.18.0/auto/lib/openssl /etc/pkiopd/ca-trust/extracted/openssl /home/ops/abc/python/lib/python2.7/site-packages/cryptography/hazmat/bindings/openssl /home/ops/abc/python/lib/python2.7/site-packages/cryptography/hazmat/backends/openssl
3. 备份当前openssl
mv /usr/include/openssl /usr/include/openssl.bak.20220426 mv /usr/bin/openssl /usr/bin/openssl.bak.20220426
4. 配置软链到新版本
ln -s /usr/local/openssl-1.0.1u/include/openssl /usr/include/openssl ln -s /usr/local/openssl-1.0.1u/bin/openssl /usr/bin/openssl
5. 更新动态链接数据并重新加载
># echo "/usr/local/openssl-1.0.1u/lib" >> /etc/ld.so.conf ># ldconfig -v
6. 最后,查看是否升级成功
># openssl version OpenSSL 1.0.1u 22 Sep 2016
笔者旧版的openssl是OpenSSL 1.0.1e-fips 11 Feb 2013,升级后是 OpenSSL 1.0.1u 22 Sep 2016,升级成功!
六、总结
通过这个事情,笔者认为:
- 需要搞清楚现网的版本是否在安全版本内,如果是安全版本,那么就无需修复;
- 如果需要修复,那么一定要先分析官方建议的修复方案;
- 查看现网环境的情况,结合官方给的修复建议,进一步确定最终的修复方案;
- 然后编写详细的升级方案和回退方案、进行内部评审,如果有测试环境,还需对升级方案进行测试验证;
- 在生产环境找1台业务没那么重要的节点先进行升级,如没有问题再去升级其他服务器的openssl。
说了那么多,总而言之是要敬畏每一条指令,每一行代码,每一步操作,运维工程师要时刻对生产环境保持敬畏之心。