Apache spark Kafka kerberos配置问题

Apache spark Kafka kerberos配置问题,apache-spark,apache-kafka,kerberos,Apache Spark,Apache Kafka,Kerberos,在卡夫卡文件中,它说校长是卡夫卡/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." 为什么需要

在卡夫卡文件中,它说校长是卡夫卡/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

我不知道什么是卡夫卡,但kerberos主体是“卡夫卡/主机名”,而不仅仅是“卡夫卡”

在kerberos数据库中,可以有许多不同的主体,称为

卡夫卡 卡夫卡/主机名 卡夫卡/行政 卡夫卡/你想要什么


其中每一个都称为主体(包括/something)

卡夫卡只是卡夫卡服务运行的主体名称。 您还应该在KDC服务器中添加一个“kafka”主体

如果您正在使用Cloudera,它将自动在KDC服务器中添加此条目。 您可以在/var/run/cloudera scm代理/processs中检查此配置/

jaas配置文件中也将包含相同的主体。 principal=“卡夫卡/hostname@Relam名称”

使用

KafkaServer {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    useTicketCache=false
    keyTab="kafka.keytab"
    principal="kafka/kafka.example.com@EXAMPLE.COM";
};
// Zookeeper client authentication
Client {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   storeKey=true
   useTicketCache=false
   keyTab="kafka.keytab"
   principal="kafka/kafka.example.com@EXAMPLE.COM";
})

这是卡夫卡服务器和卡夫卡连接到kerberized zookeeper的jaas,您可以在卡夫卡的server.properties中设置这3个属性

security.protocol: SASL_PLAINTEXT
sasl.mechanism: GSSAPI
sasl.kerberos.service.name: kafka
为什么卡夫卡运行的Kerberos主体名称是“卡夫卡”而不是“卡夫卡”/hostname@EXAMPLE.COM“

“卡夫卡/hostname@EXAMPLE.COM“实际上是指服务主体名称(SPN)。SPN是KDC中服务实例的唯一标识符。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。这允许客户端应用程序请求服务对帐户进行身份验证,即使客户端没有帐户名

因此,服务名称在这里是“Kafka”,服务主体名称是“Kafka”/hostname@EXAMPLE.COM". Kafka是运行Kafka的服务帐户

为什么需要设置此配置:sasl.kerberos.service.name,它是如何工作的

正如我在上面回答的,由于您已经使用Kerberos设置了Kafka brokers身份验证,因此客户机应用程序可以请求服务对帐户进行身份验证,即使客户机没有帐户名

但是客户端(生产者、消费者、连接工作者等)将使用自己的主体(通常与运行客户端的用户同名)对集群进行身份验证,因此根据需要获取或创建这些主体。然后为每个主体创建一个JAAS文件。KafkaClient部分描述了像producer和consumer这样的客户端如何连接到Kafka代理

你需要有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”进行身份验证


以下是有关的详细信息。

使用wurstmeister/kafka docker,似乎无法直接编辑server.properties。 相反,我在docker-compose.yml中定义了以下环境属性:

KAFKA_SASL_KERBEROS_SERVICE_NAME: kafka

你们是如何提供本金分配的?