在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):starjun/openstar开源软件地址(OpenSource Url):https://github.com/starjun/openstar开源编程语言(OpenSource Language):Lua 83.1%开源软件介绍(OpenSource Introduction):
欢迎使用 {OpenStar}(WAF+),该项目是从实际需求中产生,经过多次的版本迭代,实属不易。感谢春哥,以及春哥的神器(OpenResty) 注意:使用版本一定要大于 1.11.0 因为使用了ngx.var.request_id 代码写的比较好理解,肯定不优雅 哈~ 正在更新说明WIKI篇,已经更新了安装篇,请自行查阅。 更新:规则支持方式
更新:规则支持方式
非开源版本 【带后台、带 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支持("*")对所有表单名称进行匹配
1.7.1.10 更新支持基于业务属性进行限速的功能network_Mod: 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:
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, 1.1 增加app_Mod,丰富allow动作(ip)网站的某个目录进行IP白名单的访问控制(后台、phpmyadmin等) 0.9 - 1.0 修改了大量全局函数在学习完OpenResty最佳实践后,代码太不专业,修改了大量全局变量、函数 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、loveshell防护模块、以及互联网搜集的一些过滤点 0.2 CC防护应用层版通过网络层+应用层的防护后,我后续增加了应用层的安全防护,如应用层set cookie、url跳转、js跳转等这样应用层的防护模块 0.1 CC防护版当时是为了解决公司的CC攻击,由于一些硬件抗D设备在新的网络环境下(有CDN网络下)无法获取用户真实IP头,我才动手将第一个版本完成,当时功能就是有通过自定义HTTP头获取用户真实ip进行访问频率的限制。(OpenStar可以根据某个url进行频率限制,不仅仅是整个网站的[排除静态文件,如设置了referer_Mod 或者 url_Mod 中资源的allow操作]) TOP基础配置说明 base.json 一些同学问的比较多的问题: 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配置文件,和比较完整的代码,不然真心不好作答,有时间我会尽量回复(不一定是对的),没时间回复的请谅解。 [email protected]邮箱已经没有在用了,请不要给这个发邮箱啦。 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增加 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方言等这些判断还是有一定的缺陷,故可以直接使用控件方式、或者和浏览器合作(浏览器支持这种防护标记)
i:set 一个cookie,其合法性是由控件和web服务器双向约定或加密产生,从而判断下一次请求是否合法 ii:增加args参数尾巴,其value值合法性由控件和web服务器双向约定或加密产生,从而判断下一次请求是否合法 iii:增加POST参数,其value值合法性由控件和web服务器双向约定或加密产生,等等对下一次请求进行验证增加 重点这些防护算法我正在申请相关专利,个人用户以后永久免费的,仅对企业收费,请抄袭党,无耻公司放过小弟一码。 这些防护算法我正在申请相关专利,个人用户以后永久免费的,仅对企业收费,请抄袭党,无耻公司放过小弟一码。 这些防护算法我正在申请相关专利,个人用户以后永久免费的,仅对企业收费,请抄袭党,无耻公司放过小弟一码。 概览OpenStar是一个基于OpenResty的,高性能WAF,还相应增加了其他灵活、友好、实用的功能,是增强的WAF。 app_Mod 支持规则组 连接符支持 or , 参考doc/demo.md文档 WAF防护在OpenStar中的WAF防护模块,采用传统的字符串的匹配如正则过滤、包含等(有人会问现在不是流行自主学习么;正则、包含等会有盲点、会被绕过;WAF的误报和漏报问题等等......)。规则不是万能的,但是没有规则是万万不能的 这里我简单说明一下,自主分析学习引擎是我们的日志分析引擎做的(预留了api可实时增加拦截),这里是高性能、高并发的点,就用简单快速的方法解决,且根据业务实际调整好防护策略,可以解决绝大多数WEB安全1.0和WEB安全2.0类型的漏洞(90%+的问题)。 WAF 防护从header,args,post,访问频率等,分层进行按顺序防护,详细在后面的功能会详细说明
CC/采集防护什么是CC攻击,简单的说一下,就是用较少的代价恶意请求web(应用)中的重资源消耗点(CPU/IO/数据库等等)从而达到拒绝服务的目的;数据采集,就是内容抓取了,简单这么理解吧
攻击类型
防护方法
1:客户端防护
使用JS进行前端的防护(浏览器识别、鼠标轨迹判断、url有规则添加尾巴(args参数)、随机延迟、鼠标键盘事件获取等)其实这里非常复杂,如浏览器的识别 ie 支持 2:服务端防护 url添加的尾巴(args参数)是服务器动态生成的token,而不是使用静态的正则去匹配其合法性。 3:特定攻击 该类特定攻击,可以通过特征快速匹配出来(慢速攻击、PHP5.3的http头攻击) 简单场景 1:用户可直接访问的url(这种是最好防的) 第一阶段:
2:嵌入的url(ajax校验点、图片验证码) 第一阶段:
第二阶段:
第三阶段:
说明:多次实战CC处理经验,很少到第三阶段,当然储备好这些JS脚本非常重要,纯JS肯定也是有限的,所有我就提出了使用控件,甚至是和浏览器厂商合作等更精准的防护方法。这样对CC攻击、页面抓取、刷单等有非常好的防护效果。
目录后续更新!~ 下载wget git clone 已经打包的一些脚本,请参考bash目录 安装
已经打包的一些脚本,请参考bash目录,运行前请阅读一下,感谢好友余总帮助写的脚本 使用配置规则一般情况下匹配某一规则由3个参数组成,第二个参数标识第一个参数类型,第三个参数表示是否取反,默认为 hostname: ==>表示匹配所有域名(使用字符串匹配,非正则,非常快) hostname: ==>表示使用正则匹配host(ngx.re.find($host,参数1,参数2)) hostname: ==>表示匹配参数1 列表 中所有host hostname: ==>表示匹配 字典 中host为true的host uri: ==>表示匹配uri中包含/admin的所有uri都会被匹配(string.find($uri,参数1,1,true)) ip: ==>表示匹配的ip在这两组ip段/ip中 args: 说明:第3个参数表示取args参数table的key名称,第3个参数2表示取args[args_name]为table时,匹配任意(all),匹配最后一个(end),匹配第几个(数字),默认取第一个 ==>表示匹配的GET的args参数名为args_name,使用第4个参数模式进行匹配,匹配规则就是第一个和二个参数。其中第1、2参数支持前面描述的规则方式。 table类型的匹配规则比较麻烦,暂时想着是这样处理,有好的想法可以告诉我 执行流程
a:首先加载本地的base.json配置文件,将相关配置读取到config_dict,host_dict,ip_dict中
0:realIpFrom_Mod ==> 获取用户真实IP(从HTTP头获取,如设置) 1:ip_Mod ==> 请求ip的黑/白名单、log记录 2:host_method_Mod ==> host和method过滤(白名单) 3:rewrite_Mod ==> 跳转模块,set-cookie操作 4:host_Mod ==> 对应host执行的规则过滤(uri,referer,useragent等)
5:app_Mod ==> 用户自定义应用层过滤 6:referer_Mod ==> referer过滤(黑/白名单、log记录) 7:uri_Mod ==> uri过滤(黑/白名单、log记录) 8:header_Mod ==> header过滤(黑名单) 9:useragent_Mod ==> useragent过滤(黑/白名单、log记录) 10:cookie_Mod ==> cookie过滤(黑/白名单、log记录) 11:args_Mod ==> args参数过滤[实际是query_string](黑/白名单、log记录) 12:post_Mod ==> post参数过滤[实际是整个post内容](黑/白名单、log记录) 13:network_Mod ==> 应用层网络频率限制(频率黑名单)
14:replace_Mod ==> 内容替换规则(动态进行内容替换,性能消耗较高慎用,可以的话用app_Mod中rehtml、refile这2个自定义action) STEP 0 : realIpFrom_Mod
通过上面的例子,表示域名id.game.com,从ips来的直连ip,用户真实ip在x-for-f中,ips是支持二阶匹配,可以参考例子进行设置,ips为*时,表示不区分直连ip了。 STEP 1:ip_Mod(黑/白名单、log记录)
上面的例子,表示ip为111.206.199.61(从http头获取,如设置)白名单 action可以取值[allow、deny],deny表示黑名单;第二个就表示对应host的ip黑/白名单,其他host不受影响。 STEP 2:host_method_Mod(白名单)
上面的例子表示,规则开启,host为id.game.com、127.0.0.1允许的method是GET和POST state:表示规则是否开启 method:表示允许的method,参数2标识参数1是字符串、列表(list)、正则、字典(dict) hostname:表示匹配的host,规则同上
STEP 3: rewrite_Mod(跳转模块)
上面的例子表示规则启用,host为101.200.122.200,且url匹配成功的进行302/307跳转,同时设置一个无状态cookie,名称是token。action中第二个参数是用户ip+和改参数进行md5计算的。请自行使用一个无意义字符串。防止攻击者猜测出生成算法。 STEP 4:host_Mod
STEP 5:app_Mod(自定义action)
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论