1. 程式人生 > >ngx_lua_waf是一個基於lua-nginx-module(openresty)的web應用防火牆

ngx_lua_waf是一個基於lua-nginx-module(openresty)的web應用防火牆

 

https://www.itsvse.com/thread-3416-1-1.html

 

 
ngx_lua_waf

ngx_lua_waf是我剛入職趣遊時候開發的一個基於ngx_lua的web應用防火牆。

程式碼很簡單,開發初衷主要是使用簡單,高效能和輕量級。

現在開源出來,遵從MIT許可協議。其中包含我們的過濾規則。如果大家有什麼建議和想fa,歡迎和我一起完善。

用途:
            
      
防止sql注入,本地包含,部分溢位,fuzzing測試,xss,SSRF等web攻擊
        防止svn/備份之類檔案洩漏
        防止ApacheBench之類壓力測試工具的攻擊
        遮蔽常見的掃描黑客工具,掃描器
        遮蔽異常的網路請求
        遮蔽圖片附件類目錄php執行許可權
        防止webshell上傳


推薦安裝:

推薦使用lujit2.1做lua支援

ngx_lua如果是0.9.2以上版本,建議正則過濾函式改為ngx.re.find,匹配效率會提高三倍左右。


使用說明:

nginx安裝路徑假設為:/usr/local/nginx/conf/

把ngx_lua_waf下載到conf目錄下,解壓命名為waf

在nginx.conf的http段新增

            
  1.   lua_package_path "/usr/local/nginx/conf/waf/?.lua";
  2.         lua_shared_dict limit 10m;
  3.         init_by_lua_file  /usr/local/nginx/conf/waf/init.lua; 
  4.             access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
複製程式碼

配置config.lua裡的waf規則目錄(一般在waf/conf/目錄下)

        RulePath = "/usr/local/nginx/conf/waf/wafconf/"

絕對路徑如有變動,需對應修改

然後重啟nginx即可


配置檔案詳細說明:


           
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
        --規則存放目錄
        attacklog = "off"
        --是否開啟攻擊資訊記錄,需要配置logdir
        logdir = "/usr/local/nginx/logs/hack/"
        --log儲存目錄,該目錄需要使用者自己新建,切需要nginx使用者的可寫許可權
        UrlDeny="on"
        --是否攔截url訪問
        Redirect="on"
        --是否攔截後重定向
        CookieMatch = "on"
        --是否攔截cookie攻擊
        postMatch = "on" 
        --是否攔截post攻擊
        whiteModule = "on" 
        --是否開啟URL白名單
        black_fileExt={"php","jsp"}
        --填寫不允許上傳檔案字尾型別
        ipWhitelist={"127.0.0.1"}
        --ip白名單,多個ip用逗號分隔
        ipBlocklist={"1.0.0.1"}
        --ip黑名單,多個ip用逗號分隔
        CCDeny="on"
        --是否開啟攔截cc攻擊(需要nginx.conf的http段增加lua_shared_dict limit 10m;)
        CCrate = "100/60"
        --設定cc攻擊頻率,單位為秒.
        --預設1分鐘同一個IP只能請求同一個地址100次
        html=[[Please go away~~]]
        --警告內容,可在中括號內自定義
        備註:不要亂動雙引號,區分大小寫

        
檢查規則是否生效

部署完畢可以嘗試如下命令:        
  
      
  1. curl http://xxxx/test.php?id=../etc/passwd
  2.         返回"Please go away~~"字樣,說明規則生效。
複製程式碼

注意:預設,本機在白名單不過濾,可自行調整config.lua配置


效果圖如下
 

規則更新:

考慮到正則的快取問題,動態規則會影響效能,所以暫沒用共享記憶體字典和redis之類東西做動態管理。

規則更新可以把規則檔案放置到其他伺服器,通過crontab任務定時下載來更新規則,nginx reload即可生效。以保障ngx lua waf的高效能。

只記錄過濾日誌,不開啟過濾,在程式碼裡在check前面加上--註釋即可,如果需要過濾,反之

一些說明:

        過濾規則在wafconf下,可根據需求自行調整,每條規則需換行,或者用|分割
        
                args裡面的規則get引數進行過濾的
                url是隻在get請求url過濾的規則                
                post是隻在post請求過濾的規則                
                whitelist是白名單,裡面的url匹配到不做過濾                
                user-agent是對user-agent的過濾規則
        

        預設開啟了get和post過濾,需要開啟cookie過濾的,編輯waf.lua取消部分--註釋即可
        
        日誌檔名稱格式如下:虛擬主機名_sec.log

 

nginx