Kafka总结(六)Kafka 安全性保障


1. ssl/tls 原理

  • 摘要算法:将需要加密的铭文使用hash函数生成一段被称为摘要的遗传密文,128位

  • 数字签名:将摘要使用私钥加密后连同明文一同发送,接收方使用公钥将其解密为摘要,然后使用hash函数从明文算出摘要,将二者进行对比以确认消息的完整性和消息确实是由发送方签名并发出的。

  • CA证书:用户将证书的公钥和个人信息发送给CA,CA确信来源后,给用户发一个(由CA私钥)签名后的数字证书。

    • 证书颁发机构,证书本身的数字签名,证书持有者公钥,证书签名用到的hash算法。
  • 证书有效性

    • 根据CA名找到相应的CA根证书和CA公钥,用CA公钥对证书摘要解密,若解密失败则认为其为假证书。
    • 若证书被篡改,用CA公钥对证书签名进行解密得到摘要A,再用hash函数计算出证书摘要B,若A与B相同则证书正常,否则认为其被篡改。

扩展阅读:数字签名是什么?

2. kafka安全性介绍

在版本0.9.0.0中,Kafka社区增加了许多功能,单独或一起使用,提高了Kafka集群安全性。新增的验证信息有:

  • 身份验证:从其它client(生产者和消费者)、brokers或 工具 使用SSL或SASL(Kerberos的)连接brokers
  • 从broker到ZooKeeper连接认证
  • client到broker之间的数据传输,brokers之间,或者broker和工具之间的数据加密使用SSL(请注意,当启用SSL,会有性能下降,性能下降的幅度取决于CPU的类型和JVM实现。)
  • 对client的读/写操作的授权
  • 授权是可插拔的,支持与外部授权服务集成
  • 安全性保证是可选的,kafka集群中经过认证、未经认证、加密和非加密的client可以混合使用。

3. 加密和使用SSL认证

3.1 创建CA证书

