在前一篇文章《基于ngx_lua模塊的waf開發實踐》(鏈接為:http://drops.wooyun.org/tips/5136)中,提出了后續的三個研究方向,其中一個就是在多站點下waf分離的研究,現在將這方面的研究跟大家分享一下。
最初的思路是直接在nginx中配置多個站點,然后在每個站點中都加載一份waf代碼。
流程圖如下:
這樣做的情況下,如果站點比較多,就會導致nginx配置比較亂,而且當nginx配置多站點的情況下,會出現一些問題。我這里就借用安全寶的一份對比表來說明。
當然,在實際應用中,一般并不會應用到這么多站點,這里只是做個說明。但是上面說的問題確實是存在的。
需求1:在nginx中能夠只監聽1個站點,能夠實現所有站點轉發
需求2:各個站點可以獨立進行控制,包括waf開發,日志開關以及使用的規則
針對需求1,流程圖如下:
nginx.conf關鍵代碼:
waf.lua關鍵代碼:
訪問過程分析:
當一個用戶訪問到waf服務器時,首先獲取host參數,根據網址配置里查詢到對應的upstream,給預先定義的變量$upstream,從而達到正確轉發的目的。
而且后期還可以將網站信息存儲在數據庫,當第一次訪問的時候再加載到內存,達到動態加載的目的。
針對需求2:
網址配置代碼如下:
規則配置代碼如下:
這樣可以給每一個網站單獨配置規則集,并在網址配置里面注明即可。
在網址配置里面可以注明每個網站的waf開關,是否記錄日志,以及哪個規則。
在規則配置中可以指定規則的放行或阻攔,日志的開啟或關閉。
此種方式是一種針對對站點的很好的思路,但此方式還是依賴在nginx中配置各站點的upstream,后續考慮直接在lua代碼中配置。
針對多站點的情況,最好能夠結合數據庫,將網站信息都存儲在數據庫中,實現動態加載。
針對nginx每次變更需要reload,后期考慮寫一個控制頁面來動態的進行控制,比如規則的的開啟或者關閉針對waf各種狀態的展示以及日志的處理與展示
此文只是提供一種思路,當然也不是我想出來的,也是參考各種資料,最主要的是針對現在各種大流量大并發的網絡環境下,很多公司包括我們公司有這樣一種需求,所以分享出來,希望和更多的人交流,學習。