1. 概述
當前爆出了Openssl漏洞,會泄露隱私信息,涉及的機器較多,環境迥異,導致修復方案都有所不同。不少服務器使用的Nginx,是靜態編譯 opensssl,直接將openssl編譯到nginx里面去了,這就意味著,單純升級openssl是沒有任何效果,Nginx不會加載外部的 openssl動態鏈接庫的,必須將nginx重新編譯才可以根治。
2. 識別Nginx是否是靜態編譯的
以下三種方法都可以確認Nginx是否靜態編譯Openssl。
2.1 查看Nginx編譯參數
輸入以下指令,查看Nginx的編譯參數:
- # ./sbin/nginx -V
如果編譯參數中含有--with-openssl=...,則表明Nginx是靜態編譯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的依賴庫
為進一步確認,可以查看一下程序的依賴庫,輸入以下指令:
- # ldd `which nginx` | grep ssl
顯示
- libssl.so.10 => /usr/lib/libssl.so.10 (0xb76c6000)
注意:如果輸出中不包含libssl.so的文件(),就說明是靜態編譯的Openssl的
再輸入命令以確定openssl以確定庫所屬的openssl版本,但是不會太詳細,比如本應該是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打開的文件來查看是否靜態編譯,輸入以下指令:
- # ps aux | grep nginx
- # lsof -p 111111<這里換成Nginx的進程PID> | grep ssl
如果沒有打開Openssl的庫文件,就說明是靜態編譯Openssl的,如下圖所:
3. 重新編譯Nginx
在互聯網公司里,很少有統一的Nginx版本,都是各部門根據自己的業務需求選擇相應的插件,然后自己編譯的,所以在編譯的時候一定要注意插件這塊,不 要忘記編譯某些插件,盡量保持Nginx特性不變,下面的方法可以給大家參考一下,但是一定要經過測試才可以上線啊。