配置FlinkServer UDF安全沙箱
本章节适用于MRS 3.3.1及以后版本。
用户可以根据作业需要,通过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,请参考访问FlinkServer WebUI界面。
 - 查看Jar包存储路径。
 - 为指定依赖配置权限。
    
    
返回FusionInsight Manager,选择“集群 > 服务 > Flink > 配置 > 全部配置 > FlinkServer(角色) > 自定义”,在参数“flinkserver.security.policy”的值中配置如下内容并保存:
 - 重启FlinkServer实例。
    
    
单击“实例”,勾选所有FlinkServer实例,选择“更多 > 重启实例”,根据界面提示重启FlinkServer实例。