使用ClickHouse UDF安全沙箱
场景介绍
ClickHouse支持用户通过UDF的方式,实现自定义函数功能。此功能存在第三方恶意攻击和越权的风险,因此增加安全沙箱的功能,限制UDF的运行权限范围。
ClickHouse支持Python、Java等多种语言实现UDF,本特性仅支持Java UDF安全沙箱。
本章节适用于MRS 3.3.1及之后版本。
前提条件
准备UDF文件,例如“test.jar”。
配置ClickHouse UDF
- 使用WinSCP工具以omm用户将用户的UDF文件上传至ClickHouse节点,例如上传至“/home/omm”目录下。
- 执行以下命令上传用户的UDF文件。
cp /home/omm/test.jar /srv/BigData/clickhouse/data1/metadata/user_scripts
- 执行以下命令修改用户UDF文件的权限。
chmod 550 /srv/BigData/clickhouse/data1/metadata/user_scripts/test.jar
chown omm:wheel /srv/BigData/clickhouse/data1/metadata/user_scripts/test.jar
- 登录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。
- 配置完成后,单击“保存”,保存配置。
关闭ClickHouse UDF安全沙箱
登录FusionInsight Manager界面,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置 > 用户自定义函数”,修改“_udf_sandbox”参数为“none”,保存配置。

配置ClickHouse UDF安全沙箱白名单
当用户使用Java制作的UDF时,默认开启安全沙箱功能。如果用户的一个或者多个Java UDF需要关闭安全沙箱功能,则可将对应的UDF文件名称配置在白名单中。
登录FusionInsight Manager界面,选择“集群 > 服务 > ClickHouse > 配置 > 全部配置 > 用户自定义函数”,修改“_sandbox_white_list”,多个UDF文件用逗号隔开,保存配置。
例如:test1.jar,test2.jar,test3.jar,如下图所示:

配置UDF运行JDK版本
ClickHouse支持指定UDF运行的JDK版本,默认为JDK8,还支持指定为JDK17或者JDK21。
- 登录Manager界面,选择“集群 > 服务”,在服务列表中单击“ClickHouse”进入概览页面,选择“ 配置 > 全部配置”。
- 在全部配置页面,选择“ClickHouseServer(角色) > 用户自定义函数”,参数“udf_jdk_version”的值为对应的JDK版本。修改该参数值即可修改ClickHouse UDF运行的JDK版本。 图1 修改JDK版本
- 单击“保存”保存配置。