是否可以为 Kafka 提供自定义 LoginModule 以支持 LDAP?

Can Kafka be provided with custom LoginModule to support LDAP?

Kafka 可以配置为使用多种身份验证机制:纯文本 username/password、Kerberos 或 SSL。前 2 个使用 SASL,其中需要 JAAS 配置文件。

对于纯文本身份验证方法,配置如下(取自 documentation):

KafkaServer {
   org.apache.kafka.common.security.plain.PlainLoginModule required
   username="admin"
   password="admin-secret"
   user_admin="admin-secret"
   user_alice="alice-secret";
};

我想尽可能使用 LDAP 进行身份验证。我的问题是:如果我用实现 LoginModule 的 class 替换 PlainLoginModule 并将此 class 放在代理的 class 路径中,我可以实现身份验证吗以我希望的任何方式(即 LDAP)?

我不能以合理的方式使用 Kerberos,因为它的主体是在我工作的组织中定义的,因此我希望使用 LDAP,因为我需要支持 RBAC。

是的,您可以为 Kafka 提供自定义的 class,实现 LoginModule 并在其中包含您想要的身份验证逻辑。

然后用您的 class 名称更新 JAAS 文件并确保它在 class 路径中。

您需要放置一些样板代码才能正确设置所有内容,但您可以使用 PlainLoginModulePlainSaslServerProviderPlainSaslServerFactoryPlainSaslServer 作为示例。

您的 LoginModule class 应该具有与 PlainLoginModule 相同的逻辑,但是初始化您的 Provider 实现(在静态块中)。

您的 Provider class 应具有与 PlainSaslServerProvider 相同的逻辑,但应引用您的 SaslServerFactory 实现。

您的 SaslFactory class 应该再次具有与 PlainSaslServerFactory 相同的逻辑,但创建您的 SaslServer 实现的实例。

最后,您的 SaslServer class 应该在其 evaluateResponse() 方法中实施必要的 LDAP 逻辑。只需确保正确设置 this.authorizationId 因为这将成为用户主体并将 complete 设置为 true (就像 PlainSaslServer.evaluateResponse() 那样)