[博客更新]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 功能
这个功能可是在那场攻防战中让我唯一取胜的一个功能了 谁让那个攻击者所有的攻击请求都是同一个 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 都是可以的。
温馨提示
点击阅读原文,到博客文章页面查看
以上是关于[博客更新]ngx_lua_waf 个人增强版使用说明(宝塔面板环境)的主要内容,如果未能解决你的问题,请参考以下文章