kafka使用SASL/SCRAM认证

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

SCRAM(Salted Challenge Response Authentication Mechanism)是SASL机制家族的一种,通过执行用户名/密码认证(如PLAIN和DIGEST-MD5)的传统机制来解决安全问题。 该机制在RFC 5802中定义。Kafka支持SCRAM-SHA-256和SCRAM-SHA-512,可与TLS一起使用执行安全认证。 用户名用作配置ACL等认证的Principal。Kafka中的默认SCRAM实现是在Zookeeper中存储SCRAM的证书,适用于Zookeeper在私有网络上的Kafka安装。有关详细信息,请参阅安全注意事项。

1. 创建 SCRAM 证书

Kafka的SCRAM实现使用Zookeeper作为证书存储。通过使用kafka-configs.sh来创建证书。 对于启用的每个SCRAM机制,必须通过使用机制名称添加配置来创建证书。 必须在kafka broker启动之前创建broker之间通信的证书。客户端证书可以动态创建和更新,并且将使用更新后的证书来验证新的连接。

为用户alice创建SCRAM凭证(密码为alice-secret):

> bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=alice-secret],SCRAM-SHA-512=[password=alice-secret]' --entity-type users --entity-name alice

如果未指定迭代数,则使用默认迭代数为4096。 创建一个随机salt,由salt,迭代,StoredKey和ServerKey组成的SCRAM标识,都存储在Zookeeper中。有关SCRAM身份和各个字段的详细信息,请参阅RFC 5802

以下示例中,需要用户admin进行broker间通信,通过以下命令创建:

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-secret],SCRAM-SHA-512=[password=admin-secret]' --entity-type users --entity-name admin

可以使用--describe列出现有的证书:

bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-type users --entity-name alice

可以使用--delete为一个或多个SCRAM机制删除证书:

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name alice

2. 配置Kafka Broker

  1. 在每个Kafka broker的config目录下添加一个类似于下面的JAAS文件,我们姑且将其称为kafka_server_jaas.conf:

    KafkaServer {
     org.apache.kafka.common.security.scram.ScramLoginModule required
     username="admin"
     password="admin-secret"
    };
    

    其中,broker使用KafkaServer中的用户名和密码来和其他broker进行连接。 在这个例子中,admin是broker之间通信的用户。

  2. JAAS配置文件的位置作为JVM参数传递给每个Kafka broker:

    -Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf
    
  3. 在server.properties中配置SASL端口和SASL机制。 例如:

    listeners=SASL_SSL://host.name:port
    security.inter.broker.protocol=SASL_SSL
    sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 (or SCRAM-SHA-512)
    sasl.enabled.mechanisms=SCRAM-SHA-256 (or SCRAM-SHA-512)
    

3. 配置kafka客户端

在客户端上配置SASL认证

  1. 为每个客户端配置JAAS配置(在producer.properteis或consumer.properteis)。登录模块展示了客户端(如生产者和消费者)如何连接到broker的。下面是配置了SCRAM机制的客户端的例子。

    sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="alice" \
    password="alice-secret";
    

    客户端使用username和password来配置客户端连接的用户。在这个例子中,客户端使用用户alice连接broker。在JVM中不同的客户端连接不同的用户(通过在sasl.jaas.config中指定不同的用户名和密码)。

    客户端的JAAS配置通过指定作为JVM的参数。使用名为KafkaCLient的客户端登录。此选择仅允许来自JVM的所有客户端连接中的一个用户。

  2. 在 producer.properties 或 consumer.properties 中配置以下参数:

     security.protocol=SASL_SSL
     sasl.mechanism=SCRAM-SHA-256 (or SCRAM-SHA-512)
    

4. SASL/SCRAM安全注意事项

  • 在kafka中SASL/SCRAM的默认实现SCRAM证书存储在Zookeeper中,这适用于Zookeeper安全和私有网络的生产场景。

  • Kafka仅支持强散列函数SHA-256和SHA-512,最小迭代次数为4096.强散列函数结合强密码和高迭代数可以防止强制攻击(如果Zookeeper安全性受到威胁)。

  • SCRAM只能使用TLS加密,以防止拦截SCRAM交换。如果Zookeeper受到威胁,则可以防止字典或暴力攻击,和防止伪装模仿。

  • 从Kafka 2.0版开始,可以通过在Zookeeper不安全的安装中配置sasl.server.callback.handler.class来自定义回调处理程序覆盖默认的SASL/SCRAM凭据存储。

  • 更多的安全注意事项,可参考RFC 5802

实战笔记

kafka实战SASL/SCRAM



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




上一条: kafka使用SASL/PLAIN认证
下一条: kafka在broker中启用多个SASL机制