单机kafka添加SSL认证

参考:https://www.cnblogs.com/smartloli/p/12950761.html

https://www.icode9.com/content-4-136457.html

1.概述

最近有同学咨询说,Kafka的SSL安全认证如何安装与使用?今天笔者将通过以下几个方面来介绍Kafka的SSL:

  • Kafka 权限介绍
  • Kafka SSL的安装与使用
  • Kafka Eagle中如何配置SSL?

2.内容

2.1 什么是Kafka权限认证?

在Kafka 0.9.0.0之后,Kafka社区增加了一系列的功能,其中包含对Kafka集群进行安全管控。支持的权限认证方式如下:

  1. Broker与Client之间的权限认证(例如Producer和Consumer)。可以使用SSL或SASL,而SASL支持如下方案:
    • SASL/GSSAPI(Kerberos),开始于0.9.0.0版本
    • SASL/PLAIN,开始于0.10.0.0版本
    • SASL/SCRAM-SHA-256和SASL/SCRAM-SHA-512,开始于0.10.2.0版本
    • SASL/OAUTHBEARER,开始于2.0版本

   2. Broker和Zookeeper之间建立权限认证

   3. 在Broker和Client之间、Broker和Broker之间使用SSL建立权限认证时,性能会有所下降,其程度取决于CPU类型和JVM的实现

   4. 对Client进行读写认证

在实际生产环境中,对于权限认证使用的较多的是SCRAM认证,其原因在《Kafka SCRAM和PLAIN实战》这篇博客中详细解释。

2.2 Kafka SSL安装与使用

Kafka允许客户端使用SSL来连接,默认情况下,SSL是禁止的,但是可以通过手动开启。安装Kafka SSL的流程如下所示:

 执行步骤如下所示:

1、创建脚本create_ssl.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[root@database-zongshuai kafka_2.12-2.2.2]# vim  create_ssl.sh
#! /bin/bash
set -e
#初始化环境变量(在脚本中声明变量)
echo "Step1: Config env"
 
BASE_DIR=/data/kafka_2.12-2.2.2/ssl
CERT_OUTPUT_PATH="$BASE_DIR/certificates"
PASSWORD=ke123456
KEY_STORE="$CERT_OUTPUT_PATH/kafka.keystore"
TRUST_STORE="$CERT_OUTPUT_PATH/kafka.truststore"
KEY_PASSWORD=$PASSWORD
STORE_PASSWORD=$PASSWORD
TRUST_KEY_PASSWORD=$PASSWORD
TRUST_STORE_PASSWORD=$PASSWORD
CLUSTER_NAME=ke-cluster-01
CERT_AUTH_FILE="$CERT_OUTPUT_PATH/ca-cert"
CLUSTER_CERT_FILE="$CERT_OUTPUT_PATH/${CLUSTER_NAME}-cert"
DAYS_VALID=365
D_NAME="CN=database-zongshuai.novalocal, OU=bonc, O=bonc, L=China, ST=China, C=database-zongshuai.novalocal"
 
mkdir -p $CERT_OUTPUT_PATH
 
#创建证书到KeyStore
echo "Step2: Create certificate to keystore"
keytool -keystore $KEY_STORE -alias $CLUSTER_NAME -validity $DAYS_VALID -genkey -keyalg RSA -storepass $STORE_PASSWORD -keypass $KEY_PASSWORD -dname "$D_NAME"
 
#创建CA
echo "Step3: Create CA"
openssl req -new -x509 -keyout $CERT_OUTPUT_PATH/ca-key -out "$CERT_AUTH_FILE" -days "$DAYS_VALID" -passin pass:"$PASSWORD" -passout pass:"$PASSWORD" -subj "/C=CN/S
T=XX/L=XX/O=XX/CN=XX"
 
#导入CA到TrustStore中
echo "Step4: Import CA into truststore"
keytool -keystore "$TRUST_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$TRUST_STORE_PASSWORD" -keypass "$TRUST_KEY_PASS" -noprompt
 
#导出证书
echo "Step5: Export certificate from keystore"
keytool -keystore "$KEY_STORE" -alias "$CLUSTER_NAME" -certreq -file "$CLUSTER_CERT_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
 
#给证书签名
echo "Step6: Signing the certificate"
openssl x509 -req -CA "$CERT_AUTH_FILE" -CAkey $CERT_OUTPUT_PATH/ca-key -in "$CLUSTER_CERT_FILE" -out "${CLUSTER_CERT_FILE}-signed" -days "$DAYS_VALID" -CAcreateser
ial -passin pass:"$PASSWORD"
 
#导入CA到KeyStore
echo "Setp7: Import CA into keystore"
keytool -keystore "$KEY_STORE" -alias CARoot -import -file "$CERT_AUTH_FILE" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt
 
#导入证书到KeyStore
echo "Setp8: Import signed certificate into keystore"
keytool -keystore "$KEY_STORE" -alias "${CLUSTER_NAME}" -import -file "${CLUSTER_CERT_FILE}-signed" -storepass "$STORE_PASSWORD" -keypass "$KEY_PASSWORD" -noprompt

 成功执行脚本后,会在对应的目录($BASE_DIR/certificates)生成对应文件清单:

 2、修改kafka安装目录下config目录下的server.properties文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
listeners=SSL://database-zongshuai.novalocal:9095
advertised.listeners=SSL://database-zongshuai.novalocal:9095
ssl.keystore.location=/data/kafka_2.12-2.2.2/ssl/certificates/kafka.keystore
ssl.keystore.password=ke123456
ssl.key.password=ke123456
ssl.truststore.location=/data/kafka_2.12-2.2.2/ssl/certificates/kafka.truststore
ssl.truststore.password=ke123456
ssl.client.auth=required
ssl.enabled.protocols=TLSv1.2,TLSv1.1,TLSv1
ssl.keystore.type=JKS
ssl.truststore.type=JKS
ssl.endpoint.identification.algorithm=HTTPS
security.inter.broker.protocol=SSL
broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka_2.12-2.2.2/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=database-zongshuai.novalocal:2182
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

注:SSL配置最好写在配置文件的最上面,否者可能导致Kafka配置SSL失败。

3、修改zookeeper配置文件

1
2
3
4
[root@database-zongshuai kafka_2.12-2.2.2]# grep  '^[a-z]'  config/zookeeper.properties           
dataDir=/data/kafka_2.12-2.2.2/zookeeper
clientPort=2182
maxClientCnxns=0

4、创建目录

1
2
3
[root@database-zongshuai kafka_2.12-2.2.2]# pwd
/data/kafka_2.12-2.2.2
[root@database-zongshuai kafka_2.12-2.2.2]#mkdir  zookeeper  kafka-logs

5、启动zookeeper

1
[root@database-zongshuai kafka_2.12-2.2.2]# ./bin/zookeeper-server-start.sh  -daemon config/zookeeper.properties

6、启动kafka

1
[root@database-zongshuai kafka_2.12-2.2.2]# ./bin/kafka-server-start.sh   -daemon  config/server.properties

7、使用Linux自带的openssl测试一下,验证我们配置的ssl有效

1
[root@database-zongshuai kafka_2.12-2.2.2]# openssl s_client -debug -connect  database-zongshuai.novalocal:9095 -tls1

 

 

 2.3验证

1、创建topic

1
2
3
4
5
#创建topic
[root@database-zongshuai kafka_2.12-2.2.2]#bin/kafka-topics.sh --create --zookeeper database-zongshuai.novalocal:2182 --replication-factor 1 --partitions 1 --topic test01
 
#查看topic
[root@database-zongshuai kafka_2.12-2.2.2]#bin/kafka-topics.sh --list --zookeeper database-zongshuai.novalocal:2182

 2、模拟生产者

创建一个SSL下的消费者配置文件p.properties

1
2
3
4
5
6
7
8
[root@database-zongshuai kafka_2.12-2.2.2]# cat  p.properties
bootstrap.servers=database-zongshuai.novalocal:9095
security.protocol=SSL
ssl.truststore.location=/data/kafka_2.12-2.2.2/ssl/certificates/kafka.truststore
ssl.truststore.password=ke123456  
ssl.keystore.location=/data/kafka_2.12-2.2.2/ssl/certificates/kafka.keystore
ssl.keystore.password=ke123456
ssl.key.password=ke123456

启动生产者:

1
[root@database-zongshuai kafka_2.12-2.2.2]#bin/kafka-console-producer.sh --broker-list database-zongshuai.novalocal:9095 --topic test01 --producer.config  /data/kafka_2.12-2.2.2/p.properties

 3、模拟消费者

创建一个SSL下的消费者配置文件c.properties

1
2
3
4
5
6
7
[root@database-zongshuai kafka_2.12-2.2.2]# cat  c.properties
security.protocol=SSL
group.id=test-group
ssl.truststore.location=/data/kafka_2.12-2.2.2/ssl/certificates/kafka.truststore
ssl.truststore.password=ke123456
ssl.keystore.password=ke123456
ssl.keystore.location=/data/kafka_2.12-2.2.2/ssl/certificates/kafka.keystore

启动消费者:

1
[root@database-zongshuai kafka_2.12-2.2.2]# bin/kafka-console-consumer.sh --bootstrap-server database-zongshuai.novalocal:9095 --topic test01 --from-beginning --consumer.config  c.properties

posted @   灰蓝色的白云梦想  阅读(1129)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示