# opsany_waf **Repository Path**: fightlinux/opsany_waf ## Basic Information - **Project Name**: opsany_waf - **Description**: WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的WAF的实现由五个模块(配置模块、协议解析模块、规则模块、动作模块、错误处理模块)组成。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-14 - **Last Updated**: 2022-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # opsany_waf - 使用Nginx+Lua实现自定义WAF(Web application firewall) - 依据赵班长编写的WAF进行修改(https://gitee.com/unixhot/waf.git) ## 项目背景介绍 ### 需求产生 为了快速进行Nginx代理部署,并增加Nginx安全防护功能,集成了赵班长开源的WAF代码。 ### WAF实现 WAF一句话描述,就是解析HTTP请求(协议解析模块),规则检测(规则模块),做不同的防御动作(动作模块),并将防御过程(日志模块)记录下来。所以本文中的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进行攻击日志收集、存储、搜索和展示。 ## 安装部署 使用docker-compose + openresty方式进行部署 ### 环境安装 #### docker-compose安装openresty **需要安装docker 与 docker-compose,在此不进行详细说明** #### docker-compose文件 ``` mkdir /opt/nginx cd /opt/nginx cat < docker-compose.yml version: '3' services: nginx: image: \${DOCKER_IMAGE:-openresty/openresty:latest} restart: always network_mode: host container_name: nginx privileged: true volumes: - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime - \$PWD/conf.d:/etc/nginx/conf.d - \$PWD/lua:/usr/local/openresty/nginx/lua - \$PWD/logs:/usr/local/openresty/nginx/logs - \$PWD/waf_logs:/usr/local/openresty/nginx/waf_logs - \$PWD/html:/usr/local/openresty/nginx/html EOF ``` #### opsany_waf部署 ``` cd /root git clone https://gitee.com/daogef/opsany_waf.git cp -rf opsany_waf/opsany_waf /opt/nginx/lua cp -rf opsany_waf/conf.d/default.conf /opt/nginx/conf.d/default.conf cd /opt/nginx/ chmod 777 waf_logs docker-compose run --rm nginx nginx -t && sleep 3 && docker-compose up -d nginx ``` ### OpenResty二进制安装 参考方案:http://openresty.org/cn/linux-packages.html ##### CentOS ``` # 添加opresty官方yum源 wget https://openresty.org/package/centos/openresty.repo sudo mv openresty.repo /etc/yum.repos.d/ # 更新yum源索引 sudo yum check-update # 安装openresty、命令行工具resty、openresty-opm工具 yum -y install openresty openresty-resty openresty-opm ``` ##### Ubuntu 你可以在你的 Ubuntu 系统中添加我们的 APT 仓库,这样就可以便于未来安装或更新我们的软件包(通过 `apt-get update` 命令)。 运行下面的命令就可以添加仓库(每个系统只需要运行一次): 步骤一:安装导入 GPG 公钥时所需的几个依赖包(整个安装过程完成后可以随时删除它们): ```bash sudo apt-get -y install --no-install-recommends wget gnupg ca-certificates ``` 步骤二:导入我们的 GPG 密钥: - ubuntu 16 ~ 20 版本 ```bash wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add - ``` - ubuntu 22 及以上版本 ``` wget -O - https://openresty.org/package/pubkey.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg ``` 步骤三:添加我们官方 APT 仓库。 对于 `x86_64` 或 `amd64` 系统,可以使用下面的命令: - ubuntu 16 ~ 20 版本 ```bash echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main" \ | sudo tee /etc/apt/sources.list.d/openresty.list ``` - ubuntu 22 及以上版本 ```bash echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null ``` 步骤四:更新 APT 索引: ```bash sudo apt-get update ``` 然后就可以像下面这样安装软件包,比如 `openresty`: ```bash sudo apt-get -y install openresty ``` 这个包同时也推荐安装 `openresty-opm` 和 `openresty-restydoc` 包,所以后面两个包会缺省安装上。 如果你不想自动关联安装,可以用下面方法关闭自动关联安装: ```bash sudo apt-get -y install --no-install-recommends openresty ``` ### 跨域白名单添加 在conf.d/default.conf文件中找到如下配置内容,在其中添加白名单即可 ``` # 跨域白名单配置 map $http_origin $allow_origin { default ""; "~^(https?://localhost(:[0-9]+)?)" $1; "~^(https?://127.0.0.1(:[0-9]+)?)" $1; } ``` 例如需要添加允许*.baidu.com进行跨域调用,配置如下 ``` # 跨域白名单配置 map $http_origin $allow_origin { default ""; "~^(https?://localhost(:[0-9]+)?)" $1; "~^(https?://127.0.0.1(:[0-9]+)?)" $1; "~^(https?://.*.baidu.com)" $1; } ```