作者:
zhangsan
·
2015/04/30 8:00
0x00 前言
在前一篇文章《基於ngx_lua模組的waf開發實踐》(連結為:/tips/?id=5136)中,提出了後續的三個研究方向,其中一個就是在多站點下waf分離的研究,現在將這方面的研究跟大家分享一下。
0x01 問題分析
最初的思路是直接在nginx中配置多個站點,然後在每個站點中都載入一份waf程式碼。
流程圖如下:

這樣做的情況下,如果站點比較多,就會導致nginx配置比較亂,而且當nginx配置多站點的情況下,會出現一些問題。我這裡就借用安全寶的一份對比表來說明。

當然,在實際應用中,一般並不會應用到這麼多站點,這裡只是做個說明。但是上面說的問題確實是存在的。
0x02 需求分析
需求1:在nginx中能夠只監聽1個站點,能夠實現所有站點轉發
需求2:各個站點可以獨立進行控制,包括waf開發,日誌開關以及使用的規則
0x03 需求實現
針對需求1,流程圖如下:

nginx.conf關鍵程式碼:

waf.lua關鍵程式碼:

訪問過程分析:
當一個使用者訪問到waf伺服器時,首先獲取host引數,根據網址配置裡查詢到對應的upstream,給預先定義的變數$upstream,從而達到正確轉發的目的。
而且後期還可以將網站資訊儲存在資料庫,當第一次訪問的時候再載入到記憶體,達到動態載入的目的。
針對需求2:
網址配置程式碼如下:

規則配置程式碼如下:

這樣可以給每一個網站單獨配置規則集,並在網址配置裡面註明即可。
在網址配置裡面可以註明每個網站的waf開關,是否記錄日誌,以及哪個規則。
在規則配置中可以指定規則的放行或阻攔,日誌的開啟或關閉。
0x04 後續需解決問題
此種方式是一種針對對站點的很好的思路,但此方式還是依賴在nginx中配置各站點的upstream,後續考慮直接在lua程式碼中配置。
針對多站點的情況,最好能夠結合資料庫,將網站資訊都儲存在資料庫中,實現動態載入。
針對nginx每次變更需要reload,後期考慮寫一個控制頁面來動態的進行控制,比如規則的的開啟或者關閉針對waf各種狀態的展示以及日誌的處理與展示
0x05 總結
此文只是提供一種思路,當然也不是我想出來的,也是參考各種資料,最主要的是針對現在各種大流量大併發的網路環境下,很多公司包括我們公司有這樣一種需求,所以分享出來,希望和更多的人交流,學習。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!