kafka使用SASL验证

半兽人 发表于: 2016-05-03   最后更新时间: 2016-10-25  
  •   1 订阅,7041 游览

kafka使用SASL验证


1、预备知识

  1. Kerberos
    如果你已在使用Kerberos服务器(例如,通过使用Active Directory),则无需安装新的服务器。否则,你将需要安装一个,Linux可能有Kerberos如何安装和配置的简短说明(Ubuntu,红帽)封装。请注意,如果您使用的是Oracle的Java,你需要下载java版本的JCE策略文件,将它们复制到 $JAVA_HOME/jre/lib/security中.
  2. 创建Kerberos主体
    如果您使用的是公司的Kerberos或Active Directory服务器,请为你的集群和将用Kerberos身份验证访问kafka每个操作系统用户的每个kafka broker上你的Kerberos管理员(通过客户端和工具)。如果您已经安装了自己的Kerberos,您需要使用下面的命令来自己创建这些主体:
    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要求所有的主机都可以用自己的FQDN来解决。


2、配置Kafka Broker


1、添加一个JAAS文件,类似下面的每个kafka broker的配置目录。这个例子我们姑且命名为kafka_server_jaas.conf(注意,每个broker都应该有自己的密钥表)。

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";
    };
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文件中配置的密钥表可被操作系统启动kafka broker用户读取。


4、在server.properties中配置SASL端口,在listeners增加SASL_PLAINTEXT或SASL_SSL,至少包含一个或多个逗号分隔值:

listeners=SASL_PLAINTEXT://host.name:port
如果使用SASL_SSL,还必须配置SSL。如果你只配置SASL端口(或如果你想broker使用SASL相互进行身份验证),那么请确保你的broker间设置相同的SASL协议。
security.inter.broker.protocol=SASL_PLAINTEXT (or SASL_SSL)
我们还必须在服务器配置服务的名字。属性,应与卡夫卡的主体名经纪人。在上面的例子中,主体是“kafka/ kafka1.hostname.com@EXAMPLE.com”,所以:
sasl.kerberos.service.name=kafka
重要提示
  1. KafkaServer是每个KafkaServer/Broker使用JAAS文件中的节名,这一部分告诉broker使用哪个主体和此主体存储密钥表的位置。在本节它允许broker登录使用keytab指定。
  2. client使用SASL与zookeeper进行身份验证。它还允许broker设置SASL ACL在Zookeeper节点锁定这些节点,因此,只有broker可以修改它。它必需有所有broker相同的主体名称。如果要使用客户端以外的节名,系统属性 zookeeper.sasl.client 设置相应的名称。(例如,-Zookeeper.sasl.client=ZkClient)。
  3. ZooKeeper使用”zookeeper”作为默认服务名称,如果你想改变它,设置系统属性zookeeper.sasl.client(例如 -Dzookeeper.sasl.client.username=zk)

3、配置kafka客户端


SASL认证仅支持新的生产者和消费者,不支持旧的。要在客户端上配置SASL验证:

1、客户端(生产者,消费者,工作连接等)将验证集群与他们自己的主体(通常具有相同名称的用户运行客户端),从而获得或根据需要创建主体。然后,为每个主体创建一个JAAS文件,KafkaClient部分描述了像生产者和消费者客户端是如何连接到broker,下面是使用密钥表客户端的配置示例(适合长时间运行的进程)。

KafkaClient {
        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”一起使用,如:
KafkaClient {
        com.sun.security.auth.module.Krb5LoginModule required
        useTicketCache=true;
    };
2、通过JAAS和可选krb5文件位置作为JVM参数到每个客户机JVM(更多细节):
-Djava.security.krb5.conf=/etc/kafka/krb5.conf
-Djava.security.auth.login.config=/etc/kafka/kafka_client_jaas.conf
3、确保在kafka_client_jaas.conf中kaytabs配置在启动客户端的操作系统用户是可读的。

在producer.properties或consumer.properties中配置以下属性:

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

4、整合安全功能在正在运行的集群

你可以通过一个或多个前面讨论支持的协议来确保正在运行的集群,这是完成阶段:
  • 以增量的方式额外打开额外的安全端口(s)。
  • 使用安全的,而不是PLAINTEXT端口重启客户端(假设你是固定client-broker连接)。
  • 集群增量的方式再次启用broker-to-broker安全性(如果这是必需的)
  • 最后一个增量来关闭PLAINTEXT端口。

配置SSL和SASL的具体步骤,在7.2和7.3描述。按照这些步骤启用安全所需的协议(S)。

安全的实现允许你为broker-client和broker-broker配置不同的协议。这些都必须启用独立的反弹。PLAINTEXT端口必须悬空(开启),所以broker和/或clients可以继续使用。

当执行增量部署,通过SIGTERM清理停止broker。等待重新启动副本,以移动到下一个节点之前返回到isr列表。这也是很好的做法。

举个例子,假设我们希望broker-client和broker-broker两个使用SSL进行加密。在第一个增量部署,在每个节点上打开SSL端口:

listeners=PLAINTEXT://broker1:9091,SSL://broker1:9092
然后重启客户端,改变他们的配置指向新开的安全端口:
bootstrap.servers = [broker1:9092,...]
        security.protocol = SSL
        ...etc
在第二个增量服务器反弹,我们通知kafka去使用SSL作为broker-broker协议(这将使用相同的SSL端口):
listeners=PLAINTEXT://broker1:9091,SSL://broker1:9092
security.inter.broker.protocol=SSL
在最后的增量部署,我们通过关闭PLAINTEXT端口:
listeners=SSL://broker1:9092
security.inter.broker.protocol=SSL
另外,我们可以选择打开多个端口,以便不同的协议可用于broker-broker和client-broker通信。假设我们希望在整个使用SSL加密(即,对于broker-broker和client-broker通信),但我们也想SASL认证添加到broker-client连接。我们会在第一增量过程中打开两个额外的端口实现这一点:
listeners=PLAINTEXT://broker1:9091,SSL://broker1:9092,SASL_SSL://broker1:9093
然后,我们将重启客户端,改变他们的配置指向到新的SASL&SSL安全端口:
bootstrap.servers = [broker1:9093,...]
        security.protocol = SASL_SSL
        ...etc
第二个服务器集群反弹将切换集群到我们以前打开的SSL端口使用加密broker-broker通讯。
listeners=PLAINTEXT://broker1:9091,SSL://broker1:9092,SASL_SSL://broker1:9093
security.inter.broker.protocol=SSL
最后,新部署的来保证集群,在关闭PLAINTEXT端口.
listeners=SSL://broker1:9092,SASL_SSL://broker1:9093
security.inter.broker.protocol=SSL
zookeeper可以保证独立的kafka集群。这样做的步骤都在7.5.2节。








发表于: 1年前   最后更新时间: 1年前   游览量:7041
上一条: Producer API
下一条: kafka介绍(0.8版本)

评论…


  • 评论…
    • in this conversation
      提问