
# 配置Flink认证和加密
#### 安全认证
Flink整个系统存在三种认证方式：
- 使用kerberos认证：Flink yarn client与Yarn Resource Manager、JobManager与Zookeeper、JobManager与HDFS、TaskManager与HDFS、Kafka与TaskManager、TaskManager和Zookeeper。
- 使用security cookie进行认证：Flink yarn client与Job Manager、JobManager与TaskManager、TaskManager与TaskManager。
- 使用YARN内部的认证机制：Yarn Resource Manager与Application Master（简称AM）。
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  - Flink的JobManager与YARN的AM是在同一个进程下。
  
  - 如果用户集群开启Kerberos认证需要使用kerberos认证。
   
  表1安全认证方式 
  | **安全认证方式**         | **说明**                   | **配置方法**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
  |:---|:---|:---|
  | Kerberos认证         | 当前只支持keytab认证方式。         | 1. 从FusionInsight Manager下载用户keytab，并将keytab放到Flink客户端所在主机的某个文件夹下。  2. 在"flink-conf.yaml"上配置： 1. keytab路径。 ``` security.kerberos.login.keytab: /home/flinkuser/keytab/abc222.keytab ``` 说明： "/home/flinkuser/keytab/abc222.keytab"表示的是用户目录。   2. principal名。 ``` security.kerberos.login.principal: abc222 ```   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 ```                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
  | Security Cookie 认证 | -                        | 1. 在Flink客户端的"bin"目录下，调用"generate_keystore.sh"脚本，生成"Security Cookie"、"flink.keystore"文件和"flink.truststore"文件。 执行**sh generate_keystore.sh**，输入用户自定义密码。密码不允许包含#。 说明： 执行脚本后，在Flink客户端的"conf"目录下生成"flink.keystore"和"flink.truststore"文件，并且在客户端配置文件"flink-conf.yaml"中将以下配置项进行了默认赋值。 - 将配置项"security.ssl.keystore"设置为"flink.keystore"文件所在绝对路径。  - 将配置项"security.ssl.truststore"设置为"flink.truststore"文件所在的绝对路径。    - 将配置项"security.cookie"设置为"generate_keystore.sh"脚本自动生成的一串随机规则密码。    - 默认"flink-conf.yaml"中"security.ssl.encrypt.enabled: true"。该参数值设置为false时，可通过执行"generate_keystore.sh"脚本，将配置项"security.ssl.key-password"、"security.ssl.keystore-password"和"security.ssl.truststore-password"的值自动替换为调用"generate_keystore.sh"脚本时输入的密码。 ``` cd /opt/hadoopclient/Flink/flink/bin sh generate_keystore.sh ``` 该脚本会自动替换"/opt/hadoopclient/Flink/flink/conf/flink-conf.yaml"中关于SSL的相关配置参数值。     - 默认"flink-conf.yaml"中"security.ssl.encrypt.enabled: true"。该参数值设置为true时，"generate_keystore.sh"脚本不会配置"security.ssl.key-password"、"security.ssl.keystore-password"和"security.ssl.truststore-password"的值，需要使用Manager明文加密API进行获取，执行**curl -k -i -u** *user name* **:** *password* **-X POST -HContent-type:application/json -d '{"plainText":"** *password* **"}' 'https://** *x.x.x.x* **:28443/web/api/v2/tools/encrypt'** 其中*user name* **:** password分别为当前系统登录用户名和密码；**"plainText"**的password为调用"generate_keystore.sh"脚本时的密码；x.x.x.x为集群Manager的浮动IP。命令中如果携带认证密码信息可能存在安全风险，在执行命令前建议关闭系统的history命令记录功能，避免信息泄露。      2. 查看是否打开"Security Cookie"开关，即查看配置"flink-conf.yaml"文件中的"security.enable: true"，查看"security cookie"是否已配置成功，例如： ``` security.cookie: ae70acc9-9795-4c48-ad35-8b5adc8071744f605d1d-2726-432e-88ae-dd39bfec40a9 ```    说明： 使用MRS客户端预置"generate_keystore.sh"脚本获取SSL证书有效期为5年。 如果要关闭默认的SSL认证方式，需在"flink-conf.yaml"文件中配置"security.ssl.enabled"的值为"false"，并且注释如下参数：security.ssl.key-password、security.ssl.keystore-password、security.ssl.keystore、security.ssl.truststore-password、security.ssl.trustore。 |
  | YARN内部认证方式         | 该方式是YARN内部的认证方式，不需要用户配置。 | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
     
  ![](https://support.huaweicloud.com/cmpntguide-lts-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/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
Yarn内部和Hadoop内部都不需要用户配置加密，用户只需要配置SSL加密传输方式。
配置SSL传输，用户主要在客户端的"flink-conf.yaml"文件中做如下配置：
1. 打开SSL开关和设置SSL加密算法，配置参数如[表2]所示，请根据实际情况修改对应参数值。
    表2参数描述 
   | **参数**                       | **参数值示例**                                                                                                                                           | **描述**                   |
   |:---|:---|:---|
   | security.ssl.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_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 | 设置SSL加密的算法。              |
      
   ![](https://support.huaweicloud.com/cmpntguide-lts-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.keystore            | ${path}/flink.keystore   | keystore的存放路径，"flink.keystore"表示用户通过generate_keystore.sh\*工具生成的keystore文件名称。      |
   | security.ssl.keystore-password   | -                        | keystore的password，-表示需要用户输入自定义设置的密码值。                                             |
   | security.ssl.key-password        | -                        | ssl key的password，-表示需要用户输入自定义设置的密码值。                                              |
   | security.ssl.truststore          | ${path}/flink.truststore | truststore存放路径，"flink.truststore"表示用户通过generate_keystore.sh\*工具生成的truststore文件名称。 |
   | security.ssl.truststore-password | -                        | truststore的password，-表示需要用户输入自定义设置的密码值。                                           |
      
   ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
   "path"目录是用来存放SSL keystore、truststore相关配置文件，该目录是由用户自定义创建。
   
3. 配置客户端访问keystore或truststore文件路径。
   - 相对路径（推荐）
     请执行如下步骤配置"flink.keystore"和"flink.truststore"文件路径为相对路径，并确保Flink客户端执行命令的目录可以直接访问该相对路径。
     1. 在Flink客户端"conf"目录下新建目录，例如ssl。 切换至Flink客户端"conf"目录：
        ```
        cd /Flink客户端目录/Flink/flink/conf/
        ```
        创建"ssl"目录：
        ```
        mkdir ssl
        ```
        
     
     2. 移动"flink.keystore"和"flink.truststore"文件到新建目录中。
        ```
        mv flink.keystore ssl/
        mv flink.truststore ssl/
        ```
        
     
     3. 修改"flink-conf.yaml"文件中如下两个参数为相对路径。 执行以下命令编辑"flink-conf.yaml"文件：
        ```
        vi /Flink客户端目录/Flink/flink/conf/flink-conf.yaml
        ```
        修改以下两个参数为相对路径：
        ```
        security.ssl.keystore: ssl/flink.keystore
        security.ssl.truststore: ssl/flink.truststore
        ```
        
       
   
   - 绝对路径 执行"generate_keystore.sh"脚本后，默认在"flink-conf.yaml"文件中将"flink.keystore"和"flink.truststore"文件路径自动配置为绝对路径，此时需要将"conf"目录中的"flink.keystore"和"flink.truststore"文件分别放置在Flink客户端以及Yarn各个节点的该绝对路径上。
     
    
 
