第 5 章 管理 Kafka 的安全访问


您可以通过管理每个客户端对 Kafka 代理的访问来保护 Kafka 集群。

Kafka 代理和客户端之间的安全连接可以编程:

  • 数据交换加密
  • 证明身份的身份验证
  • 允许或拒绝用户执行操作的授权

本章论述了如何在 Kafka 代理和客户端之间设置安全连接,以及描述:

  • Kafka 集群和客户端的安全选项
  • 如何保护 Kafka 代理
  • 如何将授权服务器用于基于 OAuth 2.0 令牌的身份验证和授权

5.1. Kafka 的安全性选项

使用 Kafka 资源来配置用于 Kafka 身份验证和授权的机制。

5.1.1. 侦听器身份验证

对于 OpenShift 集群中的客户端,您可以创建 普通 (不加密)或 tls 内部 监听程序。对于 OpenShift 集群外的客户端,您可以创建外部监听程序并指定连接机制,可以是 nodeport, loadbalancer, ingress or route(在 OpenShift 中)。

有关连接外部客户端的配置选项的更多信息,请参阅 在 OpenShift 集群外访问 Kafka

支持的身份验证选项:

  1. 双向 TLS 身份验证(仅在启用 TLS 的监听程序中)
  2. SCRAM-SHA-512 身份验证
  3. 基于 OAuth 2.0 令牌的身份验证
  4. 自定义身份验证

您选择的身份验证选项取决于您要如何验证对 Kafka 代理的访问。

注意

在使用自定义身份验证之前,尝试探索标准身份验证选项。自定义身份验证允许任何类型的 kafka 支持的验证。它可以提供更大的灵活性,但也增加了复杂性。

图 5.1. Kafka 侦听器身份验证选项

侦听器 身份验证 属性用于指定特定于该侦听器的身份验证机制。

如果没有指定 身份验证 属性,则监听器不会验证通过该侦听器连接的客户端。侦听器将接受所有无身份验证的连接。

在使用 User Operator 管理 KafkaUsers 时,必须配置身份验证。

以下示例显示了:

  • 为 SCRAM-SHA-512 身份验证配置了 普通 侦听器
  • 带有 mutual TLS 身份验证的 tls 侦听器
  • 具有 mutual TLS 身份验证 的外部 监听程序

每个监听程序都配置了 Kafka 集群内的唯一名称和端口。

注意

侦听器无法配置为使用保留代理通信的端口(9091 或 9090)和指标(9404)。

显示监听程序验证配置示例

# ...
listeners:
  - name: plain
    port: 9092
    type: internal
    tls: true
    authentication:
      type: scram-sha-512
  - name: tls
    port: 9093
    type: internal
    tls: true
    authentication:
      type: tls
  - name: external
    port: 9094
    type: loadbalancer
    tls: true
    authentication:
      type: tls
# ...
Copy to Clipboard Toggle word wrap

5.1.1.1. 双向 TLS 身份验证

双向 TLS 身份验证总是用于 Kafka 代理和 ZooKeeper pod 之间的通信。

AMQ Streams 可将 Kafka 配置为使用 TLS (Transport Layer Security)来提供 Kafka 代理和客户端之间的加密通信,或者没有相互身份验证。对于双向身份验证,无论是服务器和客户端均提供证书。当您配置 mutual 身份验证时,代理会验证客户端(客户端身份验证)和客户端验证代理(服务器身份验证)。

注意

TLS 身份验证更为单向,一个方对另一身份进行身份验证。例如,在 Web 浏览器和 Web 服务器之间使用 HTTPS 时,浏览器获取 Web 服务器的身份证明。

5.1.1.2. SCRAM-SHA-512 身份验证

SCRAM (Salted Challenge Response Authentication Mechanism)是一个身份验证协议,可以使用密码建立相互验证。AMQ Streams 可将 Kafka 配置为使用 SASL (Simple Authentication and Security Layer) SCRAM-SHA-512,以在未加密的和加密客户端连接中提供身份验证。

当将 SCRAM-SHA-512 身份验证与 TLS 客户端连接一起使用时,TLS 协议会提供加密,但不用于身份验证。

SCRAM 的以下属性可以安全使用 SCRAM-SHA-512,即使在未加密的连接中:

  • 通过通信频道不会以明文形式发送密码。相反,客户端和服务器都会相互挑战,以便证明他们知道验证用户的密码。
  • 服务器和客户端为每个身份验证交换造成新挑战。这意味着该交换可以应对重播攻击。

KafkaUser.spec.authentication.type 配置有 scram-sha-512 时,用户 Operator 将生成一个由大写和小写 ASCII 字母和数字组成的 12 个字符的随机密码。

5.1.1.3. 网络策略

默认情况下,AMQ Streams 会自动为每个在 Kafka 代理上启用的监听程序创建一个 NetworkPolicy 资源。这个 NetworkPolicy 允许应用程序连接到所有命名空间中的监听程序。使用网络策略作为监听程序配置的一部分。

如果要将网络级别的监听程序的访问权限限制为特定的应用程序或命名空间,请使用 networkPolicyPeers 属性。每个监听程序都有不同的 networkPolicyPeers 配置。有关网络策略对等方法的更多信息,请参阅 NetworkPolicyPeer API 参考

如果要使用自定义网络策略,您可以在 Cluster Operator 配置中将 STRIMZI_NETWORK_POLICY_GENERATION 环境变量设置为 false。如需更多信息,请参阅 Cluster Operator 配置

注意

您的 OpenShift 配置必须支持 ingress NetworkPolicies,以便在 AMQ Streams 中使用网络策略。

5.1.1.4. 其他监听程序配置选项

您可以使用 GenericKafkaListenerConfiguration 模式 的属性,将进一步配置添加到监听程序。

5.1.2. Kafka 授权

您可以使用 Kafka.spec.kafka 资源中的 authorization 属性配置 Kafka 代理的授权。如果缺少 授权 属性,则不会启用授权,并且客户端没有限制。启用后,授权将应用到所有启用的监听程序。授权方法在 type 字段中定义。

支持的授权选项:

图 5.2. Kafka 集群授权选项

5.1.2.1. 超级用户

超级用户可以访问 Kafka 集群中的所有资源,无论访问限制如何,并且受所有授权机制的支持。

要为 Kafka 集群指定超级用户,请在 superUsers 属性中添加一个用户主体列表。如果用户使用 TLS 客户端身份验证,则用户名是其证书主题中以 CN= 前缀的通用名称。

使用超级用户配置示例

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
  namespace: myproject
spec:
  kafka:
    # ...
    authorization:
      type: simple
      superUsers:
        - CN=client_1
        - user_2
        - CN=client_3
    # ...
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat