
# 准备Flink应用安全认证
MRS服务集群开启了Kerberos认证需要执行以下步骤，没有开启Kerberos认证的集群忽略该步骤。
在安全集群环境下，各个组件之间的相互通信不能够简单地互通，而需要在通信之前进行相互认证，以确保通信的安全性。
用户在提交Flink应用程序时，需要与Yarn、HDFS等之间进行通信。那么提交Flink的应用程序中需要设置安全认证，确保Flink程序能够正常运行。
当前Flink系统支持认证和加密传输，要使用认证和加密传输，用户需要做如下准备：
#### 安全认证
Flink整个系统有两种认证方式：
- 使用kerberos认证：Flink yarn client与Yarn Resource Manager、JobManager与Zookeeper、JobManager与HDFS、TaskManager与HDFS、Kafka与TaskManager、TaskManager和Zookeeper。
- 使用YARN内部的认证机制：Yarn Resource Manager与Application Master（简称AM）。
  ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
  Flink的JobManager与YARN的AM是在同一个进程下。
  表1安全认证方式 
  | 安全认证方式     | 说明                       | 配置方法                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  |:---|:---|:---|
  | Kerberos认证 | 当前只支持keytab认证方式。         | 1. 从KDC服务器上下载用户keytab，并将keytab放到Flink客户端所在主机的某个文件夹下(例如/home/flinkuser/keytab)。  2. 在"${FLINK_HOME}/conf/flink-conf.yaml"上配置： 1. keytab路径。 ``` security.kerberos.login.keytab: /home/flinkuser/keytab/user.keytab ``` 说明： "/home/flinkuser/keytab/"表示的是用户保存keytab的目录。   2. principal名(即开发用户名)。 ``` security.kerberos.login.principal:flinkuser ```   3. 对于HA模式，如果配置了ZooKeeper，还需要设置ZK kerberos认证相关的配置。配置如下： ``` zookeeper.sasl.disable: false security.kerberos.login.contexts: Client ```   4. 如果用户对于Kafka client和Kafka broker之间也需要做kerberos认证，配置如下： ``` security.kerberos.login.contexts: Client,KafkaClient ```      |
  | YARN内部认证方式 | 该方式是YARN内部的认证方式，不需要用户配置。 | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     
  ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
  当前一个Flink集群只支持一个用户，一个用户可以创建多个Flink集群。
  
 
#### 加密传输
Flink整个系统有三种加密传输方式：
- 使用Yarn内部的加密传输方式：Flink yarn client与Yarn Resource Manager、Yarn Resource Manager与Job Manager。
- SSL：Flink yarn client与JobManager、JobManager与TaskManager、TaskManager与TaskManager。
- 使用Hadoop内部的加密传输方式：JobManager和HDFS、TaskManager和HDFS、JobManager与ZooKeeper、TaskManager与ZooKeeper。
  ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
  Yarn内部和Hadoop内部都不需要用户配置加密，用户只需要配置SSL加密传输方式。
  
