OpenResty学习笔记02:安装WAF
一. 什么是WAF
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。
目前国内的几大云服务商都提供了企业级的WAF产品,且均价格不菲。
好消息是,在 OpenResty
生态中,有几款开源的WAF可供我等学习,开源万岁!
二. 开源的WAF
- ModSecurity:https://github.com/SpiderLabs/ModSecurity
- Kindle大神的ngx_lua_waf:https://github.com/loveshell/ngx_lua_waf
- VeryNginx:https://github.com/alexazhou/VeryNginx
- 赵班长的WAF:https://github.com/unixhot/waf
以上是目前已知的四款开源WAF,根据我本人了解到的信息大概情况如下:
第一个 ModSecurity 来自国外,出现的最早,在软WAF的领域貌似影响力很大,尤其是它的防御规则非常牛X,该项目现在还在维护中;
第二个 ngx_lua_waf 是一位国人写的,出现的时间也很早,后期其他基于Lua的WAF或多或少都借鉴了ngx_lua_waf的思路,该项目已停止维护;
第三个 VeryNginx 也是国人写的,最大的特点是具备Web控制台页面,可以更直观的修改配置,且无需对Nginx进行reload,该项目已停止维护;
第四个来自赵班长的WAF应该是目前使用人数最多的,主要特点就是小巧精悍、功能齐全,最适合像我这样的WAF菜鸟拿来学习。
该项目原本已停止维护,但班长在2020.7.29表示还会继续维护并增加新功能,你信吗,反正我信(你个鬼)。
本系列笔记主要围绕赵班长的WAF展开学习历程,其他三个怕是没有时间再去尝试了。
赵班长WAF的主要功能列表:
- 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
- 支持URL白名单,将不需要过滤的URL进行定义。
- 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
- 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
- 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
- 支持URL参数过滤,原理同上。
- 支持日志记录,将所有拒绝的操作,记录到日志中去。
- 日志记录为JSON格式,便于日志分析,例如使用ELK进行攻击日志收集、存储、搜索和展示。
三. 安装WAF
cd /home/my/tools
git clone https://github.com/unixhot/waf.git
cp -a ./waf/waf ./waflib
rm -rf ./waf
cd waflib
之后需要创建一个软连接,否则会提示 failed to load the 'resty.core' module
:
ln -s /usr/local/openresty/lualib/resty/ /home/my/tools/waflib/resty
修改waf的配置文件,重新指定规则目录位置:
vim config.lua
修改其中的 config_rule_dir
为实际位置:
--rule setting
config_rule_dir = "/home/my/tools/waflib/rule-config"
至此,我们的WAF就安装完成了,看一下最终的目录清单:
ls -al
四、在Nginx配置中引用WAF
想要启动WAF,还需要修改Nginx的配置文件。
我们保留上一篇的 hello 项目,再创建一个新的工作目录 waf,并创建新的Nginx配置文件:
cd /home/my/work
mkdir waf
cd waf
mkdir logs conf
vim conf/nginx.conf
将下面的配置内容粘贴到新建的配置文件中:
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
lua_shared_dict limit 50m;
lua_package_path "/home/my/tools/waflib/?.lua";
init_by_lua_file "/home/my/tools/waflib/init.lua";
access_by_lua_file "/home/my/tools/waflib/access.lua";
server {
listen 8080;
location /waf {
default_type text/html;
content_by_lua_block {
ngx.say("<p>hello waf!</p>")
}
}
}
}
该配置文件中增加了对 waflib 的引用。
启动后将打开 8080 的监听端口,并创建了一个名为 /waf 的服务,输出一行静态的文字:hello waf!。
启动Nginx:
openresty -p `pwd`/ -c conf/nginx.conf
使用浏览器访问:localhost:8080/waf
,不出意外的话应该会显示以下信息:
hello waf!
再尝试访问另一个地址:localhost:8080/waf/.bak
,该地址会触发 waf 的保护规则,因此会显示以下信息:
欢迎白帽子进行授权安全测试,安全漏洞请联系QQ:57459267
这段信息是命中WAF的保护规则后的默认信息,我们可以在 config.lua
文件中对这段信息进行自定义。
五. 总结
至此,我们已经成功在 OpenResty
环境下安装完成了 waf
功能,并初步测试通过。
下一篇将深入学习 waf
的实现原理,并进行简单的个性化改造。
版权声明: 本文为博主 网无忌 原创文章,欢迎转载,但请务必标注原文链接。