Kafka kerberos 配置问题

Kafka kerberos configuration issues

kafka文档中说principal是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

我不知道 kafka 是什么,但 kerberos 主体是 "kafka/hostname",而不是单独的 "kafka"。

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

卡夫卡 kafka/hostname kafka/admin kafka/whatyouwant

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

kafka 只不过是 kafka 服务运行的主体名称。 您还应该在 KDC 服务器中添加一个 "kafka" 主体。

如果您使用的是 Cloudera,它会自动将此条目添加到 KDC 服务器中。 您可以在 /var/run/cloudera-scm-agent/processs/<>

中检查此配置

相同的主体也将出现在 jaas 配置文件中。 校长="kafka/hostname@Relam Name";

使用

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";

};

这个 jaas 用于 kafka 服务器和 kafka 连接到 kerberized zookeeper,你可以在 kafka 的 server.properties

中设置这 3 个属性
security.protocol: SASL_PLAINTEXT
sasl.mechanism: GSSAPI
sasl.kerberos.service.name: kafka

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 代理身份验证,因此即使客户端没有帐户名,客户端应用程序也可以请求该服务对帐户进行身份验证。

但是客户端(生产者、消费者、connect worker 等)将使用自己的主体(通常与用户 运行 客户端同名)向集群进行身份验证,因此获取或创建这些主体如所须。然后为每个主体创建一个 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 代码)使用自己的委托人对代理进行身份验证,那么它将对 属性 中提到的服务 "kafka" 进行身份验证 sasl.kerberos.service.name.

这里是关于 SASL configurations 的更多信息。

使用wurstmeister/kafka-docker,貌似server.properties不能直接编辑。 相反,我在 docker-compose.yml:

中定义了以下环境 属性
KAFKA_SASL_KERBEROS_SERVICE_NAME: kafka