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部分组成:
第一部分为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