ngx_lua_waf 个人增强版使用说明(宝塔面板环境)

自从网站被攻击之后我就一直在寻找有效防止 CC 攻击的方法。在 NGINX 中有一个大佬基于 Lua 模块写了一个 ngx_lua_waf Web应用防火墙项目,宝塔面板中的 nginx 过滤器用的就是这个项目。我本人发现其防 CC 功能有些缺陷,因此根据自己在对抗 CC 攻击过程中的见解改进了该项目,并经过个人测试可以防住攻击本人博客的 CC 攻击,现将该项目发布于 “Easy Internet In HAUT“(简称 “ehaut”。这是什么?就是一个一堆人围在一起搞事情的组织而已 :(滑稽) ) Github Organization 下,地址为:https://github.com/ehaut/ngx_lua_waf。这里则说明一下这个增强版的使用说明。由于我是基于原版和宝塔版基础上做修改,因此这里只说明宝塔环境下的使用方法,没有使用宝塔面板的可以参考原版 README 中的使用说明。

一、更新内容

这里说明一下我个人更新的内容,以和原版项目作一个对比。最新的更新内容以项目的 README 中的说明为准。

  • 修复一个小bug
  • 将 ngx.re.match替换为ngx.re.find
  • 完善 DenyCC,将匹配规则由 ip+url 改为 ip+host,更加符合个人使用情况。
  • 添加根据 host+url 限制访问频率的功能,可自定义某个URL并配置限制频率。配置规则为 wafconf/hostdenycc ,请按照示例的格式来添加规则(URL:www.example.com/denycc/ RATE:10/5/300),注意 URL 和 RATE 有空格分隔。示例中,“10/5/300”代表5秒内访问达到10次就限制访问300秒。
  • 扩展 whiteurl 模块,添加 host+url 匹配规则,例如: URL:www.example.com/whiteurl/。可配合 DenyCC 功能来使用(例如该服务器中配置有多个网站,若想忽略某些网站,就可以将其添加到whiteurl中)
  • 添加根据 http refer 限制访问的功能,配置规则为:HttpReferCCDeny="on" HttpReferCCRate="5/2/120"。添加该功能是因为本人发现攻击我网站的访问中,http refer 都是相同的,而访问 IP 足足有一段的 IP,因此根据IP+host无法很好地防住,根据 http refer 可以限制其大量IP相同HTTP refer 的访问。

二、安装

若使用了宝塔面板安装的 NGINX,则已经自带了一个 ngx_lua_waf 防火墙(在宝塔面板的 NGINX 管理中叫做过滤器),因此使用本人增强的 ngx_lua_waf 就非常的简单,只需要将宝塔中的项目文件做修改即可:

// 以下文件为替换的文件
config.lua --> /www/server/nginx/waf/config.lua
init.lua --> /www/server/nginx/waf/init.lua
waf.lua --> /www/server/nginx/waf/waf.lua
wafconf/whiteurl --> /www/server/panel/vhost/wafconf/whiteurl
// 以下文件为新建的文件
wafconf/hostdenycc --> /www/server/panel/vhost/wafconf/hostdenycc

文件修改之后打开 NGINX 的主配置文件 (注意,不是网站的配置文件,是主配置文件,在宝塔面板的 NGINX 管理中的配置修改部分),将 http 区域内的 “#include luawaf.conf;” 取消注释即可启用 ngx_lua_waf (若宝塔面板版本低于6,则可以在 NGINX 管理中看到有过滤器的选项,可以直观地配置过滤器,其实就是 ngx_lua_waf )。如果没有 luawaf.conf 文件可参考原作者写的使用说明来安装。

三、功能说明和规则配置

以下内容为我个人新增功能的配置说明,原版功能我不再详细说明。

1. DenyCC 功能

该功能在原版项目中就已存在,只不过原版项目中是根据 IP + URL(/example/abc)来统计访问频率的(即作为 token,下面统称为 token),然而实际的攻击中大部分 CC 攻击都是大量随机的 URL,不会只是单一的 URL 请求,因此我将其 token 修改为 IP + HOST(www.example.com),其中的 IP 和 HOST 是从请求头中直接获取到的。

该功能的配置依旧是原版的配置,即在 config.lua 文件中配置,如下:

CCDeny="on"
CCrate="5/2"

宝塔版本低于6的可以直接在 NGINX 管理中的过滤器部分来配置,不知什么原因6版本以上宝塔取消了该部分,但实际上仍然存在着这些配置文件。

其中第一个配置的是 CC Deny 功能的开关,”on” == 开,”off” == “关”,第二个配置的是统计频率,即每一个 token 在2秒内访问达到5次就屏蔽掉,屏蔽的时间这里没有做可配置选项,而是直接定为600秒,即十分钟,如后期实在需要则加上可配置选项。屏蔽的方法是直接返回 503 状态码。后期可能会做返回校验真实用户的功能,具体见下面的 TODO 部分。

需要注意的是,该功能的作用范围是 NGINX 下的全部网站!要想只作用在某个网站或某个网址,请使用 HostDenyCC 功能。还有就是该项目中所有关于 IP 的获取,都是直接从 NGINX 的 remote_addr 变量获取到的,因此对于 CDN 的支持并不太好,我会把对 CDN 的支持列入到 TODO 中。

2. HostDenyCC功能

