1. 概述
??? 當(dāng)前爆出了openssl漏洞,會泄露隱私信息,涉及的機(jī)器較多,環(huán)境迥異,導(dǎo)致修復(fù)方案都有所不同。不少服務(wù)器使用的nginx,是靜態(tài)編譯 opensssl,直接將openssl編譯到nginx里面去了,這就意味著,單純升級openssl是沒有任何效果,nginx不會加載外部的 openssl動態(tài)鏈接庫的,必須將nginx重新編譯才可以根治。
?
2. 識別nginx是否是靜態(tài)編譯的
? 以下三種方法都可以確認(rèn)nginx是否靜態(tài)編譯openssl。
?? 2.1 查看nginx編譯參數(shù)
?????? 輸入以下指令,查看nginx的編譯參數(shù):
#?./sbin/nginx?-v
如果編譯參數(shù)中含有–with-openssl=…,則表明nginx是靜態(tài)編譯openssl,如下所示:
nginx?version:?nginx/1.4.1 built?by?gcc?4.4.7?20120313?(red?hat?4.4.7-3)?(gcc) tls?sni?support?enabled configure?arguments:?--prefix=/opt/app/nginx?--with-http_ssl_module?--with-openssl=/opt/app/openssl-1.0.1e?--add-module=/opt/app/ngx_cache_purge-2.1
2.2 查看nginx的依賴庫
????? 為進(jìn)一步確認(rèn),可以查看一下程序的依賴庫,輸入以下指令:
#?ldd?`which?nginx`?|?grep?ssl
顯示
libssl.so.10?=>?/usr/lib/libssl.so.10?(0xb76c6000)
注意:如果輸出中不包含libssl.so的文件(),就說明是靜態(tài)編譯的openssl的
再輸入命令以確定openssl以確定庫所屬的openssl版本,但是不會太詳細(xì),比如本應(yīng)該是1.0.1e.5.7,但是卻只輸出1.0.1e:
#?strings?/usr/lib/libssl.so.10?|?grep?"^openssl?" openssl?1.0.1e-fips?11?feb?2013
2.3 查看nginx打開的文件
????? 也可以通過查看nginx打開的文件來查看是否靜態(tài)編譯,輸入以下指令:
#?ps?aux?|?grep?nginx #?lsof?-p?111111?|?grep?ssl
如果沒有打開openssl的庫文件,就說明是靜態(tài)編譯openssl的,如下圖所:
3. 重新編譯nginx
在互聯(lián)網(wǎng)公司里,很少有統(tǒng)一的nginx版本,都是各部門根據(jù)自己的業(yè)務(wù)需求選擇相應(yīng)的插件,然后自己編譯的,所以在編譯的時候一定要注意插件這塊,不 要忘記編譯某些插件,盡量保持nginx特性不變。