您的位置:

Kafka认证详解

一、Kafka认证概述

Kafka是一个分布式流平台,提供了数据发布和订阅机制。它设计用于高吞吐量、可扩展性和容错性。然而,Kafka本身没有内置的安全机制,任何拥有访问Kafka集群主机的人都可以修改或者删除数据。为了避免这种情况的发生,Kafka提供了认证/Acl机制。

二、什么是Kafka认证机制

Kafka认证机制是用于验证访问Kafka集群的客户端的机制。它允许Kafka集群管理员配置哪些客户端可以访问Kafka集群,以及哪些主题和分区是可读和可写的。

三、Kafka认证的工作原理

Kafka认证的工作原理类似于其他Web应用程序的工作原理,Kafka集群将认证请求发送到认证服务,返回认证结果,如果认证通过,客户端可以访问集群,否则拒绝访问。在Kafka中,主要有以下两种类型的认证机制:

四、Plaintext本机协议认证

该方法不加密传输的Kafka集群,允许未认证的客户端通过基本的密钥字符串验证访问Kafka集群。Kafka集群默认为该方式。

server.properties
# kafka中plaintext认证方式的开启方式
listeners=PLAINTEXT://:9092
security.inter.broker.protocol=PLAINTEXT

五、SSL加密认证

该方法采用SSL/TLS加密传输Kafka集群中的所有数据,同时允许与证书匹配的客户端访问。Kafka和客户端之间通过SSL/TLS协议来建立安全通道,实现认证和加密传输。

server.properties:
# kafka中ssl认证方式的开启方式
listeners=SSL://:9093
security.inter.broker.protocol=SSL
ssl.keystore.location=/kafka/ssl/kafka.server.keystore.jks
ssl.keystore.password=123456
ssl.key.password=123456
ssl.truststore.location=/kafka/ssl/kafka.server.truststore.jks
ssl.truststore.password=123456
ssl.client.auth=required

六、SASL/Kerberos认证

该方法是采用Kerberos身份验证协议实现的安全机制,仅支持Java客户端。Kafka集群和客户端之间进行交互时,使用SASL协议进行身份验证,然后使用Kerberos协议进行票据交换。由于Kafka只可以使用Jaas配置方式来实现SASL/Kerberos认证,所以Jaas配置是该方式的必要条件。

server.properties:
# kafka中sasl认证方式的开启方式
listeners=SASL_SSL://:9094
security.inter.broker.protocol=SASL_SSL
sasl.mechanism.inter.broker.protocol=GSSAPI
sasl.enabled.mechanisms=GSSAPI
sasl.kerberos.principal=kafka/kafka@EXAMPLE.COM
sasl.kerberos.kinit.cmd=/usr/bin/kinit
sasl.kerberos.ticket.renew.window.factor=0.80
sasl.kerberos.ticket.renew.jitter=0.05
sasl.kerberos.min.time.before.relogin=1min
ssl.truststore.location=/kafka/ssl/kafka.server.truststore.jks
ssl.truststore.password=123456
security.protocol=SASL_SSL

kafka_client_jaas.conf:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/kafka/keytabs/kafka_client.keytab"
storeKey=true
useTicketCache=true
serviceName="kafka"
principal="kafkaclient@EXAMPLE.COM";
};

七、Kafka认证的ACL授权机制

Kafka中的ACL授权机制是在认证通过后,实现对集群资源访问的授权。Kafka允许对主题、分区和Consumer组进行ACL授权,以控制哪些客户端可以访问哪些主题或分区,以及哪些虚拟消费者组可以接受相应主题的消息流。

# 对主题t1的生产者A进行acl授权,只允许A写的权限
bin/kafka-acls.sh --authorizer-properties zk.connect=localhost:2181 \
--add --allow-principal User:A --operation Write \
--topic t1 --group Group1

八、Kafka认证的安全性问题

Kafka认证机制提供了安全访问Kafka集群的手段,但是在实际使用中也存在一定的风险。首先,在使用SASL/ Kerberos认证的情况下,需要一定的安全技术实践和管理,例如注销过期密钥、更新配置、过期票据等。其次,在使用SSL加密认证的情况下,需要自行生成和管理证书,并确保证书传输的安全性。

九、Kafka认证的监控和诊断

为了提高对Kafka安全的监测和诊断能力,Kafka提供了一些重要的监控工具。其中,Kafka安全插件提供了重要的诊断信息及统计数据,包括用户访问日志、Kafka集群和客户端交互信息、认证日志等。此外,还提供了Kafka审计记录功能,可以记录Kafka添加、更新和删除的所有ACL授权规则,以及客户端的验证和授权信息。

# 开启Kafka的日志审计功能
log4j.logger.kafka.authorizer.logger=TRACE, authorizerAppender

# 开启Kafka的ACL日志功能
log4j.logger.kafka.authorizer.logger=DEBUG, authorizerAppender

十、Kafka认证的应用场景

Kafka认证适用于需要保护Kafka集群中数据的场景,例如金融、电商等领域。在这些行业中,数据的安全性和完整性至关重要。Kafka认证可以有效控制谁可以访问Kafka集群、读取哪些主题和分区、在哪些主题和分区上发布数据、以及哪些Consumer组可以订阅哪些主题和分区。