ngx_lua_waf適應(yīng)多站點情況的研究
0x00 前言
在前一篇文章《基于ngx_lua模塊的waf開發(fā)實踐》(鏈接為:http://drops.wooyun.org/tips/5136)中,提出了后續(xù)的三個研究方向,其中一個就是在多站點下waf分離的研究,現(xiàn)在將這方面的研究跟大家分享一下。
0x01 問題分析
最初的思路是直接在nginx中配置多個站點,然后在每個站點中都加載一份waf代碼。
流程圖如下:

這樣做的情況下,如果站點比較多,就會導(dǎo)致nginx配置比較亂,而且當(dāng)nginx配置多站點的情況下,會出現(xiàn)一些問題。我這里就借用安全寶的一份對比表來說明。

當(dāng)然,在實際應(yīng)用中,一般并不會應(yīng)用到這么多站點,這里只是做個說明。但是上面說的問題確實是存在的。
0x02 需求分析
需求1:在nginx中能夠只監(jiān)聽1個站點,能夠?qū)崿F(xiàn)所有站點轉(zhuǎn)發(fā)
需求2:各個站點可以獨(dú)立進(jìn)行控制,包括waf開發(fā),日志開關(guān)以及使用的規(guī)則
0x03 需求實現(xiàn)
針對需求1,流程圖如下:

nginx.conf關(guān)鍵代碼:

waf.lua關(guān)鍵代碼:

訪問過程分析:
當(dāng)一個用戶訪問到waf服務(wù)器時,首先獲取host參數(shù),根據(jù)網(wǎng)址配置里查詢到對應(yīng)的upstream,給預(yù)先定義的變量$upstream,從而達(dá)到正確轉(zhuǎn)發(fā)的目的。
而且后期還可以將網(wǎng)站信息存儲在數(shù)據(jù)庫,當(dāng)***次訪問的時候再加載到內(nèi)存,達(dá)到動態(tài)加載的目的。
針對需求2:
網(wǎng)址配置代碼如下:

規(guī)則配置代碼如下:

這樣可以給每一個網(wǎng)站單獨(dú)配置規(guī)則集,并在網(wǎng)址配置里面注明即可。
在網(wǎng)址配置里面可以注明每個網(wǎng)站的waf開關(guān),是否記錄日志,以及哪個規(guī)則。
在規(guī)則配置中可以指定規(guī)則的放行或阻攔,日志的開啟或關(guān)閉。
0x04 后續(xù)需解決問題
此種方式是一種針對對站點的很好的思路,但此方式還是依賴在nginx中配置各站點的upstream,后續(xù)考慮直接在lua代碼中配置。
針對多站點的情況,***能夠結(jié)合數(shù)據(jù)庫,將網(wǎng)站信息都存儲在數(shù)據(jù)庫中,實現(xiàn)動態(tài)加載。
針對nginx每次變更需要reload,后期考慮寫一個控制頁面來動態(tài)的進(jìn)行控制,比如規(guī)則的的開啟或者關(guān)閉針對waf各種狀態(tài)的展示以及日志的處理與展示
0x05 總結(jié)
此文只是提供一種思路,當(dāng)然也不是我想出來的,也是參考各種資料,最主要的是針對現(xiàn)在各種大流量大并發(fā)的網(wǎng)絡(luò)環(huán)境下,很多公司包括我們公司有這樣一種需求,所以分享出來,希望和更多的人交流,學(xué)習(xí)。