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

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

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

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

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

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

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

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