为什么 kafka 运行的 Kerberos 主体名称是“kafka”而不是“kafka/hostname@EXAMPLE.COM”?
“kafka/hostname@EXAMPLE.COM”实际上是指服务主体名称(SPN)。 SPN 是 KDC 中服务实例的唯一标识符。 Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。这允许客户端应用程序请求服务对帐户进行身份验证,即使客户端没有帐户名称。
所以这里的服务名称是“Kafka”,服务主体名称是“kafka/hostname@EXAMPLE.COM”。 Kafka 是运行 Kafka 的服务帐户。
为什么我们需要设置这个配置:sasl.kerberos.service.name,它是如何工作的?
正如我在上面回答的那样,由于您已经使用 Kerberos 设置了 Kafka 代理身份验证,因此即使客户端没有帐户名称,客户端应用程序也可以请求服务对帐户进行身份验证。
但客户端(生产者、消费者、连接工作人员等)将使用自己的主体(通常与运行客户端的用户同名)向集群进行身份验证,因此请根据需要获取或创建这些主体。然后为每个主体创建一个 JAAS 文件。 KafkaClient 部分描述了生产者和消费者等客户端如何连接到 Kafka Broker。
您需要在运行客户端的地方拥有 jass 文件,并提供以下信息。
如果先使用 kinit 命令,请使用此配置。
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
storeKey=true
keyTab="/etc/security/keytabs/kafka_client.keytab"
principal="kafka-client-1@EXAMPLE.COM";
};
如果你使用keytab,使用这个配置:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/security/keytabs/kafka_server.keytab"
principal="kafka/kafka1.hostname.com@EXAMPLE.COM";
};
因此,一旦客户端(生产者、消费者、任何 Java 代码)使用其自己的主体对代理进行身份验证,那么它将对请求属性 sasl.kerberos.service.name 中提到的服务“kafka”进行身份验证。
这里有更多关于SASL configurations的信息。