Kafka 在 kubernetes 上使用 sasl.jaas.config 配置 jaas

Posted

技术标签:

【中文标题】Kafka 在 kubernetes 上使用 sasl.jaas.config 配置 jaas【英文标题】:Kafka configure jaas using sasl.jaas.config on kubernetes 【发布时间】:2019-02-18 06:18:44 【问题描述】:

我正在使用这个舵图:https://github.com/helm/charts/tree/master/incubator/kafka

以及 values.yaml 中的这些覆盖

configurationOverrides:
  advertised.listeners: |-
    EXTERNAL://kafka-$KAFKA_BROKER_ID.host-removed:$((31090 + $KAFKA_BROKER_ID))
  listener.security.protocol.map: |-
    PLAINTEXT:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT
  sasl.enabled.mechanisms: SCRAM-SHA-256
  auto.create.topics.enable: false
  inter.broker.listener.name: PLAINTEXT
  sasl.mechanism.inter.broker.protocol: SCRAM-SHA-256
  listener.name.EXTERNAL.scram-sha-256.sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="user" password="password";

基于此文档:https://kafka.apache.org/documentation/#security_jaas_broker

(快速总结)

Brokers may also configure JAAS using the broker configuration property sasl.jaas.config. The property name must be prefixed with the listener prefix including the SASL mechanism, i.e. listener.name.listenerName.saslMechanism.sasl.jaas.config. Only one login module may be specified in the config value. If multiple mechanisms are configured on a listener, configs must be provided for each mechanism using the listener and mechanism prefix

listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="admin" \
    password="admin-secret";

问题是当我启动 Kafka 时出现以下错误:

java.lang.IllegalArgumentException: Could not find a 'KafkaServer' or 'plaintext.KafkaServer' entry in the JAAS configuration. System property 'java.security.auth.login.config' is not set

根据优先顺序,如果上面的配置没有设置,它应该使用静态jass文件。

If JAAS configuration is defined at different levels, the order of precedence used is:
代理配置属性 listener.name.listenerName.saslMechanism.sasl.jaas.config 静态 JAAS 配置的listenerName.KafkaServer 部分 静态 JAAS 配置的 KafkaServer 部分

舵图不支持配置此 jaas 文件的方法,因此使用此属性似乎是所需的方式,我只是对配置不正确感到困惑。

注意:如果我禁用所有 SASL 并仅使用纯文本,则集群可以正常工作,但在真实环境中效果不佳。

【问题讨论】:

【参考方案1】:

我们定义了 2 个侦听器:PLAINTEXTEXTERNAL。您已将两者都映射到 SASL_PLAINTEXT

这真的是你想做的吗?还是您希望 PLAINTEXT 不需要 SASL 而只是纯文本?

如果您真的希望两者都是 SASL,那么它们都需要 JAAS 配置。在您的问题中,我只看到 EXTERNAL 的 JAAS 配置:

listener.name.EXTERNAL.scram-sha-256.sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="user" password="password";

由于您已将PLAINTEXT 映射到 SASL_PLAINTEXT,因此它还需要 JAAS 配置。您可以使用例如:

 listener.name.PLAINTEXT.scram-sha-256.sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="user" password="password";

如果您希望您的 PLAINTEXT 侦听器实际上是没有 SASL 的纯文本,那么您需要更新侦听器映射:

listener.security.protocol.map: |-
  PLAINTEXT:PLAINTEXT,EXTERNAL:SASL_PLAINTEXT

【讨论】:

您的回答帮助我更接近于设置 SASL,但是在最新版本的 kafka(我使用的是 2.8.0)中,它区分大小写,所以 listener.name.EXTERNAL.scram-sha-256 实际上应该是 listener.name.external.scram-sha-256跨度>

以上是关于Kafka 在 kubernetes 上使用 sasl.jaas.config 配置 jaas的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 集群上的 Kafka 与 Istio

Kubernetes 多节点上的 Kafka

Kubernetes-Kafka 无法在主题上写入消息

如何为在 kubernetes 集群上运行的 Kafka Connect 配置 MongoDB 官方源连接器

使用 SSL 的 Kubernetes 上的 Kafka

通过 AWS 上的 ELB 在 Kubernetes 上公开单个 Kafka 代理