更新时间:2024-08-05 GMT+08:00

准备Flink安全认证

场景说明

在安全集群环境下,各个组件之间的相互通信不能够简单的互通,而需要在通信之前进行相互认证,以确保通信的安全性。

用户在提交Flink应用程序时,需要与Yarn、HDFS等之间进行通信。那么提交Flink的应用程序中需要设置安全认证,确保Flink程序能够正常运行。

当前Flink系统支持认证和加密传输,要使用认证和加密传输,用户需要做如下准备:

安全认证

图1 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认证和security cookie认证。
表1 安全认证方式

安全认证方式

配置方法

Kerberos认证(当前只支持keytab认证方式)

  1. 从FusionInsight Manager上下载准备集群认证用户信息创建的用户keytab文件,并放置到Flink客户端所在节点的某个目录下。
  2. 在“客户端安装路径/Flink/flink/conf/flink-conf.yaml”上配置:
    1. 配置客户端安装节点的业务IP和Master节点IP到“jobmanager.web.access-control-allow-origin”和“jobmanager.web.allow-access-address”配置项中。
      jobmanager.web.access-control-allow-origin: xx.xx.xxx.xxx,xx.xx.xxx.xxx,xx.xx.xxx.xxx jobmanager.web.allow-access-address: xx.xx.xxx.xxx,xx.xx.xxx.xxx,xx.xx.xxx.xxx
      说明:

      集群外节点业务IP为安装客户端所在的弹性云服务器的IP。集群内节点业务IP获取方式如下:

      登录MapReduce服务管理控制台,选择“现有集群”,选中当前的集群并单击集群名,进入集群信息页面。在“节点管理”中查看安装客户端所在的节点IP。

    2. keytab路径。
      security.kerberos.login.keytab: /home/flinkuser/keytab/flinkuser.keytab
      说明:

      “/home/flinkuser/keytab/”表示的是用户保存keytab文件的目录。

    3. principal名为用于运行作业的用户名。
      security.kerberos.login.principal: flinkuser
    4. 对于HA模式,如果配置了ZooKeeper,还需要设置ZK kerberos认证相关的配置。
      zookeeper.sasl.disable: false
      security.kerberos.login.contexts: Client
    5. 如果用户对于Kafka client和Kafka broker之间也需要做kerberos认证,配置如下:
      security.kerberos.login.contexts: Client,KafkaClient

Security Cookie认证

  1. 将“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。

  2. 打开“Security Cookie”开关,配置“security.enable: true”,查看“security cookie”是否已配置成功,例如:
    security.cookie: ae70acc9-9795-4c48-ad35-8b5adc8071744f605d1d-2726-432e-88ae-dd39bfec40a9

YARN内部认证方式

该方式是YARN内部的认证方式,不需要用户配置。

当前一个Flink集群只支持一个用户,一个用户可以创建多个Flink集群。

加密传输

图2 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加密算法,配置参数如表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加密的算法

    如果打开Task Manager之间data传输通道的SSL,对性能会有较大影响,需要用户从安全和性能综合考虑。

  2. 在Flink客户端的bin目录下,执行命令sh generate_keystore.sh <password>,具体操作可参考认证和加密表3中的配置项会被默认赋值,用户也可以手动配置。
    表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,表示需要用户输入自定义设置的密码值。

    “path”目录是用来存放SSL keystore、truststore相关配置文件,该目录是由用户自定义创建。相对路径和绝对路径的不同导致执行命令存在差异,在34详细说明。

  3. 配置keystore或truststore文件路径为相对路径时,Flink Client执行命令的目录需要可以直接访问该相对路径。Flink有两种执行方式来传输keystore和truststore文件。
    • 在Flink的CLI yarn-session.sh命令中增加“-t”选项来传输keystore和truststore文件到各个执行节点。例如:

      cd /opt/client/Flink/flink

      ./bin/yarn-session.sh -t ssl/

    • 在Flink run命令中增加“-yt”选项来传输keystore和truststore文件到各个执行节点。例如:

      ./bin/flink run -yt ssl/ -ys 3 -m yarn-cluster -c com.huawei.SocketWindowWordCount ../lib/flink-eg-1.0.jar --hostname r3-d3 --port 9000

      • 示例中的“ssl/”是Flink客户端目录下自定义的子目录,用来存放SSL keystore、truststore相关配置文件。
      • Flink客户端执行命令的当前路径需要能访问到“ssl/”相对路径。
  4. 配置keystore或truststore文件路径为绝对路径时,需要在Flink Client以及Yarn各个节点的该绝对路径上放置keystore或truststore文件。
    Flink有两种方式执行应用程序,且执行命令中不需要使用“-t”“-yt”来传输keystore和truststore文件。
    • 使用Flink的CLI yarn-session.sh命令执行应用程序。如:

      ./bin/yarn-session.sh

    • 使用Flink run命令执行应用程序。如:

      ./bin/flink run -ys 3 -m yarn-cluster -c com.huawei.SocketWindowWordCount ../lib/flink-eg-1.0.jar --hostname r3-d3 --port 9000