CentOS 6 OpenSSL“心脏出血”漏洞排查与回滚方案
线上机器突然报“SSL handshake failure”,日志里还夹着一堆“TLS: fatal alert 40”。别急着重启,先把咖啡放下,CentOS 6 OpenSSL“心脏出血”漏洞可能正偷偷抽走内存里的私钥。下面这份笔记把排查、止血、回滚三步写成流水线,照着敲命令就能落地,零翻车。

一、先确认是不是躺枪
1. 看版本:
openssl version -a
如果输出里出现1.0.1e、1.0.1f字样,基本跑不掉;CentOS 6 默认仓库还停留在1.0.1e,心脏出血专属版本号。
2. 快速热检:
python heartbleed_test.py 127.0.0.1 443

脚本返回“VULNERABLE”就实锤;没脚本也能用nmap:
nmap -p 443 --script ssl-heartbleed 本机IP
结果里出现“State: VULNERABLE”立刻进入下一环节。
二、止血:先别重启,把洞堵上
目标:把内存泄漏口封死,同时不让业务中断超过30秒。
1. 临时禁用有问题的加密套件,给nginx/apache先打绷带:

nginx.conf里加一行:
ssl_protocols TLSv1.2;
apache同理,把SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1写进配置,reload即可。
2. 如果前端有SLB,直接把443转80,让证书层先退场,把攻击面降到0,再慢慢折腾。
三、回滚方案:老系统也能用上安全版OpenSSL
CentOS 6官方源已停止维护,别傻等yum update,源码编译最稳。
1. 建隔离目录,防止污染系统:
mkdir -p /opt/openssl-1.0.1g && cd /opt/openssl-1.0.1g
2. 拉源码包:
wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz
tar zxf后进入目录,打补丁:
./config --prefix=/opt/openssl-1.0.1g --openssldir=/opt/openssl-1.0.1g shared zlib
make && make install
3. 让系统优先走新库:
echo '/opt/openssl-1.0.1g/lib' > /etc/ld.so.conf.d/openssl-1.0.1g.conf
ldconfig
4. 重编nginx/apache,静态链新OpenSSL:
nginx例子:
./configure --with-httpsslmodule --with-openssl=/opt/openssl-1.0.1g
make && make install
5. 验证:
strings /usr/local/nginx/sbin/nginx | grep '1.0.1g'
出现1.0.1g说明回滚成功,再跑一次heartbleed_test.py,VULNERABLE消失。
四、旧包降级:实在不想编译也能救
有些机器编译环境残废,直接降级rpm更快。
1. 去vault.centos.org抠旧包:
wget http://vault.centos.org/6.5/updates/x8664/Packages/openssl-1.0.1e-16.el65.15.x86_64.rpm
注意后缀_5.15,这版已打心脏出血补丁。
2. 强制降级:
rpm -Uvh --oldpackage openssl-1.0.1e-16.el65.15.x8664.rpm
3. 重启依赖服务:
service httpd restart && service nginx restart
再跑检测脚本,确认漏洞关闭。
五、把坑记下来,下次不再踩
1. 写个crontab,每天凌晨拉脚本检测版本号,非1.0.1g立刻邮件告警。
2. 把编译好的/opt/openssl-1.0.1g目录打包成tar.gz,丢到内网仓库,下次新机器上线直接解压,3分钟完成。
3. 证书私钥被读过就别心疼,立刻重新签发,老证书吊销列表同步到CDN,防止中间人拿旧证书伪装。
六、常见翻车点与急救
• 降级rpm后ssh无法连接:sshd也依赖openssl,先在screen里重启sshd,确认端口22正常再退出。
• nginx编译报错“SSLCTXsetcertcb未定义”:说明系统头文件还是老版本,把/usr/include/openssl备份后,ln -s /opt/openssl-1.0.1g/include/openssl /usr/include/openssl再编。
• 负载均衡健康检查狂报失败:检查SLB探测的是否还是TLSv1.0,把探测协议改成TLSv1.2,瞬间恢复。
CentOS 6老胳膊老腿,心脏出血一来就散架;先热检确认,再临时掐加密套件,接着源码编译1.0.1g或rpm降级到_5.15,最后重编服务+验证+轮换证书,一条链路下来,漏洞清零,业务不停。
