添加MRS SQL防御规则
用户可以在Manager界面对指定的租户及SQL引擎添加SQL防御规则,系统会对触发规则的SQL请求进行提示、拦截或阻断操作。

为集群添加或者修改SQL防御规则时需结合业务场景进行规则是否开启以及对应规则阈值是否合理的评估,不合理的防御规则对相关SQL请求进行拦截或阻断后,可能会对上层业务造成影响。
添加SQL防御规则
- 使用具有Manager界面管理权限的用户登录MRS集群Manager界面。
登录集群Manager界面请参考访问MRS集群Manager。
- 选择“集群 > SQL防御”,打开SQL防御页面。
可以单击“查看所有支持规则”查看当前集群所有支持的SQL防御规则。
- 单击“添加规则”,验证当前用户密码后,打开添加规则页面。
- 配置相关参数后,单击“确定”。
参数
示例
描述
规则名称
SQL_defenses01
自定义SQL防御规则名称。
规则ID
static_0001
选择规则ID。
不同ID对应的防御规则含义信息可参考表1。
租户
default
单击“添加”选择可适用当前防御规则的租户名称。
如需新增租户,可参考管理MRS集群租户进行集群租户的规划与创建。
服务与动作
-
单击“添加”指定当前SQL防御规则所关联的SQL引擎并配置规则的阈值参数。
每条规则可以关联1个SQL引擎,如需针对其他SQL引擎继续配置,可以继续添加规则。
- 服务:选择当前SQL防御规则所关联的SQL引擎。
- SQL请求满足防御规则后,系统的处理操作有以下类型:
- 提示:配置系统对SQL请求满足防御规则后,是否进行日志记录和提示处理。开启按钮时,如果当前规则有变量参数,需同时配置阈值。
- 拦截:配置系统对SQL请求满足防御规则后,是否进行拦截处理。开启按钮时,如果当前规则有变量参数,需同时配置阈值。
- 熔断:配置系统对SQL请求满足防御规则后,是否进行熔断处理。开启按钮时,如果当前规则有变量参数,需同时配置阈值。
对于规则类型为静态拦截、动态拦截的SQL防御规则,系统支持“提示”、“拦截”操作。对于规则类型为运行熔断的SQL防御规则,系统支持“熔断”操作。
豁免用户
user1
配置豁免用户,规则对指定用户不生效。(该参数仅MRS 3.6.0及之后版本支持)
单击“添加”,勾选用户后单击“确定”。
- 规则添加成功后,可以在“SQL防御”界面查看已添加的防御规则。防御规则动态生效。
如需对当前规则进行调整,可单击对应规则所在“操作”列的“修改”,验证用户密码后可修改规则相关参数。
图1 查看SQL防御规则
MRS SQL防御规则
规则ID | 规则描述 | 规则适用引擎 | 规则变量参数 | SQL语句示例 |
|---|---|---|---|---|
static_0001 | SQL中count(distinct)出现次数超限。 |
| count(distinct)出现次数阈值。 建议配置值:10 | SELECT COUNT(DISTINCT deviceId), COUNT(DISTINCT collDeviceId) FROM table GROUP BY deviceName, collDeviceName, collCurrentVersion; |
static_0002 | SQL中是否使用了not in <subquery>语句。 |
| N/A | SELECT * FROM Orders o WHERE Orders.Order_ID not in (Select Order_ID FROM HeldOrders h where h.order_id =o.order_id); |
static_0003 | SQL中的join次数超限制。 |
| join次数阈值。 建议配置值:20 | N/A |
static_0004 | SQL中的union all次数超限制。 |
| union all次数阈值。 建议配置值:20 | select * from tables t1 union all select * from tables t2 union all select * from tables t3 union all select * from tables t4 union all select * from tables t5 union all select * from tables t6 union all select * from tables t7 union all select * from tables t8 union all select * from tables t9; |
static_0005 | 子查询嵌套层数超限制。 |
| 子查询的嵌套层数。 建议配置值:20 | select * from ( with temp1 as (select * from tables) select * from temp1); |
static_0006 | SQL语句字符串长度超限制。 |
| SQL字符串长度,单位为KB。 建议配置值:10 | N/A |
static_0007 | 多表关联时存在笛卡尔积。 |
| N/A | select * from A,B; |
static_0008 | 在集群级别(on cluster)执行alter table update操作。 | ClickHouse | N/A | alter table testtb1 on cluster default_cluster update price=10.0 where id='100' |
static_0009 | 在集群级别(on cluster)执行alter table delete 操作。 | ClickHouse | N/A | alter table testtb1 on cluster default_cluster delete where id ='10' |
static_0010 | 在集群级别(on cluster)执行alter table add column操作。 | ClickHouse | N/A | alter table testtb1 on cluster default_cluster add column testc String |
static_0011 | 在集群级别(on cluster)执行alter table drop column操作。 | ClickHouse | N/A | alter table testtb1 on cluster default_cluster drop column testc |
static_0012 | 在集群级别(on cluster)执行optimize final操作。 | ClickHouse | N/A | optimize table testtb1 on cluster default_cluster final |
static_0013 | 在集群级别(on cluster)执行drop table操作。 | ClickHouse | N/A | drop table testtb1 on cluster default_cluster; |
static_0014 | 在集群级别(on cluster)执行truncate table操作。 | ClickHouse | N/A | truncate table testtb1 on cluster default_cluster; |
dynamic_0001 | 扫描文件数超限制。 |
| 计划/已经扫描的文件数量阈值。 建议配置值:100000 | SELECT ss_ticket_number FROM store_sales WHERE ss_ticket_number=72291252 LIMIT 10; |
dynamic_0002 | 对单个表操作(select、delete、update、alter)涉及的分区数超限制。 |
| 表操作所涉及的分区数量阈值。 建议配置值:10000 | DELETE FROM table_name WHERE column_name =value |
dynamic_0003 | join的右表为分布式表时,右表的数据量超限制。 | ClickHouse | 执行join操作时,右表的行数阈值。 建议配置值:100000000 | SELECT name, text FROM table_1 JOIN table_2 ON table_1.Id =table_2.Id |
running_0001 | Select类型的SQL语句向客户端返回的结果行数超限制。 |
| 查询返回结果的行数阈值。 建议配置值:100000 | select * from table |
running_0002 | SQL的占用内存峰值超绝对值限制。 |
| SQL运行占用内容阈值,单位为MB。 | N/A |
running_0003 | SQL已经运行的时长超限制。 |
| SQL运行时长阈值,单位为秒。 | N/A |
running_0004 | SQL已经发生的数据扫描量。 |
| SQL扫描数据量,单位为GB。 建议配置值:10240 | N/A |

