在kafka文档中,它说主体是kafka/hostname@EXAMPLE.COM,所以sasl.kerberos.service.name应该是kafka
但我很困惑 kafka 代理配置说:sasl.kerberos.service.name
代表
"The Kerberos principal name that Kafka runs as. This can be defined either in Kafka's JAAS config or in Kafka's config."
为什么我们需要设置这个配置:sasl.kerberos.service.name
,它是如何工作的?为什么 kafka 运行的 Kerberos 主要名称是“kafka
”而不是“kafka/hostname@EXAMPLE.COM
”
最佳答案
why Kerberos principal name that kafka runs as is the "kafka" not "kafka/hostname@EXAMPLE.COM"?
“kafka/hostname@EXAMPLE.COM”实际上指的是服务主体名称(SPN)。 SPN 是 KDC 中一个服务实例的唯一标识符。 Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户相关联。这允许客户端应用程序请求服务对帐户进行身份验证,即使客户端没有帐户名也是如此。
所以这里的服务名称是“Kafka”,服务主体名称是“kafka/hostname@EXAMPLE.COM”。 Kafka 是运行 Kafka 的服务帐户。
why we need to set this configuration:sasl.kerberos.service.name, how does it work?
正如我在上面回答的那样,由于您已经使用 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 代码)使用自己的委托(delegate)人对代理进行身份验证,那么它将对属性 sasl.kerberos.service.name 中提到的服务“kafka”进行身份验证。
这里是关于 SASL configurations 的更多信息.
关于apache-spark - Kafka kerberos 配置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42555247/