Openstar
lua waf,nginx+lua,openresty,luajit,waf+,cdn,nginx
Install / Use
/learn @starjun/OpenstarREADME
title: OpenStar(开心)说明 tags: OpenResty,OpenStar,waf+,云waf,nginx lua grammar_cjkRuby: true
欢迎使用 {OpenStar}(WAF+),该项目是从实际需求中产生,经过多次的版本迭代,实属不易。感谢春哥,以及[春哥][1]的神器([OpenResty][2]) 注意:使用版本一定要大于 1.11.0 因为使用了ngx.var.request_id 代码写的比较好理解,肯定不优雅 哈~
个人的一些开发实践,有需要的朋友可以加入下 ![xq][27]
正在更新说明WIKI篇,已经更新了安装篇,请自行查阅。
更新:规则支持方式
支持并行正则匹配(使用 https://github.com/cloudflare/lua-aho-corasick 实现)
增加:并行正则("aho") -- 列表
"host":[[
"^www.baidu",
".*.baidu.com$"
],
"aho"
]
更新:规则支持方式
现有:等于("") 包含("in") 列表("list") 字典("dict") 正则("jio|jo|***")
增加:开头列表("start_list") -- 以什么什么开头列表
不区分大小写 开头列表("ustart_list")
结尾列表("end_list") -- 以什么什么结尾列表
不区分大小写 结尾列表("uend_list")
包含列表("in_list") -- 包含的列表形式
不区分大小写包含列表("uin_list") --in_list扩展(不区分大小写)
【json 同 list 一样】
增加:长度("len") [Min,Max] 表示大于等于 Min,且小于等于 Max
EG:
"host":[[
"www.baidu.",
"img.baidu."
],
"start_list"
]
"referer":[[0,150],"len"] --- referer 长度 在 0~150 之间
非开源版本 【带后台、带 4 层防护模块等...】完全免费!!!
https://www.kancloud.cn/openstar/install/1136671
变更历史
1.7 更新二阶匹配规则支持取反,动作取消next等
原二阶规则:["baidu","in"],支持取反后:["baidu","in",true];最后的默认是nil也就是false,不取反的意思,所以规则基本可以之间复用,动作为next的需要修改一下即可
1.7.1.11 更新规则匹配等于判断表达式支持("="),post_form支持("*")对所有表单名称进行匹配
["post_form",["(;|-|/)","jio",["*",2],false]] 对表单所有名称的文件名进行匹配
["www.test.com",""]
["www.test.com","="] 新增加表达方式
1.7.1.10 更新支持基于业务属性进行限速的功能
network_Mod: "network":{"maxReqs":30,"pTime":10,"blackTime":600,"guid":"cookie_userguid"},业务代码ngx.var[%guid%],实际上是从ngx.var中去值进行限速操作,所以一定要配置正常;这里表示从cookie中名称为userguid的值进行频率统计来限速。默认则是用ip限速
1.7.1.1 修改 host_Mod 规则匹配
目前只有两种规则(app_ext | network) 请参考 conf_json/host_json/101.200.122.200.json
1.7.0.24 原规则匹配变更:table-->list;list-->dict
方便理解list表示序列,dict表示字典。 EG:
"method":[
{
"POST":true,
"GET":true
},
"dict" --- 原 list
]
"ips": [[
"101.254.241.149",
"106.37.236.170"],
"list" --- 原 table
]
1.6 更新计数count_dict到DB 2,key也进行分开,优化规则缓存
规则进行了缓存,大幅提高性能,json文件保存进行了美化等......
1.5 应一些朋友强烈要求增加Master/Slave模式
主:定时将内存中的配置推送到redis, 从:定时从redis拉取数据到内存后,并保存到文件
1.4 更新命名相关,以多规则匹配
原来url改成uri,args改成query_string,修改的比较多,还有增加app_Mod实现多规则匹配,连接符支持OR
1.3 更新跳转功能,可配置进行set-cookie操作
可以配置某一个或者多个url使用跳转set-cookie操作。cookie是无状态的。
1.2 更新支持拦截外部的csrf
在referer_Mod处,增加action,allow表示允许且后续的规则不用在匹配(一般是静态资源如图片/js/css等),next表示白名单匹配成功后,会继续后面的规则匹配(这里就用于拦截外部的CSRF)增加next是因为原来代码中,若配置了防护站外的CSRF,后续的规则会bypass,所以增加的,这样就不会出现一些绕过问题。
后续的action理论上都支持该语法
1.1 增加app_Mod,丰富allow动作(ip)
网站的某个目录进行IP白名单的访问控制(后台、phpmyadmin等)
0.9 - 1.0 修改了大量全局函数
在学习完[OpenResty最佳实践][7]后,代码太不专业,修改了大量全局变量、函数
0.8 优化一下算法
原来args是遍历每个参数在连接起来,感觉性能有时有点瓶颈,就使用新api取出url中的所有参数,经过测试效果要比原来好很多。
0.7 增加集群版本
当时大约有2-4台OpenStar服务器用于安全防护,通过脚本进行统一管理的,没有进行真正的统一管理,所以抽空的时候把redis用上。
0.6 增加API相关操作
因为是个蹩脚的程序员(没办法,搞安全的现在都被逼的写代码了;感谢春哥,我在写的过程中非常的快乐,所以就把项目叫做OpenStar[开心],请勿见笑了)、前端界面我迟迟没有想好,所以先把一下操作的API封装了,也满足当时公司脚本化需求。
0.4-0.5 增加配置文件操作
刚开始都是写在lua代码中,随着功能增加,决定通过配置文件进行操作,所有就使用json方式进行定义配置文件。
0.3 增加waf防护模块
随着cc防护成功后,我陆续增加了waf相关的功能,规则参考了[modsecurity][8]、[loveshell][9]防护模块、以及互联网搜集的一些过滤点
0.2 CC防护应用层版
通过网络层+应用层的防护后,我后续增加了应用层的安全防护,如应用层set cookie、url跳转、js跳转等这样应用层的防护模块
0.1 CC防护版
当时是为了解决公司的CC攻击,由于一些硬件抗D设备在新的网络环境下(有CDN网络下)无法获取用户真实IP头,我才动手将第一个版本完成,当时功能就是有通过自定义HTTP头获取用户真实ip进行访问频率的限制。(OpenStar可以根据某个url进行频率限制,不仅仅是整个网站的[排除静态文件,如设置了referer_Mod 或者 url_Mod 中资源的allow操作])
TOP
[安装篇][3]
[基础配置说明][4] base.json
[STEP 0:realIpFrom_Mod][10]
[STEP 1:ip_Mod][11]
[STEP 2:host_method_Mod][12]
[STEP 3:rewrite_Mod][13]
[STEP 4:host_Mod][14]
[STEP 5:app_Mod][15]
[STEP 6:referer_Mod][16]
[STEP 7:uri_Mod][17]
[STEP 8:header_Mod][18]
[STEP 9:useragent_Mod][19]
[STEP 10:cookie_Mod][20]
[STEP 11:args_Mod][21]
[STEP 12:post_Mod][22]
[STEP 13:network_Mod][23]
[STEP 14:replace_Mod][24]
一些同学问的比较多的问题:
0:规则组问题 支持IFTTT模式,如条件是(referer中包含baidu 或者 cookie中不包含abc 且useragent正则匹配spider)等等这样复杂的表达式,执行动作也是有多个可以使用(deny allow log refile rehtml relua*)可以定制各种复杂的场景
1:关于多站点的事
使用ngx本身的增加配置文件就不说了,使用动态upstream可以参考我另外的项目https://github.com/starjun/dynamic_upstream-by-balancer 一些接口没有加上去,看看代码自己非常容易搞定了。反向代理的host和后端的IP组都在DICT中(注意是IP组,而不仅仅是类似一些balancer写动态upstream的是一个IP),且支持多种负载均衡方式,相信可以满足大多数需求。https的后面有时间我在完善下。
2:集群相关(提供了Master/Slave配置)
目前openstar是支持集群的,规则同步和下发等都是提供了api,都是被动方式,规则为什么没有放到redis中,请自己测试一下,每次规则过滤都从redis取后在序列化,和从dict取在序列化,自己动手测试看性能,顺便说下,规则在集群下当然存在redis中,都是通过api进行操作更新到dict中,而不是每次都从redis中取,且最近增加了定时从redis拉取配置功能(测试中...)
3:如有一些技术类问题,请尽量完整一些,包括ngx配置文件,和比较完整的代码,不然真心不好作答,有时间我会尽量回复(不一定是对的),没时间回复的请谅解。
admin@17173.com邮箱已经没有在用了,请不要给这个发邮箱啦。
TODO
无
商业版说明:
支持域名管理,支持geoip(按国家,城市进行拦截等),支持SQL语义分析(功能完善中),更强大的api接口,默认规则更强大等等
CC防护、防抓取、刷单等防护算法:
CC攻击点:
a:用户可直接访问的url(搜索请求[数据库查询],高计算[cpu计算],随机url[耗连接]等)
b:嵌入类型的url(嵌入的验证码url[CPU计算]、ajax判断用户是否存在的url[数据库查询]等)
c:非浏览器类型的接口(一些公共API、WEBservice等无SDK的接口)
d:特定语言、服务器的攻击(php dos、慢速攻击等)
我提供的防护算法是用于防护a、b类型的攻击,a类型防护启用时,可以先生成一个添加标记的跳转页面,b类型防护启用时,动态对其渲染页面进行标记的添加,c类型有sdk,自己写代码支持自己设定的防护算法的不是问题。
js静态、动态验证:
跳转页面/渲染页面对下一次请求的url进行标记增加(openstar已经实现的增加url尾巴),增加一个get的args参数,参数名称和值都是由服务器产生或者前端页面js产生,如对下一次请求的url增加cc=1ldldj这个尾巴,服务端判断合法性有静态的正则判断值的合法性,有动态的判断值是否由服务器生成的,合法性检查更加严格。
js增强:(获取鼠标轨迹、鼠标点击事件、随机延迟、基于特定浏览器对js的方言)
普通的js一些攻击软件或者爬虫工具是可以分析执行的,故可以进行js增加,如判断鼠标轨迹、鼠标点击事件这些事件判断失败就不会进行下一步请求;如基于浏览器的js方言,一些浏览器会有自己的方言,那些爬虫工具和攻击工具是不可能解析js方言的,就不会进行下一步请求;还有使用js随机延迟函数,用于下一次请求的时间分流,这样请求频率就会被分开,这样就缓解了请求频率,以及结合鼠标轨迹和鼠标事件判断,可以很好的识别工具和人。
浏览器指纹:(对浏览器会生成一个唯一指纹,从而判断链式请求指纹的一致性) 广告厂商来做这件事就事半功倍了,毕竟浏览器指纹在整个互联网的数据还是很有参考价值的,毕竟不是要指纹对应的广告标签等这些商业价值数据,仅是需要一个指纹的信誉库(同IP信誉库类似,当然也有时效性),因为CC攻击和一些爬虫、刷单工具在互联网上的指纹还是非常清晰的。 情况可以公司可以建立自己的体系,对CC攻击、页面抓取、刷单是有相当大的帮助的,以后各大公司可以共享这些浏览器指纹数据,组成一个联盟也行,从而判断该指纹是否是真实用户等一些可用数据。
http://123.57.220.116/fgjs2.html 看看自己的浏览器指纹吧(如果访问不了,哈,我买的ECS过期了!)
参考:https://github.com/Valve/fingerprintjs2
控件/浏览器防护:
使用js进行下一次请求的跳转,以及增强的鼠标轨迹、鼠标事件、浏览器js方言等这些判断还是有一定的缺陷,故可以直接使用控件方式、或者和浏览器合作(浏览器支持这种防护标记)
PS:简单举个例子
http://www.cc.com?cc=@{"api":"http://1.1.1.1/cc/api","key":"iodjdjkdldskl"}@
http://www.cc.com?cc=@{"api":"tcp://1.1.1.1:908","key":"iodjdjkdldskl"}@
http://www.cc.com?cc=@{"api":"local","key":"1:2345:44"}@
跳转页面或者渲染页面,控件/浏览器是可以识别@中间的内容的,向这个api使用key取到一个值,下一次请求带上这个值。
i:set 一个cookie,其合法性是由控件和web服务器双向约定或加密产生,从而判断下一次请求是否合法
ii:增加args参数尾巴,其value值合法性由控件和web服务器双向约定或加密产生,从而判断下一次请求是否合法
iii:增加POST参数,其value值合法性由控件和web服务器双向约定或加密产生,等等对下一次请求进行验证增加
重点
这些防护算法我正在申请相关专利,个人用户以后永久免费的,仅对企业收费,请抄袭党,无耻公司放过小弟一码。
这些防护算法我正在申请相关专利,个人用户以后永久免费的,仅对企业收费,请抄袭党,无耻公司放过小弟一码。
这些防护算法我正在申请相关专利,个人用户以后永久免费的,仅对企业收费,请抄袭党,无耻公司放过小弟一码。
概览
OpenStar是一个基于[OpenResty][2]的,高性能WAF,还相应增加了其他灵活、友好、实用的功能,是增强的WAF。 app_Mod 支持规则组 连接符支持 or , 参考doc/demo.md文档
WAF防护
在OpenStar中的WAF防护模块,采用传统的字符串的匹配如正则过滤、包含等(有人会问现在不是流行自主学习么;正则、包含等会有盲点、会被绕过;WAF的误报和漏报问题等等......)。规则不是万能的,但是没有规则是万万不能的 这里我简单说明一下,自主分析学习引擎是我们的日志分析引擎做的(预留了api可实时增加拦截),这里是高性能、高并发的点,就用简单快速的方法解决,且根据业务实际调整好防护策略,可以解决绝大多数WEB安全1.0和WEB安全2.0类型的漏洞(90%+的问题)。 WAF 防护从header,args,post,访问频率等,分层进行按顺序防护,详细在后面的功能会详细说明
-
WEB安全1.0 在1.0时代下,攻击是通过服务器漏洞(IIS6溢出等)、WEB应用漏洞(SQL注入、文件上传、命令执行、文件包含等)属于服务器类的攻击,该类型漏洞虽然经历了这么多年,很遗憾,此类漏洞还是存在,并且重复在犯相同的错误。
-
WEB安全2.0 随着社交网络的兴起,原来不被重视的XSS、CSRF等漏洞逐渐进入人们的视野,那么在2.0时代,漏洞利用的思想将更重要,发挥你的想象,可以有太多可能。
-
WEB安全3.0 同开发设计模式类似(界面、业务逻辑、数据),3.0将关注应用本身的业务逻辑和数据安全,如密码修改绕过、二级密码绕过、支付类漏洞、刷钱等类型的漏洞,故注重的是产品本身的业务安全、数据安全、风控安全等。
安全不仅仅是在技术层面、还应该在行政管理层面、物理层面去做好安全的防护,才能提供最大限度的保护。安全行业多年的从业经验:人,才是最大的威胁;无论是外部、内部、无心、有意过失。(没有丑女人、只有懒女人)我想可以套用在此处,纯属个人见解。
CC/采集防护
什么是CC攻击,简单的说一下,就是用较少的代价恶意请求web(应用)中的重资源消耗点(CPU/IO/数据库等等)从而达到拒绝服务的目的;数据采集,就是内容抓取了,简单这么理解吧
非官方学术类的解释,先将就理解下关于本文对CC攻击的分析和相关的防护算法,都是我在实战中分析总结,并形成自己的方法论,不足之处、欢迎指正。
攻击类型
-
行为(GET、POST等) 目前主要还是这两中method攻击为主,其他的少之又少。
-
被攻击的点
1:用户可直接访问的URL(搜索、重CPU计算、IO、数据库操作等)
2:嵌入的URL(验证码、ajax接口等)
3:面向非浏览器的接口(一些API、WEBservice等)
4:基于特定web服务、语言等的特定攻击(慢速攻击、PHP-dos等)
面对CC攻击我们需要根据实际情况采用不同的防护算法,比如攻击的点是一个ajax点,你使用js跳转/验证码肯定就有问题
防护方法
-
网络层 通过访问ip的频率、统计等使用阀值的方式进行频率和次数的限制,黑名单方式
-
网络层+应用层 在后来的互联网网络下,有了的CDN加入,现在增加的网络层的防护需要扩展,那么统计的IP将是在HTTP头中的IP,仍然使用频率、次数、黑名单的方式操作。
但是很多厂家的硬件流量清洗等设备,有的获取用户真实IP从HTTP头中取的是固定字段(X-FOR-F),不能自定义,更甚至有的厂家就没有该功能,这里就不说具体的这些厂家名字了PS: 在传统的4层防护上,是没有问题的
- 应用层 TAG验证、SET COOKIE、URL跳转、JS跳转、验证码、页面嵌套、强制静态缓存等 防护是需要根据攻击点进行分别防护的,如攻击的是嵌入的url,我们就不能使用JS跳转、302验证码等这样的方法;在多次的CC防护实战中,如使用url跳转、set cookie,在新型的CC攻击下,这些防护都已经失效了。后面我会分享一下我的防护算法,并且在OpenStar中已经可以根据情况实现我所说的防护算法。 浏览器是可以执行JS和flash的,这里我分享一些基于JS的防护算法,flash需要自己去写(比js复杂一些),可以实现flash应用层的安全防护和防页面抓取(开动你的大脑吧)
1:客户端防护
使用JS进行前端的防护(浏览器识别、鼠标轨迹判断、url有规则添加尾巴(args参数)、随机延迟、鼠标键盘事件获取等)其实这里非常复杂,如浏览器的识别 ie 支持 !-[1,] 这个特殊JS,一些JS方言,一些浏览器有自定义标签等等;
2:服务端防护 url添加的尾巴(args参数)是服务器动态生成的token,而不是使用静态的正则去匹配其合法性。
3:特定攻击 该类特定攻击,可以通过特征快速匹配出来(慢速攻击、PHP5.3的http头攻击)
简单场景
1:用户可直接访问的url(这种是最好防的)
第一阶段:
-
网络层:访问频率限制,超出阀值仅黑名单一段时间
-
应用层:js跳转、验证码、flash策略(拖动识别等)
2:嵌入的url(ajax校验点、图片验证码)
第一阶段:
-
网络层:访问频率限制,超出阀值仅黑名单一段时间
-
应用层:载入被攻击的url页面,重写页面,使用js方操作链接被攻击的url。js随机在url尾巴增加有一定规则的校验串,服务端对串进行静态正则校验。
第二阶段:
-
网络层+应用层:用户ip在http头中,需要从http头取ip,在进行频率限制 (其实做好了,这一层的防护,基本不用进入第三阶段的应用层防护了)
-
应用层:校验串使用服务端生成的token,进行严格服务器token验证检查
第三阶段:
- 应用层:js增加浏览器识别(不同agent匹配不同JS方言代码)、JS随机延迟、鼠标轨迹验证、键盘鼠标事件验证等js增加验证后,在进行校验串生成。
说明:多次实战CC处理经验,很少到第三阶段,当然储备好这些JS脚本非常重要,纯JS肯定也是有限的,所有我就提出了使用控件,甚至是和浏览器厂商合作等更精准的防护方法。这样对CC攻击、页面抓取、刷单等有非常好的防护效果。
应用层的防护是在网络层+扩展的网络层防护效果不佳时使用,一般情况基本用的不多,因为在OpenStar的防护下,极少数情况下,需要第三阶段防护。在防页面抓取时,发挥你的想象(js是个好帮手,善用)使用OpenStar就可以帮你快速实现;当然使用flash防抓取效果更好(不够灵活)。
目录
后续更新!~
下载
wget
git clone
已经打包的一些脚本,请参考bash目录
安装
- 安装OpenResty 这里不做过多重复描述,直接看链接[OpenResty][2]
- 配置nginx.conf 在http节点,引用waf.conf。注:原ngx相关配置基本不用修改,该优化优化、该做CPU亲缘绑定继续、该动静分离还继续、该IO、TIME等优化继续不要停。
- 配置waf.conf 修改lua_package_path,使用正确的路径即可;修改那些lua文件的路径,多检查几遍。
- 设置目录权限 OpenStar目录建议放到OR下,方便操作,该目录ngx运行用户有读写执行权限即可。因为要写日志,暂时没有用ngx.log,后续可能会改动。
- lua文件修改 在init.lua中,修改conf_json参数,base.json文件绝对路径根据自己的情况写正确。
- ap
Related Skills
node-connect
340.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
340.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.1kCommit, push, and open a PR
