使用 SASL 进行 Kafka 身份验证 - 重复的管理员用户?

lar*_*one 1 sasl jaas apache-kafka

我正在运行一个分布式 Kafka-Broker,其中代理间通信是使用 SASL/SSL 设置的。为此,我调整了此处给出的 JAAS 配置。完成的文件如下所示:

KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="admin"
  password="admin-secret"
  user_admin="admin-secret"
  user_alice="alice-secret"
  security.protocol=SASL_PLAINTEXT
  sasl.mechanism=PLAIN;

  org.apache.kafka.common.security.scram.ScramLoginModule required;
};

Client {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="admin"
  password="admin-secret";
};
Run Code Online (Sandbox Code Playgroud)

我注意到“KafkaServer”部分有 2 个管理员用户。我也经历了惨痛的教训才知道我两者都需要,但这是为什么呢?我有一种感觉,几个月前我已经读过(并忘记了)原因,但我似乎再也找不到它了。

小智 6

根据Apache Kafka 文档,该KafkaServer部分用于配置该代理到其他代理的身份验证,以及连接该代理的客户端和其他代理的身份验证。该Client部分用于连接到 Zookeeper。

由于您的问题是关于该KafkaServer部分的,并且您正在配置 SASL/PLAIN 身份验证机制,因此请参阅Apache Kafka 文档的这一部分:

此配置定义了两个用户(adminalice)。代理使用该部分中的属性username和来启动与其他代理的连接。在此示例中,admin是经纪商间通信的用户。这组属性定义连接到代理的所有用户的密码,并且代理验证所有客户端连接,包括使用这些属性的其他代理的连接。passwordKafkaServeruser_userName

换句话说,这里配置了两种不同的情况:

  • 当该代理连接到其他代理时,它将使用username和中定义的用户名和密码password
  • 当客户端和其他代理连接到此代理时,这些user_userName条目用于验证这些连接,其中用户名是密钥的userName部分user_userName,密码是值。

因此,在您的示例中,由于这两行,该代理将使用用户名admin和密码连接到其他代理:admin-secret

username="admin"
password="admin-secret"
Run Code Online (Sandbox Code Playgroud)

admin并且,客户和其他经纪人可以使用/admin-secretalice/的用户名密码组合连接到该经纪人,alice-secret因为这两行:

user_admin="admin-secret"
user_alice="alice-secret"
Run Code Online (Sandbox Code Playgroud)

如果您仅接受来自其他代理的连接以在此侦听器上进行代理间通信,则它们可能正在使用部分user_admin="admin-secret"配置,并且user_alice="alice-secret"可能是多余的。