kafka使用SASL/Kerberos认证

半兽人 发表于: 2019-10-18   最后更新时间: 2019-10-23 16:48:07  
{{totalSubscript}} 订阅, 13,557 游览

1. 预备知识

  1. Kerberos

    如果你已在使用Kerberos(如:Active Directory),则无需安装重新安装。否则,你将需要安装一个Kerberos,Linux供应商有Kerberos安装和配置的简短说明(UbuntuRadhat)。请注意,如果你使用的是Oracle Java,你需要下载java版本的JCE策略文件,将它们复制到 $JAVA_HOME/jre/lib/security中(注意:必须替换!).

  2. 创建Kerberos Principals

    如果你使用的是公司的KerberosActive Directory服务器,请向Kerberos管理员询问群集中每个broker的principal以及将使用Kerberos验证(通过客户端和工具)访问Kafka的每个操作系统用户。

    如果是你自己安装的Kerberos,你需要通过以下命令创建你自己的principal

    sudo /usr/sbin/kadmin.local -q 'addprinc -randkey kafka/{hostname}@{REALM}'
    sudo /usr/sbin/kadmin.local -q "ktadd -k /etc/security/keytabs/{keytabname}.keytab kafka/{hostname}@{REALM}"
    
  3. 确保使用主机名可以访问所有主机 -- Kerberos要求所有的host都可以用其FQDN解析所有主机。

2. 配置Kafka Broker

  1. 添加一个JAAS文件,类似下面的每个kafka broker的配置目录。在本例中我们将其命名为kafka_server_jaas.conf(注意,每个broker都应该有自己的keytab)。

    KafkaServer {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        storeKey=true
        keyTab="/etc/security/keytabs/kafka_server.keytab"
        principal="kafka/kafka1.hostname.com@EXAMPLE.COM";
    };
    
    // Zookeeper client authentication
    Client {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        storeKey=true
        keyTab="/etc/security/keytabs/kafka_server.keytab"
        principal="kafka/kafka1.hostname.com@EXAMPLE.COM";
    };
    

    JAAS文件中的KafkaServer告诉broker哪个principal要使用,以及存储该principal的keytab的位置。它允许broker使用指定的keytab进行登录。

  2. 通过JAAS和krb5文件位置(可选的)作为JVM参数传递到每个broker。

     -Djava.security.krb5.conf=/etc/kafka/krb5.conf
        -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
    
  3. 确保在JAAS文件的keytabs配置文件可被启动的Broker的操作系统员读取。

  4. server.properties中配置SASL的端口SASL机制,例如:

     listeners=SASL_PLAINTEXT://host.name:port
     security.inter.broker.protocol=SASL_PLAINTEXT
     sasl.mechanism.inter.broker.protocol=GSSAPI
     sasl.enabled.mechanisms=GSSAPI
    

    我们还必须在server.properties配置服务器名称,应与broker的principal名匹配,在上面的例子中,principal是"kafka/kafka1.hostname.com@EXAMPLE.com", 所以:

    sasl.kerberos.service.name=kafka
    

3. 配置Kafka Client

在客户端上配置SASL认证

  1. 客户端(生产者,消费者,connect,等等)用自己的principal进行集群认证(通常用相同名称作为运行客户端的用户)。因此,获取或根据需要创建这些principal。然后为每个客户端配置JAAS配置。JVM中的不同客户端通过指定不同的principal可以作为不同的用户运行。producer.properties或consumer.properties中的sasl.jaas.config描述了像生产者和消费者之类的客户端如何连接到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-consumerkafka-console-producer这样的命令行工具,kinit可以与“useTicketCache=true”一起使用,如:

     sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
         useTicketCache=true;
    

    客户端的JAAS配置可以作为JVM参数,类似于broker。 客户端使用名为KafkaClient的login部分。 此选项仅允许JVM中所有客户端连接的一个用户。

  2. 确保JAAS配置中的keytabs配置文件能被启动kafka客户端的操作系统用户读取。

  3. 可以将krb5文件位置作为JVM参数传递给每个客户端JVM:

     -Djava.security.krb5.conf=/etc/kafka/krb5.conf
    
  4. 在 producer.properties 或 consumer.properties中配置以下属性:

     security.protocol=SASL_PLAINTEXT (or SASL_SSL)
     sasl.mechanism=GSSAPI
     sasl.kerberos.service.name=kafka
    

实战笔记

kafka实战kerberos(笔记)

更新于 2019-10-23

java.io.IOException: Connection to node01:9092 (id: 1001 rack: null) failed.
    at org.apache.kafka.clients.NetworkClientUtils.awaitReady(NetworkClientUtils.java:71)
    at kafka.controller.RequestSendThread.brokerReady(ControllerChannelManager.scala:292)
    at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:246)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:96)

开启kafka的kerbeors和sasl报的错
请问怎么解决

你单独提个问题吧,核心的错误都需要提供。

还好。。。 2年前

请问站长有kafka集成kerberos认证的java代码demo吗?

我没整理额,你可以通过搜索关键字,看看其他用户写的零零散散的,太多了,但是你要自己找找:如下:https://www.orchome.com/about/search?q=kerberos&belong=1003&category=I

ps:你要是写好,可以分享一下,我帮你整理到网站里。

还好。。。 2年前

按照博主的教程,启动kafka时报错,

ERROR SASL authentication with Zookeeper Quorum member failed: javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - LOOKING_UP_SERVER)]) occurred when evaluating Zookeeper Quorum Member's received SASL token. Zookeeper Client will go to AUTH_FAILED state.

请问一下,这个该咋解决?感谢回答

4年前

既然为kafka添加权限检验功能,想问下没有java kafka_clents.jar包对接Kerberos认证的例子吗。

查看kafka更多相关的文章或提一个关于kafka的问题,也可以与我们一起分享文章