更新时间:2024-10-24 GMT+08:00

配置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)。
    • Flink的JobManager与YARN的AM是在同一个进程下。
    • 如果用户集群开启Kerberos认证需要使用kerberos认证。
    • 针对MRS 3.x之前版本,Flink不支持使用security cookie方式进行认证。
    表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证书样例章节生成“generate_keystore.sh”脚本并放置在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: false”,“generate_keystore.sh”脚本将配置项“security.ssl.key-password”、“security.ssl.keystore-password”和“security.ssl.truststore-password”的值设置为调用“generate_keystore.sh”脚本时输入的密码。配置文件中包含认证密码信息可能存在安全风险,建议当前场景执行完毕后删除相关配置文件或加强安全管理。
      • MRS 3.x及之后版本,如果需要使用密文时,设置“flink-conf.yaml”中“security.ssl.encrypt.enabled: 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
    说明:

    用户需要获取SSL证书,放置到Flink客户端中。具体操作可参考签发Flink证书样例

    使用MRS客户端预制“generate_keystore.sh”脚本获取SSL证书有效期为5年。参考签发Flink证书样例获取的SSL证书有效期为10年。

    若要关闭默认的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内部的认证方式,不需要用户配置。

    -

    当前一个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。

Yarn内部和Hadoop内部都不需要用户配置加密,用户只需要配置SSL加密传输方式。

配置SSL传输,用户主要在客户端的“flink-conf.yaml”文件中做如下配置:

  1. 打开SSL开关和设置SSL加密算法,针对MRS 3.x及之后版本,配置参数如表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加密的算法。

    针对MRS 3.x之前版本,配置参数如表3所示。

    表3 参数描述

    参数

    参数值示例

    描述

    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_AES128CBC_SHA256

    设置SSL加密的算法。

    针对MRS 3.x之前版本,如下参数见表4,在MRS的Flink默认配置中不存在,用户如果开启外部连接SSL,则需要添加以下参数。开启外部连接SSL后,因为YARN目前的开源版本无法代理HTTPS请求,所以无法通过YARN代理访问Flink的原生页面,用户可以在集群的同一个VPC下,创建windows虚拟机,在该虚拟机中访问Flink 原生页面。
    表4 参数描述

    参数

    参数值示例

    描述

    security.ssl.rest.enabled

    true

    打开外部SSL开关,若该参数配置为“true”,请参考表4配置相关参数。

    security.ssl.rest.keystore

    ${path}/flink.keystore

    keystore的存放路径。

    security.ssl.rest.keystore-password

    -

    keystore的password,-表示需要用户输入自定义设置的密码值。

    security.ssl.rest.key-password

    -

    ssl key的password,-表示需要用户输入自定义设置的密码值。

    security.ssl.rest.truststore

    ${path}/flink.truststore

    truststore存放路径。

    security.ssl.rest.truststore-password

    -

    truststore的password,-表示需要用户输入自定义设置的密码值。

    • 如果打开Task Manager之间data传输通道的SSL,对性能会有较大影响,需要用户从安全和性能综合考虑。
    • 配置文件中包含认证密码信息可能存在安全风险,建议当前场景执行完毕后删除相关配置文件或加强安全管理。
  2. 参考签发Flink证书样例章节生成“generate_keystore.sh”脚本并放置在Flink客户端的bin目录下,执行命令sh generate_keystore.sh <password>,请参考配置Flink认证和加密,针对MRS 3.x及之后版本,表5中的配置项会被默认赋值,用户也可以手动配置。
    表5 参数描述

    参数

    参数值示例

    描述

    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,-表示需要用户输入自定义设置的密码值。

    针对MRS 3.x之前版本,generate_keystore.sh不需手动生成,表6中的配置项会被默认赋值,用户也可以手动配置。

    表6 参数描述

    参数

    参数值示例

    描述

    security.ssl.internal.keystore

    ${path}/flink.keystore

    keystore的存放路径,“flink.keystore”表示用户通过generate_keystore.sh*工具生成的keystore文件名称。

    security.ssl.internal.keystore-password

    -

    keystore的password,表示需要用户输入自定义设置的密码值。

    security.ssl.internal.key-password

    -

    ssl key的password,表示需要用户输入自定义设置的密码值。

    security.ssl.internal.truststore

    ${path}/flink.truststore

    truststore存放路径,“flink.truststore”表示用户通过generate_keystore.sh*工具生成的truststore文件名称。

    security.ssl.internal.truststore-password

    -

    truststore的password,表示需要用户输入自定义设置的密码值。

    针对MRS 3.x之前版本,如果开启外部连接SSL,即 security.ssl.rest.enabled 配置为 true,则如下参数见表7,用户需要配置。

    表7 参数说明

    参数

    参数值示例

    描述

    security.ssl.rest.enabled

    true

    打开外部SSL开关,若该参数配置为“true”,请参考表7配置相关参数。

    security.ssl.rest.keystore

    ${path}/flink.keystore

    keystore的存放路径

    security.ssl.rest.keystore-password

    -

    keystore的password,表示需要用户输入自定义设置的密码值。

    security.ssl.rest.key-password

    -

    ssl key的password,表示需要用户输入自定义设置的密码值。

    security.ssl.rest.truststore

    ${path}/flink.truststore

    truststore存放路径

    security.ssl.rest.truststore-password

    -

    truststore的password,表示需要用户输入自定义设置的密码值。

    “path”目录是用来存放SSL keystore、truststore相关配置文件,该目录是由用户自定义创建。

  3. 配置客户端访问keystore或truststore文件路径。
    • 相对路径(推荐)
      请执行如下步骤配置“flink.keystore”“flink.truststore”文件路径为相对路径,并确保Flink客户端执行命令的目录可以直接访问该相对路径。
      1. 在Flink客户端“conf”目录下新建目录,例如ssl。

        cd /Flink客户端目录/Flink/flink/conf/

        mkdir ssl

      2. 移动“flink.keystore”“flink.truststore”文件到新建目录中。

        mv flink.keystore ssl/

        mv flink.truststore ssl/

      3. 修改“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各个节点的该绝对路径上。