{"id":15028595,"url":"https://github.com/starjun/openstar","last_synced_at":"2025-05-16T05:05:08.547Z","repository":{"id":42941036,"uuid":"59126869","full_name":"starjun/openstar","owner":"starjun","description":"lua waf,nginx+lua,openresty,luajit,waf+,cdn,nginx","archived":false,"fork":false,"pushed_at":"2021-10-10T12:38:05.000Z","size":35648,"stargazers_count":1266,"open_issues_count":4,"forks_count":422,"subscribers_count":89,"default_branch":"master","last_synced_at":"2025-04-08T15:06:35.852Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Lua","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/starjun.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-05-18T15:11:53.000Z","updated_at":"2025-04-01T07:50:02.000Z","dependencies_parsed_at":"2022-07-19T08:47:25.312Z","dependency_job_id":null,"html_url":"https://github.com/starjun/openstar","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starjun%2Fopenstar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starjun%2Fopenstar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starjun%2Fopenstar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/starjun%2Fopenstar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/starjun","download_url":"https://codeload.github.com/starjun/openstar/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254471061,"owners_count":22076585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T20:08:42.753Z","updated_at":"2025-05-16T05:05:03.540Z","avatar_url":"https://github.com/starjun.png","language":"Lua","funding_links":[],"categories":["Lua","Resources"],"sub_categories":["Web Plataforms"],"readme":"---\ntitle: OpenStar(开心)说明\ntags: OpenResty,OpenStar,waf+,云waf,nginx lua\ngrammar_cjkRuby: true\n\n---\n\n欢迎使用 **{OpenStar}(WAF+)**，该项目是从实际需求中产生，经过多次的版本迭代，实属不易。感谢**春哥**，以及[春哥][1]的神器（**[OpenResty][2]**）\n注意：使用版本一定要大于 1.11.0 因为使用了ngx.var.request_id\n**代码写的比较好理解，肯定不优雅  哈~**\n\n个人的一些开发实践，有需要的朋友可以加入下\n![xq][27]\n\n正在更新说明WIKI篇,已经更新了安装篇，请自行查阅。\n\n更新：规则支持方式\n```\n支持并行正则匹配(使用 https://github.com/cloudflare/lua-aho-corasick 实现)\n增加：并行正则(\"aho\") -- 列表\n\"host\":[[\n          \"^www.baidu\",\n          \".*.baidu.com$\"\n        ],\n            \"aho\"\n        ]\n```\n\n更新：规则支持方式\n```\n现有：等于(\"\") 包含(\"in\") 列表(\"list\") 字典(\"dict\") 正则(\"jio|jo|***\")\n增加：开头列表(\"start_list\") -- 以什么什么开头列表\n      不区分大小写 开头列表(\"ustart_list\")\n      结尾列表(\"end_list\")  -- 以什么什么结尾列表\n      不区分大小写 结尾列表(\"uend_list\")\n      包含列表(\"in_list\")   -- 包含的列表形式\n      不区分大小写包含列表(\"uin_list\")  --in_list扩展(不区分大小写)\n      【json 同 list 一样】\n增加：长度(\"len\") [Min,Max] 表示大于等于 Min,且小于等于 Max\nEG：\n\"host\":[[\n          \"www.baidu.\",\n          \"img.baidu.\"\n        ],\n            \"start_list\"\n        ]\n\"referer\":[[0,150],\"len\"]   --- referer 长度 在 0~150 之间\n```\n\n# 非开源版本 【带后台、带 4 层防护模块等...】完全免费！！！\nhttps://www.kancloud.cn/openstar/install/1136671\n\n\n# 变更历史\n\n## 1.7 更新二阶匹配规则支持取反，动作取消next等\n原二阶规则：[\"baidu\",\"in\"],支持取反后：[\"baidu\",\"in\",true];最后的默认是nil也就是false,不取反的意思，所以规则基本可以之间复用，动作为next的需要修改一下即可\n\n## 1.7.1.11 更新规则匹配等于判断表达式支持(\"=\"),post_form支持(\"*\")对所有表单名称进行匹配\n```\n[\"post_form\",[\"(;|-|/)\",\"jio\",[\"*\",2],false]] 对表单所有名称的文件名进行匹配\n\n[\"www.test.com\",\"\"]\n[\"www.test.com\",\"=\"] 新增加表达方式\n\n```\n\n\n## 1.7.1.10 更新支持基于业务属性进行限速的功能\nnetwork_Mod: `\"network\":{\"maxReqs\":30,\"pTime\":10,\"blackTime\":600,\"guid\":\"cookie_userguid\"}`，业务代码ngx.var[%guid%]，实际上是从ngx.var中去值进行限速操作，所以一定要配置正常；这里表示从cookie中名称为userguid的值进行频率统计来限速。默认则是用ip限速\n\n### 1.7.1.1 修改 host_Mod 规则匹配\n目前只有两种规则（app_ext | network） 请参考 conf_json/host_json/101.200.122.200.json\n\n### 1.7.0.24 原规则匹配变更：table--\u003elist;list--\u003edict\n方便理解list表示序列，dict表示字典。\nEG：\n```\n\"method\":[\n            {\n                \"POST\":true,\n                \"GET\":true\n            },\n            \"dict\" --- 原 list\n        ]\n\"ips\": [[\n            \"101.254.241.149\",\n            \"106.37.236.170\"],\n            \"list\" --- 原 table\n        ]\n```\n\n## 1.6 更新计数count_dict到DB 2,key也进行分开，优化规则缓存\n规则进行了缓存，大幅提高性能，json文件保存进行了美化等......\n\n## 1.5 应一些朋友强烈要求增加Master/Slave模式\n主：定时将内存中的配置推送到redis, 从：定时从redis拉取数据到内存后，并保存到文件\n\n## 1.4 更新命名相关，以多规则匹配\n原来url改成uri，args改成query_string，修改的比较多，还有增加app_Mod实现多规则匹配，连接符支持OR\n\n## 1.3 更新跳转功能，可配置进行set-cookie操作\n可以配置某一个或者多个url使用跳转set-cookie操作。cookie是无状态的。\n\n## 1.2 更新支持拦截外部的csrf\n在referer_Mod处，增加action，`allow`表示允许且后续的规则不用在匹配（一般是静态资源如图片/js/css等），`next`表示白名单匹配成功后，会继续后面的规则匹配（这里就用于拦截外部的CSRF）增加`next`是因为原来代码中，若配置了防护站外的CSRF，后续的规则会bypass,所以增加的，这样就不会出现一些绕过问题。\n**后续的action理论上都支持该语法**\n\n## 1.1 增加app_Mod,丰富allow动作（ip）\n网站的某个目录进行IP白名单的访问控制（后台、phpmyadmin等）\n\n## 0.9 - 1.0 修改了大量全局函数\n在学习完[OpenResty最佳实践][7]后，代码太不专业，修改了大量全局变量、函数\n\n## 0.8 优化一下算法\n原来args是遍历每个参数在连接起来，感觉性能有时有点瓶颈，就使用新api取出url中的所有参数，经过测试效果要比原来好很多。\n\n## 0.7 增加集群版本\n当时大约有2-4台OpenStar服务器用于安全防护，通过脚本进行统一管理的，没有进行真正的统一管理，所以抽空的时候把redis用上。\n\n## 0.6 增加API相关操作\n因为是个蹩脚的程序员（没办法，搞安全的现在都被逼的写代码了；感谢春哥，我在写的过程中非常的快乐，所以就把项目叫做OpenStar[开心]，请勿见笑了）、前端界面我迟迟没有想好，所以先把一下操作的API封装了，也满足当时公司脚本化需求。\n\n## 0.4-0.5 增加配置文件操作\n刚开始都是写在lua代码中，随着功能增加，决定通过配置文件进行操作，所有就使用json方式进行定义配置文件。\n\n## 0.3 增加waf防护模块\n随着cc防护成功后，我陆续增加了waf相关的功能，规则参考了[modsecurity][8]、[loveshell][9]防护模块、以及互联网搜集的一些过滤点\n\n## 0.2 CC防护应用层版\n通过网络层+应用层的防护后，我后续增加了应用层的安全防护，如应用层set cookie、url跳转、js跳转等这样应用层的防护模块\n\n## 0.1 CC防护版\n当时是为了解决公司的CC攻击，由于一些硬件抗D设备在新的网络环境下（有CDN网络下）无法获取用户真实IP头，我才动手将第一个版本完成，当时功能就是有通过自定义HTTP头获取用户真实ip进行访问频率的限制。（OpenStar可以根据某个url进行频率限制，不仅仅是整个网站的[排除静态文件，如设置了referer\\_Mod 或者 url\\_Mod 中资源的allow操作]）\n\n# TOP\n\n[安装篇][3]\n\n[基础配置说明][4] base.json\n\n[STEP 0：realIpFrom_Mod][10]\n\n[STEP 1：ip_Mod][11]\n\n[STEP 2：host_method_Mod][12]\n\n[STEP 3：rewrite_Mod][13]\n\n[STEP 4：host_Mod][14]\n\n[STEP 5：app_Mod][15]\n\n[STEP 6：referer_Mod][16]\n\n[STEP 7：uri_Mod][17]\n\n[STEP 8：header_Mod][18]\n\n[STEP 9：useragent_Mod][19]\n\n[STEP 10：cookie_Mod][20]\n\n[STEP 11：args_Mod][21]\n\n[STEP 12：post_Mod][22]\n\n[STEP 13：network_Mod][23]\n\n[STEP 14：replace_Mod][24]\n\n\n一些同学问的比较多的问题：\n\n0：规则组问题\n支持IFTTT模式，如条件是（referer中包含baidu 或者 cookie中不包含abc 且useragent正则匹配spider）等等这样复杂的表达式，执行动作也是有多个可以使用(deny allow log refile rehtml relua*)可以定制各种复杂的场景\n\n\n1：关于多站点的事\n\n使用ngx本身的增加配置文件就不说了，使用动态upstream可以参考我另外的项目https://github.com/starjun/dynamic_upstream-by-balancer\n一些接口没有加上去，看看代码自己非常容易搞定了。反向代理的host和后端的IP组都在DICT中（注意是IP组，而不仅仅是类似一些balancer写动态upstream的是一个IP），且支持多种负载均衡方式，相信可以满足大多数需求。https的后面有时间我在完善下。\n\n2：集群相关(提供了Master/Slave配置)\n\n目前openstar是支持集群的，规则同步和下发等都是提供了api，都是被动方式，规则为什么没有放到redis中，请自己测试一下，每次规则过滤都从redis取后在序列化，和从dict取在序列化，自己动手测试看性能，顺便说下，规则在集群下当然存在redis中，都是通过api进行操作更新到dict中，而不是每次都从redis中取，且最近增加了定时从redis拉取配置功能（测试中...）\n\n3：如有一些技术类问题，请尽量完整一些，包括ngx配置文件，和比较完整的代码，不然真心不好作答，有时间我会尽量回复（不一定是对的），没时间回复的请谅解。\n\nadmin@17173.com邮箱已经没有在用了，请不要给这个发邮箱啦。\n\n## TODO ##\n\n  无\n\n  商业版说明：\n\n  **支持域名管理，支持geoip（按国家，城市进行拦截等），支持SQL语义分析(功能完善中)，更强大的api接口，默认规则更强大等等**\n\n----------\n\nCC防护、防抓取、刷单等防护算法：\n\nCC攻击点：\n\na：用户可直接访问的url(搜索请求[数据库查询]，高计算[cpu计算]，随机url[耗连接]等)\n\nb：嵌入类型的url(嵌入的验证码url[CPU计算]、ajax判断用户是否存在的url[数据库查询]等)\n\nc：非浏览器类型的接口(一些公共API、WEBservice等无SDK的接口)\n\nd：特定语言、服务器的攻击(php dos、慢速攻击等)\n\n我提供的防护算法是用于防护a、b类型的攻击，a类型防护启用时，可以先生成一个添加标记的跳转页面，b类型防护启用时，动态对其渲染页面进行标记的添加，c类型有sdk，自己写代码支持自己设定的防护算法的不是问题。\n\njs静态、动态验证：\n\n跳转页面/渲染页面对下一次请求的url进行标记增加（openstar已经实现的增加url尾巴），增加一个get的args参数，参数名称和值都是由服务器产生或者前端页面js产生，如对下一次请求的url增加`cc=1ldldj`这个尾巴，服务端判断合法性有静态的正则判断值的合法性，有动态的判断值是否由服务器生成的,合法性检查更加严格。\n\njs增强：（获取鼠标轨迹、鼠标点击事件、随机延迟、基于特定浏览器对js的方言）\n\n普通的js一些攻击软件或者爬虫工具是可以分析执行的，故可以进行js增加，如判断鼠标轨迹、鼠标点击事件这些事件判断失败就不会进行下一步请求；如基于浏览器的js方言，一些浏览器会有自己的方言，那些爬虫工具和攻击工具是不可能解析js方言的，就不会进行下一步请求；还有使用js随机延迟函数，用于下一次请求的时间分流，这样请求频率就会被分开，这样就缓解了请求频率，以及结合鼠标轨迹和鼠标事件判断，可以很好的识别工具和人。\n\n浏览器指纹：（对浏览器会生成一个唯一指纹，从而判断链式请求指纹的一致性）\n广告厂商来做这件事就事半功倍了，毕竟浏览器指纹在整个互联网的数据还是很有参考价值的，毕竟不是要指纹对应的广告标签等这些商业价值数据，仅是需要一个指纹的信誉库（同IP信誉库类似，当然也有时效性），因为CC攻击和一些爬虫、刷单工具在互联网上的指纹还是非常清晰的。\n情况可以公司可以建立自己的体系，对CC攻击、页面抓取、刷单是有相当大的帮助的，以后各大公司可以共享这些浏览器指纹数据，组成一个联盟也行，从而判断该指纹是否是真实用户等一些可用数据。\n\nhttp://123.57.220.116/fgjs2.html 看看自己的浏览器指纹吧(如果访问不了，哈，我买的ECS过期了！)\n\n参考：https://github.com/Valve/fingerprintjs2\n\n\n控件/浏览器防护:\n\n使用js进行下一次请求的跳转，以及增强的鼠标轨迹、鼠标事件、浏览器js方言等这些判断还是有一定的缺陷，故可以直接使用控件方式、或者和浏览器合作（浏览器支持这种防护标记）\n\n\n```\nPS：简单举个例子\nhttp://www.cc.com?cc=@{\"api\":\"http://1.1.1.1/cc/api\",\"key\":\"iodjdjkdldskl\"}@\nhttp://www.cc.com?cc=@{\"api\":\"tcp://1.1.1.1:908\",\"key\":\"iodjdjkdldskl\"}@\nhttp://www.cc.com?cc=@{\"api\":\"local\",\"key\":\"1:2345:44\"}@\n跳转页面或者渲染页面，控件/浏览器是可以识别@中间的内容的，向这个api使用key取到一个值，下一次请求带上这个值。\n\n```\n\ni：set 一个cookie,其合法性是由控件和web服务器双向约定或加密产生，从而判断下一次请求是否合法\n\nii：增加args参数尾巴，其value值合法性由控件和web服务器双向约定或加密产生，从而判断下一次请求是否合法\n\niii：增加POST参数，其value值合法性由控件和web服务器双向约定或加密产生，等等对下一次请求进行验证增加\n\n## 重点 ##\n\n这些防护算法我正在申请相关专利，个人用户以后永久免费的，仅对企业收费，请抄袭党，无耻公司放过小弟一码。\n\n这些防护算法我正在申请相关专利，个人用户以后永久免费的，仅对企业收费，请抄袭党，无耻公司放过小弟一码。\n\n这些防护算法我正在申请相关专利，个人用户以后永久免费的，仅对企业收费，请抄袭党，无耻公司放过小弟一码。\n\n\n# 概览\n\n\n----------\n\n\n**OpenStar**是一个基于[OpenResty][2]的，高性能WAF，还相应增加了其他灵活、友好、实用的功能，是增强的WAF。\n**app_Mod 支持规则组 连接符支持 or , 参考doc/demo.md文档**\n# WAF防护\n\n\n----------\n\n\n在**OpenStar**中的WAF防护模块，采用传统的字符串的匹配如正则过滤、包含等（*有人会问现在不是流行自主学习么；正则、包含等会有盲点、会被绕过；WAF的误报和漏报问题等等......*）。**规则不是万能的，但是没有规则是万万不能的** 这里我简单说明一下，自主分析学习引擎是我们的日志分析引擎做的（预留了api可实时增加拦截），这里是高性能、高并发的点，就用简单快速的方法解决，且根据业务实际调整好防护策略，可以解决绝大多数WEB安全1.0和WEB安全2.0类型的漏洞（90%+的问题）。\nWAF 防护从header,args,post,访问频率等，分层进行按顺序防护，详细在后面的功能会详细说明\n\n - **WEB安全1.0**\n   在1.0时代下，攻击是通过服务器漏洞（IIS6溢出等）、WEB应用漏洞（SQL注入、文件上传、命令执行、文件包含等）属于服务器类的攻击，该类型漏洞虽然经历了这么多年，很遗憾，此类漏洞还是存在，并且重复在犯相同的错误。\n\n - **WEB安全2.0**\n   随着社交网络的兴起，原来不被重视的XSS、CSRF等漏洞逐渐进入人们的视野，那么在2.0时代，漏洞利用的思想将更重要，发挥你的想象，可以有太多可能。\n\n - **WEB安全3.0**\n   同开发设计模式类似（界面、业务逻辑、数据），3.0将关注应用本身的业务逻辑和数据安全，如密码修改绕过、二级密码绕过、支付类漏洞、刷钱等类型的漏洞，故注重的是产品本身的业务安全、数据安全、风控安全等。\n\n   \u003e `安全不仅仅是在技术层面、还应该在行政管理层面、物理层面去做好安全的防护，才能提供最大限度的保护。`\n   \u003e 安全行业多年的从业经验：人，才是最大的威胁；无论是外部、内部、无心、有意过失。（没有丑女人、只有懒女人）我想可以套用在此处，纯属个人见解。\n\n# CC/采集防护\n什么是**CC攻击**，简单的说一下，就是用较少的代价恶意请求web（应用）中的重资源消耗点（CPU/IO/数据库等等）从而达到拒绝服务的目的；**数据采集**，就是内容抓取了，简单这么理解吧\n\u003e `非官方学术类的解释，先将就理解下`\n**关于本文对CC攻击的分析和相关的防护算法，都是我在实战中分析总结，并形成自己的方法论，不足之处、欢迎指正。**\n\n## 攻击类型\n - 行为（GET、POST等）\n  目前主要还是这两中method攻击为主，其他的少之又少。\n - 被攻击的点\n\n    1：用户可直接访问的URL（搜索、重CPU计算、IO、数据库操作等）\n\n    2：嵌入的URL（验证码、ajax接口等）\n\n    3：面向非浏览器的接口（一些API、WEBservice等）\n\n    4：基于特定web服务、语言等的特定攻击（慢速攻击、PHP-dos等）\n\n\u003e `面对CC攻击我们需要根据实际情况采用不同的防护算法，比如攻击的点是一个ajax点，你使用js跳转/验证码肯定就有问题`\n\n## 防护方法\n - 网络层\n 通过访问ip的频率、统计等使用阀值的方式进行频率和次数的限制，黑名单方式\n\n- 网络层+应用层\n 在后来的互联网网络下，有了的CDN加入，现在增加的网络层的防护需要扩展，那么统计的IP将是在HTTP头中的IP，仍然使用频率、次数、黑名单的方式操作。\n \u003e `但是很多厂家的硬件流量清洗等设备，有的获取用户真实IP从HTTP头中取的是固定字段（X-FOR-F），不能自定义，更甚至有的厂家就没有该功能，这里就不说具体的这些厂家名字了`PS: 在传统的4层防护上，是没有问题的\n\n-  应用层\nTAG验证、SET COOKIE、URL跳转、JS跳转、验证码、页面嵌套、强制静态缓存等\n防护是需要根据攻击点进行分别防护的，如攻击的是嵌入的url，我们就不能使用JS跳转、302验证码等这样的方法；**在多次的CC防护实战中，如使用url跳转、set cookie，在新型的CC攻击下，这些防护都已经失效了**。后面我会分享一下我的防护算法，并且在**OpenStar**中已经可以根据情况实现我所说的防护算法。\n浏览器是可以执行JS和flash的，这里我分享一些基于JS的防护算法，flash需要自己去写（比js复杂一些），可以实现flash应用层的安全防护和防页面抓取（开动你的大脑吧）\n\n1：客户端防护\n使用JS进行前端的防护（浏览器识别、鼠标轨迹判断、url有规则添加尾巴（args参数）、随机延迟、鼠标键盘事件获取等）其实这里非常复杂，如浏览器的识别 ie 支持 `!-[1,]` 这个特殊JS，一些JS方言，一些浏览器有自定义标签等等；\n\n2：服务端防护\nurl添加的尾巴（args参数）是服务器动态生成的token，而不是使用静态的正则去匹配其合法性。\n\n3：特定攻击\n该类特定攻击，可以通过特征快速匹配出来（慢速攻击、PHP5.3的http头攻击）\n\n**简单场景**\n\n1：用户可直接访问的url（这种是最好防的）\n\n第一阶段：\n\n - 网络层：访问频率限制，超出阀值仅黑名单一段时间\n\n - 应用层：js跳转、验证码、flash策略（拖动识别等）\n\n2：嵌入的url（ajax校验点、图片验证码）\n\n第一阶段：\n\n - 网络层：访问频率限制，超出阀值仅黑名单一段时间\n\n - 应用层：载入被攻击的url页面，重写页面，使用js方操作链接被攻击的url。js随机在url尾巴增加有一定规则的校验串，服务端对串进行静态正则校验。\n\n第二阶段：\n\n - 网络层+应用层：用户ip在http头中，需要从http头取ip，在进行频率限制\n（其实做好了，这一层的防护，基本不用进入第三阶段的应用层防护了）\n\n - 应用层：校验串使用服务端生成的token，进行严格服务器token验证检查\n\n第三阶段：\n\n - 应用层：js增加浏览器识别（不同agent匹配不同JS方言代码）、JS随机延迟、鼠标轨迹验证、键盘鼠标事件验证等js增加验证后，在进行校验串生成。\n\n说明：多次实战CC处理经验，很少到第三阶段，当然储备好这些JS脚本非常重要，纯JS肯定也是有限的，所有我就提出了使用控件，甚至是和浏览器厂商合作等更精准的防护方法。这样对CC攻击、页面抓取、刷单等有非常好的防护效果。\n\n\u003e 应用层的防护是在网络层+扩展的网络层防护效果不佳时使用，一般情况基本用的不多，因为在OpenStar的防护下，极少数情况下，需要第三阶段防护。在防页面抓取时，发挥你的想象（js是个好帮手，善用）使用OpenStar就可以帮你快速实现；当然使用flash防抓取效果更好（不够灵活）。\n\n# 目录\n\n后续更新！~\n\n# 下载\n\nwget\n\ngit clone\n\n**已经打包的一些脚本，请参考bash目录**\n\n# 安装\n - 安装OpenResty\n 这里不做过多重复描述，直接看链接[OpenResty][2]\n - 配置nginx.conf\n 在http节点，引用waf.conf。注：原ngx相关配置基本不用修改，该优化优化、该做CPU亲缘绑定继续、该动静分离还继续、该IO、TIME等优化继续不要停。\n - 配置waf.conf\n 修改lua\\_package\\_path，使用正确的路径即可；修改那些lua文件的路径，多检查几遍。\n - 设置目录权限\n OpenStar目录建议放到OR下，方便操作，该目录ngx运行用户有读写执行权限即可。因为要写日志，*暂时没有用ngx.log，后续可能会改动*。\n - lua文件修改\n 在init.lua中，修改conf_json参数，base.json文件绝对路径根据自己的情况写正确。\n - api使用\n2016年6月7日 23:31:09 更新啦，引用waf.conf，后就可以直接使用api接口了，通过监听5460端口来给管理用啦，界面也在筹划中，期待有人可以加入，帮我一起整界面。\n\n**已经打包的一些脚本，请参考bash目录，运行前请阅读一下，感谢好友余总帮助写的脚本**\n\n# 使用\n\n## 配置规则\n\n一般情况下匹配某一规则由3个参数组成，第二个参数标识第一个参数类型,第三个参数表示是否取反，默认为`nil` 即 `false` 表示不取反\n\nhostname：`[\"*\",\"\"]` = `[\"*\",\"\",false]`\n\n==\u003e表示匹配所有域名（使用字符串匹配，非正则，非常快）\n\nhostname：`[\"*\\\\.game\\\\.com\",\"jio\"]`\n\n==\u003e表示使用正则匹配host（**ngx.re.find($host,参数1，参数2)**）\n\nhostname：`[[\"127.0.0.1\",\"127.0.0.1:8080\"],\"list\"]`\n\n==\u003e表示匹配参数1 列表 中所有host\n\nhostname：`[{\"127.0.0.1\":true,\"127.0.0.1:5460\":true},\"dict\"]`\n\n==\u003e表示匹配 字典 中host为true的host\n\nuri：`[\"/admin\",\"in\"]`\n\n==\u003e表示匹配uri中包含/admin的所有uri都会被匹配（**string.find($uri,参数1,1,true)**）\n\nip：`[[\"127.0.0.1/32\",\"\"113.45.199.0/24\"\"],\"cidr\"]`\n\n==\u003e表示匹配的ip在这两组ip段/ip中\n\nargs：`[\"*\",\"\",[\"args_name\",\"all\"],false]`\nargs：`[\"*\",\"\",[\"args_name\",\"end\"]]` = `[\"*\",\"\",[\"args_name\",\"end\"],false]`\nargs：`[\"*\",\"\",[\"args_name\",1]]`\n\n说明：第3个参数表示取args参数table的key名称，第3个参数[2]表示取args[args_name]为table时，匹配任意(all)，匹配最后一个(end),匹配第几个(数字)，默认取第一个\n\n==\u003e表示匹配的GET的args参数名为args_name,使用第4个参数模式进行匹配，匹配规则就是第一个和二个参数。其中第1、2参数支持前面描述的规则方式。\n\n**table类型的匹配规则比较麻烦，暂时想着是这样处理，有好的想法可以告诉我**\n\n## 执行流程\n\n![enter description here][5]\n\n - init阶段\n\n a：首先加载本地的base.json配置文件，将相关配置读取到config\\_dict,host\\_dict,ip\\_dict中\n\n - access阶段（自上到下的执行流程，规则列表也是自上到下按循序执行的）\n\n 0：realIpFrom_Mod ==\u003e 获取用户真实IP（从HTTP头获取，如设置）\n\n 1：ip_Mod ==\u003e 请求ip的黑/白名单、log记录\n\n 2：host\\_method\\_Mod ==\u003e host和method过滤（白名单）\n\n 3：rewrite_Mod ==\u003e 跳转模块，set-cookie操作\n\n 4：host_Mod ==\u003e 对应host执行的规则过滤（uri,referer,useragent等）\n\n    这里是产品中提供给独立用户使用的过滤规则。目前支持自定义规则组（任意参数，任意组合）\n\n 5：app_Mod ==\u003e 用户自定义应用层过滤\n\n 6：referer_Mod ==\u003e referer过滤（黑/白名单、log记录）\n\n 7：uri_Mod ==\u003e uri过滤（黑/白名单、log记录）\n\n 8：header_Mod ==\u003e header过滤（黑名单）\n\n 9：useragent_Mod ==\u003e useragent过滤（黑/白名单、log记录）\n\n 10：cookie_Mod ==\u003e cookie过滤（黑/白名单、log记录）\n\n 11：args\\_Mod ==\u003e args参数过滤[实际是query_string]（黑/白名单、log记录）\n\n 12：post_Mod ==\u003e post参数过滤[实际是整个post内容]（黑/白名单、log记录）\n\n 13：network_Mod ==\u003e 应用层网络频率限制（频率黑名单）\n\n - body阶段\n\n 14：replace\\_Mod ==\u003e 内容替换规则（动态进行内容替换，性能消耗较高慎用，可以的话用app\\_Mod中rehtml、refile这2个自定义action）\n\n## \u003cspan id = \"step0\"\u003eSTEP 0 : realIpFrom_Mod \u003c/span\u003e\n\n - 说明：\n`{\"101.200.122.200:5460\": {\"ips\": [\"*\",\"\"],\"realipset\": \"x-for-f\"}}`\n\n 通过上面的例子，表示域名id.game.com,从ips来的直连ip，用户真实ip在x-for-f中，ips是支持二阶匹配，可以参考例子进行设置，ips为\\*时，表示不区分直连ip了。\n\n## STEP 1：ip_Mod（黑/白名单、log记录）\n\n - 说明：\n `{\"ip\":\"111.206.199.61\",\"action\":\"allow\"}`\n`{\"ip\":\"www.game.com-111.206.199.1\",\"action\":\"deny\"}`\n\n 上面的例子，表示ip为111.206.199.61（从http头获取，如设置）白名单\n action可以取值[allow、deny]，deny表示黑名单；第二个就表示对应host的ip黑/白名单，其他host不受影响。\n\n [返回](#top)\n\n## \u003cspan id = \"step2\"\u003eSTEP 2：host\\_method\\_Mod（白名单）\u003c/span\u003e\n\n - 说明：\n `{\"state\":\"on\",\"method\":[[\"GET\",\"POST\"],\"list\"],\"hostname\":[[\"id.game.com\",\"127.0.0.1\"],\"list\"]}`\n\n  上面的例子表示，规则开启，host为id\\.game\\.com、127.0.0.1允许的method是GET和POST\n  state：表示规则是否开启\n  method：表示允许的method，参数2标识参数1是字符串、列表(list)、正则、字典(dict)\n  hostname：表示匹配的host，规则同上\n\n  \u003e **`\"method\": [[\"GET\",\"POST\"],\"list\"]`==\u003e 表示匹配的method是GET和POST**\n\n  \u003e **`\"method\": [\"^(get|post)$\",\"jio\"]` ==\u003e 表示匹配method是正则匹配**\n\n  \u003e **`\"hostname\": [\"*\",\"\"]` ==\u003e表示匹配任意host（字符串匹配，非正则，非常快）**\n\n  \u003e **后面的很多规则都是使用该方式匹配的**\n\n[返回](#top)\n\n\n## STEP 3: rewrite_Mod（跳转模块）\n- 说明：\n```\n    {\n        \"state\": \"on\",\n        \"action\": [\"set-cookie\"],\n    \"set_cookie\":[\"asjldisdafpopliu8909jk34jk\",\"token_name\"],\n        \"hostname\": [\"101.200.122.200\",\"\"],\n        \"uri\": [\"^/rewrite$\",\"jio\"]\n    }\n```\n上面的例子表示规则启用，host为101.200.122.200,且url匹配成功的进行302/307跳转，同时设置一个无状态cookie，名称是token。action中第二个参数是用户ip+和改参数进行md5计算的。请自行使用一个无意义字符串。防止攻击者猜测出生成算法。\n\n [返回](#top)\n\n## STEP 4：host_Mod\n - 说明：\n 该模块是匹配对应host进行规则匹配，在conf_json/host_json/目录下，本地的基于host的匹配规则\n 支持host.state状态支持[on log off],log即表示原匹配被拦截将失效，off表示不做任何规则的过滤\n\n## \u003cspan id = \"step5\"\u003eSTEP 5：app_Mod（自定义action）\u003c/span\u003e\n - 说明：\n ```\n{\n    \"state\":\"on\",\n    \"action\":[\"deny\"],\n    \"hostname\":[\"127.0.0.1\",\"\"],\n    \"uri\":[\"^/([\\w]{4}\\.html|deny1\\.do|你好\\.html)$\",\"jio\"]\n}\n ```\n\n  上面的例子表示规则启用，host为127.0.0.1，且url符合正则匹配的，拒绝访问\n\n  state：规则是否启用\n  action：执行动作\n\n  1：deny ==\u003e 拒绝访问\n\n  2：allow ==\u003e 允许访问\n\n  3：log ==\u003e 仅记录日志\n\n  4：rehtml ==\u003e 表示返回自定义字符串\n\n  5：refile ==\u003e 表示返回自定义文件（文件内容返回）\n\n  6：relua ==\u003e 表示返回lua执行脚本（使用dofile操作）\n\n  7：relua_str ==\u003e 表示返回lua代码执行\n\n  hostname：匹配的host\n\n  uri：匹配的uri\n\n  \u003e **hostname 和 uri 使用上面描述过的匹配规则，参数2标记、参数1内容**\n\n  \u003e **详细参见项目中的demo规则，多实验、多测试就知道效果了**\n\n  \u003e **各种高级功能基本就靠这个模块来实现了，需要你发挥想象**\n\n [返回](#top)\n\n## STEP 6：referer_Mod（白名单）\n\n - 说明：\n `{\"state\":\"on\",\"uri\":[\"\\\\.(gif|jpg|png|jpeg|bmp|ico)$\",\"jio\"],\"hostname\":[\"127.0.0.1\",\"\"],\"referer\":[\"*\",\"\"],\"action\":\"allow\"}`\n\n  上面的例子表示，host为127.0.0.1，uri配置的正则成功，referer正则匹配成功就放行**【这里把一些图片等静态资源可以放到这里，因为使用OpenStar，不需要将access_by_lua_file 专门放到nginx的不同的location动态节点去，这样后续的匹配规则就不对这些静态资源进行匹配了，减少总体的匹配次数，提高效率】**，action表示执行的动作，`allow`表示规则匹配成功后，跳出后续所有规则（一般对静态资源图片），referer匹配失败就拒绝访问（白名单），防盗链为主；规则的取反可以设置防护站外的CSRF\n\n  state：表示规则是否开启\n  uri：表示匹配的uri\n  hostname：匹配host\n  referer：匹配referer\n  action：匹配动作\n\n  \u003e referer的匹配是白名单，注意一下即可\n  \u003e 这些匹配都是基于上面说过的二阶匹配法\n\n [返回](#top)\n\n## STEP 7：uri_Mod（黑、白名单）\n\n - 说明：\n `{\"state\":\"on\",\"hostname\":[\"\\*\",\"\"],\"uri\":[\"\\\\.(css|js|flv|swf|zip|txt)$\",\"jio\"],\"action\":\"allow\"}`\n\n  上面的例子表示，规则启用，任意host，uri正则匹配成功后放行，不进行后续规则匹配（该场景同图片等静态资源一样进行放行，减少后续的匹配）\n  state：表示规则是否开启\n  hostname：表示匹配的host\n  uri：表示匹配uri\n  action：可取值[allow、deny、log]，表示匹配成功后的执行动作\n\n  \u003e 一般情况下，过滤完静态资源后，剩下的都是拒绝一下uri的访问如.svn等一些敏感目录或文件\n\n [返回](#top)\n\n## STEP 8：header_Mod（黑名单）\n\n - 说明：\n `{\"state\":\"on\",\"uri\":[\"\\*\",\"\"],\"hostname\":[\"\\*\",\"\"],\"header\":[\"Acunetix_Aspect\",\"\\*\",\"\"]}`\n\n 上面的例子表示，规则启用，匹配任意host，任意uri，header中Acunetix_Aspect内容的匹配（本次匹配任意内容）这个匹配是一些扫描器过滤，该规则是wvs扫描器的特征\n state：规则是否启用\n uri：匹配uri\n hostname：匹配host\n header：匹配header头\n\n [返回](#top)\n\n## STEP 9：useragent_Mod （黑名单）\n  - 说明：\n  `{\"state\":\"off\",\"action\":\"deny\",\"useragent\":[\"HTTrack|harvest|audit|dirbuster|pangolin|nmap|sqln|-scan|hydra|Parser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|zmeu|BabyKrokodil|netsparker|httperf|bench\",\"jio\"],\"hostname\":[[\"127.0.0.1:8080\",\"127.0.0.1\"],\"list\"]}`\n\n  上面的例子表示，规则关闭，匹配host为127.0.0.1 或者 127.0.0.1:8080 ，useragent正则匹配，匹配成功则拒绝访问，一般host设置为：`\"hostname\":[\"*\",\"\"]`表示所有（字符串匹配，非常快）\n  state：规则是否启用\n  hostname：匹配host\n  useragent：匹配agent\n  action：匹配动作\n\n [返回](#top)\n\n## STEP 10：cookie_Mod（黑名单）\n - 说明：\n `{\"state\":\"on\",\"cookie\":[\"\\\\.\\\\./\",\"jio\"],\"hostname\":[\"*\",\"\"],\"action\":\"deny\"}`\n\n  上面的例子表示，规则启用，匹配任意host，cookies匹配正则，匹配成功则执行拒绝访问操作\n  state：表示规则是否启用\n  cookie：表示匹配cookie\n  hostname：表示匹配host\n  action：可选参数[deny、allow] 表示执行动作\n\n  \u003e action后续可以能增加其他action，所以预留在这，否则黑名单根本不需要action参数\n\n [返回](#top)\n\n## STEP 11：args_Mod（黑名单）\n\n - 说明：\n `{\"state\":\"on\",\"hostname\":[\"*\",\"\"],\"args_data\":[\"\\\\:\\\\$\",\"jio\"],\"action\":\"deny\"}`\n\n 上面例子表示，规则启用，匹配任意host，query_string参数组匹配正则，成功则执行拒绝访问动作\n state：表示规则是否启用\n hostname：表示匹配host\n query_string：表示匹配args参数组\n action：表示匹配成功拒绝访问\n\n [返回](#top)\n\n## STEP 12：post_Mod（黑名单）\n - 说明：\n `{\"state\":\"on\",\"hostname\":[\"*\",\"\"],\"posts_data\":[\"\\\\$\\\\{\",\"jio\"],\"action\":\"deny\"}`\n\n  上面的例子表示，规则启用，匹配任意host,post_str参数组匹配正则，成功则拒绝访问\n  state：表示是否启用规则\n  hostname：匹配host\n  post_str：匹配post参数组\n  action：匹配成功后拒绝访问\n\n [返回](#top)\n\n## STEP 13：network_Mod（频率黑名单）\n - 说明：\n `{\"state\":\"on\",\"network\":{\"maxReqs\":20,\"pTime\":10,\"blackTime\":600},\"hostname\":[\"id.game.com\",\"\"],\"uri\":[\"^/2.html$\",\"jio\"]}`\n\n  上面的例子表示，规则启用，host为id.game.com,url匹配正则，匹配成功则进行访问频率限制，在10秒内访问次数超过20次，请求的IP到IP黑名单中10分钟（60秒\\*10）\n  state：表示是否启用规则\n  hostname：表示匹配host\n  uri：表示匹配uri\n  network：maxReqs ==\u003e 请求次数；pTime ==\u003e 单位时间；blacktime ==\u003e ip黑名单时长\n\n  \u003e 一般情况下，cc攻击的点一个网站只有为数不多的地方是容易被攻击的点，所以设计时，考虑增加通过url细化匹配。\n\n [返回](#top)\n\n## STEP 14：replace_Mod（内容替换）\n - 说明：\n `{\"state\":\"on\",\"uri\":[\"^/$\",\"jio\"],\"hostname\":[\"passport.game.com\",\"\"],\"replace_list\":[[\"联合\",\"\",\"联合FUCK\"],[\"登录\",\"\",\"登录POSS\"],[\"lzcaptcha\\\\?key='\\\\s\\*\\\\+ key\",\"jio\",\"lzcaptcha?keY='+key+'\u0026keytoken=@token@'\"]]}`\n\n  上面的例子表示，规则启用，host为passport.game.com,url是正则匹配，匹配成功则进行返回内容替换\n  1：将\"联合\"替换为\"联合FUCK\"；\n  2：将\"登录\"替换为\"登录POSS\"；\n  3：通过正则进行匹配（`ngx.re.gsub`）其中@token@表示动态替换为服务器生成的一个唯一随机字符串\n  state：表示是否启用规则\n  hostname：表示匹配的host\n  uri：表示匹配的uri\n  replace_list：表示替换列表，参数1 ==\u003e 被替换内容；参数2 ==\u003e 匹配模式（正则、字符串）如例子中前2个替换列表就是字符串匹配，使用\"\"即可，不能没有；参数3 ==\u003e 被替换的内容\n\n# API相关\n参考doc目录下的api.md说明\n\n# 样例\n- 参见doc下，demo.md说明\n\n\n# 性能评测\n\n**操作系统信息**\nOpenStar测试服务器：\n\n```\n 微软虚机，内网测试\n\n uname -a :\n Linux dpicsvr01 4.2.0-30-generic #36-Ubuntu SMP Fri Feb 26 00:58:07 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux\n\n 内存：\n cat /proc/meminfo | grep MemTotal\n MemTotal:       14360276 kB// 14GB\n\n CPU型号：cat /proc/cpuinfo | grep 'model name' |uniq\n Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz\n\n CPU核数：cat /proc/cpuinfo | grep \"cpu cores\" | uniq\n 4\n\n CPU个数：cat /proc/cpuinfo | grep \"physical id\" | uniq | wc -l\n 1\n ab：\n ab -c 1000 -n 100000 \"http://10.0.0.4/test/a?a=b\u0026c=d\"\n```\n测试结果：\n![enter description here][6]\n 通过图片可以看到，关闭所有规则，做了2组测试，取最高的`8542`；\n\n 启用规则（排除app，network，replace），测试结果`8388`，性能下降`1.81%`；\n\n 启用规则（排除replace，app中未启用relua这个高消耗点），测试结果`7959`，性能下降`6.83%`；\n\n 启用规则（排除useragent，ab工具默认被拦截了，第二个测试就不完全了。）测试结果`7116`，性能下降`16%`；\n\n 总的来说，启用规则后，性能损失可以接受，根据自身的业务进行调整，还可以有所优化。\n\n# 404StarLink 2.0 - Galaxy\n\nopenstar 是 404Team 星链计划2.0 中的一环，如果对 openstar 有任何疑问又或是想要找小伙伴交流，可以参考星链计划的加群方式。\nhttps://github.com/knownsec/404StarLink2.0-Galaxy#community\n\n![404log][25]\n\nopenstar has joined 404Team [404StarLink 2.0 - Galaxy][26]\n\n# 关于\n\n- 关于该项目前面其实已经说了不少，从无到有基本都说了，强调下，感谢春哥，[loveshell][9]！！！\n- 关于我：从事安全、架构相关工作。\n- Copyright and License\nGPL（GNU General Public License）\nCopyright (C) 2011-2016, by zj\n\n\n  [1]: https://github.com/agentzh\n  [2]: http://openresty.org/cn/\n  [3]: https://github.com/starjun/openstar/wiki/%E5%AE%89%E8%A3%85%E7%AF%87\n  [4]: https://github.com/starjun/openstar/wiki/base.json\n  [5]: ./doc/Openstar.jpg \"OpenStar.jpg\"\n  [6]: ./doc/test.png \"test.png\"\n  [7]: https://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html\n  [8]: http://www.modsecurity.org/\n  [9]: https://github.com/loveshell/ngx_lua_waf\n  [10]: https://github.com/starjun/openstar/wiki/0-realIpFrom_Mod\n  [11]: https://github.com/starjun/openstar/wiki/1-ip_Mod\n  [12]: https://github.com/starjun/openstar/wiki/2-host_method_Mod\n  [13]: https://github.com/starjun/openstar/wiki/3-rewrite_Mod\n  [14]: https://github.com/starjun/openstar/wiki/4-host_Mod\n  [15]: https://github.com/starjun/openstar/wiki/5-app_Mod\n  [16]: https://github.com/starjun/openstar/wiki/6-referer_Mod\n  [17]: https://github.com/starjun/openstar/wiki/7-uri_Mod\n  [18]: https://github.com/starjun/openstar/wiki/8-header_Mod\n  [19]: https://github.com/starjun/openstar/wiki/9-useragent_Mod\n  [20]: https://github.com/starjun/openstar/wiki/10-cookie_Mod\n  [21]: https://github.com/starjun/openstar/wiki/11-args_Mod\n  [22]: https://github.com/starjun/openstar/wiki/12-post_Mod\n  [23]: https://github.com/starjun/openstar/wiki/13-network_Mod\n  [24]: https://github.com/starjun/openstar/wiki/14-replace_Mod\n  [25]: https://github.com/knownsec/404StarLink-Project/raw/master/logo.png \"404.png\"\n  [26]: https://github.com/knownsec/404StarLink2.0-Galaxy\n  [27]: ./doc/xq.jpg \"xq.jpg\"","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstarjun%2Fopenstar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstarjun%2Fopenstar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstarjun%2Fopenstar/lists"}