第 5 章 配置安全连接
保护 Kafka 集群和客户端应用程序之间的连接有助于确保集群和客户端之间的通信的机密性、完整性和真实性。
要实现安全连接,您可以引入与身份验证、加密和授权相关的配置:
- 身份验证
- 使用身份验证机制来验证客户端应用程序的身份。
- 加密
- 启用使用 SSL/TLS 加密在客户端和服务器间传输数据加密。
- 授权
- 根据客户端应用程序的身份验证身份,控制 Kafka 代理上允许的客户端访问和操作。
在不进行身份验证的情况下无法使用授权。如果没有启用身份验证,则无法确定客户端的身份,因此无法强制执行授权规则。这意味着,即使定义了授权规则,也不会在不进行身份验证的情况下强制实施它们。
在 Apache Kafka 的 Streams 中,监听程序用于配置 Kafka 代理和客户端之间的网络连接。侦听器配置选项决定了代理如何侦听传入客户端连接以及如何管理安全访问。所需的确切配置取决于您选择的身份验证、加密和授权机制。
您可以配置 Kafka 代理和客户端应用程序以启用安全功能。保护到 Kafka 集群的客户端连接的一般概述如下:
- 安装 Apache Kafka 组件的流,包括 Kafka 集群。
- 对于 TLS,为每个代理和客户端应用程序生成 TLS 证书。
- 在代理配置中配置监听程序以进行安全连接。
- 配置客户端应用程序以进行安全连接。
根据您用来与 Kafka 代理建立安全和验证连接的机制配置客户端应用程序。Kafka 代理使用的身份验证、加密和授权必须与连接客户端应用程序使用的身份验证、加密和授权匹配。客户端应用程序和代理需要在安全协议和配置上达成一致,以便实现安全通信。例如,Kafka 客户端和 Kafka 代理必须使用相同的 TLS 版本和密码套件。
客户端和服务器间的安全配置不匹配可能会导致连接失败或潜在的安全漏洞。仔细配置和测试代理和客户端应用程序非常重要,以确保它们被正确保护并可安全地通信。
5.1. 为安全访问设置代理
在为安全访问配置客户端应用程序前,您必须首先在 Kafka 集群中设置代理来支持您要使用的安全机制。要启用安全连接,您可以使用安全机制的适当配置创建监听程序。
5.1.1. 建立到在 RHEL 上运行的 Kafka 集群的安全连接
当在 RHEL 上使用 Streams for Apache Kafka 时,保护与 Kafka 集群的客户端连接的一般概述如下:
- 在 RHEL 服务器中安装 Apache Kafka 组件的 Streams,包括 Kafka 集群。
- 对于 TLS,为 Kafka 集群中的所有代理生成 TLS 证书。
在代理配置属性文件中配置监听程序。
- 为 Kafka 集群监听程序配置身份验证,如 TLS 或 SASL SCRAM-SHA-512。
-
为 Kafka 集群上所有启用的监听程序配置授权,如
简单
授权。
- 对于 TLS,为每个客户端应用程序生成 TLS 证书。
-
创建
config.properties
文件,以指定客户端应用程序使用的连接详情和身份验证凭证。 启动 Kafka 客户端应用程序并连接到 Kafka 集群。
-
使用
config.properties
文件中定义的属性连接到 Kafka 代理。
-
使用
- 验证客户端是否可以成功连接到 Kafka 集群,并安全地使用和生成信息。
其他资源
有关设置代理的更多信息,请参阅以下指南:
5.1.2. 为 RHEL 上的 Kafka 集群配置安全监听程序
使用配置属性文件在 Kafka 中配置监听程序。要为 Kafka 代理配置安全连接,您可以在此文件中为 TLS、SASL 和其他与安全相关的配置设置相关的属性。
以下是在 Kafka 代理的 server.properties
配置文件中指定的 TLS 侦听器的示例配置,其密钥存储和信任存储采用 PKCSbusybox 格式:
server.properties
中的监听程序配置示例
listeners = listener_1://0.0.0.0:9093, listener_2://0.0.0.0:9094 listener.security.protocol.map = listener_1:SSL, listener_2:PLAINTEXT ssl.keystore.type = PKCS12 ssl.keystore.location = /path/to/keystore.p12 ssl.keystore.password = <password> ssl.truststore.type = PKCS12 ssl.truststore.location = /path/to/truststore.p12 ssl.truststore.password = <password> ssl.client.auth = required authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer. super.users = User:superuser
listener 属性指定每个监听程序名称,以及代理侦听的 IP 地址和端口。协议映射告知
listener_1
侦听器将 SSL 协议用于使用 TLS 加密的客户端。listener_2
为不使用 TLS 加密的客户端提供 PLAINTEXT 连接。密钥存储包含代理的私钥和证书。truststore 包含用于验证客户端应用程序身份的可信证书。ssl.client.auth
属性强制执行客户端身份验证。
Kafka 集群使用简单的授权。授权器设置为 SimpleAclAuthorizer
。为所有监听器上的非受限访问定义了单个超级用户。Apache Kafka 的流支持 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
5.1.3. 建立到在 OpenShift 上运行的 Kafka 集群的安全连接
在 OpenShift 中使用流 for Apache Kafka 时,一般概述了保护与 Kafka 集群的客户端连接,如下所示:
使用 Cluster Operator 在 OpenShift 环境中部署 Kafka 集群。使用
Kafka
自定义资源配置和安装集群并创建监听程序。- 为监听程序配置身份验证,如 TLS 或 SASL SCRAM-SHA-512。Cluster Operator 会创建一个包含集群 CA 证书的 secret,以验证 Kafka 代理的身份。
-
为所有启用的监听程序配置授权,如
简单
授权。
使用 User Operator 创建一个代表您的客户端的 Kafka 用户。使用
KafkaUser
自定义资源配置和创建用户。- 为与监听器验证机制匹配的 Kafka 用户(客户端)配置身份验证。User Operator 会创建一个 secret,其中包含客户端用于与 Kafka 集群进行身份验证的客户端证书和私钥。
- 为您的 Kafka 用户(客户端)配置与监听器的授权机制匹配的授权。授权规则允许对 Kafka 集群的特定操作。
-
创建
config.properties
文件,以指定客户端应用程序连接到集群所需的连接详情和身份验证凭证。 启动 Kafka 客户端应用程序并连接到 Kafka 集群。
-
使用
config.properties
文件中定义的属性连接到 Kafka 代理。
-
使用
- 验证客户端是否可以成功连接到 Kafka 集群,并安全地使用和生成信息。
其他资源
有关设置代理的更多信息,请参阅在 OpenShift 中为 Apache Kafka 配置流。
5.1.4. 在 OpenShift 中为 Kafka 集群配置安全监听程序
当您使用 Apache Kafka
的 Streams 部署 Kafka 自定义资源时,您可以将监听程序配置添加到 Kafka spec
中。使用监听程序配置在 Kafka 中安全连接。要为 Kafka 代理配置安全连接,请在监听器级别设置 TLS、SASL 和其他与安全相关的配置的相关属性。
外部监听程序提供对 OpenShift 集群外部的 Kafka 集群的客户端访问。Apache Kafka 的 Streams 创建监听程序服务和 bootstrap 地址,以便根据配置启用对 Kafka 集群的访问。例如,您可以创建使用以下连接机制的外部监听程序:
- 节点端口
- loadBalancers
- OpenShift 路由
以下是 Kafka
资源的 nodeport
侦听器配置示例:
Kafka
资源中的监听程序配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: - name: plaintext port: 9092 type: internal tls: false configuration: useServiceDnsDomain: true - name: tls port: 9093 type: internal tls: true authentication: type: tls - name: external port: 9094 type: route tls: true authentication: type: tls authorization: type: simple superUsers: - CN=superuser # ...
listener 属性配置有三个监听程序: plaintext
、tls
和 external
。外部
侦听器的类型是 nodeport
,它使用 TLS 进行加密和身份验证。当使用 Cluster Operator 创建 Kafka 集群时,CA 证书会自动生成。您可以将集群 CA 添加到客户端应用程序的信任存储中,以验证 Kafka 代理的身份。另外,您可以将 Apache Kafka 的 Streams 配置为使用在代理或监听程序级别的您自己的证书。当客户端应用程序需要不同的安全配置时,可能需要在监听器级别使用证书。在监听器级别使用证书也会添加额外的控制和安全层。
使用配置供应商插件将配置数据加载到生成者和消费者客户端。配置提供程序插件从 secret 或 ConfigMap 加载配置数据。例如,您可以告诉供应商自动从 Strimzi secret 获取证书。如需更多信息,请参阅 OpenShift 上运行的 Apache Kafka 文档 的流。
Kafka 集群使用简单的授权。authorization 属性 type 设置为 simple
。为所有监听器上的非受限访问定义了单个超级用户。Apache Kafka 的流支持 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
时,Apache Kafka 的 Streams 会自动管理创建和更新 ACL。ACL 将访问规则应用到客户端应用程序。
在以下示例中,第一个 ACL 授予名为 my-topic
的特定主题的读取和描述权限。resource.patternType
设置为 literal
,这意味着资源名称必须完全匹配。
第二个 ACL 授予名为 my-group
的特定消费者组的读取权限。resource.patternType
设置为 prefix
,这意味着资源名称必须与前缀匹配。
KafkaUser
资源中的 ACL 配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: # ... authorization: type: simple acls: - resource: type: topic name: my-topic patternType: literal operations: - Read - Describe - resource: type: group name: my-group patternType: prefix operations: - Read
如果在配置 Kafka 用户时将 tls-external
指定为身份验证选项,您可以使用自己的客户端证书,而不是 User Operator 生成的客户端证书。