【问题标题】:Apache Kafka Secure and non secure connections with spark 1.6.3Apache Kafka 与 spark 1.6.3 的安全和非安全连接
【发布时间】:2017-08-01 10:20:49
【问题描述】:

尝试将启用 Kerberos 的 Apache Kafka(0.9) 与 Apache spark 1.6.3 一起使用时出错。Zookeeper 版本为 3.4.5 我必须连接到两个卡夫卡。一个是启用keberos,另一个没有,所以我没有在spark executor的额外java opts中设置java.security.auth.login.config属性。

Kafka Initialization failed: org.apache.kafka.common.KafkaException: Failed to construct kafka consumer
    at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:648)
    at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:542)
    at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:524)
    at com.spark.receiver.helper.KafkaChannelHelper.initializeConnection(KafkaChannelHelper.java:277)
    at com.spark.receiver.helper.KafkaChannelHelper$2.run(KafkaChannelHelper.java:240)
Caused by: org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: Could not find a 'KafkaClient' entry in `/home/user/kafka_client.conf`.
    at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:74)
    at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:60)
    at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:79)
    at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:577)
    ... 4 more
Caused by: java.lang.IllegalArgumentException: Could not find a 'KafkaClient' entry in `/home/user/kafka_client.conf`.
    at org.apache.kafka.common.security.kerberos.Login.login(Login.java:294)
    at org.apache.kafka.common.security.kerberos.Login.<init>(Login.java:104)
    at org.apache.kafka.common.security.kerberos.LoginManager.<init>(LoginManager.java:44)
    at org.apache.kafka.common.security.kerberos.LoginManager.acquireLoginManager(LoginManager.java:85)
    at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:55)
    ... 7 more

java.security.auth.login.config是consumer自己设置的,连接kafkaConsumer的代码是:

public void initializeConnection() {
    props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_PLAINTEXT");
         System.setProperty("java.security.auth.login.config", jassFilePath);
        try {
            this.consumer = new KafkaConsumer<String, byte[]>(props);
        } catch (Exception e) {
            LOGGER.error("Kafka Initialization failed: ", e);
        }
    }

kafka_client.conf 仅包含以下部分:

KafkaClient{
    com.sun.security.auth.module.Krb5LoginModule required
    debug=true
    useKeyTab=true
    keyTab="/etc/security/keytabs/user.keytab"
    storeKey=true
    principal="user@REALM"
    serviceName="kafka";
};

【问题讨论】:

    标签: apache-kafka kerberos


    【解决方案1】:

    在向/从安全环境发布/使用数据之前应考虑两件事:-

    • 配置 security.protocol
    Properties props = new Properties();
    props.put("security.protocol", "PLAINTEXTSASL");
    
    • 将 jaas 配置与 java vm 选项一起传递
    java -Djava.security.auth.login.config=/home/kafka-user/kafka-jaas.conf \
    -Djava.security.krb5.conf=/etc/krb5.conf \
    -Djavax.security.auth.useSubjectCredsOnly=false \
    -cp hdp-kafka-sample-1.0-SNAPSHOT.jar:/usr/hdp/current/kafka-broker/libs/* \
    hdp.sample.KafkaProducer one.hdp:6667 test
    

    查看secure-kafka-java-producer-with-kerberos 了解完整说明。

    【讨论】:

      【解决方案2】:

      我对 kafka 1.11.0 也有类似的问题。

      同一 JVM 中的监控程序正在访问多个代理,其中一些代理使用的是 SASL Kerberos,而另一些则不安全。

      参数是程序自己在访问安全集群时添加的。

      -Djava.security.auth.login.config=/home/kafka-user/kafka-jaas.conf
      

      但是程序抛出异常:

      
      Could not find a 'KafkaClient' entry in the JAAS configuration. System property 'java.security.auth.login.config' is /path/to/jaas/kafka_client_jaas_usekeytab.conf
      
      

      奇怪的是java.security.auth.login.config真的设置正确而且这个文件中的内容很好。

      单集群的其他程序运行良好。

      kafka 官方文档JAAS configuration for Kafka clients 说:

      Clients may specify JAAS configuration as a producer or consumer property without creating a physical configuration file. 
      
      This mode also enables different producers and consumers within the same JVM to use different credentials by specifying different properties for each client. 
      
      If both static JAAS configuration system property java.security.auth.login.config and client property sasl.jaas.config are specified, the client property will be used.
      

      另一个问题here 说:

      他仅使用java.security.auth.login.config 就遇到了一些问题。

      也许解决办法是:

      在您的程序中提供sasl.jaas.config java.security.auth.login.config

      我将尝试对此案进行验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 2020-10-14
        • 2016-12-27
        • 1970-01-01
        • 2020-02-17
        相关资源
        最近更新 更多