5.2. Kafka 客户端的安全选项


使用 KafkaUser 资源为 Kafka 客户端配置身份验证机制、授权机制和访问权限。在配置安全性方面,客户端以用户表示。

您可以验证并授权用户对 Kafka 代理的访问。身份验证允许访问权限,授权限制对所禁止的操作的访问权限。

您还可以创建对 Kafka 代理没有约束访问的 超级用户

身份验证和授权机制必须与 用于访问 Kafka 代理的监听程序的规格 匹配。

配置用户以保证对 Kafka 代理的访问

有关配置 KafkaUser 资源以安全访问 Kafka 代理的更多信息,请查看以下部分:

5.2.1. 为用户处理识别 Kafka 集群

KafkaUser 资源包含一个标签,它定义了其所属的 Kafka 集群(来自 Kafka 资源名称)的适当名称。

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
Copy to Clipboard Toggle word wrap

User Operator 用来识别 KafkaUser 资源并创建新用户,以及后续用户处理过程中使用该标签。

如果标签与 Kafka 集群不匹配,则 User Operator 无法识别 KafkaUser,用户不会被创建。

如果 KafkaUser 资源的状态为空,请检查您的标签。

5.2.2. 用户身份验证

使用 KafkaUser.spec 中的 身份验证 属性配置用户身份验证。使用 type 字段指定用户的验证机制。

支持的验证类型:

  • TLS 用于 TLS 客户端身份验证
  • 使用外部证书进行 TLS 客户端身份验证的 TLS- external
  • SCRAM-sha-512 用于 SCRAM-SHA-512 身份验证

如果指定了 tlsscram-sha-512,则用户 Operator 会在创建用户时创建身份验证凭据。如果指定了 tls-external,用户仍然使用 TLS 客户端身份验证,但没有创建身份验证凭据。当您提供自己的证书时,使用这个选项。如果没有指定验证类型,用户 Operator 不会创建用户或其凭证。

您可以使用 tls-external 使用 User Operator 外部发布的证书进行 TLS 客户端身份验证。User Operator 不会生成 TLS 证书或 secret。您仍然可以通过 User Operator 管理 ACL 规则和配额,其方式与使用 tls 机制相同。这意味着,在指定 ACL 规则和配额时使用 CN=USER-NAME 格式。USER-NAME 是 TLS 证书中提供的常用名称。

5.2.2.1. TLS 客户端身份验证

要使用 TLS 客户端身份验证,请将 KafkaUser 资源中的 type 字段设置为 tls

启用 TLS 客户端身份验证的用户示例

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: tls
  # ...
Copy to Clipboard Toggle word wrap

用户由 User Operator 创建时,它会创建一个名为 KafkaUser 资源的名称的新 secret。secret 包含用于 TLS 客户端身份验证的私钥和公钥。公钥包含在用户证书中,由客户端证书颁发机构(CA)签名。

所有密钥都是 X.509 格式。

secret 以 PEM 和 PKCS #12 格式提供私钥和证书。

有关保护 Kafka 与 secret 的通信的更多信息,请参阅 第 10 章 管理 TLS 证书

使用用户凭证的 secret 示例

apiVersion: v1
kind: Secret
metadata:
  name: my-user
  labels:
    strimzi.io/kind: KafkaUser
    strimzi.io/cluster: my-cluster
type: Opaque
data:
  ca.crt: # Public key of the client CA
  user.crt: # User certificate that contains the public key of the user
  user.key: # Private key of the user
  user.p12: # PKCS #12 archive file for storing certificates and keys
  user.password: # Password for protecting the PKCS #12 archive file
Copy to Clipboard Toggle word wrap

要使用 User Operator 之外发布的证书的 TLS 客户端身份验证,请将 KafkaUser 资源中的 type 字段设置为 tls-external。不会为用户创建 secret 和凭证。

带有 TLS 客户端身份验证的用户示例,它使用 User Operator 之外发布的证书

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: tls-external
  # ...
Copy to Clipboard Toggle word wrap

5.2.2.3. SCRAM-SHA-512 身份验证

要使用 SCRAM-SHA-512 身份验证机制,请将 KafkaUser 资源中的 type 字段设置为 scram-sha-512

启用 SCRAM-SHA-512 验证的用户示例

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: scram-sha-512
  # ...
Copy to Clipboard Toggle word wrap

用户由 User Operator 创建时,它会创建一个名为 KafkaUser 资源的名称的新 secret。secret 包含在 password 键中生成的密码,该密钥使用 base64 编码。要使用密码,必须解码它。

使用用户凭证的 secret 示例

apiVersion: v1
kind: Secret
metadata:
  name: my-user
  labels:
    strimzi.io/kind: KafkaUser
    strimzi.io/cluster: my-cluster
