配置FlinkServer UDF安全沙箱
用户可以根据作业需要,通过Flink Web UI界面上传UDF、依赖等第三方Jar包,并在SQL作业校验、运行作业时调用相关依赖。为了确保上传的Jar是安全的,Flink默认开启了沙箱功能,可参考为指定Jar包配置权限通过配置参数“flinkserver.security.policy”的值设置沙箱权限,参考关闭FlinkServer安全沙箱配置参数“security.manager.enabled”的值关闭沙箱功能。
权限介绍
权限包含三部分:权限类型(必选)、权限名和允许的操作。
- 默认权限
- 属性权限,允许读Property:permission java.util.PropertyPermission "*", "read";
- 套接字权限,允许connect、resolve到所有地址端口:permission java.net.SocketPermission "*", "connect,resolve";
- 标准权限
表1 文件权限 权限类型
权限名
允许的操作
示例
java.io.FilePermission
- 文件名:指定文件
- -:当前目录和子目录中的所有文件
- *:当前目录中的所有文件
- read:读
- write:写
- delete:删除
- execute:执行
表2 套接字权限 权限类型
权限名
允许的操作
示例
java.net.SocketPermission
- 主机名:端口:指定主机和端口
- *:所有地址和端口
- accept:接收
- listen:侦听
- connect:连接
- resolve:解析
表3 属性权限 权限类型
权限名
允许的操作
示例
java.util.PropertyPermission
需要访问的jvm属性名
- read:读
- write:写
读标准Java属性:
permission java.util.PropertyPermission "java.", "read";
表4 运行时权限 权限类型
权限名
java.lang.RuntimePermission
- accessDeclaredMembers:允许代码使用反射访问其他类中私有或保护的成员。
- createClassLoader:允许代码实例化类加载器。
- createSecurityManager:允许代码实例化安全管理器,它将允许程序化的实现对沙箱的控制。高危操作,UDF拥有该权限后可以修改/关闭服务的SecurityManager。
- exitVM:允许代码关闭整个虚拟机。
- getClassLoader:允许代码访问类加载器以获得某个特定的类。
- setContextClassLoader:允许代码为某线程设置上下文类加载器。
- setFactory:允许代码创建套接字工厂。
- setIO:允许代码重定向System.in、System.out或System.err输入输出流。
- setSecurityManager:允许代码设置安全管理器。
- stopThread:允许代码调用线程类的stop()方法。
表5 安全权限 权限类型
权限名
java.security.SecurityPermission
- createAccessControlContext:允许创建一个存取控制器的上下文环境。
- getPolicy:检索可以实现沙箱策略的类。
- setPolicy:设置可以实现沙箱策略的类。高危操作,UDF拥有该权限后可以修改服务的Policy。
表6 反射权限 权限类型
权限名
java.lang.reflect.ReflectPermission
suppressAccessChecks:允许利用反射检查任意类的私有变量。
表7 完全权限 权限类型
权限名
java.security.AllPermission
无(拥有执行任何操作的权限)。
使用第三方依赖Jar文件,发现权限不足并报错如下表示需配置对应的沙箱权限:
Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "xxxx" "read") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:886) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.SecurityManager.checkRead(SecurityManager.java:888) at java.io.File.exists(File.java:825) at com.xxx.ExpireUDF.(ExpireUDF.java:19)
为指定Jar包配置权限
- 登录FusionInsight Manager,访问Flink Web UI,请参考访问Flink WebUI。
- 查看Jar包存储路径。
- 为指定依赖配置权限。
返回FusionInsight Manager,选择“集群 > 服务 > Flink > 配置 > 全部配置 > FlinkServer(角色) > 自定义”,在参数“flinkserver.security.policy”的值中配置如下内容并保存:
- 重启FlinkServer实例。
单击“实例”,勾选所有FlinkServer实例,选择“更多 > 重启实例”,根据界面提示重启FlinkServer实例。