#选择使用静态模块还是动态模块
-执行如下命令
sh assets/guide.sh
-如果输出下面这行,则建议使用动态模块
It is recommended that you use dynamic modules.
-如果输出下面这行,则建议使用静态模块
It is recommended that you use static modules.
#server块中添加配置
---LTS 版本
http {
...
server {
...
# on/off 表示启用和关闭
waf on;
# 规则文件所在目录的绝对路径,必须以/结尾
waf_rule_path /usr/local/src/ngx_waf/assets/rules/;
# 防火墙工作模式,STD表示标准模式
waf_mode STD;
# CC防御参数
# 1000表示每分钟请求次数上限,超出上限后封禁对应ip地址60分钟
waf_cc_deny rate=1000r/m duration=60m;
# 最多缓存50个检测目标的检测结果
# 对除了IP黑白名单检测、CC防护和POST检测以外的所有检测生效
waf_cache capacity=50;
...
}
...
}
---Current 版本
http {
# 声明一块共享内存
waf_zone name=waf size=20m;
...
server {
...
# on/off 表示启用和关闭
waf on;
# 规则文件所在目录的绝对路径,必须以/结尾
waf_rule_path /usr/local/src/ngx_waf/assets/rules/;
# 防火墙工作模式,STD表示标准模式
waf_mode STD;
# CC防御参数
# 1000表示每分钟请求次数上限,超出上限后封禁对应ip地址60分钟
waf_cc_deny on rate=1000r/m duration=60m zone=waf:cc;
# 对除了IP黑白名单检测、CC防护和POST检测以外的所有检测生效
waf_cache on capacity=50;
...
}
...
}---针对路径或文件限流
---LTS
# 将静态资源的请求速率限制到10,000次/分钟
location /static/ {
waf_cc_deny rate=10000r/m duration=1h;
}
# 将动态资源的请求速率限制到2,000次/分钟
location /dynamic/ {
waf_cc_deny rate=2000r/m duration=1h;
}
---Current
http {
waf_zone name=waf size=20m;
server {
# 将静态资源的请求速率限制到10,000次/分钟
location /static/ {
waf_cc_deny rate=10000r/m duration=1h zone=waf:cc_static;
}
# 将动态资源的请求速率限制到2,000次/分钟
location /dynamic/ {
waf_cc_deny rate=2000r/m duration=1h zone=waf:cc_dynamic;
}
}
}---开启验证码
hCaptcha
reCAPTCHAv2
reCAPTCHAv3
-当你的站点受到 CC 攻击时开启验证码是不错的选择,因为验证码可以帮助你进行人机识别。本模块目前支持三种验证码,你应该选择一个并从其网站上申请到 Sitekey 和 Secret。配置完成之后,重启 nginx 服务。
# 整个站点开启验证码
server {
waf_captcha on prov=hCaptcha secret=your_secret sitekey=your_sitekey;
}
# 为某个路径开启验证码
location {
waf_captcha on prov=hCaptcha secret=your_secret sitekey=your_sitekey;
}
# 当访问频率过高时开启验证码
http {
waf_zone name=waf size=20m;
server {
waf_cc_deny on rate=1000r/m duration=1h zone=waf:cc;
waf_captcha off prov=hCaptcha secret=your_secret sitekey=your_sitekey;
waf_action cc_deny=CAPTCHA zone=waf:action;
}---拦截请求时启用验证码
当一个请求被拦截时,ngx_waf 会对该 IP 启用验证码,此时该 IP 想要继续访问就必须完成验证码。这基本可以废掉多数的自动攻击工具,因为这些工具会尝试每一个漏洞,而我们总能识别一些明显的攻击请求并启用验证码,而自动工具时难以通过验证的。对于手动攻击者,这也能提高他们的时间成本。
http {
waf_zone name=waf size=20m;
server {
waf_captcha off prov=xxx sitekey=xxx secret=xxx;
waf_action blacklist=CAPTCHA zone=waf:action;
}
}---被攻击时降低带宽占用
-当你受到 CC 攻击时,攻击者的 IP 已经被 CC 防护拉黑,但是你的上下行带宽依然很高, 这是因为 CC 防护会返回一个 503 状态码,因此占用了你的带宽,你可以使用下面的配置来降低带宽占用。
-444 状态码是 nginx定义的一个非标准的 HTTP 状态码,其作用就是直接关闭连接,不再发送任何数据。如果你使用了 444 状态码,那么在用户看来你的网站就像是不存在一样。这是因为网站出错一般都会有 HTTP 状态码用来提示错误, 如果访问一个网站连错误提示都没有,那么大概率是这个网站不存在。
---LTS
waf_http_status cc_deny=444;
---Current
waf_action cc_deny=444;
---抵御分布式 CC 攻击
-CC 攻击(HTTP 洪水)是指发送大量的 HTTP 请求来耗尽服务器的资源。如果攻击者使用的 IP 较少则防御较为简单,因为只需要限制 IP 的请求频率,但是如果攻击者使用大量的 IP 进行攻击,仅仅限制 IP 的请求频率是无济于事的。这种使用大量 IP 进行 CC 攻击的方式称为分布式 CC 攻击或分布式 HTTP 洪水。
-本模块提供了一些缓解方式,第一种开启验证码来缓解,第二种使用降低带宽占用,第三种使用五秒盾来缓解。你可能听说过 Cloudflare 的五秒盾,本模块的五秒盾和 Cloudflare 的完全不同。它的功能是检测客户端是否能够正确地支持 Cookie,比如发送 Cookie 和正确地处理 Set-Cookie 响应头。你可以从本项目的 assets/ 目录下找到 under-attack.html 并将其拷贝到某个路径下,然后通过修改 nginx 的配置文件来开启五秒盾。
# ----LTS
# 为整个网站开启五秒盾
server {
waf_under_attack on file=/path/to/under_attack.html;
}
# 为某个路径开启五秒盾
location /path {
waf_under_attack on file=/path/to/under_attack.html;
}
# --- Current
# 为整个网站开启五秒盾
server {
waf_under_attack on;
}
# 为某个路径开启五秒盾
location /path {
waf_under_attack on;
}
waf_mode
- 配置语法: waf_mode <mode_type> ...
- 默认配置:——
- 配置段: http, server, location
指定防火墙的工作模式,至少指定一个模式,最多指定八个模式。
mode_type具有下列取值(不区分大小写):
- GET: 当Http.Method=GET时启动检查。
- HEAD: 当Http.Method=HEAD时启动检查。
- POST: 当Http.Method=POST时启动检查。
- PUT: 当Http.Method=PUT时启动检查。
- DELETE: 当Http.Method=DELETE时启动检查。
- MKCOL: 当Http.Method=MKCOL时启动检查。
- COPY: 当Http.Method=COPY时启动检查。
- MOVE: 当Http.Method=MOVE时启动检查。
- OPTIONS: 当Http.Method=OPTIONS时启动检查。
- PROPFIN: 当Http.Method=PROPFIN时启动检查。
- PROPPATCH: 当Http.Method=PROPPATCH时启动检查。
- LOCK: 当Http.Method=LOCK时启动检查。
- UNLOCK: 当Http.Method=UNLOCK时启动检查。
- PATCH: 当Http.Method=PATCH时启动检查。
- TRAC: 当Http.Method=TRAC时启动检查。
- CMN-METH:等价于 HEAD GET POST。
- ALL-METH:任意的 HTTP 请求方法都会启动检查。
- IP: 启用 IP 地址的检查规则。
- URL: 启用 url 的检查规则。
- RBODY: 启用 POST 请求体的检查规则。
- ARGS: 启用 args 的检查规则。
- UA: 启用 user-agent 的检查规则。
- COOKIE: 启用 cookie 的检查规则。
- REFERER: 启用 referer 的检查规则。
- CC: 启用 CC 防御。当你启用了此模式,你必须设置 waf_cc_deny。
- ADV:启用高级规则。
- LIB-INJECTION-SQLI:使用 libinjection(opens new window)检测 SQL 注入。
- LIB-INJECTION-XSS:使用 libinjection(opens new window)检测 XSS 攻击。
- LIB-INJECTION:等价于 LIB-INJECTION-SQLI LIB-INJECTION-XSS。
- CACHE:启用缓存。启用此模式后会缓存检查的结果,下次检查相同的目标时就不需要重复检查了。不过不会缓存 POST 体的检查结果。比如一个 URL 经过检查后并没有在黑名单中,那么下次检查相同的 URL 时就无需再次检查 URL 黑名单了。当你启用了此模式,你必须设置 waf_cache。
- STD:标准工作模式,等价于 HEAD GET POST IP URL RBODY ARGS UA CC CACHE LIB-INJECTION-SQLI。
- STATIC:适用于静态站点的工作模式,等价于 HEAD GET IP URL UA CC CACHE。
- DYNAMIC:适用于动态站点的工作模式,等价于 HEAD GET POST IP URL ARGS UA RBODY COOKIE CC CACHE LIB-INJECTION-SQLI。
- FULL: 启用所有的模式。
- [数据删除]: 启用此模式会[数据删除]。
您可以通过在某个 mode_type 前增加 ! 前缀来关闭该模式,下面是一个例子。
表示使用标准的工作模式,但是不检查 User-Agent。
注意
如果同时启用两个及以上的存在冲突的模式,则靠右的模式会覆盖它左边的模式。下面的例子表示检查 User-Agent。
waf_cc_deny
配置语法: waf_cc_deny <rate=nr/m> [duration=1h] [size=20m]
默认配置:——
配置段: http, server, location
设置 CC 防护相关的参数。
rate:表示一段时间内的请求次数的上限,如 500r/m。超出限制后会返回 503 状态码 (opens new window),并附带 Retry-After (opens new window)响应头。
duration:表示超出第一个参数 rate 的限制后拉黑 IP 的时间,如 60s、60m、60h 和 60d,如不指定则默认为 1h。
size:用于设置记录 IP 访问次数的内存的大小,如 20m、2048k,不得小于 20m,如不指定则默认为 20m。当这段内存耗尽的时候程序会按照 LRU 策略清理一部分访问记录。
waf_cache
- 配置语法: waf_cache <capacity=n>
- 默认配置:—
- 配置段: http, server, location
-设置缓存规则检查结果相关的参数。
- capacity:对于一些启用了缓存机制的检测项目,每个检测项目最多缓存多少个检测目标的检测结果。
启用了缓存机制的检测项目
启用了缓存机制的检测项目指除了 CC 防护、IP 黑白名单检测和 POST 检测之外的所有的检测项。
-性能优化建议
capacity 过小会导致频繁地淘汰缓存,增加内存碎片,降低性能。所以请根据实际应用场景合理地设置。