## 简介
高级规则是最具灵活性的规则配置,需要使用者有较好的动手能力,特别复杂的功能和配置,都可以在高级规则中实现(防重放检查,验证动态验证码,签名验签检查等等等等...)
## 入口
![](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 是插件的函数名称,后面的数据是传递给该插件的参数。
}
]
```
**高级规则配置极其复杂,后面我也会持续更新其他教程进行完善**
- kcon 兵器谱
- 演示 1
- 演示 2
- 演示 3
- 演示 4
- 演示 5
- 前言
- 安装
- 更新
- 登录后台
- 授权认证
- 集群配置
- 7层防护 -- 最佳实践
- 匹配位置说明
- 匹配方式说明
- 规则匹配详解
- 全局 - CDN规则
- 添加header头配置
- 限速limit配置
- 缓存proxy_cache配置
- 清除缓存
- 全局 - 获取真实IP配置
- 全局 - IP黑白名单
- 全局 - 域名方法配置(白名单)
- 全局 - 跳转规则配置
- 全局 - 高级规则配置
- 全局 - 普通规则配置
- 全局 - 频率规则配置
- 全局 - 内容替换规则
- 内容替换规则(插件使用)
- 全局 - 拦截信息配置
- 全局 - LOG规则配置
- 平台配置
- 基本配置
- 高级配置
- 配置文件管理
- 4 层代理
- 转发配置
- 插件管理
- 防护配置
- 网站管理
- 证书管理
- 域名管理
- 网站规则
- 插件管理
- 插件操作 --- 基本使用
- 插件操作 --- 手机号脱敏插件
- 归档
- 更新日志
- 视频教程目录