openresty使用ngx_waf

介绍ngx_waf

为什么选择 ngx_waf

  • 基础防护:如 IP 或 IP 网段的黑白名单、URI 黑白名单和请求体黑名单等。
  • 使用简单:配置文件和规则文件书写简单,可读性强。
  • 高性能:使用高效的 IP 检查算法和缓存机制。
  • 高级防护:兼容 ModSecurity,因此你可以使用开放式网络应用安全项目(OWASP)® 的核心规则库
  • 友好爬虫验证:支持验证 Google、Bing、Baidu 和 Yandex 的爬虫并自动放行,避免错误拦截。
  • 验证码:支持三种验证码:hCaptcha、reCAPTCHAv2 和 reCAPTCHAv3。

功能

  • 兼容 ModSecurity。此功能仅限最新的 Current 版本。
  • SQL 注入防护(Powered By libinjection)。
  • XSS 攻击防护(Powered By libinjection)。
  • 支持 IPV4 和 IPV6。
  • 支持开启验证码(CAPTCHA),支持 hCaptchareCAPTCHAv2reCAPTCHAv3。此功能仅限最新的 Current 版本。
  • 支持识别友好爬虫(如 BaiduSpider)并自动放行(基于 User-Agent 和 IP 的识别)。此功能仅限最新的 Current 版本。
  • CC 防御,超出限制后自动拉黑对应 IP 一段时间。
  • IP 黑白名单,同时支持类似 192.168.0.0/16fe80::/10,即支持点分十进制和冒号十六进制表示法和网段划分。
  • POST 黑名单。
  • URL 黑白名单
  • 查询字符串(Query String)黑名单。
  • UserAgent 黑名单。
  • Cookie 黑名单。
  • Referer 黑白名单。

打包

前言

openresty天生支持lua,线上的日志是有lua做处理

线上有不同的vpc,每个环境都要做到快速部署,故把模块都打进docker

本文章主要讲的是ngx_waf,但其实不止这个模块,一共有:

打包镜像

使用

监控

http模块配置

1
vhost_traffic_status_zone;

开启服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 9145;
# 给日志模板使用的变量
set $resp_body "";
set $resp_cookies "";
location /metrics {
content_by_lua_block {
metric_connections:set(ngx.var.connections_reading, {"reading"})
metric_connections:set(ngx.var.connections_waiting, {"waiting"})
metric_connections:set(ngx.var.connections_writing, {"writing"})
prometheus:collect()
}
}

location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}

}

ngx_waf

文档地址

我使用到这个模块里的最主要的就是waf_captcha,这个是人机验证功能

由于自带的页面太难看了,所以我做了一个界面

1
waf_captcha on prov=hCaptcha file=/data/res/CAPTCHA.html secret=xxx;