我正在使用 Spring Boot 1.5.6.RELEASE 通过Kerberos身份验证连接到 Kafka 0.11 。这些是我用于Kafka的依赖项:
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-kafka</artifactId>
<version>3.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
我必须将消息发送到不受我们管理的Kafka服务器,并且获得了Kafka用户名,keytab
文件和krb5.conf
文件。
这些是用于在没有Kerberos的情况下进行测试的属性:
spring:
kafka:
bootstrap-servers: "10.10.20.185:9092"
producer:
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
很好。
如何在我的应用程序配置中实现Kerberos? 由于我是Kafka和Kerberos的新手,将不胜感激。
答案 0 :(得分:0)
请参见the kafka documentation "Authentication using SASL/Kerberos"。
要在客户端上配置SASL身份验证,请执行以下操作: 客户端(生产者,消费者,连接工作者等)将使用其自己的主体(通常与运行客户端的用户名称相同)对集群进行身份验证,因此需要获取或创建这些主体。然后为每个客户端配置JAAS配置属性。通过指定不同的主体,JVM中的不同客户端可以作为不同用户运行。 producer.properties或consumer.properties中的sasl.jaas.config属性描述了生产者和消费者之类的客户端如何连接到Kafka Broker。以下是使用密钥表的客户端的示例配置(建议长时间运行的进程):
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
useKeyTab=true \
storeKey=true \
keyTab="/etc/security/keytabs/kafka_client.keytab" \
principal="kafka-client-1@EXAMPLE.COM";
对于诸如kafka-console-consumer或kafka-console-producer之类的命令行实用程序,可以将kinit与“ useTicketCache = true”一起使用,如下所示:
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
useTicketCache=true;
可以将客户端的JAAS配置指定为类似于此处所述的代理的JVM参数。客户端使用名为KafkaClient的登录部分。此选项仅允许一个用户通过JVM进行所有客户端连接。
确保启动kafka客户端的操作系统用户可以读取JAAS配置中配置的密钥表。 (可选)将krb5文件位置作为JVM参数传递给每个客户端JVM(有关更多详细信息,请参见here):
-Djava.security.krb5.conf=/etc/kafka/krb5.conf
在producer.properties或Consumer.properties中配置以下属性:
security.protocol=SASL_PLAINTEXT (or SASL_SSL)
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka