更新时间:2024-12-11 GMT+08:00

配置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:执行
    • 允许所有文件的读、写、删除、执行:

      permission java.io.FilePermission "<< ALL FILES>>", "read,write,delete,execute";

    • 允许对用户主目录的读:

      permission java.io.FilePermission "${user.home}/-", "read";

    表2 套接字权限

    权限类型

    权限名

    允许的操作

    示例

    java.net.SocketPermission

    • 主机名:端口:指定主机和端口
    • *:所有地址和端口
    • accept:接收
    • listen:侦听
    • connect:连接
    • resolve:解析
    • 允许实现所有套接字操作:

      permission java.net.SocketPermission ":1-", "accept,listen,connect,resolve";

    • 允许建立到特定网站的连接和解析:

      permission java.net.SocketPermission ".abc.com:1-", "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包配置权限

  1. 登录FusionInsight Manager,访问Flink Web UI,请参考访问FlinkServer WebUI界面
  2. 查看Jar包存储路径。

    • 记录UDF的存储路径

      单击“UDF管理”,在UDF列表查看并记录其“存储路径”。

    • 记录第三方依赖的存储路径

      单击“依赖管理”,在依赖列表查看并记录其“存储路径”。

  3. 为指定依赖配置权限。

    返回FusionInsight Manager,选择“集群 > 服务 > Flink > 配置 > 全部配置 > FlinkServer(角色) > 自定义”,在参数“flinkserver.security.policy”的值中配置如下内容并保存:

    • 名称:2中记录的存储路径。多个路径需单击加号添加多行输入。
    • 值:权限值,以分号结尾。例如:permission java.util.PropertyPermission "*", "read";permission java.net.SocketPermission "*", "connect,resolve";。详情可参考权限介绍

  4. 重启FlinkServer实例。

    单击“实例”,勾选所有FlinkServer实例,选择“更多 > 重启实例”,根据界面提示重启FlinkServer实例。

关闭FlinkServer安全沙箱

  1. 登录FusionInsight Manager。
  2. 选择“集群 > 服务 > Flink > 配置 > 全部配置”。
  3. 搜索参数“security.manager.enabled”并将其值置为“false”。
  4. 单击“保存”根据界面提示保存配置。
  5. 单击“实例”,勾选所有FlinkServer实例,选择“更多 > 重启实例”,根据界面提示重启FlinkServer实例。