重新編譯Nginx指導手冊【修復靜態編譯Openssl的Nginx漏洞 】[Openssl Heartbleed]

地址: http://blog.csdn.net/hujkay
作者:Jekkay Hu([email protected])
關鍵詞:openssl, heartbleed, CVE-2014-0160,漏洞修復, 補丁下載, 靜態Nginx,重新編譯
時間: 2014/4/11

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 ./sbin/nginx

     如果依賴庫不含有Openssl,則表明是靜態編譯的Openssl的。
    

   2.3 查看Nginx打開的文件

      也可以通過查看Nginx打開的文件來查看是否靜態編譯,輸入以下指令:
 
  # ps aux | grep nginx
  # lsof -p 111111<這裏換成Nginx的進程PID>  | grep ssl

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


3. 重新編譯Nginx


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

    3.1 下載Nginx

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

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

        輸入以下命令,查看Nginx編譯了哪些插件模塊:       
# ./sbin/nginx -V
       輸出的編譯參數裏面包含了編譯模塊,如下:
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
     編譯選項--add-module就是Nginx所編譯的插件模塊。先把所有插件模塊記錄下來,比如上面的服務器就有隻有一個插件cache_purge,然後從以下網址中下載相關插件源碼:     
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版本,下載頁面:
       
下載頁面:http://www.openssl.org/source/
下載地址: http://www.openssl.org/source/openssl-1.0.1g.tar.gz
    

    3.6 編譯安裝

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

4. 小結

         此次,漏洞涉及的服務器太多了,但凡用到了HTTPS的服務器,50%+都中了此道,修復任務任道而重遠啊。


點此打發咖啡】[https://me.alipay.com/jekkay]

胡楊, Jekkay Hu

2014/4/11









發佈了52 篇原創文章 · 獲贊 16 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章