首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >自建WAF系统

自建WAF系统

作者头像
用户1423082
发布2024-12-31 20:20:04
发布2024-12-31 20:20:04
39000
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

实验环境

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下载与编译

安装依赖:

代码语言:javascript
代码运行次数:0
运行
复制
apt update &&  apt install libpcre3-dev libssl-dev perl make build-essential curl zlib1g-dev

下载

代码语言:javascript
代码运行次数:0
运行
复制
wget https://openresty.org/download/openresty-1.21.4.2.tar.gz

解压安装编译

代码语言:javascript
代码运行次数:0
运行
复制
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

下载

代码语言:javascript
代码运行次数:0
运行
复制
git clone https://github.com/unixhot/waf.git

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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
# 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来实现

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

代码语言:javascript
代码运行次数:0
运行
复制
proxy_pass https://www.XXX.com/;

基于Nginx+Lua得WAF

WAF得配置在config.lua中

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

代码语言:javascript
代码运行次数:0
运行
复制
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目录

代码语言:javascript
代码运行次数:0
运行
复制
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得内容

代码语言:javascript
代码运行次数:0
运行
复制
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得软连接)

代码语言:javascript
代码运行次数:0
运行
复制
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后缀

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验环境
  • OpenResty简介
  • OpenResty下载与编译
  • 安装unixhot waf
  • Nginx反向代理
  • 基于Nginx+Lua得WAF
  • 测试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档