SSL设置

此页面提供有关如何为Flink进程之间和之间的网络通信启用TLS / SSL身份验证和加密的说明。

内部和外部连接

通过身份验证和加密保护机器进程之间的网络连接时,Apache Flink可区分内部外部连接。内部连接是指Flink进程之间建立的所有连接。这些连接运行Flink自定义协议。用户永远不会直接连接到内部连接端点。外部/ REST连接端点是指从外部到Flink进程的所有连接。这包括用于启动和控制正在运行的Flink作业/应用程序的Web UI和REST命令,包括Flink CLI与JobManager / Dispatcher的通信。

为了获得更大的灵活性,可以单独启用和配置内部和外部连接的安全性。

内部和外部连接

内部连接

内部连接包括:

  • 控制消息:JobManager / TaskManager / Dispatcher / ResourceManager之间的RPC
  • 数据平面:TaskManagers之间的连接,用于在随机播放,广播,再分配等过程中交换数据。
  • Blob服务(库和其他工件的分发)。所有内部连接都经过SSL身份验证和加密。连接使用相互身份验证,这意味着每个连接的服务器端和客户端都需要相互提供证书。证书有效地作为共享密钥。

常见的设置是为Flink部署生成专用证书(可以是自签名的)。任何其他方都不需要与Flink交互的内部通信证书,可以简单地添加到容器镜像或附加到YARN部署。

注意:由于内部连接使用共享证书进行相互身份验证,因此Flink可以跳过主机名验证。这使基于容器的设置更容易。

外部/ REST连接

所有外部连接都通过HTTP / REST端点公开,例如由Web UI和CLI使用:

  • Dispatcher通信以提交作业(会话群集)
  • JobManager通信以检查和修改正在运行的作业/应用程序可以将REST端点配置为需要SSL连接。但是,服务器将接受来自任何客户端的连接,这意味着REST端点不会对客户端进行身份验证。

如果需要验证与REST端点的连接,我们建议部署“侧面汽车代理”:将REST端点绑定到环回接口(或Kubernetes中的pod本地接口)并启动REST代理,以验证和转发要求Flink。Flink用户部署的代理的示例Envoy Proxy带有MOD_AUTH的NGINX

将身份验证委托给代理的理由是,这些代理提供的许多身份验证选项比Flink项目可以合理地实现自身更多,因此可以更好地集成到现有的基础架构中。

可查询状态

与可查询状态端点的连接当前未经过身份验证或加密。

配置SSL

可以单独为内部外部连接启用S​​SL

  • security.ssl.internal.enabled:为所有内部连接启用S​​SL 。
  • security.ssl.rest.enabled:为REST /外部连接启用S​​SL 。注意:为了向后兼容,security.ssl.enabled选项仍然存在,并为内部和REST端点启用SSL。

对于内部连接,您可以选择分别禁用不同连接类型的安全性。如果security.ssl.internal.enabled设置为true,则可以设置以下参数false以禁用该特定连接类型的SSL:

  • taskmanager.data.ssl.enabled:TaskManagers之间的数据通信
  • blob.service.ssl.enabled:将BLOB从JobManager传输到TaskManager
  • akka.ssl.enabled:JobManager / TaskManager / ResourceManager之间基于Akka的RPC连接

Keystore和Truststores

SSL配置需要配置Keys库信任Keys库包含公共证书(公钥)和私钥,而信任库包含可信证书或可信当局。需要设置这两个存储,以便信任库信任Keys库的证书。

内部连接

由于内部通信是相互身份验证的,因此Keys库和信任库通常包含相同的专用证书。证书可以使用通配符主机名或地址,因为证书应该是共享Keys,并且不验证主机名。甚至可以使用与信任库相同的文件(Keys库)。

  1. security.ssl.internal.keystore: /path/to/file.keystore
  2. security.ssl.internal.keystore-password: keystore_password
  3. security.ssl.internal.key-password: key_password
  4. security.ssl.internal.truststore: /path/to/file.truststore
  5. security.ssl.internal.truststore-password: truststore_password

REST端点(外部连接)

对于REST端点,Keys库由服务器端点使用,并且REST客户端(包括CLI客户端)使用信任库来接受服务器的证书。在RESTKeys库具有自签名证书的情况下,信任库必须直接信任该证书。如果REST端点使用通过适当的证书层次结构签名的证书,则该层次结构的根应位于信任库中。

  1. security.ssl.rest.keystore: /path/to/file.keystore
  2. security.ssl.rest.keystore-password: keystore_password
  3. security.ssl.rest.key-password: key_password
  4. security.ssl.rest.truststore: /path/to/file.truststore
  5. security.ssl.rest.truststore-password: truststore_password

重要

IETF RFC 7525建议使用一组特定的密码套件的强大的安全性。由于这些密码套件在开箱即用的许多设置中都不可用,因此Flink的默认值设置为稍弱但更兼容的密码套件。如果可能,我们建议通过在Flink配置中添加以下条目,SSL设置更新到更强大的密码套件:

  1. 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

如果您的设置不支持这些密码套件,您将看到Flink进程无法相互连接。

创建和部署Keys库和信任库

可以使用keytool实用程序生成Keys,证书以及Keys库和信任库您需要从Flink集群中的每个节点访问适当的Java Keystore和Truststore。

  • 对于独立安装,这意味着将文件复制到每个节点,或将它们添加到共享安装目录。
  • 对于基于容器的设置,请将Keys库和信任库文件添加到容器镜像中。
  • 对于Yarn / Mesos设置,群集部署阶段可以自动分发Keys库和信任库文件。对于面向外部的REST端点,证书中的公用名称或主题Slave 名称应与节点的主机名和IP地址匹配。