[root@node1 bin]# openssl req -new -x509 -keyout ca.key -out ca.crt -days 365 -passout pass:hnbian
Generating a 2048 bit RSA private key
.................................................................................................+++
....+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:SH
Locality Name (eg, city) [Default City]:SH
Organization Name (eg, company) [Default Company Ltd]:hn
Organizational Unit Name (eg, section) []:hn
Common Name (eg, your name or your server's hostname) []:hn
Email Address []:

# 完成后文件夹会生成两个文件
-rw-r--r--. 1 root root 1253 2月  20 21:45 ca.crt
-rw-r--r--. 1 root root 1834 2月  20 21:45 ca.key

[root@node1 bin]# cat ca.key
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI9GoE9qbF5pYCAggA
MBQGCCqGSIb3DQMHBAj32zyfuDBQAwSCBMicELMl862bDQo7E2HjjkUOBn/0hEL5
UlNMDaoJxQEtnCHA9nbMKUgKiewzgRGCF1wDdWv+91Xxu1hBkJHnGma9wbD1j4Zc
kAU2nmy86YRUf8COSb17Oh9iKWfPNWSoK7M69oYdaZq84ypS4GTDNQ9bPeugZDfl
kVayWMS4KE/LfKvcXRbJ25L3feYCoY3KhnqOnAJuNwlMpIq8Y296RT5ZY6zLJBvy
J9b80wqB51gOYgt3z+oVgZdM2uQrx2JecMwgn4NcMQAvyX3RgJqvY0OLC45RBSC7
+miizNLCBYn+zYGP/C0E8xFufJsLTxXeniCkH45mWCyzL7okZQvEI3VqYGDjN/1J
5HR+Vs9trj/qxdcHFCt+g0lE+w16Ac3merfDg5QMoYSBX564edDZEW0qn66/zefT
Ea3DDVsassDnw18BD6GBR5tdjFQl3hF0+kDgJFiA34lSVHdjMPzwZY1NcU0sWITz
7Qj11Ekihg0E4BIj2dihhXZhxGeDG59ERXvts3tKenhaax5+sHJ3e1oqw1RtatM9
bKGd01NP56Aub3ldiFg8kmzsmMZwjmS3lW6EoYG9i2xkTvAsuDL3x6X9njvH6HmX
7YGPZ6qytZua3eMPDX7i6b34r3FsXWbXzOch7jbdLfZkW+glzbsdAxrahlaNd9IH
kkKu/zKRIKjywzWEnIxZO83s5GIzXN+C0DmsOH8w29IYn/Y848DWZ5gH0EPDdRA9
ChHKnzctVNbQudRLcU7q6uBCKDWxCMe07K0ys3PNd7vVkQIVh4oNYGGn/Z6HhfA4
OLsE44gYgqO1OB2AkIwqD6D5d+W7+LhEw4yNBQXSbkTE9QTaT01DTol4j5HSLiv5
n2eB3FN0UZHLjc7uN2VbIVkAyhECHFi7bQJuRWPUGNl0cg/v+3sPvTs0lZhrFa6D
16mcfjudTuCUP1cQ/kIpFPW/pV9zqrbMW32AbhOOj/Ay5slxqg+J/IyCN+AUc8Az
DWyD0UOWUXm4toHky44FlTRqzSgooktxSTnxPyeJrzUpWNI7GrindV3BrslWbuA6
wWwzwHWfJIPo3CKMdbe2zgYqFaksFHN7RNH4PpI8gPHX/iTc7bGFWVaPR6eIqj3+
JR72YCJkE3P3Hc1bevLH7z1AZqxFqQVqUNNrvK5UCWqDzkq6qdXWPOw/AYjZnKwf
B+4eWhcV0+eQZwFGxfs2mrgNnMkofpjakc4l4eA984pkYJKrb1Oc5LPKv5RaxlHx
Sh9B4CRtZ3FkLd1W/FjxsZoI818zMoy2Fo3aHzh52/8BRGOybZ6AxPM3QEL3Au/C
c/xsFoSdnCgTDpcxL5/R4bPdGu6Qzq+Rvu0CvDKA4EprZje02oQdAZUoo0JtN1J9
HTUziJN1W7Pld05h3MsBJyS6CoVbr8mRT9UeZwe9hLORCfngJ4NhS1CxlfX/wf0N
CdhkqoF+1hqlqQUwwUNm2wdi4svLaeybwpWCFcXW2JPy3u2BJhl47BtrXurbHoYk
TL5gjRENZH4/Xm1ZklUJENn5zJGR/lco34iyVmS/ZveoABUVubCvZCazOo9XNF2C
i/fouA4GWBda7I+s9aKfoBqHHxx0wIaTA5lTS7dpgmNicRlskTDnc/6r8goI/heR
cPw=
-----END ENCRYPTED PRIVATE KEY-----

[root@node1 bin]# cat ca.crt
-----BEGIN CERTIFICATE-----
MIIDbzCCAlegAwIBAgIJAIBG9bbriyXzMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNV
BAYTAkNOMQswCQYDVQQIDAJTSDELMAkGA1UEBwwCU0gxCzAJBgNVBAoMAmhuMQsw
CQYDVQQLDAJobjELMAkGA1UEAwwCaG4wHhcNMjAwMjIwMTM0NTU5WhcNMjEwMjE5
MTM0NTU5WjBOMQswCQYDVQQGEwJDTjELMAkGA1UECAwCU0gxCzAJBgNVBAcMAlNI
MQswCQYDVQQKDAJobjELMAkGA1UECwwCaG4xCzAJBgNVBAMMAmhuMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxZW+xDhgF6ZIanXO+hFc0i5lHcF9bU9O
ZOgb+PHyaAkoim+M+fvabr3CRPxj8x6YFB8Y8gKALOFvpGtrnOU6ePCBAnW3PBpD
wkLAERNWHbqUvHB41t3DK5JRyb6EwRSYJYUBtZO5lkW2mr+fL2tC1R+nl0q4JCr1
u3fd+SndqhaVQiQCV/LyrPntROrX4pRzZSGRlSf9M3S18Rp7S5t0Y4UxvlD5KwYl
Tghhw/rfOmrrxAf9KTV0i3lS4ml5+VYfa4rQDZ/Y3NJkt0BGtght9ihWmU0CrDQg
tppQSOmy76vZTovL42bX/MWjSUeOt+7ECgChrlNrDAPmL2srF/Gb1wIDAQABo1Aw
TjAdBgNVHQ4EFgQUGAUlaljL25OJ9ccwN1qpuwocztwwHwYDVR0jBBgwFoAUGAUl
aljL25OJ9ccwN1qpuwocztwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC
AQEAsYTGCh93JsXzIuwBzEYh/A62rfZuHbqaFf2z1VObWrGFC6vHP93gkVQ2hdKJ
MxBjexePVsX/jAUj7uSOIqnp52kD8lZ/U7vc2Pu4PlDcrpCXNVU8CKRMwnckezj+
cPcBAdfKOA97poWHFRIGZfoRea0zJ6H68otEZByVdbjez5acg5j2rxZqCHzEEfWc
OcK1irD7Yyrcp6V/59/xq8zFL3Q6NKxCF7IZ2yKbbhWgp64Hq65c3lWTwkl9NWYU
EXn1wPcJaiCeCeHpmmTtBvODOsGLMa/PBZkKudXYPH9VgcJKtKqUEXLlSpoSI7vi
+O/6FkNgnCCC2Sn1KDuc0Cwugw==
-----END CERTIFICATE-----

3.2 生成服务器keystore(秘钥和证书)

如果找不到 keytool 命令,可以尝试 source /root/.bash_profile

 [root@node1 bin]# keytool -keystore hserver.keystore.jks -alias node1 -validity 365 -storepass hnbian -keypass hnbian -genkey
 您的名字与姓氏是什么?
   [Unknown]:  hn
 您的组织单位名称是什么?
   [Unknown]:  hn
 您的组织名称是什么?
   [Unknown]:  hn
 您所在的城市或区域名称是什么?
   [Unknown]:  hn
 您所在的省/市/自治区名称是什么?
   [Unknown]:  SH
 该单位的双字母国家/地区代码是什么?
   [Unknown]:  CN
 CN=hn, OU=hn, O=hn, L=hn, ST=SH, C=CN是否正确?
   []:  y


 Warning:
 JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore hserver.keystore.jks -destkeystore hserver.keystore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

 完成后生成服务器keystore 
 -rw-r--r--. 1 root root 1921 2月  20 21:52 hserver.keystore.jks

3.3 生成客户端keystore(秘钥和证书)

# 在哪台机器访问broker就应该在哪台机器生成client keystore
[root@node1 bin]# keytool -keystore client.keystore.jks -alias node1 -validity 365 -storepass hnbian -keypass hnbian -genkey
您的名字与姓氏是什么?
  [Unknown]:  hn
您的组织单位名称是什么?
  [Unknown]:  hn
您的组织名称是什么?
  [Unknown]:  hn
您所在的城市或区域名称是什么?
  [Unknown]:  hn
您所在的省/市/自治区名称是什么?
  [Unknown]:  SH
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=hn, OU=hn, O=hn, L=hn, ST=SH, C=CN是否正确?
  []:  y


Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore client.keystore.jks -destkeystore client.keystore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

完成后会生成keystore文件
-rw-r--r--. 1 root root 1922 2月  20 21:55 client.keystore.jks

3.4 将CA证书导入服务器truststore

[root@node1 bin]# keytool -v -keystore hserver.truststore.jks -alias CARoot -import -file ca.crt -storepass hnbian
所有者: CN=hn, OU=hn, O=hn, L=SH, ST=SH, C=CN
发布者: CN=hn, OU=hn, O=hn, L=SH, ST=SH, C=CN
序列号: 8046f5b6eb8b25f3
有效期为 Thu Feb 20 21:45:59 CST 2020 至 Fri Feb 19 21:45:59 CST 2021
证书指纹:
     MD5:  6E:31:B4:D7:A0:05:5E:3B:8F:FF:15:BD:DA:7B:24:22
     SHA1: D8:2B:31:A7:79:F1:69:A8:B2:F8:ED:AF:2F:E1:CB:91:1E:93:32:F7
     SHA256: A2:55:13:22:0A:1C:9A:84:83:3C:7A:F6:21:B1:EE:79:9C:51:11:BB:BE:37:E8:6E:71:56:D6:A8:95:0A:F9:5F
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 18 05 25 6A 58 CB DB 93   89 F5 C7 30 37 5A A9 BB  ..%jX......07Z..
0010: 0A 1C CE DC                                        ....
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 18 05 25 6A 58 CB DB 93   89 F5 C7 30 37 5A A9 BB  ..%jX......07Z..
0010: 0A 1C CE DC                                        ....
]
]

是否信任此证书? []:  y
证书已添加到密钥库中
[正在存储hserver.truststore.jks]

3.5 将CA证书导入客户端truststore

[root@node1 bin]# keytool -v -keystore client.truststore.jks -alias CARoot -import -file ca.crt -storepass hnbian
所有者: CN=hn, OU=hn, O=hn, L=SH, ST=SH, C=CN
发布者: CN=hn, OU=hn, O=hn, L=SH, ST=SH, C=CN
序列号: 8046f5b6eb8b25f3
有效期为 Thu Feb 20 21:45:59 CST 2020 至 Fri Feb 19 21:45:59 CST 2021
证书指纹:
     MD5:  6E:31:B4:D7:A0:05:5E:3B:8F:FF:15:BD:DA:7B:24:22
     SHA1: D8:2B:31:A7:79:F1:69:A8:B2:F8:ED:AF:2F:E1:CB:91:1E:93:32:F7
     SHA256: A2:55:13:22:0A:1C:9A:84:83:3C:7A:F6:21:B1:EE:79:9C:51:11:BB:BE:37:E8:6E:71:56:D6:A8:95:0A:F9:5F
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 18 05 25 6A 58 CB DB 93   89 F5 C7 30 37 5A A9 BB  ..%jX......07Z..
0010: 0A 1C CE DC                                        ....
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 18 05 25 6A 58 CB DB 93   89 F5 C7 30 37 5A A9 BB  ..%jX......07Z..
0010: 0A 1C CE DC                                        ....
]
]

是否信任此证书? []:  y
证书已添加到密钥库中
[正在存储client.truststore.jks]

操作完成后会生成 hserver.truststore.jks 文件

-rw-r--r--. 1 root root  946 2月  20 21:58 hserver.truststore.jks

3.6 导出证书

[root@node1 bin]# keytool -keystore hserver.keystore.jks -alias node1 -certreq -file node1.crt -storepass hnbian

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore hserver.keystore.jks -destkeystore hserver.keystore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

导出完成后会有一个node1.crt 文件
-rw-r--r--. 1 root root 1535 2月  20 22:01 node1.crt

3.7 用CA证书给服务器证书签名

[root@node1 bin]# openssl x509 -req -CA ca.crt -CAkey ca.key -in node1.crt -out node1-signed.crt -days 365 -CAcreateserial -passin pass:hnbian
Signature ok
subject=/C=CN/ST=SH/L=hn/O=hn/OU=hn/CN=hn
Getting CA Private Key

3.8 将CA证书导入服务器keystore

[root@node1 bin]# keytool -keystore hserver.keystore.jks -alias CARoot -import -file ca.crt -storepass hnbian
所有者: CN=hn, OU=hn, O=hn, L=SH, ST=SH, C=CN
发布者: CN=hn, OU=hn, O=hn, L=SH, ST=SH, C=CN
序列号: 8046f5b6eb8b25f3
有效期为 Thu Feb 20 21:45:59 CST 2020 至 Fri Feb 19 21:45:59 CST 2021
证书指纹:
     MD5:  6E:31:B4:D7:A0:05:5E:3B:8F:FF:15:BD:DA:7B:24:22
     SHA1: D8:2B:31:A7:79:F1:69:A8:B2:F8:ED:AF:2F:E1:CB:91:1E:93:32:F7
     SHA256: A2:55:13:22:0A:1C:9A:84:83:3C:7A:F6:21:B1:EE:79:9C:51:11:BB:BE:37:E8:6E:71:56:D6:A8:95:0A:F9:5F
签名算法名称: SHA1withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 18 05 25 6A 58 CB DB 93   89 F5 C7 30 37 5A A9 BB  ..%jX......07Z..
0010: 0A 1C CE DC                                        ....
]
]

#2: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

#3: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 18 05 25 6A 58 CB DB 93   89 F5 C7 30 37 5A A9 BB  ..%jX......07Z..
0010: 0A 1C CE DC                                        ....
]
]

