自建WAF系统

实验环境

Ubuntu20.04
openresty-1.21.4.2

OpenResty简介

OpenResty 是一个基于 Nginx 的 Web 应用服务器,它将 Nginx 与一组强大的 Lua 模块集成在一起,提供了高性能、可扩展和灵活的 Web 开发环境。OpenResty 的目标是通过编写简洁的 Lua 代码来构建高性能的 Web 应用,而无需额外的服务器端脚本语言。

OpenResty 提供了丰富的 Lua 库和模块,可以与各种第三方服务和数据库进行交互,如 MySQL、Redis、Memcached 等,从而实现复杂的业务逻辑和数据处理。通过 Lua 脚本的编写,您可以在请求的不同阶段对请求进行处理、路由、验证、转发等操作,以及对响应进行过滤、修改等操作。

OpenResty 的优势主要有以下几点:

  1. 高性能:OpenResty 基于 Nginx,继承了其高性能、高并发处理能力和低资源消耗特点。同时,通过使用 Lua 进行自定义的请求处理和响应生成,可以进一步提高应用的性能。

  2. 可扩展:OpenResty 提供了丰富的 Lua 库和模块,可以轻松地扩展功能,从而满足不同业务场景的需求。借助这些扩展,您可以快速构建出符合自己业务需求的定制化 Web 服务器。

  3. 灵活性:OpenResty 提供了灵活的配置和编程方式,可以在全局层面和请求处理阶段进行高度定制。您可以根据需要对请求和响应进行精细控制,实现个性化的处理逻辑。

  4. 社区支持:OpenResty 拥有庞大的用户社区和开发者社区,提供了大量的资源、插件和示例代码,方便开发者学习和交流。

总之,OpenResty 是一个功能强大且易于使用的 Web 应用服务器,它通过集成 Nginx 和 Lua,提供了一种高性能、可扩展和灵活的方式来构建 Web 应用。无论是构建 API 服务、处理静态文件、实现反向代理还是构建微服务架构,OpenResty 都是一个值得考虑的选择。

OpenResty下载与编译

安装依赖:

1
apt update &&  apt install libpcre3-dev libssl-dev perl make build-essential curl zlib1g-dev

下载

1
wget https://openresty.org/download/openresty-1.21.4.2.tar.gz

解压安装编译

1
2
3
4
5
6
7
8
tar -xvf openresty-VERSION.tar.gz
cd openresty-VERSION/
./configure -j2
make -j2
sudo make install

# better also add the following line to your ~/.bashrc or ~/.bash_profile file.
export PATH=/usr/local/openresty/bin:/usr/local/openresty/nginx/sbin:$PATH

或者假如是Ubuntu可以直接根据官方文档,添加仓库,直接apt安装

安装unixhot waf

下载

1
git clone https://github.com/unixhot/waf.git

将里面waf文件夹复制到Nginx配置文件目录

1
2
cp -rf waf /usr/local/openresty/nginx/conf/
ln -s /usr/local/openresty/lualib/resty/ /usr/local/openresty/nginx/conf/waf/resty

修改nginx配置文件nginx.conf

1
2
3
4
5
# WAF
lua_shared_dict limit 50m;
lua_package_path "/usr/local/openresty/nginx/conf/waf/?.lua";
init_by_lua_file "/usr/local/openresty/nginx/conf/waf/init.lua";
access_by_lua_file "/usr/local/openresty/nginx/conf/waf/access.lua";

这段 nginx 配置主要是实现使用 OpenResty 的 WAF (Web Application Firewall) 应用。具体含义如下:

  1. lua_shared_dict limit 50m;:定义了名为 limit 的共享字典,大小为 50MB,这个共享字典是用来存储限流、计数等信息的。

  2. lua_package_path “/usr/local/openresty/nginx/conf/waf/?.lua”;:定义了 Lua 脚本的搜索路径,这里是在 /usr/local/openresty/nginx/conf/waf/ 目录下寻找 Lua 文件。

  3. init_by_lua_file “/usr/local/openresty/nginx/conf/waf/init.lua”;:在 Nginx 启动时执行一次 init.lua 脚本,主要完成 WAF 初始化操作。

  4. access_by_lua_file “/usr/local/openresty/nginx/conf/waf/access.lua”;:在处理请求时,先执行 access.lua 脚本,主要完成 WAF 的访问控制功能。

Nginx反向代理

Nginx+Lua WAF很重要的一个基础功能,即反向代理功能

一般通过Location里面添加 proxy_pass来实现

这里我本地实验,就不用反向代理了

1
proxy_pass https://www.XXX.com/;

基于Nginx+Lua得WAF

WAF得配置在config.lua中

从access.lua可以看出检测的顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require 'init'

function waf_main()
if white_ip_check() then
elseif black_ip_check() then
elseif user_agent_attack_check() then
elseif cc_attack_check() then
elseif cookie_attack_check() then
elseif white_url_check() then
elseif url_attack_check() then
elseif url_args_attack_check() then
--elseif post_attack_check() then
else
return
end
end

waf_main()

规则在rule-config目录

1
2
3
root@vm:/usr/local/openresty/nginx/conf/waf# ls rule-config/
args.rule cookie.rule url.rule whiteip.rule
blackip.rule post.rule useragent.rule whiteurl.rule

查看url.rule得内容

1
2
3
4
5
6
7
root@vm:/usr/local/openresty/nginx/conf/waf/rule-config# cat url.rule 
\.(htaccess|bash_history)
\.(bak|inc|old|mdb|sql|backup|java|class|tgz|gz|tar|zip)$
(phpmyadmin|jmx-console|admin-console|jmxinvokerservlet)
java\.lang
\.svn\/
/(attachments|upimg|images|css|uploadfiles|html|uploads|templets|static|template|data|inc|forumdata|upload|includes|cache|avatar)/(\\w+).(php|jsp)

可以看到一条规则一行

都是一些敏感文件,敏感后缀,敏感目录等

测试

输入openresty启动nginx(其实是nginx得软连接)

1
2
root@vm:~# ll /usr/local/openresty/bin/openresty 
lrwxrwxrwx 1 root root 37 Oct 5 01:57 /usr/local/openresty/bin/openresty -> /usr/local/openresty/nginx/sbin/nginx*

在浏览器输入zip后缀

打赏专区