基於lua-nginx-module(openresty)的WEB應用防火牆

獨樂樂,不如衆樂樂,分享給你們一篇WEB應用防火牆的文章,基於Lua+ Nginx實現。如下是ngx_lua_waf的做者全文輸出。 
php

Github地址:https://github.com/loveshell/ngx_lua_wafhtml

ngx_lua_waf

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

代碼很簡單,開發初衷主要是使用簡單,高性能和輕量級。nginx

如今開源出來,聽從MIT許可協議。其中包含咱們的過濾規則。若是你們有什麼建議和想fa,歡迎和我一塊兒完善。git

用途:

防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等程序員

web攻擊 防止svn/備份之類文件泄漏 github

防止ApacheBench之類壓力測試工具的攻擊 web

屏蔽常見的掃描黑客工具,掃描器 redis

屏蔽異常的網絡請求 sql

屏蔽圖片附件類目錄php執行權限 

防止webshell上傳

推薦安裝:

推薦使用lujit2.1作lua支持

ngx_lua若是是0.9.2以上版本,建議正則過濾函數改成ngx.re.find,匹配效率會提升三倍左右。

使用說明:

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

把ngxluawaf下載到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/目錄下)

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

絕對路徑若有變更,需對應修改

而後重啓nginx便可

配置文件詳細說明:

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

  2. --規則存放目錄

  3. attacklog = "off"

  4. --是否開啓攻擊信息記錄,須要配置logdir

  5. logdir = "/usr/local/nginx/logs/hack/"

  6. --log存儲目錄,該目錄須要用戶本身新建,切須要nginx用戶的可寫權限

  7. UrlDeny="on"

  8. --是否攔截url訪問

  9. Redirect="on"

  10. --是否攔截後重定向

  11. CookieMatch = "on"

  12. --是否攔截cookie攻擊

  13. postMatch = "on"

  14. --是否攔截post攻擊

  15. whiteModule = "on"

  16. --是否開啓URL白名單

  17. black_fileExt={"php","jsp"}

  18. --填寫不容許上傳文件後綴類型

  19. ipWhitelist={"127.0.0.1"}

  20. --ip白名單,多個ip用逗號分隔

  21. ipBlocklist={"1.0.0.1"}

  22. --ip黑名單,多個ip用逗號分隔

  23. CCDeny="on"

  24. --是否開啓攔截cc攻擊(須要nginx.confhttp段增長lua_shared_dict limit 10m;)

  25. CCrate = "100/60"

  26. --設置cc攻擊頻率,單位爲秒.

  27. --默認1分鐘同一個IP只能請求同一個地址100

  28. html=[[Please go away~~]]

  29. --警告內容,可在中括號內自定義

  30. 備註:不要亂動雙引號,區分大小寫

檢查規則是否生效

部署完畢能夠嘗試以下命令:

 
  1. curl http://xxxx/test.php?id=../etc/passwd

  2. 返回"Please go away~~"字樣,說明規則生效。

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

效果圖以下:

規則更新:

考慮到正則的緩存問題,動態規則會影響性能,因此暫沒用共享內存字典和redis之類東西作動態管理。

規則更新能夠把規則文件放置到其餘服務器,經過crontab任務定時下載來更新規則,nginx reload便可生效。以保障ngx_lua_waf的高性能。

只記錄過濾日誌,不開啓過濾,在代碼裏在check前面加上--註釋便可,若是須要過濾,反之

一些說明:

過濾規則在wafconf下,可根據需求自行調整,每條規則需換行,或者用|分割

 
  1. args裏面的規則get參數進行過濾的

  2. url是隻在get請求url過濾的規則    

  3. post是隻在post請求過濾的規則      

  4. whitelist是白名單,裏面的url匹配到不作過濾    

  5. user-agent是對user-agent的過濾規則

默認開啓了get和post過濾,須要開啓cookie過濾的,編輯waf.lua取消部分--註釋便可,日誌文件名稱格式以下:虛擬主機名_sec.log


附:筆者已在測試環境測試,你若是有興趣的話也能夠試用一下,這只是WEB應用防火牆的一個開源實現,還有實現方案僅可應用於實戰中,若是你還不瞭解WAF的話,建議去google下,必有不小的收穫。

相關文章
相關標籤/搜索