0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Nginx三方扩展ngx_waf快速实现一个高性能的Web应用防火墙

dyquk4xk2p3d 来源:escapelife.site 2023-05-12 16:43 次阅读

ngx_waf:方便且高性能的 Nginx 防火墙模块

缓存策略为 LRU,IP 检查和 CC 防御花费常数时间,其它的检查花费 O(nm) 的时间,其中 n 是相关规则的条数,m 为执行正则匹配的时间复杂度,但是每次检查过后会自动缓存本次检查的结果,下次检查相同的目标时就可以使用缓存而不是检查全部的规则。不会缓存 POST 请求体的检查结果。

1工具特点

介绍了该工具的主要特点以及核心功能!

该 Nginx 的第三方扩展工具,可以防御 CC 攻击(超出限制后自动拉黑对应 IP 一段时间或者使用验证码做人机识别),可以支持多种黑白名单(IP/POST/URL/UA等等),还可以提供防护 SQL 注入和 XSS 工具。

使用简单

配置文件和规则文件书写简单,可读性强

基础防护

如 IP 或 IP 网段的黑白名单、URI 黑白名单和请求体黑名单等

高性能

使用高效的 IP 检查算法和缓存机制,支持 IPV4 和 IPV6

高级防护

兼容 ModSecurity 的规则,你可以使用 OWASP 的核心规则库

友好爬虫验证

支持验证 Google、Bing、Baidu 和 Yandex 的爬虫并自动放行,避免错误拦截,主要是基于 User-Agent 和 IP 的识别规则

验证码

支持三种验证码:hCaptcha、reCAPTCHAv2 和 reCAPTCHAv3

2模块安装

第三方模块我们应该怎么安装呢?

Nginx 提供两种安装模块的方式,即「静态链接」和「动态加载」,通过两种方式安装的模块也分别称为「静态模块」和「动态模块」,可以通过运行脚本 assets/guide.sh 来选择使用静态模块还是动态模块。

#执行如下命令
$shassets/guide.sh

#如果输出下面这行,则建议使用动态模块
#Itisrecommendedthatyouusedynamicmodules.

#如果输出下面这行,则建议使用静态模块
#Itisrecommendedthatyouusestaticmodules.

[1] 静态模块

编译安装一个新的模块需要知道当前的 Nginx 的 configure 脚本的参数,您可以通过运行 nginx -V 来获取,务必记住 configure arguments: 后面的内容。安装静态模块需要重新编译整个 Nginx,花费的时间相对于安装动态模块比较长。如果不想在替换二进制文件时,关闭 Nginx 服务的话,可以参考官方文档的热部署方案。

#下载对应的Nginx版本
#http://nginx.org/en/download.html
$cd/usr/local/src
$wgethttps://nginx.org/download/nginx-1.20.1.tar.gz
$tar-zxfnginx-1.20.1.tar.gz

#使用稳定版的源码
$cd/usr/local/src
$gitclone-bltshttps://github.com/ADD-SP/ngx_waf.git

#运行配置脚本
$cd/usr/local/src/nginx-1.20.1
$./configureARG--add-module=/usr/local/src/ngx_waf
$sed-i's/^(CFLAGS.*)/1
-fstack-protector-strong-Wno-sign-compare/'
objs/Makefile

#编译(非并行/并行)
$make
$make-j$(nproc)

#替换Nginx二进制文件(假设已经安装过)
$cpobjs/nginx/usr/local/nginx/sbin/nginx

[2] 动态模块 - 下载预构建的模块

通过执行脚本 assets/download.sh 来下载动态模块。

#用于nginx-1.20.1的LTS版的模块
$shassets/download.sh1.20.1lts

#用于nginx-1.20.1的最新版的模块
$shassets/download.sh1.20.1current

#执行成功后会有如下输出
checkingforcommand...yes
checkingforlibcimplementation...yes
+GNUClibary
Pullingremoteimageaddsp/ngx_waf-prebuild:ngx-1.20.1-module-beta-glibc
......
Downloadcomplete!

如果看到 Download complete! 的话,则说明下载成功,模块会被保存在当前目录下。你可以将其拷贝到一个目录下,然后在 nginx.conf 的顶部添加一行。然后关闭 Nginx 服务并运行 nginx -t。如果没有出错则说明模块被正常加载,反之则说明您的 Nginx 不支持预构建的模块,请编译安装模块。

load_module"/path/to/ngx_http_waf_module.so";

[3] 动态模块 - 编译动态模块

编译安装动态模块并不需要重新编译整个 Nginx,只需要重新编译所有的模块,所以速度相对静态模块快一些,这也是本文档推荐的方式。

#下载对应的Nginx版本
#http://nginx.org/en/download.html
$cd/usr/local/src
$wgethttps://nginx.org/download/nginx-1.20.1.tar.gz
$tar-zxfnginx-1.20.1.tar.gz

