kafka使用SASL/Kerberos认证

半兽人 发表于: 2019-10-18   最后更新时间: 2019-10-23  

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(笔记)



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: Kafka SASL验证
下一条: kafka使用SASL/PLAIN认证