返回介绍

SSL 设置

发布于 2025-05-02 18:19:20 字数 9098 浏览 0 评论 0 收藏

此页面提供有关如何为 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

可以单独为 内部 和 外部 连接启用 SSL :

  • security.ssl.internal.enabled :为所有 内部 连接启用 SSL 。
  • security.ssl.rest.enabled :为 REST /外部 连接启用 SSL 。

注意:为了向后兼容, 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 库)。

security.ssl.internal.keystore: /path/to/file.keystore
security.ssl.internal.keystore-password: keystore_password
security.ssl.internal.key-password: key_password
security.ssl.internal.truststore: /path/to/file.truststore
security.ssl.internal.truststore-password: truststore_password

REST 端点(外部连接)

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

security.ssl.rest.keystore: /path/to/file.keystore
security.ssl.rest.keystore-password: keystore_password
security.ssl.rest.key-password: key_password
security.ssl.rest.truststore: /path/to/file.truststore
security.ssl.rest.truststore-password: truststore_password

重要

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

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

创建和部署 Keys 库和信任库

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

  • 对于独立安装,这意味着将文件复制到每个节点,或将它们添加到共享安装目录。
  • 对于基于容器的设置,请将 Keys 库和信任库文件添加到容器镜像中。
  • 对于 Yarn / Mesos 设置,群集部署阶段可以自动分发 Keys 库和信任库文件。

对于面向外部的 REST 端点,证书中的公用名称或主题 Slave 名称应与节点的主机名和 IP 地址匹配。

示例 SSL Setup Standalone 和 Kubernetes

内部连接

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

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 库和信任库。

security.ssl.internal.enabled: true
security.ssl.internal.keystore: /path/to/flink/conf/internal.keystore
security.ssl.internal.truststore: /path/to/flink/conf/internal.keystore
security.ssl.internal.keystore-password: internal_store_password
security.ssl.internal.truststore-password: internal_store_password
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 主节点的节点(或服务)。

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

keytool -exportcert -keystore rest.keystore -alias flink.rest -storepass rest_keystore_password -file flink.cer

keytool -importcert -keystore rest.truststore -alias flink.rest -storepass rest_truststore_password -file flink.cer -noprompt
security.ssl.rest.enabled: true
security.ssl.rest.keystore: /path/to/flink/conf/rest.keystore
security.ssl.rest.truststore: /path/to/flink/conf/rest.truststore
security.ssl.rest.keystore-password: rest_keystore_password
security.ssl.rest.truststore-password: rest_truststore_password
security.ssl.rest.key-password: rest_key_password

REST 端点(带有自签名 CA)

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

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"

keytool -exportcert -keystore ca.keystore -alias ca -storepass ca_keystore_password -file ca.cer

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) 的主机名。

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

keytool -certreq -alias flink.rest -keystore rest.signed.keystore -storepass rest_keystore_password -keypass rest_key_password -file rest.csr

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

keytool -importcert -keystore rest.signed.keystore -storepass rest_keystore_password -file ca.cer -alias ca -noprompt

keytool -importcert -keystore rest.signed.keystore -storepass rest_keystore_password -keypass rest_key_password -file rest.cer -alias flink.rest -noprompt

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

security.ssl.rest.enabled: true
security.ssl.rest.keystore: /path/to/flink/conf/rest.signed.keystore
security.ssl.rest.truststore: /path/to/flink/conf/ca.truststore
security.ssl.rest.keystore-password: rest_keystore_password
security.ssl.rest.key-password: rest_key_password
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 默认信任库中。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。