獨樂樂,不如衆樂樂,分享給你們一篇WEB應用防火牆的文章,基於Lua+ Nginx實現。如下是ngx_lua_waf的做者全文輸出。
php
Github地址:https://github.com/loveshell/ngx_lua_wafhtml
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段添加
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下,必有不小的收穫。