[博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境)

Posted sunriseydy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境)相关的知识,希望对你有一定的参考价值。

一、更新内容

这里说明一下我个人更新的内容,以和原版项目作一个对比。最新的更新内容以项目的 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 功能

这个功能可是在那场攻防战中让我唯一取胜的一个功能了 [博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境) 谁让那个攻击者所有的攻击请求都是同一个 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 规则。我相信这个功能还是很有用的 [博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境)

四、TODO

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

  • 添加 redis 缓存的支持

  • 添加 CDN 模式的支持

  • 添加 IP 段的识别功能

  • 添加用户校验的支持,即达到屏蔽的频率后不直接返回 503,而是返回用户校验页面,尽量避免对真实用户的误杀。

  • 添加根据 UA 来限制的功能

这些功能在宝塔的收费版 NGINX 防火墙插件中都有,但作为一个小型网站的个人博主,我并不想提高维护的成本,有什么需要还是自己开发吧 [博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境)

五、最后

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

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



温馨提示



点击阅读原文,到博客文章页面查看


以上是关于[博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境)的主要内容,如果未能解决你的问题,请参考以下文章

使用Hexo搭建GitHub博客(2018年Mac版)

本博客停止更新,新内容在个人网站上

office2016专业增强版可以用多久

docker,mysql,wordpress搭建个人博客

office2019专业增强版怎么激活啊?求大神分享一个激活密钥和激活教程,谢谢!

图像处理OpenCV(C++版)——4.1 对比度增强之灰度直方图