- Apache Flink 文档
- 概念
- 数据流编程模型
- 分布式运行时环境
- 教程
- API 教程
- DataStream API 教程
- Setup 教程
- 本地安装教程
- 在 Windows 上运行 Flink
- 例子
- 批处理示例
- 应用开发
- 项目构建设置
- Java 项目模板
- Scala 的项目模板
- 配置依赖关系,连接器,库
- 基础 API 概念
- Scala API 扩展
- Java Lambda 表达式
- Flink DataStream API 编程指南
- 活动时间
- 事件时间/处理时间/摄取时间
- 活动时间和水印
- 状态与容错
- 算子
- DataStream 转换
- 物理分区
- 任务链和资源组
- 流连接器
- 旁路输出
- Python 编程指南(流)Beta
- 测试
- 实验特点
- Flink DataSet API 编程指南
- 数据集转换
- 容错
- 在数据集中压缩数据元
- 迭代
- Python 编程指南 Beta
- 连接器
- Hadoop 兼容性测试版
- 本地执行
- 群集执行
- Table API 和 SQL
- 概念和通用 API
- 流处理概念
- 连接到外部系统
- Table API
- SQL
- 内置函数
- 用户定义的源和接收器
- 用户定义的函数
- SQL 客户端测试版
- 数据类型和序列化
- 为 Flink 程序注册自定义序列化程序
- 管理执行
- 执行配置
- 程序打包和分布式执行
- 并行执行
- 执行计划
- 重启策略
- 类库
- FlinkCEP - Flink 的复杂事件处理
- 风暴兼容性 Beta
- 项目配置
- 执行 Storm 拓扑
- 在 Flink 流程序中嵌入 Storm 算子
- Flink Extensions
- Storm 兼容性示例
- Gelly:Flink Graph API
- 图 API
- FlinkML - Flink 的机器学习
- 最佳实践
- API 迁移指南
- 部署和运营
- 集群和部署
- 独立群集
- YARN 设置
- Mesos 设置
- Kubernetes 设置
- Docker 设置
- 亚马逊网络服务(AWS)
- Google Compute Engine 设置
- 先决条件
- 在 Google Compute Engine 上部署 Flink
- MapR 设置
- Hadoop 集成
- JobManager 高可用性(HA)
- 状态和容错
- 检查点
- 保存点
- 状态后台
- 调整检查点和大状态
- 配置
- 生产准备清单
- 命令行界面
- Scala REPL
- Kerberos 身份验证设置和配置
- SSL 设置
- 文件系统
- 升级应用程序和 Flink 版本
- 调试和监控
- 度量
- 如何使用日志记录
- 历史服务器
- 监控检查点
- 监测背压
- 监控 REST API
- 调试 Windows 和事件时间
- 调试类加载
- 应用程序分析
- 使用 Java Flight Recorder 进行性能分析
- 使用 JITWatch 进行分析
- Flink Development
- 将 Flink 导入 IDE
- 从 Source 建立 Flink
- 内幕
- 组件堆栈
- 数据流容错
- 工作和调度
- 任务生命周期
- 文件系统
- 实现
- 坚持保证
- 更新文件内容
- 覆盖文件
- 线程安全
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
可以单独为 内部 和 外部 连接启用 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 传输到 TaskManagerakka.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 默认信任库中。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论