Tengine WAF 实践

u27207612402929340252fm72

0x00 前言

对于WAF大家都不陌生,很多公司都有自研waf,基本是往智能化、集群化发展。但还是会存在一些细微的场合,是这些大型waf覆盖不到的,这时候就需要一款轻巧灵便又简易高效的waf。

Tengine自nginx发展而来,是源自淘宝的开源项目,新增了很多高级功能和特性。 基于tengine的防攻击模块,最初我尝试了mod-security,但有一个bug, 在大并发的时候狂吃内存,直至拖垮应用,不知道这个问题现在解决没有。 后来转向ngx_lua_waf(感谢loveshell),并在此基础上做了部分改良, 觉得效果不错,就推荐给大家。

0x01 部署

部署简单,拿来就能用。整个工程是基于centos6.x,已经编译好了。

如果是其他系统,需要重新编译一遍tengine,使支持lua模块。

下载 https://github.com/lanzsec/tengine_waf.git 工程到/usr/local/tengine 目录 chown –R nobody:nobody /usr/local/tengine cp –r /usr/local/tengine/lib/* /usr/lib64/ 配置 /usr/local/tengine/conf/server/ 站点 参照模板,比普通的vhosts配置只在location下面多了一行 access_by_lua_file cd /usr/local/tengine/sbin && ./nginx

0x02 WEB 防护

规则目录为tengine/conf/wafconf/,提供了多维度的web防护策略,有以下几个文件:

user-agent 匹配拦截恶意的user-agent url 匹配拦截恶意的网页路径 args 匹配拦截恶意的GET请求参数 post 匹配拦截恶意的post请求参数 cookie 匹配拦截恶意的cookie 请求 whitetip ip白名单 whiteurl 网页路径白名单 blockip ip黑名单

整个配置文件规则为文本格式,简单易懂,每条规则支持正则匹配,例如下面whiteip的规则表示:把来自本机和192.168.100网段的请求加入白名单。

#whiteip 127.0.0.1 ^192\.168\.100.\

0x03 cc防护

cc攻击,也有很多方法,但大都功能比较少。Tengine waf 的目的就是要做功能强大,支持多样的场景需求。

配置文件路径tengine/conf/wafconf/denycc , 一条规则有3部分组成:

waf1

第一部分为token, token最多由3项组成,中间用“+”拼接。每一项可以是以下值:

ip 表示客户端ip domain 表示域名,有多个域名反代的时候可以区分 uri 表示整个uri页面路径 uri:/xx/yy.php 表示匹配xx/yy.php 的 uri GetParam:xxx 表示GET参数xxx的值 PostParam:xxx 表示POST参数xxx的值 CookieParam:xxx 表示Cookie参数xxx的值 header:imei 表示http头参数imei的值

第二部分为频率阀值,前者表示次数,后者表示时间(单位秒),例如30/60 表示: 60秒内请求达到30次。

第三部分为封禁时间,单位为秒。

示例一:

ip+uri 60/60 3600

如上规则表示为:如果来自同一个ip同一页面的请求次数超过每分钟60次,则对其封禁1小时。

示例二:

假如我不需要对所有页面去做流控,只需要对特定页面做限制即可。比如说登录页面/logon.php 和 短信验证码页面 /sms/send.php,

防止暴力破解和短信炸弹,则配置可以为:

ip+uri:logon.php 60/60 1800 ip+uri:/sms/ 10/60 3600

首先允许配置多条规则,其次uri采取正则匹配的形式,/sms/ 则匹配了所有路径含有/sms/的页面。

示例三:

假如网站架构不一样,比如api结构的,gateway?api=logon&则token 可以为 ip+GetParam:api。表示特定ip对某个api接口访问频次不超过每分钟60次,否则封禁半小时。

ip+GetParam:api 60/60 1800

示例四:

假如我想根据用户维护来做限制,禁止某些用户操作太频繁,首选要取得用户标识,比如GetParam:userid 或者CookieParam:sessionid,再根据实际情况去组合规则,表示对每个登录用户访问频次不能超过每分钟30次,否则封禁半小时。

CookieParam:sessionid 30/60 1800

0x04 Q&A

4.1 为什么是centos, 为什么部署路径是/usr/local/?

因为这是已经编译好的版本,我待过的几家互联网公司用的基本都是centos系统。

如果不放心或者不适用,请自行编译tengine,半天时间应该够了。

也不用担心/usr目录不够大,默认情况下acces日志和攻击拦截日志都在/usr/local/tengine/logs 目录下,但可以随便改到其他目录。

4.2 有没有控制开关?

有开关,在conf/config.lua里, 有6个开关,分别对应各个配置文件功能是否开启。

urlMatch="on" cookieMatch="on" postMatch="on" whiteurlMatch="on" whiteipMatch="on" blackipMatch="on" denycc="on"

还有一个总开关,默认关闭,当开启了只进行检测,不进行拦截,若是匹配到规则了会记录到攻击日志中。

OnlyCheck="off"

如果不想用这个防攻击模块了,也很简单,把conf/server/ 目录下站点的配置文件 access_by_lua_file 这一行去掉,即和普通的tengine一样了。

4.3 某个ip被封禁了为什么还有请求过来?

注意这里实行的是宽封禁,即封禁也需要满足token条件,假如规则为ip+uri:/abcd/ 命中被封禁了,则只封这个ip并带有abcd目录的访问,这个ip访问其他页面仍旧不封禁。所以默认策略下token参数越多,封禁力度就越小。 建议读下代码,想改成全封禁也很容易。

如发现bug或者有什么建议,欢迎随时联系caobinbupt@foxmail.com

0x05 项目地址

https://github.com/lanzsec/tengine_waf.git

 

*本文原创作者:lanzbupt,原创稿件转载请注明来自MottoIN

未经允许不得转载: » Tengine WAF 实践

原文链接:http://www.hackdig.com/12/hack-42082.htm

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/21801

(0)
上一篇 2024年5月6日 06:54
下一篇 2024年5月6日 10:09

相关推荐

发表回复

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

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml