Spring Boot + Kafka + Kerberos配置

3

我正在使用 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都很新,所以任何帮助都将不胜感激。

2个回答

4

请参阅kafka文档"使用SASL/Kerberos进行身份验证"

要在客户端上配置SASL身份验证: 客户端(生产者、消费者、连接工作进程等)将使用自己的主体(通常与运行客户端的用户名称相同)对集群进行身份验证,因此根据需要获取或创建这些主体。然后为每个客户端配置JAAS配置属性。不同的JVM中的不同客户端可以通过指定不同的主体以不同的用户身份运行。producer.properties或consumer.properties中的sasl.jaas.config属性描述了诸如producer和consumer之类的客户端如何连接到Kafka Broker。以下是一个使用keytab的客户端的示例配置(建议用于长时间运行的进程):

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连接所有客户端连接。

确保JAAS配置中配置的keytabs可被启动kafka客户端的操作系统用户读取。 可以选择将krb5文件位置作为JVM参数传递给每个客户端JVM(有关更多详细信息,请参见此处):

-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

我创建了一个 jaas.conf 文件:KafkaClient{ com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true useTicketCache=true keyTab="/home/tomi/user-host.keytab" principal="user/host@x.com"; };我使用 java -jar -Djava.security.auth.login.config=/home/tomi/jaas.conf -Djava.security.krb5.conf=/home/tomi/krb5.conf kafka.jar 启动应用程序。 当尝试发送消息时,我收到以下错误:sun.security.krb5.KrbException: no supported default etypes for default_tkt_enctypes。 在我的 krb5.conf 文件中,default_tkt_enctypes 被定义为 aes256-cts-hmac-sha1-96 - tomi
我建议您使用那些信息提出一个新问题;人们通常不会在这里的评论中寻找新问题 - 我没有能力为此提供答案。 - Gary Russell

3

请参考Confluent的说明。

您需要在spring boot应用程序的application.yml文件中输入以下内容。Spring boot Kafka会自动读取这些配置并创建具有Kerberos身份验证的消费者客户端。

spring:
  kafka:
    producer:
      bootstrap-servers: address:port
    properties:
      security:
        protocol: SASL_PLAINTEXT
      sasl:
        mechanism: GSSAPI
        kerberos:
          service:
            name: kafka
        jaas:
          config: com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/path/to/keytab" principal="servicename/hostname@REALM";


你还需要向JVM传递-Djava.security.krb5.conf=/etc/krb5.conf,或在你的主类中使用静态初始化器设置Kerberos配置信息(其中包含有关你的KDC的详细信息)。 在这里阅读有关Kerberos要求的更多信息
static {
        System.setProperty("java.security.krb5.conf", "/etc/krb5.conf");
        System.out.println(System.getProperty("java.security.krb5.conf"));
    }

确保您的代理也支持Spring Boot配置中提供的安全协议。 您可以通过检查Kafka代理中的server.properties文件来确认这些内容,例如:
使用启用了GSSAPI(Kerberos)机制(注意:Kafka代理中可以启用多个机制,因此支持多个身份验证机制) sasl.enabled.mechanisms=GSSAPI
使用启用了SCRAM机制 sasl.enabled.mechanisms=SCRAM-SHA-256
使用启用了PLAIN机制 sasl.enabled.mechanisms=PLAIN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接