保护你的服务器不受Heartbleed OpenSSL漏洞的威胁
提供:ZStack社区
SSL出现重大安全隐患
2014年4月7日,号称互联网史上最糟糕的一个安全漏洞被披露。该漏洞涉及OpenSSL,名字叫做Heartbleed。Heartbleed漏洞在OpenSSL 1.0.1版本被引入,该版本自从2012年3月开始被广泛使用,直到2014年4月7日被披露同时发出的1.0.1g版本才提供了该漏洞的补丁。有关该漏洞的详细说明可参考这个CVE-2014-0160的问题报告。
该bug的存在让攻击者可以读取相关服务器的内存,从而获取该服务器上被使用过的任何密钥的内容。各个发行版目前都推出了打过补丁的更新(译注:本文撰写于2014年4月8日),以供用户下载更新,然而用户仍然拉取更新到本地,并处理之前可能被泄露的所有密钥。
本文介绍如何将系统更新至最新的安全版本的OpenSSL,并处理可能已经不再安全的SSL证书。最后,测试一下你的服务器是否已经对Heartbleed免疫。
更新系统
如果你使用的发行版已经更新了其OpenSSL软件包,则最简单的方法就是做一次整体的系统更新。
Ubuntu和Debian用户可以用如下命令:
sudo apt-get update
sudo apt-get dist-upgrade
如果你只想单独更新OpenSSL而不想更新整个系统(不推荐,除非你担心系统会在更新其他组件之后变得不稳定),则可以输入如下命令:
sudo apt-get install --only-upgrade openssl
sudo apt-get install --only-upgrade libssl1.0.0
该命令将仅仅更新涉及Heartbleed漏洞的软件,而不更新其他的系统组件。
CentOS和Fedora用户可以输入如下命令更新整个系统:
yum update
或输入如下命令更新OpenSSL:
yum update openssl
或者,你也可以手动构建OpenSSL软件包。64位Fedora可使用如下命令:
yum -y install koji
koji download-build --arch=x86_64 openssl-1.0.1e-37.fc19.1
yum localinstall openssl-1.0.1e-37.fc19.1.x86_64.rpm
32位Fedora可使用如下命令:
yum -y install koji
koji download-build --arch=i686 openssl-1.0.1e-37.fc19.1
yum localinstall openssl-1.0.1e-37.fc19.1.i686.rpm
Arch Linux用户可输入如下命令更新整个系统:
sudo pacman -Syu
由于Arch Linux容易在单独更新软件包后变得不稳定,所以这里不介绍单独更新OpenSSL的做法。
至此,你的系统就完成了补丁。在系统更新运行过程中,你应该能看到 openssl
出现在更新列表中。
更新完毕后,重启系统以确保系统内存中使用的是新版本的OpenSSL:
sudo shutdown -r now
检查版本号
系统更新重启完毕后,请检查你的OpenSSL版本。
针对Heartbleed漏洞的官方补丁版本是OpenSSL 1.0.1g,不过不同的发行版可能会使用不同的版本号。有的发行版直接在老版本的OpenSSL上打补丁,而不是更新整个软件包。
因此,最好是通过发行版的软件包系统来进行这个检查,而不是使用openssl version
命令。
Debian / Ubuntu
Debian和Ubuntu用户可以使用如下命令进行检查:
dpkg -l | grep "openssl"
你看到的结果应该是这样的:
ii openssl 1.0.1e-2+deb7u6 amd64 Secure Socket Layer (SSL) binary and related cryptographic tools
不同的Debian版本显示的结果:
- Debian 6 (Squeeze):不受该漏洞影响(该版本的发布时间在Heartbleed漏洞引入之前)
- Debian 7 (Wheezy):1.0.1e-2+deb7u6
- Debian testing (Jessie):1.0.1g-1
- Debian unstable (Sid):1.0.1g-1
不同的Ubuntu版本显示的结果:
- Ubuntu 10.04: 不受该漏洞影响(该版本的发布时间在Heartbleed漏洞引入之前)
- Ubuntu 12.04: 1.0.1-4ubuntu5.12
- Ubuntu 12.10: 1.0.1c-3ubuntu2.7
- Ubuntu 13.04: 该版本的生命周期已结束,用户应更新系统至新版
- Ubuntu 13.10: 1.0.1e-3ubuntu1.2
将自己得到的结果跟上述列表对照,看是否匹配。对于官方已经不再维护的发行版(比如Ubuntu 13.04),建议用户将系统迁移至新版。
CentOS / Fedora
CentOS和Fedora用户可通过如下命令检查OpenSSL版本:
rpm -q -a | grep "openssl"
输出结果如下:
openssl-1.0.1e-16.el6_5.7.x86_64
CentOS各版本显示的结果(以下输出忽略了后面的32位/64位相关信息):
- CentOS 5: 不受该漏洞影响(该版本的发布时间在Heartbleed漏洞引入之前)
- CentOS 6: openssl-1.0.1e-16.el6.5.7
Fedora各版本显示的结果:
- Fedora 17: 不受该漏洞影响(该版本的发布时间在Heartbleed漏洞引入之前)
- Fedora 19: openssl-1.0.1e-37.fc19.1
注:Fedora使用了“.1”后缀来代表是否打过补丁。如果你的输出结果没有“.1”后缀,则代表尚未打过补丁。
Arch Linux
在Arch Linux上进行检查要简单一些,因为这个发行版没有那么多版本。
用如下命令检查OpenSSL版本:
pacman -Q | grep "openssl"
应该输出的结果:
openssl 1.0.1.g-1
当然,如果你的OpenSSL版本比上面的版本高,你也是安全的。
SSL证书/密钥的废除与更新
我们现在已经在系统上完成了OpenSSL的更新。如果你从供应商处购买过SSL证书,则需要废除(revoke)之前的密钥,重新注册(reissue)新的密钥。这个过程一般叫做“密钥更新(rekeying)”。
不同的SSL证书供应商为该过程提供了不同的服务方式。一般来说,如果你到供应商的后台界面,这个功能应该叫做“rekey”或者“reissue keys”。大部分供应商在进行rekey的同时就会废除之前的密钥,当然你也可以手动进行废除的操作。
供应商的后台会一步一步指引你完成整个过程,包括如何生成CSR的方式。
如果供应商的指南没有提供具体的openssl
命令,则可以参考下面的这行命令(需要在sudo
下执行):
openssl req -new -newkey rsa:2048 -nodes -keyout hostname.key -out hostname.csr
你需要把生成的CSR复制到供应商的后台界面中以完成rekey的动作。然后,就可以下载新的证书了。
新的密钥需要跟旧的密钥安装在同样的位置。不同的发行版会有不同的密钥保存目录,比较常见的是/etc/ssl/certs
这个目录,也有可能在Web服务器目录下。
Apache用户可以打开Apache的主配置文件,查询下面这几项内容:
SSLEngine on
SSLCertificateFile /path/to/your_domain.crt
SSLCertificateKeyFile /path/to/your_key.key
SSLCertificateChainFile /path/to/CA.crt
Nginx用户可以打开Nginx的配置文件,查询下面这几项内容:
server {
. . .
ssl_certificate /path/to/your_domain.crt;
ssl_certificate_key /path/to/your_key.key;
. . .
}
如果你在上面这些地方都没找到,也可以查询你的发行版提供的文档,或者在本地文件系统做一次搜索。
证书密钥更新完毕后,重启Web服务器以使新密钥生效。
Debian和Ubuntu用户可以使用下面的命令:
sudo service apache2 restart # Apache
sudo service nginx restart # Nginx
CentOS和Fedora用户可以使用下面的命令:
sudo service httpd restart # Apache
sudo service nginx restart # Nginx
Arch Linux用户可以使用下面的命令:
sudo systemctl restart httpd.service
sudo systemctl restart nginx.service
以上,你的Web服务器应该已经在使用新的证书运行了。
普通用户的角度
由于本次漏洞影响范围广泛,作为一个普通的互联网用户,你也需要做一定的防范,以避免威胁到你的个人账户信息。
我们可以假设,之前你通过SSL登陆过的网站可能都已经遭受了Heartbleed的侵害,这意味着之前的登陆过程可能已经被泄露。
首先,你可以在你确定已经打过补丁的网站上更新你的密码。如果你更新密码的时候该网站还没打过补丁,那么新密码也跟旧密码一样不可靠。
然后是你之前设置过的VPN。VPN连接的实现方法不止一个,不过SSL是最流行的一种方式。比如OpenVPN用的就是SSL。任何与服务器连接的证书都最好重新生成,把旧的废弃,换用新的。
你也可以考虑将所有的进程密钥和cookie都删掉。这包括你在各个网站上的API key,你的浏览器里的cookie等等。一时之间这会造成很多不方便,然而为了安全这也是值得的。毕竟,一个没打过补丁的SSL网站几乎跟没用过SSL的普通网站一样的不安全。
总结
Heartbleed是一个严重的bug,任何管理员和用户都务必要针对这个bug展开防护措施。系统管理员应当立刻更新其系统并告知用户其中的风险,进行必要的用户端防护。
更新系统并更新过SSL证书之后,你的系统已经对Heartbleed漏洞免疫,可以继续提供安全的加密访问能力。
本文来源自DigitalOcean Community。英文原文:How to Protect Your Server Against the Heartbleed OpenSSL Vulnerability by Justin Ellingwood
翻译:lazycai