1. 程式人生 > >重新編譯Nginx指導手冊【修復靜態編譯Openssl的Nginx漏洞 】(轉)

重新編譯Nginx指導手冊【修復靜態編譯Openssl的Nginx漏洞 】(轉)

snippets asset 替換 業務需求 tps eight nbsp 出了 sof

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,如下所示:
[plain] view plain copy print?技術分享技術分享
  1. nginx version: nginx/1.4.1
  2. built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
  3. TLS SNI support enabled
  4. 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的依賴庫

為進一步確認,可以查看一下程序的依賴庫,輸入以下指令: [plain] view plain copy print?技術分享技術分享
  1. # ldd ./sbin/nginx
技術分享
如果依賴庫不含有Openssl,則表明是靜態編譯的Openssl的。

2.3 查看Nginx打開的文件

也可以通過查看Nginx打開的文件來查看是否靜態編譯,輸入以下指令:
[plain] view plain copy
print?技術分享技術分享
  1. # ps aux | grep nginx
  2. # lsof -p 111111<這裏換成Nginx的進程PID> | grep ssl

如果沒有打開Openssl的庫文件,就說明是靜態編譯Openssl的,如下圖所示:
技術分享

3. 重新編譯Nginx


在互聯網公司裏,很少有統一的Nginx版本,都是各部門根據自己的業務需求選擇相應的插件,然後自己編譯的,所以在編譯的時候一定要註意插件這塊,不要忘記編譯某些插件,盡量保持Nginx特性不變,下面的方法可以給大家參考一下,但是一定要經過測試才可以上線啊。

3.1 下載Nginx

去官網下載Nginx,至於版本的話,我是推薦用最新的穩定版本1.4.7,但是各部門可以根據自己的實際情況來選擇,不一定要用最新穩定版本。 [plain] view plain copy print?技術分享技術分享
  1. Nginx的下載地址: http://nginx.org/en/download.html

3.2 下載相關Nginx的第三方插件

輸入以下命令,查看Nginx編譯了哪些插件模塊: [plain] view plain copy print?技術分享技術分享
  1. # ./sbin/nginx -V
輸出的編譯參數裏面包含了編譯模塊,如下:
[plain] view plain copy print?技術分享技術分享
  1. nginx version: nginx/1.4.1
  2. built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
  3. TLS SNI support enabled
  4. 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
編譯選項--add-module就是Nginx所編譯的插件模塊。先把所有插件模塊記錄下來,比如上面的服務器就有只有一個插件cache_purge,然後從以下網址中下載相關插件源碼: [plain] view plain copy print?技術分享技術分享
  1. Nginx 第三方插件下載網址: http://wiki.nginx.org/3rdPartyModules

3.3 自定義插件

如果是咱公司自己開發的Nginx插件,請務必找到相應的同事,確認是否兼容當前的Nginx版本。此外,非官網提供的第三方插件也需要經過測試,是否能夠兼容當前Nginx版本。

3.4 編譯參數

在2小節中,將編譯參數記錄下來,比如上面的--prefix=/opt/app/nginx --with-http_ssl_module ... 等等,記錄下來,編譯的時候盡量保持一致,這樣才能盡可能保持Nginx的特性不變。

3.5 下載Openssl的源碼

從Openssl的官網下載最新的源碼,建議使用最新的額1.0.1g版本,下載頁面:
[plain] view plain copy print?技術分享技術分享
  1. 下載頁面:http://www.openssl.org/source/
  2. 下載地址: http://www.openssl.org/source/openssl-1.0.1g.tar.gz
技術分享

3.6 編譯安裝

在編譯安裝之前,請將原來的./sbin/Nginx 備份一下,以防萬一。所有源碼準備完之後,就開始編譯安裝: [plain] view plain copy print?技術分享技術分享
  1. #./configure <編譯參數> <第三方插件>
  2. # make & make install
編譯完成之後,重啟Nginx,然後測試無誤後,然後再對其他相同配置環境的機器直接替換即可,註意,不同環境服務器是不能直接替換的,比如Redhat5.x上的Nginx就不能復制到Redhat6.x上了。

轉自:http://blog.csdn.net/hujkay/article/details/23476557

重新編譯Nginx指導手冊【修復靜態編譯Openssl的Nginx漏洞 】(轉)