
# 配置ClickHouse SQL防御规则
用户可以在Manager界面配置ClickHouse的SQL防御规则，根据业务调整对应SQL防御规则的参数。
#### 前提条件
- 已安装包含ClickHouse服务的集群客户端，例如安装目录为"/opt/hadoopclient"。
- ClickHouse逻辑集群运行状态正常。
- 对于开启了Kerberos认证的集群，需要创建具有ClickHouse表操作权限的业务用户，例如创建人机用户"clickhouseuser"。
- 已创建关联了ClickHouse服务的租户，并与ClickHouse业务用户关联，具体请参见[添加MRS租户](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0305.html)章节。
 
#### 约束限制
- 防御规则默认动态生效时间为1分钟。
- 拦截和熔断规则会中断SQL查询，请根据实际业务配置合理的值。
- ClickHouse相关规则配置后，需要重新登录客户端生效。
 
#### 配置ClickHouse SQL防御规则
1. 登录MRS集群Manager界面。 
   登录集群Manager界面请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> SQL防御"，打开SQL防御页面。
3. 参考[添加MRS SQL防御规则](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300125.html)添加针对ClickHouse的SQL防御规则。
   
   ClickHouse SQL引擎支持的各类型SQL防御规则可参考[MRS SQL防御规则](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300125.html#mrs_01_300125__zh-cn_topic_0000001683411170_zh-cn_topic_0000001662442869_section19510043143814)。
   MRS 3.6.0及之后版本：例如添加一条规则ID为"static_0008"，SQL语句执行ClickHouse集群级别的表更新操作就进行"提示"，"豁免用户"为"ckuser"的规则。
   图1添加ClickHouse SQL防御规则   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002654416998.png "点击放大")
   MRS 3.6.0之前版本：例如添加一条规则ID为"static_0008"，SQL语句执行ClickHouse集群级别的表更新操作就进行"提示"的规则。
   图2添加ClickHouse SQL防御规则   
   ![](https://support.huaweicloud.com/usermanual-mrs/zh-cn_image_0000002479450710.png "点击放大")
   
   
4. 登录安装有ClickHouse客户端的节点，执行以下命令，切换到客户端安装目录。 
   **cd /opt/hadoopclient**
   执行以下命令，配置环境变量。
   **source bigdata_env**
   
   
5. 如果当前集群为安全模式（启用Kerberos认证），执行以下命令认证当前用户，当前用户需要具有创建ClickHouse表的权限。如果当前集群为普通模式（未启用Kerberos认证），则无需执行本步骤。 
   **kinit** *组件业务用户*
   例如，**kinit**clickhouseuser。
   
   
6. 使用ClickHouse客户端连接到ClickHouse服务端。 
   安全模式：
   **clickhouse client --host** *ClickHouseServer的实例IP* **--port** **9440** **--secure**
   普通模式：
   **clickhouse client --host** *ClickHouseServer的实例IP* **--user** *用户名* **--password** **--port** **9000**
   *输入用户密码*
   
   
7. 执行以下命令，创建数据表。 
   **CREATE DATABASE** *cktest* **ON CLUSTER** *default_cluster* **;**
   **CREATE TABLE** *cktest.test2* **ON CLUSTER** *default_cluster* **( \`EventDate\` DateTime, \`CounterID\` UInt32, \`UserID\` UInt32, \`ver\` UInt16 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/** *cktest/test2* **', '{replica}')** **PARTITION BY toYYYYMM(EventDate) ORDER BY (EventDate, intHash32(UserID));**
   **CREATE TABLE** *cktest.test2_dir* **ON CLUSTER** *default_cluster* **as** *cktest.test2* **ENGINE = Distributed(** *default_cluster* *, cktest, test2* **, rand());**
   
   
8. 执行以下命令向表中插入数据。 
   **insert into** *cktest.test2* **values('2023-08-01',111,111,111);**
   **insert into** *cktest.test2* **values('2023-08-02',222,111,111);**
   
   
9. 针对已经创建的表，执行以下SQL语句，检查当前SQL防御规则是否生效。 
   **alter table** *cktest.test2* **on cluster** *default_cluster* **update CounterID = toUInt32(222) where EventDate='2023-08-01' ;**
   ```
   ...
   <Warning> SQLDefender: Distributed DDL ALTER UPDATE queries are undesirable.
   ...
   ```
   如果防御规则设置的是拦截，则命令执行失败，系统回显信息如下：
   ```
   ...
   DB::Exception: Distributed DDL ALTER TABLE UPDATE queries are undesirable..(QUERY_IS_PROHIBITED)
   ...
   ```
   ![](https://support.huaweicloud.com/usermanual-mrs/public_sys-resources/note_3.0-zh-cn.png)
   更多ClickHouse SQL防御规则可参考[MRS SQL防御规则](https://support.huaweicloud.com/usermanual-mrs/mrs_01_300125.html#mrs_01_300125__zh-cn_topic_0000001683411170_zh-cn_topic_0000001662442869_section19510043143814)。
   
   
 
