第 5 章 配置安全连接
保护 Kafka 集群和客户端应用程序之间的连接有助于确保集群和客户端之间的通信的机密性、完整性和真实性。
要实现安全连接,您可以引入与身份验证、加密和授权相关的配置:
- 身份验证
- 使用身份验证机制来验证客户端应用程序的身份。
- 加密
- 启用使用 SSL/TLS 加密在客户端和服务器之间传输的数据加密。
- 授权
- 根据客户端应用程序的身份验证身份控制 Kafka 代理上允许的客户端访问和操作。
在没有身份验证的情况下无法使用授权。如果没有启用身份验证,则无法确定客户端的身份,因此无法强制执行授权规则。这意味着,即使定义了授权规则,也不会在没有身份验证的情况下强制执行它们。
在 AMQ Streams 中,监听器用于在 Kafka 代理和客户端之间配置网络连接。侦听器配置选项决定了代理如何侦听进入客户端连接以及如何管理安全访问。所需的配置取决于您选择的身份验证、加密和授权机制。
您可以配置 Kafka 代理和客户端应用程序以启用安全功能。保护到 Kafka 集群的客户端连接的一般概述如下:
- 安装 AMQ Streams 组件,包括 Kafka 集群。
- 对于 TLS,请为每个代理和客户端应用程序生成 TLS 证书。
- 在代理配置中配置监听程序以安全连接。
- 为安全连接配置客户端应用程序。
根据您用来建立与 Kafka 代理的安全和验证连接的机制配置客户端应用程序。Kafka 代理使用的身份验证、加密和授权必须与连接的客户端应用程序使用的身份验证、加密和授权匹配。客户端应用程序和代理需要同意安全协议和配置,以进行安全通信。例如,Kafka 客户端和 Kafka 代理必须使用相同的 TLS 版本和密码套件。
客户端和服务器之间不匹配的安全配置可能会导致连接失败或潜在的安全漏洞。仔细配置和测试代理和客户端应用程序非常重要,以确保它们被正确保护,并能够安全地通信。
5.1. 为安全访问设置代理 复制链接链接已复制到粘贴板!
在为安全访问配置客户端应用程序前,您必须首先在 Kafka 集群中设置代理来支持您要使用的安全机制。要启用安全连接,您可以使用适当的安全机制配置创建监听程序。
5.1.1. 建立到 RHEL 上运行的 Kafka 集群的安全连接 复制链接链接已复制到粘贴板!
在 RHEL 上使用 AMQ Streams 时,保护与 Kafka 集群的客户端连接的一般概述如下:
- 在 RHEL 服务器上安装 AMQ Streams 组件,包括 Kafka 集群。
- 对于 TLS,为 Kafka 集群中的所有代理生成 TLS 证书。
在代理配置属性文件中配置监听程序。
- 为 Kafka 集群监听程序配置身份验证,如 TLS 或 SASL SCRAM-SHA-512。
-
为 Kafka 集群上所有启用的监听程序(如
简单
授权)配置授权。
- 对于 TLS,请为每个客户端应用程序生成 TLS 证书。
-
创建
config.properties
文件,以指定客户端应用程序使用的连接详情和身份验证凭证。 启动 Kafka 客户端应用程序并连接到 Kafka 集群。
-
使用
config.properties
文件中定义的属性连接到 Kafka 代理。
-
使用
- 验证客户端是否可以成功连接到 Kafka 集群,并安全地使用并生成信息。
有关设置代理的更多信息,请参阅在 RHEL 上使用 AMQ Streams。
5.1.2. 为 RHEL 上的 Kafka 集群配置安全监听程序 复制链接链接已复制到粘贴板!
使用配置属性文件在 Kafka 中配置监听程序。要为 Kafka 代理配置安全连接,您可以在此文件中为 TLS、SASL 和其他与安全相关的配置设置相关属性。
以下是在 Kafka 代理的 server.properties
配置文件中指定的 TLS 侦听器配置示例,其密钥存储和 truststore 格式为:
server.properties
中的监听程序配置示例
listener 属性指定每个监听程序名称,以及代理侦听的 IP 地址和端口。protocol 映射告知
listener_1
侦听器将 SSL 协议用于使用 TLS 加密的客户端。listener_2
为不使用 TLS 加密的客户端提供 PLAINTEXT 连接。密钥存储包含代理的私钥和证书。truststore 包含用于验证客户端应用程序身份的可信证书。ssl.client.auth
属性强制执行客户端身份验证。
Kafka 集群使用简单的授权。授权器设置为 SimpleAclAuthorizer
。定义了单个超级用户,在所有监听器上没有限制访问。AMQ Streams 支持 Kafka SimpleAclAuthorizer
和自定义授权器插件。
如果我们使用 listener.name.<name_of_listener>
为配置属性添加前缀,则配置特定于该监听程序。
这只是一个示例配置。某些配置选项特定于监听器类型。如果您使用 OAuth 2.0 或 Open Policy Agent (OPA),还必须在特定监听器中配置对授权服务器或 OPA 服务器的访问。您可以根据特定要求和环境创建监听程序。
有关监听程序配置的更多信息,请参阅 Apache Kafka 文档。
使用 ACL 进行微调访问
您可以使用访问控制列表(ACL)来微调对 Kafka 集群的访问。要创建和管理访问控制列表(ACL),请使用 kafka-acls.sh
命令行工具。ACL 将访问规则应用到客户端应用程序。
在以下示例中,第一个 ACL 授予名为 my-topic
的特定主题的读和描述权限。resource.patternType
设置为 literal
,这意味着资源名称必须完全匹配。
第二个 ACL 为名为 my-group
的特定消费者组授予读取权限。resource.patternType
设置为 prefix
,这意味着资源名称必须与前缀匹配。
ACL 配置示例
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add \ --allow-principal User:my-user --operation Read --operation Describe --topic my-topic --resource-pattern-type literal \ --allow-principal User:my-user --operation Read --group my-group --resource-pattern-type prefixed
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add \
--allow-principal User:my-user --operation Read --operation Describe --topic my-topic --resource-pattern-type literal \
--allow-principal User:my-user --operation Read --group my-group --resource-pattern-type prefixed
5.1.3. 建立到 OpenShift 上运行的 Kafka 集群的安全连接 复制链接链接已复制到粘贴板!
在 OpenShift 上使用 AMQ Streams 时,保护与 Kafka 集群的客户端连接的一般概述如下:
使用 Cluster Operator 在 OpenShift 环境中部署 Kafka 集群。使用
Kafka
自定义资源配置和安装集群并创建监听程序。- 为监听程序配置身份验证,如 TLS 或 SASL SCRAM-SHA-512。Cluster Operator 创建一个包含集群 CA 证书的 secret,以验证 Kafka 代理的身份。
-
为所有启用的监听程序配置授权,如
简单的
授权。
使用 User Operator 创建代表您的客户端的 Kafka 用户。使用
KafkaUser
自定义资源配置和创建用户。- 为与监听器验证机制匹配的 Kafka 用户(客户端)配置身份验证。User Operator 创建一个包含客户端用于与 Kafka 集群进行身份验证的客户端的 secret。
- 为您的 Kafka 用户(客户端)配置与监听器的授权机制匹配的授权。授权规则允许对 Kafka 集群上的特定操作。
-
创建
config.properties
文件,以指定客户端应用程序连接到集群所需的连接详情和身份验证凭证。 启动 Kafka 客户端应用程序并连接到 Kafka 集群。
-
使用
config.properties
文件中定义的属性连接到 Kafka 代理。
-
使用
- 验证客户端是否可以成功连接到 Kafka 集群,并安全地使用并生成信息。
有关设置代理的更多信息,请参阅在 OpenShift 中配置 AMQ Streams。
5.1.4. 在 OpenShift 上为 Kafka 集群配置安全监听程序 复制链接链接已复制到粘贴板!
当您使用 AMQ Streams 部署 Kafka
自定义资源时,您可以在 Kafka spec
中添加监听程序配置。使用监听程序配置来保护 Kafka 中的连接。要为 Kafka 代理配置安全连接,请在监听器级别上为 TLS、SASL 和其他与安全相关的配置设置相关属性。
外部监听程序提供对 OpenShift 集群外部的 Kafka 集群的客户端访问。AMQ Streams 创建监听器服务和 bootstrap 地址,以根据配置启用对 Kafka 集群的访问。例如,您可以创建使用以下连接机制的外部监听程序:
- 节点端口
- loadbalancers
- OpenShift 路由
以下是 Kafka
资源的 nodeport
侦听器配置示例:
Kafka
资源中的监听程序配置示例
监听器
属性配置了三个监听程序: 纯文本
、tls
和 external
。外部监听程序
是 nodeport
类型,它使用 TLS 进行加密和验证。当使用 Cluster Operator 创建 Kafka 集群时,会自动生成 CA 证书。您可以将集群 CA 添加到客户端应用程序的信任存储中,以验证 Kafka 代理的身份。另外,您可以将 AMQ Streams 配置为使用代理或监听程序级别的自己的证书。当客户端应用程序需要不同的安全配置时,可能需要在监听器级别使用证书。在监听器级别使用证书也会添加额外的控制层和安全性。
使用配置供应商插件将配置数据加载到生成者和消费者客户端。配置提供程序插件从 secret 或 ConfigMap 加载配置数据。例如,您可以告知提供程序自动从 Strimzi secret 获取证书。如需更多信息,请参阅在 OpenShift 上运行的 AMQ Streams 文档。
Kafka 集群使用简单的授权。authorization 属性类型设置为 simple
。定义了单个超级用户,在所有监听器上没有限制访问。AMQ Streams 支持 Kafka SimpleAclAuthorizer
和自定义授权器插件。
这只是一个示例配置。某些配置选项特定于监听器类型。如果您使用 OAuth 2.0 或 Open Policy Agent (OPA),还必须在特定监听器中配置对授权服务器或 OPA 服务器的访问。您可以根据特定要求和环境创建监听程序。
有关监听器配置的更多信息,请参阅 GenericKafkaListener
模式参考。
当使用 路由类型
监听程序来访问 OpenShift 上的 Kafka 集群时,会启用 TLS 透传功能。OpenShift 路由旨在使用 HTTP 协议,但它也可用于为其他协议代理网络流量,包括 Apache Kafka 使用的 Kafka 协议。客户端建立与路由的连接,路由将使用 TLS Server Name Indication (SNI)扩展将流量转发到 OpenShift 集群中运行的代理,以获取目标主机名。SNI 扩展允许路由正确识别每个连接的目标代理。
使用 ACL 进行微调访问
您可以使用访问控制列表(ACL)来微调对 Kafka 集群的访问。要添加访问控制列表(ACL),您可以配置 KafkaUser
自定义资源。当您创建 KafkaUser
时,AMQ Streams 会自动管理创建和更新 ACL。ACL 将访问规则应用到客户端应用程序。
在以下示例中,第一个 ACL 授予名为 my-topic
的特定主题的读和描述权限。resource.patternType
设置为 literal
,这意味着资源名称必须完全匹配。
第二个 ACL 为名为 my-group
的特定消费者组授予读取权限。resource.patternType
设置为 prefix
,这意味着资源名称必须与前缀匹配。
KafkaUser
资源中的 ACL 配置示例
如果在配置 Kafka 用户时将 tls-external
指定为身份验证选项,您可以使用自己的客户端证书,而不是由 User Operator 生成的客户端证书。