
# 使用ClickHouse UDF安全沙箱
#### 场景介绍
ClickHouse支持用户通过UDF的方式，实现自定义函数功能。此功能存在第三方恶意攻击和越权的风险，因此增加安全沙箱的功能，限制UDF的运行权限范围。
ClickHouse支持Python、Java等多种语言实现UDF，本特性仅支持Java UDF安全沙箱。
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
本章节适用于MRS 3.3.1及之后版本。
#### 前提条件
准备UDF文件，例如"test.jar"。
#### 配置ClickHouse UDF
1. 使用WinSCP工具以**omm**用户将用户的UDF文件上传至ClickHouse节点，例如上传至"/home/omm"目录下。
2. 执行以下命令上传用户的UDF文件。 
   **cp /home/omm/** *test.jar* **/srv/BigData/clickhouse/data1/metadata/user_scripts**
   
   
3. 执行以下命令修改用户UDF文件的权限。
   
   **chmod 550 /srv/BigData/clickhouse/data1/metadata/user_scripts/** *test.jar*
   **chown omm:wheel /srv/BigData/clickhouse/data1/metadata/user_scripts/** *test.jar*
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   所有的ClickHouse节点都执行[1]至[3]。
   
   
4. 登录FusionInsight Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置"，通过"clickhouse-udf-customize"配置用户UDF函数。配置参数如下： 
   
   | **参数名**                          | **描述**                                        |
   |:---|:---|
   | function\[1\].name               | 定义外部函数的名称。                                    |
   | function\[1\].type               | 定义外部函数的类型，此处为executable，表示此函数由一个可执行文件实现。      |
   | function\[1\].return_type        | 定义外部函数的返回类型，例如字符串类型String。                    |
   | function\[1\].argument\[1\].type | 定义参数的类型，例如字符串类型String。                        |
   | function\[1\].argument\[1\].name | 定义参数的名称。                                      |
   | function\[1\].format             | 定义返回结果的格式，此处为TabSeparated，表示以制表符为分隔符的文本格式。    |
   | function\[1\].execute_direct     | 当配置为Java UDF时配置为0，其他配置为1。                     |
   | function\[1\].command            | 定义该外部函数对应的命令。当配置为Java UDF时填写文件名称，例如：test.jar。 |
      
   
   
5. 配置完成后，单击"保存"，保存配置。
 
#### 关闭ClickHouse UDF安全沙箱
登录FusionInsight Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> 用户自定义函数"，修改"_udf_sandbox"参数为"none"，保存配置。
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002701670160.png)
#### 配置ClickHouse UDF安全沙箱白名单
当用户使用Java制作的UDF时，默认开启安全沙箱功能。如果用户的一个或者多个Java UDF需要关闭安全沙箱功能，则可将对应的UDF文件名称配置在白名单中。
登录FusionInsight Manager界面，选择"集群 \> 服务 \> ClickHouse \> 配置 \> 全部配置 \> 用户自定义函数"，修改"_sandbox_white_list"，多个UDF文件用逗号隔开，保存配置。
例如：test1.jar,test2.jar,test3.jar，如下图所示：
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002731389381.png "点击放大")
#### 配置UDF运行JDK版本
ClickHouse支持指定UDF运行的JDK版本，默认为JDK8，还支持指定为JDK17或者JDK21。
1. 登录Manager界面，选择"集群 \> 服务"，在服务列表中单击"ClickHouse"进入概览页面，选择" 配置 \> 全部配置"。
2. 在全部配置页面，选择"ClickHouseServer（角色） \> 用户自定义函数"，参数"udf_jdk_version"的值为对应的JDK版本。修改该参数值即可修改ClickHouse UDF运行的JDK版本。 
   图1修改JDK版本   
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002731549351.png "点击放大")
   
   
3. 单击"保存"保存配置。
 