type: Opaque
data:
  password: Z2VuZXJhdGVkcGFzc3dvcmQ= 
1

  sasl.jaas.config: b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkuc2NyYW0uU2NyYW1Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT0ibXktdXNlciIgcGFzc3dvcmQ9ImdlbmVyYXRlZHBhc3N3b3JkIjsK 
2
Copy to Clipboard Toggle word wrap

1
生成的密码 base64 编码。
2
SASL SCRAM-SHA-512 身份验证的 JAAS 配置字符串为 base64 编码。

解码生成的密码:

echo "Z2VuZXJhdGVkcGFzc3dvcmQ=" | base64 --decode
Copy to Clipboard Toggle word wrap
5.2.2.3.1. 自定义密码配置

创建用户时,AMQ Streams 会生成随机密码。您可以使用自己的密码而不是 AMQ Streams 生成的密码。要做到这一点,使用密码创建一个 secret,并在 KafkaUser 资源中引用它。

为 SCRAM-SHA-512 身份验证设置密码的用户示例

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  authentication:
    type: scram-sha-512
    password:
      valueFrom:
        secretKeyRef:
          name: my-secret 
1

          key: my-password 
2

  # ...
Copy to Clipboard Toggle word wrap

1
包含预定义密码的 secret 名称。
2
存储在机密中的密码的密钥。

5.2.3. 用户授权

用户授权使用 KafkaUser.spec 中的 authorization 属性进行配置。使用 type 字段为用户启用的授权类型。

要使用简单的授权,您可以在 KafkaUser.spec.authorization 中将 type 属性设置为 simple。简单的授权将使用 Kafka Admin API 管理 Kafka 集群内的 ACL 规则。是否启用 User Operator 中的 ACL 管理,还是取决于您的 Kafka 集群中的授权配置。

  • 对于简单的授权,始终启用了 ACL 管理。
  • 对于 OPA 授权,始终禁用 ACL 管理。授权规则在 OPA 服务器中配置。
  • 对于 Red Hat Single Sign-On 授权,您可以直接管理 Red Hat Single Sign-On 中的 ACL 规则。您还可以将授权委派给简单授权器,作为配置中回退选项。当启用对简单授权器委派时,User Operator 也将启用 ACL 规则的管理。
  • 要使用自定义授权插件进行自定义授权,请使用 Kafka 自定义资源的 .spec.kafka.authorization 配置中的 supportsAdminApi 属性来启用或禁用支持。

如果没有启用 ACL managment,AMQ Streams 会在包含任何 ACL 规则时拒绝资源。

如果您使用 User Operator 的独立部署,则默认启用 ACL 管理。您可以使用 STRIMZI_ACLS_ADMIN_API_SUPPORTED 环境变量来禁用它。

如果没有指定授权,则 User Operator 不会为用户置备任何访问权限。这类 KafkaUser 仍然可以访问资源取决于所使用的授权器。例如,对于 AclAuthorizer,这由其 allow.everyone.if.no.acl.found 配置决定。

5.2.3.1. ACL 规则

AclAuthorizer 使用 ACL 规则来管理对 Kafka 代理的访问。

ACL 规则授予您在 acls 属性中指定的用户访问权限。

如需有关 AclRule 对象的更多信息,请参阅 AclRule 模式参考

5.2.3.2. 超级用户访问 Kafka 代理

如果用户添加到 Kafka 代理配置的超级用户列表中,无论 KafkaUser 中的 ACL 中定义的授权限制,用户将允许无限地访问集群。

有关配置超级用户访问代理的更多信息,请参阅 Kafka 授权

5.2.3.3. 用户配额

您可以为 KafkaUser 资源配置 spec 以强制配额,以便用户不超过配置对 Kafka 代理的访问级别。您可以设置基于大小的网络使用量和基于时间的 CPU 利用率阈值。您还可以添加分区变异配额来控制为用户请求接受更改分区的请求的速度。

带有用户配额的 KafkaUser 示例

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaUser
metadata:
  name: my-user
  labels:
    strimzi.io/cluster: my-cluster
spec:
  # ...
  quotas:
    producerByteRate: 1048576 
1

    consumerByteRate: 2097152 
2

    requestPercentage: 55 
3

    controllerMutationRate: 10 
4
Copy to Clipboard Toggle word wrap

1
用户可以推送到 Kafka 代理的数据量上的字节/秒配额
2
用户可从 Kafka 代理获取的数据量的字节/秒配额
3
CPU 使用率限制为客户端组的时间百分比
4
每秒允许的并发分区创建和删除操作数(mutations)数

有关这些属性的更多信息,请参阅 KafkaUserQuotas 架构参考

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat