什么是SSL?
安全套接字层(SSL)是传输层的一个安全协议。在SSL协议中,数据被分割成片段。这些片段经过压缩和加密后,会附加在由SHA (Secure Hash Protocol)和MD5(Message Digest)等算法生成的MAC (Message Authentication Code)上。SSL是传输层安全(TLS)的前身。在对数据进行加密后,最后,SSL header被附加到数据上。
默认情况下,Confluent Kafka采用不安全的明文协议在9092端口进行通信。
Confluent Kafka安全支持Broker和客户端内部通信的SSL安全协议。每个Broker对其他Broker和客户端进行认证。Broker和客户端都会互相认证(2-way authentication)。人们也可以使用SSL与SASL安全,参考Confluent Kafka sasl的内容。
注意:在Confluent Kafka安全中启用SSL(TLS)将覆盖Kafka消费者的零拷贝优化。在零拷贝机制中,数据只会被复制到页缓存中一次,并在每次消费时重复使用,而不是存储在内存中,并在每次读取时复制到用户空间。这允许消息的消费速度接近网络连接的极限。
为了握手成功:
- 每个Broker都应该有自己的私钥/证书对,客户端使用证书来验证Broker的身份。
- 如果启用了客户端身份验证,那么每个客户端都应该有一个私钥/证书对,Broker使用证书对客户端身份进行验证。
客户端认证是可选的,但推荐使用。使用它的代价是性能影响,而不使用它可以允许未经身份验证的代理(模拟)与客户端进行通信。
在Kafka Brokers中启用SSL协议的步骤以及启用Confluent Kafka安全。
注意:以下步骤不包括创建SSL证书和密钥的步骤,可以参考这里。
用以下对应的配置更新server.properties文件:
ssl.truststore.location=/var/private/ssl/kafka.server.truststore.jks
ssl.keystore.location=/var/private/ssl/kafka.server.keystore.jks
ssl.truststore.password=secret123
ssl.keystore.password=secret123
ssl.key.password=secret123
在server.properties中进行以下配置,开始broker间的SSL通信:
security.inter.broker.protocol=SSL
现在更新server.properties中的listeners和advertised listeners (如果不同)。一般来说,我们对SSL使用9093端口,因为9092是默认的明文端口。
listeners=SSL://kafkabroker1:9093
advertised.listeners=SSL://localhost:9093
对于继续使用plaintext协议以及SSL,请参考下面:
listeners=PLAINTEXT://kafkabroker1:9092,SSL://kafkabroker1:9093
advertised.listeners=PLAINTEXT://localhost:9092,SSL://localhost:9093
SSL端口正常运行时,删除/禁用9092 plaintext 端口。
-
对于启用客户端认证(双向认证),必须启用以下配置:ssl.client.auth=required
-
在客户端,需要同时拥有证书和密钥。所有和启用SSL的Kafka集群进行通信的客户端都要用到以下配置。
这些配置可以放在一个文件中,并与常用的客户端应用文件一起重复使用。bootstrap.servers=kafkabroker1:9093 security.protocol=SSL ssl.truststore.location=/var/private/ssl/kafka.client.truststore.jks ssl.truststore.password=secret123 ssl.keystore.location=/var/private/ssl/kafka.client.keystore.jks ssl.keystore.password=secret123 ssl.key.password=secret123
注意:ssl.truststore.password值在broker和客户端的配置中都是可选的,但强烈建议完整性检查。
下面是Confluent Kafka Security中带有SSL元数据配置的Kafka客户端的例子。
- ${home}/bin/kafka-console-producer -broker-list kafkabroker1:9093 -topic test_topic -producer.config client-ssl.properties
- ${home}/bin/kafka-console-consumer –bootstrap-server kafkabroker1:9093 –topic test_topic –consumer.config client-ssl.properties –from-beginning
- 基于JVM的生产者和消费者,下面的export命令可以包含在启动脚本中,或者设置为指定机器的环境变量。
export KAFKA_OPTS=
-Djavax.net.ssl.trustStore=/path/to/truststore.jks
-Djavax.net.ssl.trustStoreType=jks
-Djavax.net.ssl.trustStorePassword=<password
-Djavax.net.ssl.keyStore=/path/to/keystore.jks
-Djavax.net.ssl.keyStoreType=jks
-Djavax.net.ssl.keyStorePassword=;password>
参考
https://docs.confluent.io/platform/current/kafka/authentication_ssl.html
原文标题:Security & SSL Setup in Confluent Kafka
原文作者:munandersingh
原文地址:https://blog.knoldus.com/security-ssl-setup-in-confluent-kafka/