配置SSL传输，用户主要在客户端的"flink-conf.yaml"文件中做如下配置：
1. 打开SSL开关和设置SSL加密算法，配置参数如[表2]所示，请根据实际情况修改对应参数值。
   
    表2参数描述 
   | 参数                            | 参数值示例                           | 描述                       |
   |:---|:---|:---|
   | security.ssl.internal.enabled | true                            | 打开内部SSL开关。               |
   | akka.ssl.enabled              | true                            | 打开akka SSL开关。            |
   | blob.service.ssl.enabled      | true                            | 打开blob通道SSL开关。           |
   | taskmanager.data.ssl.enabled  | true                            | 打开taskmanager之间通信的SSL开关。 |
   | security.ssl.algorithms       | TLS_RSA_WITH_AES_128_CBC_SHA256 | 设置SSL加密的算法。              |
      
   如下参数MRS的Flink默认配置没有，用户可以根据需要进行添加，外部连接开启SSL，YARN的代理无法访问Flink页面。这是由于YARN不支持https代理。配置文件中包含认证密码信息可能存在安全风险，建议当前场景执行完毕后删除相关配置文件或加强安全管理。
   
   | **参数**                                | **参数值示例**                | **描述**                                         |
   |:---|:---|:---|
   | security.ssl.rest.enabled             | true                     | 打开外部SSL开关。                                     |
   | security.ssl.rest.keystore            | ${path}/flink.keystore   | keystore的存放路径。                                 |
   | security.ssl.rest.keystore-password   | 123456                   | keystore的password，"123456"表示需要用户输入自定义设置的密码值。   |
   | security.ssl.rest.key-password        | 123456                   | ssl key的password，"123456"表示需要用户输入自定义设置的密码值。    |
   | security.ssl.rest.truststore          | ${path}/flink.truststore | truststore存放路径。                                |
   | security.ssl.rest.truststore-password | 123456                   | truststore的password，"123456"表示需要用户输入自定义设置的密码值。 |
      
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   如果打开Task Manager之间data传输通道的SSL，对性能会有较大影响，需要用户从安全和性能综合考虑。
   
   
2. 在Flink客户端的bin目录下，执行命令***sh generate_keystore.sh \<password\>*** ，[表3]中的配置项会被默认赋值，用户也可以手动配置。命令中如果携带认证密码信息可能存在安全风险，在执行命令前建议关闭系统的history命令记录功能，避免信息泄露。
   
    表3参数描述 
   | 参数                                        | 参数值示例                    | 描述                                                                                |
   |:---|:---|:---|
   | security.ssl.internal.keystore            | ${path}/flink.keystore   | keystore的存放路径，"flink.keystore"表示用户通过generate_keystore.sh\*工具生成的keystore文件名称。      |
   | security.ssl.internal.keystore-password   | 123456                   | keystore的password，"123456"表示需要用户输入自定义设置的密码值。                                      |
   | security.ssl.internal.key-password        | 123456                   | ssl key的password，"123456"表示需要用户输入自定义设置的密码值。                                       |
   | security.ssl.internal.truststore          | ${path}/flink.truststore | truststore存放路径，"flink.truststore"表示用户通过generate_keystore.sh\*工具生成的truststore文件名称。 |
   | security.ssl.internal.truststore-password | 123456                   | truststore的password，"123456"表示需要用户输入自定义设置的密码值。                                    |
      
   如果开启外部连接SSL，即 security.ssl.rest.enabled 配置为 true，则如下参数用户需要配置
   
   | **参数**                                | **参数值示例**                | **描述**                                         |
   |:---|:---|:---|
   | security.ssl.rest.keystore            | ${path}/flink.keystore   | keystore的存放路径。                                 |
   | security.ssl.rest.keystore-password   | 123456                   | keystore的password，"123456"表示需要用户输入自定义设置的密码值。   |
   | security.ssl.rest.key-password        | 123456                   | ssl key的password，"123456"表示需要用户输入自定义设置的密码值。    |
   | security.ssl.rest.truststore          | ${path}/flink.truststore | truststore存放路径。                                |
   | security.ssl.rest.truststore-password | 123456                   | truststore的password，"123456"表示需要用户输入自定义设置的密码值。 |
      
   "path"目录是用来存放SSL keystore、truststore相关配置文件，该目录是由用户自定义创建。相对路径和绝对路径的不同导致执行命令存在差异，详细说明如下。
   ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 配置keystore或truststore文件路径为**相对路径** 时，Flink Client执行命令的目录需要可以直接访问该相对路径
     ```
     security.ssl.internal.keystore: ssl/flink.keystore
     security.ssl.internal.truststore: ssl/flink.truststore
     ```
     
   
   - 配置keystore或truststore文件路径为**绝对路径** 时，需要在Flink Client以及各个节点的该绝对路径上放置keystore或truststore文件。
     ```
     security.ssl.internal.keystore: /opt/client/Flink/flink/conf/flink.keystore
     security.ssl.internal.truststore: /opt/client/Flink/flink/conf/flink.truststore
     ```
     
    
   - 配置keystore或truststore文件路径为相对路径时，Flink Client执行命令的目录需要可以直接访问该相对路径。Flink有两种执行方式来传输keystore和truststore文件。
     - 在Flink的CLI yarn-session.sh命令中增加"-t"选项来传输keystore和truststore文件到各个执行节点。如：
       ```
       ./bin/yarn-session.sh -t ssl/ -n 2
       ```
       
     
     - 在Flink run命令中增加"-yt"选项来传输keystore和truststore文件到各个执行节点。如：
       ```
       ./bin/flink run -yt ssl/ -ys 3 -yn 3 -m yarn-cluster -c com.huawei.SocketWindowWordCount lib/flink-eg-1.0.jar --hostname r3-d3 --port 9000
       ```
       ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
       - 在举例当中的"ssl/"是Flink Client端目录下的子目录，该目录是用来存放SSL keystore、truststore相关配置文件。
       
       - Flink Client执行命令的当前路径需要能访问到"ssl/"相对路径。
         
      
   
   - 配置keystore或truststore文件路径为绝对路径时，需要在Flink Client以及各个节点的该绝对路径上放置keystore和truststore文件，并且提交作业的用户需要具有读取keystore和truststore文件的权限。 Flink有两种方式执行应用程序，且执行命令中不需要使用"-t"或"-yt"来传输keystore和truststore文件。
     - 使用Flink的CLI yarn-session.sh命令执行应用程序。如：
       ```
       ./bin/yarn-session.sh -n 2
       ```
       
     
     - 使用Flink run命令执行应用程序。如：
       ```
       ./bin/flink run  -ys 3 -yn 3 -m yarn-cluster -c com.huawei.SocketWindowWordCount lib/flink-eg-1.0.jar --hostname r3-d3 --port 9000
       ```
       
      
   
   
   
   
 
