🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 简介 高级规则是最具灵活性的规则配置,需要使用者有较好的动手能力,特别复杂的功能和配置,都可以在高级规则中实现(防重放检查,验证动态验证码,签名验签检查等等等等...) ## 入口 ![](https://img.kancloud.cn/2f/27/2f277ea955858c2977039a288f235e5b_686x637.png) ## 界面介绍 先看一下高级规则主界面,这里可以看到所有已经配置的高级规则所有信息 ![](https://img.kancloud.cn/bb/e1/bbe1f654a86f45a4f40f3c63d722a9c7_991x1325.png) 凡是出现上移、下移...配置规则优先级的规则组,共性都是一样的,规则的顺序修改后,一定要 **应用** ,然后在 **保存** * 高级匹配规则开关:配置高级规则总开关的 * 上移:移动该条规则顺序 优先 * 下移:移动该条规则顺序 落后 * 置顶:调整该条规则优先级 最高 * 置底:调整该条规则优先级 最低 【注:跳转规则顺序(上移/下移/置顶/置底)后需要应用优先级才可以生效】 ## 添加规则 先看一下添加规则的界面吧 ![](https://img.kancloud.cn/87/d7/87d7b230f1f62d69da78e1d26761eaef_744x524.png) * des:对该条规则的人为描述,方便规则的管理和认知 * state:是否启用该条规则 * waf:owasp标记 * action:执行动作 1. deny 拒绝当前请求 2. allow 放行该请求,且直接跳出所有的规则匹配,及后续的规则都不会匹配;比较 第3个规则是放行,第6个规则是拦截,3和6规则都满足时,只会执行第3个规则 3. debug 记录当前请求,一般用于调试使用,其会完整的记录`request`的内容、以及`response`内容,存放在 `/opt/openresty(tengine)/openstar/logs/debug.log`;及基础配置中的 `logs` 参数的路径 4. rehtml 返回固定的 `html` 类型的`body`内容(`Content-Type:text/html`),一般可以配置一个JS跳转的页面,配置一个第三方要求的一个特定的验证txt文件等等 5. refile 返回一个文件内容,返回的头`Content-Type`可配置 文件名称:保存在目录`/opt/openresty(tengine)/openstar/index/`中的文件,及基本配置中`htmlPath`参数配置的路径 文件类型:`Content-Type` 的配置,默认为:`text/html` 6. func 执行一个插件函数,插件函数可以直接返回内容,也可以添加参数,也可以进行签名检查等等 * hostname、uri 这2个规则的匹配和过去介绍的一样 第一个参数:匹配的内容 第二个参数:匹配的方法(匹配符) 【参考匹配方式】 第三个参数:取反标记 * app_ext:整个内容是一个数组 高级规则组是高级规则配置的核心配置使用,因为其匹配的位置是 `request` 请求的任何位置,具体可以匹配的参数可以参考前面的 [匹配位置说明](https://www.kancloud.cn/openstar/install/1136679) 子规则的写法: ![](https://img.kancloud.cn/41/1a/411aa6051f0313641c8843e5f7fa6b99_517x505.png) ![](https://img.kancloud.cn/47/89/4789d855b13bf75aaf8a10a4e25b4456_536x523.png) ![](https://img.kancloud.cn/72/01/72011c685f3aee95fda4e103a172405f_524x510.png) 看到这几个实例后,我在给大家总结一下: ![](https://img.kancloud.cn/7d/30/7d30cf16b81aae10b6dde7c03f06749f_475x386.png) 写法比较复杂,一定要多多练习,后面也会结合配置实例进行讲解 子规则组合后的理解: ``` #下面示例中,true 和 false 是每一条规则的匹配结果 true or false --- 理解一下 (true or false)==> true false or false and true --- 理解一下(false or false)and true ==> false and true ==> false false or false or true and false --- 理解一下(false or false or true)and false ==> true and false ==> false true or false or true and false or true --- (true or false or true) and (false or true) ==> true and true ==> true 注:or 连接符连接的上下规则可以理解为 ()括起来的,多个 or 连接时也是一样,括号范围到 连接符为 and 时截止!!! 当 and 连接符截止的规则组为 false 时,后面的规则是不会进匹配的,有效的提高性能,如第二个例子,其实际过程中,其不会执行 第三个 规则的匹配 ``` ## 删除 删除该条规则 ## 编辑 同添加规则相似,是对该条规则进行编辑操作 ## 保存: 保存该模块规则到服务器json配置文件(防止重启后配置丢失) 保存当前内存中 高级规则模块(app_Mod) 保存到本地磁盘中(`/opt/openresty/openstar/conf_json/app_Mod.json`) 注:Slave 会自动保存配置到json文件!!! ## 配置示例 先看一下 demo 示例的几个规则 ``` EG:假设本演示WAF的ip:192.168.10.56 [ { "state": "on", "des":"1-test-deny", "action": "deny", "waf":"other", "hostname": ["localhost",""], "uri": ["^/([\\w]{4}\\.html|deny\\.do|你好\\.html)$","jio"] # 基础配置规则 host uri 匹配成功则拒绝请求(可以没有 高级规则组) # 这里 域名 匹配的是 默认域名 localhost (及没有匹配到任意域名时,访问的默认server) # uri 使用正则的方式匹配这 4类 uri ,匹配成功就拒绝本次请求 # 访问以下 uri 则拦截该请求 http://192.168.10.56/你好.html http://192.168.10.56/deny.do http://192.168.10.56/12x3.html }, { "state": "on", "des":"2-test-rehtml", "action": "rehtml", "waf":"cc", "rehtml": "<html>hi~!</html>", "hostname": ["localhost",""], "uri": ["/rehtml",""] # 基础规则匹配成功 返回 固定的 html # 访问 http://192.168.10.56/rehtml 将会看到rehtml 配置的内容 }, { "state": "on", "des":"3-test-refile", "waf":"cc", "action": "refile", "refile": ["2.txt","text/html"], "hostname": ["localhost",""], "uri": ["/refile",""] # 基础规则匹配成功,返回文件 2.txt 的文件内容 # 访问 http://192.168.10.56/refile 则会看到 文件 /opt/openresty/openstar/index/2.txt 文件的内容 # 其中文件路径的配置就是在 高级配置 中参数 htmlPath 所配置的地址 }, { "state": "off", "des":"4-test-app_ext", "action": "deny", "waf":"other", "hostname": [["www.abc.com","localhost"],"list"], "uri": ["/api/.*","jio"], "app_ext":[ ["ip",[["106.37.236.170","1.1.1.1"],"list",true]] ] # 匹配域名等于 www.abc.com 和 localhost ,且uri 正则匹配 /api/.* 其访问的ip 为 106.37.236.170 和 1.1.1.1时不做任何处理,其他的IP就拒绝其请求;一般用于后台的 IP 访问控制 }, { "state": "on", "des":"5-test-js_debug", "waf":"cc", "action": "refile", "refile": ["js_debug.txt","text/html"], "hostname": ["localhost",""], "uri": ["/api/debug",""], "app_ext":[ ["args",["true","@token@",["cctoken"],true]] ] # 域名匹配 localhost ,uri 匹配 /api/debug ,其GET参数 cctoken的内容 不等于 @token@ (WAF动态生成)时,返回固定的文件内容;前面在介绍 匹配方式 时有说过 # 可以看录制的视频教程,里面做了比较详细的解释 }, { "state": "on", "des":"6-test-len", "waf":"other", "action": "deny", "hostname": ["localhost",""], "uri": ["/len",""], "app_ext":[ ["args",[[5,20],"len",["arg_len"],true]] ] #域名匹配 localhost ,uri 匹配 /len ,其GET参数arg_len 其长度不在范围[5,20](大于等于5,小于等于20)时,就执行拦截操作 # 访问 http://192.168.10.56/len?arg_len=1111 拦截该请求 # 访问 http://192.168.10.56/len?arg_len=01234567890123456789012 拦截该请求 # 访问 http://192.168.10.56/len?arg_len=0123456 本条规则就不会拦截 }, { "state": "on", "des":"7-test-js_time", "waf":"other", "action": "refile", "refile":["js_time.txt","text/html"], "hostname": [["www.abc.com","localhost"],"list"], "uri": ["/api/time",""], "app_ext":[ ["args",["^[\\w]{6}$","jio",["keyby"],true]] ] # 域名匹配 www.abc.com 和 localhost ,uri 匹配 /api/time,其GET参数keyby内容不满足正则 \w{6} 时,就执行拦截操作 # 详细的解释可以看录制的视频 }, { "state": "on", "des":"8-test-debug", "action": "debug", "hostname": ["localhost",""], "uri": ["/debug",""] # 域名匹配 localhost ,uri 匹配 /debug,执行 debug 记录操作,不影响后续规则 # 记录的请求数据在文件 /opt/openresty(tengine)/openstar/logs/debug.log # 其中文件存放的路径也是在高级配置中参数 logPath 配置的路径 }, { "state": "on", "des":"9-test-post_js_time", "waf":"cc", "action": "refile", "refile":["js_time.txt","text/html"], "hostname": [["www.abc.com","localhost"],"list"], "uri": ["/api/time",""], "app_ext":[ ["posts",["^[\\w]{6}$","jio",["p_key"],true]] ] # 域名匹配 www.abc.com 和 localhost ,uri 匹配 /api/time,其POST参数p_key的内容不满足正则 \w{6} 时,就执行拦截操作 }, { "state": "on", "des":"10-test-post_form", "waf":"webshell", "action": "deny", "post_form":1024, "hostname": ["localhost",""], "uri": ["/api/test/debug",""], "app_ext":[ ["post_form",["\\.(jpg|jpeg|png|webp|gif)$","jio",["image0",2],true],"or"], ["post_form",["(;|-|/)","jio",["image0",2],false],"or"] ] # 本条规则是过滤 POST 表单的内容 # app_ext 第一条规则 匹配的是 表单名称是 image0 的文件名匹配该条正则然后取反 # app_ext 第二条规则 同样匹配 image0 文件名匹配"(;|-|/)" }, { "state": "on", "des":"11-test-func", "action": "func", "func": ["sign_generate",["http_ck_sign","md5","$uri","$http_time","isdifasdfksf"]], "hostname": ["localhost",""], "uri": ["/sign.test",""] # 本条规则是执行 插件函数 # sign_generate 是插件的函数名称,后面的数据是传递给该插件的参数。 } ] ``` **高级规则配置极其复杂,后面我也会持续更新其他教程进行完善**