NGINXweb應用防火牆–ngx_lua_waf
作者:春哥
GitHub:https://github.com/loveshell/ngx_lua_waf
ngx_lua_waf是一個基於lua-nginx-module(openresty)的web應用防火牆自2016年已經停止更新,下方有其他大佬更新的規則。
##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
修改版更新內容:
在春哥的基礎上加了封IP的時間(原版本為60/s,修改後可以自定義),還增加了不過濾搜索引擎。
Nginx_lua_waf用途:
防止sql注入,本地包含,部分溢出,fuzzing測試,xss,SSRF等web攻擊
防止svn/備份之類文件洩漏
防止ApacheBench之類壓力測試工具的攻擊
屏蔽常見的掃描黑客工具,掃描器
屏蔽異常的網絡請求
屏蔽圖片附件類目錄php執行權限
防止webshell上傳
春哥原版規則:https://www.lanzous.com/i2t7r8d
修改版規則:https://www.lanzous.com/i2t7raf
使用說明:
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即可
service nginx restart
配置文件詳細說明:
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次
DenySeconds=”360″
–原來攻擊被封默認60秒,這裡修改為自定義,我這設定為360秒(這裡是新加的)
html=[[Please go away~~] ]
–警告內容,可在中括號內自定義
部署完畢可以嘗試如下命令:
curl http://xxxx/test.php?id=../etc/passwd
返回”Please go away~~”字樣,說明規則生效。
注意:默認,本機在白名單不過濾,可自行調整config.lua配置
修改說明:
修改正則過濾函數改為ngx.re.find,匹配效率會提高三倍左右
增加封IP時間自定義控制
增加不過濾搜索引擎