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