HostDenyCC 功能是我个人新增的一个功能,该功能最大的特点是将 IP + HOST (e.g.127.0.0.1www.example.com) 或者是 IP + HOST + URL (e.g. 127.0.0.1www.example.com/a/b/c ) 作为统计频率的 token。若开启了该功能则不用开启上面的 DenyCC 功能。

该功能的配置有两部分,一个是在 config.lua 中有一个功能开关,如下:

HostCCDeny="on"

同样地 “on” == 开,”off” == 关;另一个配置是具体的规则配置,有一个单独的配置文件,在项目的 wafconf/hostdenycc 文件中,配置模板如下:

URL:www.example.com/denycc/ RATE:10/5/300

需要注意的是 URL 和 RATE 这两个配置是以空格分隔的,最好复制文件中的模板再做修改,否则可能会导致规则匹配失败。

配置中的 URL 部分就是你要统计并限制的 URL,这个 URL 实际上是完整的 URL,即包括 HOST 的,配置的时候将冒号后面、空格之前的 “www.example.com/denycc/” 改为你要配置的 URL 即可。当然你也可以不加上最后的路径,只配置 HOST 部分,即 “www.example.com”。

RATE 部分的配置就是单一 token 的统计频率及限制时间,模板中的配置含义是5秒内单一 token 访问达到10次就屏蔽300秒,同样屏蔽就是直接返回 503 状态码。这里我对屏蔽时间做了可配置处理是因为不同的 URL 可能会有不同的限制时间需求,比如 API 接口屏蔽时间短一点,登录的 URL 屏蔽时间长一点。

3. HTTPReferDenyCC 功能

这个功能可是在那场攻防战中让我唯一取胜的一个功能了 :(滑稽) 谁让那个攻击者所有的攻击请求都是同一个 http refer 呢。这个功能实际上就是把统计频率的 token 换成 HOST + http_refer 了而已,这里并没有加上 IP 是因为绝大多数 CC 攻击的 IP 都是大量的,单靠 IP 不足以抵挡,既然它有更明显的特征,就不用管 IP 了。不过,该功能仅限于攻击请求都是同一个 http_refer ,如果攻击你的请求中 http_refer 并不相同就不起作用了。那么怎么识别攻击是不是同一个 http_refer 呢?看一下 NGINX 的访问日志,类似这样的:

"GET /daily/sunriseydy-app/ HTTP/1.1" 499 0 "http://www.baidu.com/s?wd=L1HG"

499 0 后面的就是 http_refer,如果连续几个异常流量都是同一个 http_refer,那么该功能就可以抵抗。

同 DenyCC 功能一样,该功能的作用范围也是 NGINX 下的全部网站,不过可以配合增强版的 WhiteURL 功能来开放某些网站为白名单,后面会说到。

HTTPReferDenyCC 功能也只有一个配置,就是在 config.lua 文件中的:

HttpReferCCDeny="on"
HttpReferCCRate="5/2/120"

我想不用我解释就知道配置是啥意思了吧,和上面的那些都是一样的含义。两秒内同一个 token 访问达到5次就屏蔽120秒,即返回 503。

4. WhiteURL 功能

WhiteURL 是一个白名单功能,原版项目中它只能配置根路径后面的 URL,类似 “/abc/” ,我将其修改为可添加完整的 URL 白名单,即 HOST + URL,比如 “www.example.com/abc/” ,这样可以作为那些作用范围是全部网站的功能的辅助。具体的配置规则在项目的 wafconf/whiteurl 文件中,配置模板如下:

^/123/$
URL:www.example.com/whiteurl/

每一行前面不加 URL 的规则是根路径后面的 URL,而加了 URL 的就是完整的 URL 规则。我相信这个功能还是很有用的 :(滑稽)

四、TODO

由于本人并不是精通 NGINX 和 Lua 开发,只是根据自己的实际需要对原项目做了一些修改,后期如果遇到一些需求我会考虑加上去,下面是已经在考虑添加的功能:

  • 添加 redis 缓存的支持
  • 添加 CDN 模式的支持
  • 添加 IP 段的识别功能
  • 添加用户校验的支持,即达到屏蔽的频率后不直接返回 503,而是返回用户校验页面,尽量避免对真实用户的误杀。
  • 添加根据 UA 来限制的功能

这些功能在宝塔的收费版 NGINX 防火墙插件中都有,但作为一个小型网站的个人博主,我并不想提高维护的成本,有什么需要还是自己开发吧 :(委屈)

五、最后

最后感谢原作者(@loveshell)开发出这么一个优秀的项目以及 NGINX 的 Lua 模块:https://openresty.org/cn/

同时我也欢迎大家将好的想法和问题提出来,PR 和 Issues 都是可以的。


版权说明:
作品 sunriseydy 采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
文章内容如未说明均为原创,欢迎转载,但请注明原作者(sunriseydy)和原文链接(https://blog.sunriseydy.top/technology/server-blog/server/ngx_lua_waf/)
部分来自互联网的文章,如有侵权,请联系我,24小时内删除,谢谢

手机打开扫一扫即可访问本页面

感谢您的支持,SunriseYDY 会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

日出一点一 | 在探索的路上永不止步

分享到微博 分享到QQ 微信赞赏 在手机上阅读 点赞 0

评论一下呗亲

电子邮件地址不会被公开。 必填项已用*标注