
# 配置FlinkServer UDF安全沙箱
#### 操作场景
用户可以根据作业需要，通过Flink Web UI界面上传UDF、依赖等第三方Jar包，并在SQL作业校验、运行作业时调用相关依赖。为了确保上传的Jar是安全的，Flink默认开启了沙箱功能，可参考[关闭FlinkServer安全沙箱]配置参数"security.manager.enabled"的值关闭沙箱功能。
#### 约束与限制
本章节适用于MRS 3.3.1-LTS及之后版本。
#### 权限介绍
权限包含三部分：权限类型（必选）、权限名和允许的操作。
- 默认权限
  - 属性权限，允许读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 | 无（拥有执行任何操作的权限）。 |
     
  
 
 #### 关闭FlinkServer安全沙箱
1. 登录MRS集群Manager。 
   登录集群Manager具体操作，请参考[访问MRS集群Manager](https://support.huaweicloud.com/usermanual-mrs/mrs_01_0128.html)。
   
   
2. 选择"集群 \> 服务 \> Flink \> 配置 \> 全部配置"。
3. 搜索参数"security.manager.enabled"并将其值置为"false"。
4. 单击"保存"根据界面提示保存配置。
5. 单击"实例"，勾选所有FlinkServer实例，选择"更多 \> 重启实例"，根据界面提示重启FlinkServer实例。
 
