獨樂樂,不如衆樂樂,分享給你們一篇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
代碼很簡單,開發初衷主要是使用簡單,高性能和輕量級。git
如今開源出來,聽從MIT許可協議。其中包含咱們的過濾規則。若是你們有什麼建議和想fa,歡迎和我一塊兒完善。程序員
用途:
防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等github
web攻擊 防止svn/備份之類文件泄漏 web
防止ApacheBench之類壓力測試工具的攻擊 redis
屏蔽常見的掃描黑客工具,掃描器 sql
屏蔽異常的網絡請求 shell
屏蔽圖片附件類目錄php執行權限
防止webshell上傳
推薦安裝:
推薦使用lujit2.1作lua支持
ngx_lua若是是0.9.2以上版本,建議正則過濾函數改成ngx.re.find,匹配效率會提升三倍左右。
使用說明:
nginx安裝路徑假設爲:/usr/local/nginx/conf/
把ngxluawaf下載到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
附:筆者已在測試環境測試,你若是有興趣的話也能夠試用一下,這只是WEB應用防火牆的一個開源實現,還有實現方案僅可應用於實戰中,若是你還不瞭解WAF的話,建議去google下,必有不小的收穫。
擴展閱讀:
歪脖貳點零 ∣迭代當下 · 架構將來
程序員,除了編碼,生活還應該有沉澱!
長按,識別二維碼,加關注