OpenResty学习笔记02:安装WAF

一. 什么是WAF

 
Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。
目前国内的几大云服务商都提供了企业级的WAF产品,且均价格不菲。
好消息是,在 OpenResty 生态中,有几款开源的WAF可供我等学习,开源万岁!
 

二. 开源的WAF

 

  1. ModSecurity:https://github.com/SpiderLabs/ModSecurity
  2. Kindle大神的ngx_lua_waf:https://github.com/loveshell/ngx_lua_waf
  3. VeryNginx:https://github.com/alexazhou/VeryNginx
  4. 赵班长的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的主要功能列表:

  1. 支持IP白名单和黑名单功能,直接将黑名单的IP访问拒绝。
  2. 支持URL白名单,将不需要过滤的URL进行定义。
  3. 支持User-Agent的过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
  4. 支持CC攻击防护,单个URL指定时间的访问次数,超过设定值,直接返回403。
  5. 支持Cookie过滤,匹配自定义规则中的条目,然后进行处理(返回403)。
  6. 支持URL过滤,匹配自定义规则中的条目,如果用户请求的URL包含这些,返回403。
  7. 支持URL参数过滤,原理同上。
  8. 支持日志记录,将所有拒绝的操作,记录到日志中去。
  9. 日志记录为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 的实现原理,并进行简单的个性化改造。

posted @ 2023-04-30 22:27  网无忌  阅读(268)  评论(0编辑  收藏  举报