ngx_lua_waf是一個基於lua-nginx-module(openresty)的web應用防火牆 阿新 • • 發佈:2018-12-08 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段新增 lua_package_path "/usr/local/nginx/conf/waf/?.lua"; lua_shared_dict limit 10m; init_by_lua_file /usr/local/nginx/conf/waf/init.lua; 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~~]] --警告內容,可在中括號內自定義 備註:不要亂動雙引號,區分大小寫 檢查規則是否生效 部署完畢可以嘗試如下命令: curl http://xxxx/test.php?id=../etc/passwd 返回"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