示例SSL Setup Standalone和Kubernetes

内部连接

执行以下keytool命令以在Keys库中创建Keys对:

  1. keytool -genkeypair -alias flink.internal -keystore internal.keystore -dname "CN=flink.internal" -storepass internal_store_password -keypass internal_key_password -keyalg RSA -keysize 4096

Keys库中的单个Keys/证书由服务器和客户端端点以相同的方式使用(相互身份验证)。Keys对充当内部安全的共享Keys,我们可以直接将其用作Keys库和信任库。

  1. security.ssl.internal.enabled: true
  2. security.ssl.internal.keystore: /path/to/flink/conf/internal.keystore
  3. security.ssl.internal.truststore: /path/to/flink/conf/internal.keystore
  4. security.ssl.internal.keystore-password: internal_store_password
  5. security.ssl.internal.truststore-password: internal_store_password
  6. security.ssl.internal.key-password: internal_key_password

REST端点

REST端点可以从外部进程接收连接,包括不属于Flink的工具(例如,对REST API的curl请求)。设置通过CA层次结构签名的正确证书可能对REST端点有意义。

但是,如上所述,REST端点不会对客户端进行身份验证,因此通常需要通过代理进行安全保护。

REST端点(简单的自签名证书)

此示例显示如何创建简单的Keys库/信任库对。信任库不包含主键,可以与其他应用程序共享。在此示例中,myhost.company.org / ip:10.0.2.15是Flink主节点的节点(或服务)。

  1. keytool -genkeypair -alias flink.rest -keystore rest.keystore -dname "CN=myhost.company.org" -ext "SAN=dns:myhost.company.org,ip:10.0.2.15" -storepass rest_keystore_password -keypass rest_key_password -keyalg RSA -keysize 4096
  2. keytool -exportcert -keystore rest.keystore -alias flink.rest -storepass rest_keystore_password -file flink.cer
  3. keytool -importcert -keystore rest.truststore -alias flink.rest -storepass rest_truststore_password -file flink.cer -noprompt
  1. security.ssl.rest.enabled: true
  2. security.ssl.rest.keystore: /path/to/flink/conf/rest.keystore
  3. security.ssl.rest.truststore: /path/to/flink/conf/rest.truststore
  4. security.ssl.rest.keystore-password: rest_keystore_password
  5. security.ssl.rest.truststore-password: rest_truststore_password
  6. security.ssl.rest.key-password: rest_key_password

REST端点(带有自签名CA)

执行以下keytool命令以使用自签名CA创建信任库。

  1. keytool -genkeypair -alias ca -keystore ca.keystore -dname "CN=Sample CA" -storepass ca_keystore_password -keypass ca_key_password -keyalg RSA -keysize 4096 -ext "bc=ca:true"
  2. keytool -exportcert -keystore ca.keystore -alias ca -storepass ca_keystore_password -file ca.cer
  3. keytool -importcert -keystore ca.truststore -alias ca -storepass ca_truststore_password -file ca.cer -noprompt

现在使用由上述CA签名的证书为REST端点创建Keys库。flink.company.org / ip:10.0.2.15成为Flink master(JobManager)的主机名。

  1. keytool -genkeypair -alias flink.rest -keystore rest.signed.keystore -dname "CN=flink.company.org" -ext "SAN=dns:flink.company.org" -storepass rest_keystore_password -keypass rest_key_password -keyalg RSA -keysize 4096
  2. keytool -certreq -alias flink.rest -keystore rest.signed.keystore -storepass rest_keystore_password -keypass rest_key_password -file rest.csr
  3. keytool -gencert -alias ca -keystore ca.keystore -storepass ca_keystore_password -keypass ca_key_password -ext "SAN=dns:flink.company.org,ip:10.0.2.15" -infile rest.csr -outfile rest.cer
  4. keytool -importcert -keystore rest.signed.keystore -storepass rest_keystore_password -file ca.cer -alias ca -noprompt
  5. keytool -importcert -keystore rest.signed.keystore -storepass rest_keystore_password -keypass rest_key_password -file rest.cer -alias flink.rest -noprompt

现在将以下配置添加到您的flink-conf.yaml

  1. security.ssl.rest.enabled: true
  2. security.ssl.rest.keystore: /path/to/flink/conf/rest.signed.keystore
  3. security.ssl.rest.truststore: /path/to/flink/conf/ca.truststore
  4. security.ssl.rest.keystore-password: rest_keystore_password
  5. security.ssl.rest.key-password: rest_key_password
  6. security.ssl.rest.truststore-password: ca_truststore_password

YARN / Mesos部署提示

对于YARN和Mesos,您可以使用Yarn和Mesos的工具来帮助:

  • 配置内部通信的安全性与上面的示例完全相同。

  • 要保护REST端点,您需要颁发REST端点的证书,使其对Flink主服务器可能部署到的所有主机都有效。这可以使用通配符DNS名称或通过添加多个DNS名称来完成。

  • 部署Keys库和信任库的最简单方法是通过YARN客户端的发送文件选项(-yt)。将Keys库和信任库文件复制到本地目录(例如deploy-keys/)并按如下方式启动YARN会话:flink run -m yarn-cluster -yt deploy-keys/ flinkapp.jar

  • 使用YARN部署时,可以通过YARN代理的跟踪URL访问Flink的Web仪表板。要确保YARN代理能够访问Flink的HTTPS URL,您需要配置YARN代理以接受Flink的SSL证书。为此,将自定义CA证书添加到YARN代理节点上的Java默认信任库中。