是否信任此证书? []:  y
证书已添加到密钥库中

3.9 将已签名服务器证书导入服务器keystore

[root@node1 bin]# keytool -keystore hserver.keystore.jks -alias node1 -import -file node1-signed.crt -storepass hnbian
证书回复已安装在密钥库中

3.10 增加broker配置


vim config/server.properties
1. 修改 listeners
listeners=PLAINTEXT://172.16.72.150:9092,SSL://172.16.72.150:9093

将下面配置添加到 最后

# ssl.client.auth=required
ssl.keystore.location=/opt/kafka_2.12-1.0.2/bin/hserver.keystore.jks
ssl.keystore.password=hnbian
ssl.key.password=hnbian
ssl.truststore.location=/opt/kafka_2.12-1.0.2/bin/hserver.truststore.jks
ssl.truststore.password=hnbian

#修改完配置后重启kafka

[root@node1 bin]# ./kafka-server-start.sh -daemon ../config/server.properties
[root@node1 bin]#
[root@node1 bin]#


# 检查kafka 是否启动 
[root@node1 bin]# lsof -i:9092
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    72162 root  129u  IPv6 591225      0t0  TCP node1:XmlIpcRegSvc (LISTEN)
java    72162 root  148u  IPv6 591393      0t0  TCP node1:XmlIpcRegSvc->node3:33864 (ESTABLISHED)
java    72162 root  155u  IPv6 591397      0t0  TCP node1:60919->node2:XmlIpcRegSvc (ESTABLISHED)
java    72162 root  156u  IPv6 591398      0t0  TCP node1:54441->node3:XmlIpcRegSvc (ESTABLISHED)

# 检查kafka 是否启动 
[root@node1 bin]# lsof -i:9093
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    72162 root  144u  IPv6 591390      0t0  TCP node1:9093 (LISTEN)
[root@node1 bin]#

3.11 验证broker SSL 是否生效

openssl s_client -debug -connect 172.16.72.150:9092 -tls1

3.12 增加客户端配置文件

vim client.properties 

security.protocol=SSL
ssl.keystore.location=/opt/kafka_2.12-1.0.2/bin/client.keystore.jks
ssl.keystore.password=hnbian
# 如果不验证客户端,那么下面客户端的配置可以不用配置
#ssl.key.password=hnbian
#ssl.truststore.location=/opt/kafka_2.12-1.0.2/bin/client.truststore.jks
#ssl.truststore.password=hnbian

4. 验证

# 创建一个新的topic
[root@node1 bin]# ./kafka-topics.sh --zookeeper node1:2181,node2:2181,node3:2181 --create --topic test9 --partitions 1 --replication-factor 1
Created topic "test9".
[root@node1 bin]# ./kafka-topics.sh --zookeeper node1:2181,node2:2181,node3:2181 --describe --topic test9
Topic:test9    PartitionCount:1    ReplicationFactor:1    Configs:
    Topic: test9    Partition: 0    Leader: 0    Replicas: 0    Isr: 0

# 启动生产者生产数据

[root@node1 bin]# ./kafka-console-producer.sh --broker-list node1:9093 --topic test9 --producer.config ../config/client.properties
>1
>2
>3

# 启动消费者消费数据

[root@node1 bin]# ./kafka-console-consumer.sh --bootstrap-server node1:9093 --topic test9 --from-beginning --consumer.config ../config/client.properties
1
2
3

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
Kafka总结(八)Kafka 高性能总结与性能测试 Kafka总结(八)Kafka 高性能总结与性能测试
1. 高效实用磁盘 顺序写磁盘:顺序写磁盘,性能非常刚甚至能与随机写内存相媲美。 Append Only:数据不更新,无记录级别的数据删除,(只会整个segment删除) I/O Scheduler 将连续的小块写组装成大块的物理写从而提高
2020-02-21
下一篇 
Kafka总结(五)Kafka 命令行详解下、配置、副本、测试等相关命令 Kafka总结(五)Kafka 命令行详解下、配置、副本、测试等相关命令
脚本列表 序号 脚本 功能 1 connect-distributed.sh && connect-standalone.sh 连接kafka集群/单机模式 2 kafka-run-class.sh 执行
2020-02-19
  目录