#使用稳定版的源码
$cd/usr/local/src
$gitclone-bltshttps://github.com/ADD-SP/ngx_waf.git

#运行配置脚本
$cd/usr/local/src/nginx-1.20.1
$./configure--add-dynamic-module=/usr/local/src/ngx_waf--with-compat
$sed-i's/^(CFLAGS.*)/1
-fstack-protector-strong-Wno-sign-compare/'
objs/Makefile

#开始编译动态模块
$makemodules

#将动态模块拷贝到模块目录(关闭服务)
$cpobjs/*.so/usr/local/nginx/modules

最后,在 Nginx 的配置文件顶部添加一行,表示加载这个编译好的模块。

load_module"/usr/local/nginx/modules/ngx_http_waf_module.so";

3模块使用

第三方模块我们应该怎么使用呢?更多参数参考 配置语法

现在就可以在 nginx.conf 内的一个 server 块中添加配置来开启 ngx_waf 模块来配置服务的防火墙了,下面是一个例子。

[1] LTS 版本

http{
...
server{
...
#on/off表示启用和关闭
wafon;

#规则文件所在目录的绝对路径,必须以/结尾
waf_rule_path/usr/local/src/ngx_waf/assets/rules/;

#防火墙工作模式,STD表示标准模式
waf_modeSTD;

#CC防御参数
#1000表示每分钟请求次数上限,超出上限后封禁对应ip地址60分钟
waf_cc_denyrate=1000r/mduration=60m;

#最多缓存50个检测目标的检测结果
#对除了IP黑白名单检测、CC防护和POST检测以外的所有检测生效
waf_cachecapacity=50;
...
}
...
}

[2] Current 版本

http{
#声明一块共享内存
waf_zonename=wafsize=20m;
...
server{
...
#on/off表示启用和关闭
wafon;

#规则文件所在目录的绝对路径,必须以/结尾
waf_rule_path/usr/local/src/ngx_waf/assets/rules/;

#防火墙工作模式,STD表示标准模式
waf_modeSTD;

#CC防御参数
#1000表示每分钟请求次数上限,超出上限后封禁对应ip地址60分钟
waf_cc_denyonrate=1000r/mduration=60mzone=waf:cc;

#对除了IP黑白名单检测、CC防护和POST检测以外的所有检测生效
waf_cacheoncapacity=50;
...
}
...
}

4常用设置

列出一些 常用的设置,拿来直接就可以使用!

因为模块的配置比较复杂,为了降低使用难度,在这里列出了一些常见用法。

[1] 针对路径或文件限流

有时你可能想要限制不同的路径或文件的请求速率,比如静态资源和动态资源使用不同的速率限制。

#LTS

#将静态资源的请求速率限制到10,000次/分钟
location/static/{
waf_cc_denyrate=10000r/mduration=1h;
}

#将动态资源的请求速率限制到2,000次/分钟
location/dynamic/{
waf_cc_denyrate=2000r/mduration=1h;
}
#Current

http{
waf_zonename=wafsize=20m;
server{
#将静态资源的请求速率限制到10,000次/分钟
location/static/{
waf_cc_denyrate=10000r/mduration=1hzone=waf:cc_static;
}

#将动态资源的请求速率限制到2,000次/分钟
location/dynamic/{
waf_cc_denyrate=2000r/mduration=1hzone=waf:cc_dynamic;
}
}
}

[2] 开启验证码

hCaptcha

reCAPTCHAv2

reCAPTCHAv3

当你的站点受到 CC 攻击时开启验证码是不错的选择,因为验证码可以帮助你进行人机识别。本模块目前支持三种验证码,你应该选择一个并从其网站上申请到 Sitekey 和 Secret。配置完成之后,重启 nginx 服务。

#整个站点开启验证码
server{
waf_captchaonprov=hCaptchasecret=your_secretsitekey=your_sitekey;
}
#为某个路径开启验证码
location{
waf_captchaonprov=hCaptchasecret=your_secretsitekey=your_sitekey;
}
#当访问频率过高时开启验证码
http{
waf_zonename=wafsize=20m;
server{
waf_cc_denyonrate=1000r/mduration=1hzone=waf:cc;
waf_captchaoffprov=hCaptchasecret=your_secretsitekey=your_sitekey;
waf_actioncc_deny=CAPTCHAzone=waf:action;
}
}

[3] 拦截请求时启用验证码

如今,许多攻击者都会使用自动工具攻击服务器,这些自动工具会尝试每一个漏洞,有的会被安全措施所拦截,有的则可以躲避检测。如果攻击者觉得你的价值比较高,可能会手动攻击你的服务。我们并不能完美地防御这些攻击,但却能很简单地提高攻击的成本。

当一个请求被拦截时,ngx_waf 会对该 IP 启用验证码,此时该 IP 想要继续访问就必须完成验证码。这基本可以废掉多数的自动攻击工具,因为这些工具会尝试每一个漏洞,而我们总能识别一些明显的攻击请求并启用验证码,而自动工具时难以通过验证的。对于手动攻击者,这也能提高他们的时间成本。

http{
waf_zonename=wafsize=20m;

server{
waf_captchaoffprov=xxxsitekey=xxxsecret=xxx;
waf_actionblacklist=CAPTCHAzone=waf:action;
}
}

[4] 被攻击时降低带宽占用

当你受到 CC 攻击时,攻击者的 IP 已经被 CC 防护拉黑,但是你的上下行带宽依然很高, 这是因为 CC 防护会返回一个 503 状态码,因此占用了你的带宽,你可以使用下面的配置来降低带宽占用。

444 状态码是 nginx定义的一个非标准的 HTTP 状态码,其作用就是直接关闭连接,不再发送任何数据。如果你使用了 444 状态码,那么在用户看来你的网站就像是不存在一样。这是因为网站出错一般都会有 HTTP 状态码用来提示错误, 如果访问一个网站连错误提示都没有,那么大概率是这个网站不存在。

#LTS
waf_http_statuscc_deny=444;
#Current
waf_actioncc_deny=444;

[5] 抵御分布式 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_attackonfile=/path/to/under_attack.html;
}

#为某个路径开启五秒盾
location/path{
waf_under_attackonfile=/path/to/under_attack.html;
}
#Current

#为整个网站开启五秒盾
server{
waf_under_attackon;
}

#为某个路径开启五秒盾
location/path{
waf_under_attackon;
}

5效果测试

如需更多帮助,可以参考 如何测试!

当我们部署和配置服务完成之后,需要测试下防火墙是否正常起作用了,可以通过如下方式进行简单的测试来判断规则是否正常运行。

#测试时的配置
master_processon;
worker_processes1;

http{
server{
listen80;
server_namelocalhost;

access_logoff;

wafon;
waf_modeDYNAMIC!CC!POST;
waf_rule_path/usr/local/src/ngx_waf/rules/;
waf_cachecapacity=6000interval=1hpercent=50;

location/{
default_typetext/html;
return200'hello';
}
}
}

[1] 简易测试

运行下列命令,如果输出 403 则表示模块正常工作

$curl-I-o/dev/null--user-agentbench
-s-w"%{http_code}\n"https://example.com

[2] 自动测试

项目附带了许多测试用例,你可以通过下面的指令来运行全部的用例

#这行命令的执行时间比较长
$cpanTest::Nginx

#如果目录已经存在则会先删除再创建
$exportMODULE_TEST_PATH=/path/to/temp/dir

#如果你安装了动态模块则需要指定动态模块的绝对路径,反之则无需执行这行命令
$exportMODULE_PATH=/path/to/ngx_http_waf_module.so

#自动化测试
$cd./test/test-nginx
$sh./init.sh
$sh./start.sh./t/*.t
#可以使用WRK工具测试
$wrk-c100-d30m-t1-stest/wrk/rand.lua--latency
http://localhost/--/path/to/rand-str.txt

6注意事项

如需更多帮助,可以参考 常见问题与解答!

本模块只保证对 nginx-1.18.0 或更新的版本的兼容性,且不保证与 Linux 以外的操作系统的兼容性。这里需要注意的是,模块与 ngx_http_rewrite_module 存在兼容性问题。

当 return 指令生效时,该模块不会生效

当 rewrite 指令造成了返回(如 302 重定向)时,该模块不会生效

所以可以使用 try_files 代替 rewrite 指令,避免上述问题的出现

#rewrite
if(!-e$request_filename){
rewrite(.*)/index.php
}

#try_files
try_files$uri$uri//index.php;

7参考链接

Github 代码仓库

黑白名单规则说明

检测项目规则优先级

模块的内置变量

日志相关的配置说明

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2670

    浏览量

    47338
  • Web
    Web
    +关注

    关注

    2

    文章

    1255

    浏览量

    69328
  • 防火墙
    +关注

    关注

    0

    文章

    416

    浏览量

    35591
  • SQL
    SQL
    +关注

    关注

    1

    文章

    759

    浏览量

    44066
  • nginx
    +关注

    关注

    0

    文章

    143

    浏览量

    12161

原文标题:使用 Nginx 三方扩展 ngx_waf 快速实现一个高性能的 Web 应用防火墙

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux如何关闭防火墙

    1、查看防火墙规则vim /etc/sysconfig/iptables放开某个端口号不被防火墙拦截,适用于部署tomcat,nginx等之类的软件
    发表于 07-12 06:31

    防火墙技术

    防火墙技术.ppt 防火墙及相关概念包过滤型防火墙代理服务型防火墙 防火墙的配置分布式防火墙
    发表于 06-16 23:41 0次下载

    防火墙防火墙的渗透技术

    防火墙防火墙的渗透技术 传统的防火墙工作原理及优缺点: 1.(传统的)包过滤防火墙的工作原理   包过滤是在IP层实现的,因
    发表于 08-01 10:26 1045次阅读

    什么是数据库防火墙 数据库防火墙作用是什么

    由于数据库防火墙这个词通俗易懂,和防火墙Web防火墙、下防火墙等主流安全产品
    发表于 07-04 14:50 1.2w次阅读

    网站安全公司waf防火墙的基本概念介绍

    WAF(网站web运用服务器防火墙)是根据实行系列对于HTTP/HTTPS的安全策略来专业为Web运用保护的
    发表于 04-09 11:45 884次阅读

    WAF防火墙Web 应用程序和网络防火墙

    容易受到 Web 应用程序漏洞的攻击。然而WAF无法防御网络层的攻击,因此它应该是网络防火墙的补充而不是替代。
    的头像 发表于 07-24 17:34 808次阅读
    <b class='flag-5'>WAF</b>与<b class='flag-5'>防火墙</b>:<b class='flag-5'>Web</b> 应用程序和网络<b class='flag-5'>防火墙</b>

    Web 应用程序防火墙 (WAF) 相关知识介绍

    Web应用程序防火墙(WAF)如何工作?Web应用防护系统(也称为:网站应用级入侵防御系统。英文:WebApplicationFirewall,简称:
    的头像 发表于 07-31 17:37 1179次阅读
    <b class='flag-5'>Web</b> 应用程序<b class='flag-5'>防火墙</b> (<b class='flag-5'>WAF</b>) 相关知识介绍

    Web 应用程序和网络防火墙之间的异同

    。因此了解WAF安全和网络防火墙安全之间的重要性和区别至关重要,这有助于防止Web攻击和更广泛的网络攻击。传统上,企业通过网络防火墙保护其数据和用户,但网络
    的头像 发表于 08-01 00:26 907次阅读
    <b class='flag-5'>Web</b> 应用程序和网络<b class='flag-5'>防火墙</b>之间的异同

    Web应用防火墙的重要性及基本原理

    企业网络安全是保障业务稳定运行的基础,而Web应用防火墙WAF)是这个基础上的重要环。本文将为你详细介绍WAF的基本原理,并探讨其在维护
    的头像 发表于 10-10 14:47 667次阅读
    <b class='flag-5'>Web</b>应用<b class='flag-5'>防火墙</b>的重要性及基本原理

    如何利用Web应用防火墙应对未知威胁

    网络安全是永恒的话题,尤其是在未知威胁不断涌现的情况下。Web应用防火墙WAF)是企业网络安全防线的重要组成部分,能够帮助企业在面对未
    的头像 发表于 10-13 13:45 369次阅读

    Web应用防火墙性能优化技术

    Web应用防火墙WAF)是企业网络安全的重要屏障,其性能直接影响到网络服务的质量和安全。本文详细探讨了WAF
    的头像 发表于 10-13 13:58 365次阅读

    Web应用防火墙的重要性及基本原理

    企业网络安全是保障业务稳定运行的基础,而Web应用防火墙WAF)是这个基础上的重要环。本文将为你详细介绍WAF的基本原理,并探讨其在维护
    的头像 发表于 10-14 08:32 604次阅读
    <b class='flag-5'>Web</b>应用<b class='flag-5'>防火墙</b>的重要性及基本原理

    火伞云Web应用防火墙的特点与优势

    在前文中,我们已经介绍了Web应用防火墙WAF)的基本原理和重要性。接下来,我们将深入探讨火伞云Web应用防火墙的特点与优势,了解它如何为
    的头像 发表于 10-14 08:32 686次阅读
    火伞云<b class='flag-5'>Web</b>应用<b class='flag-5'>防火墙</b>的特点与优势

    如何利用Web应用防火墙应对未知威胁

    网络安全是永恒的话题,尤其是在未知威胁不断涌现的情况下。Web应用防火墙WAF)是企业网络安全防线的重要组成部分,能够帮助企业在面对未
    的头像 发表于 10-14 08:32 646次阅读
    如何利用<b class='flag-5'>Web</b>应用<b class='flag-5'>防火墙</b>应对未知威胁

    Web应用防火墙性能优化技术

    Web应用防火墙WAF)是企业网络安全的重要屏障,其性能直接影响到网络服务的质量和安全。本文详细探讨了WAF
    的头像 发表于 10-14 08:33 627次阅读
    <b class='flag-5'>Web</b>应用<b class='flag-5'>防火墙</b>的<b class='flag-5'>性能</b>优化技术