一 KafkaSSL配置
1.1 创建密钥和证书
以下在每台kafka服务器上执行
keytool -keystoreserver.keystore.jks -alias localhost -validity 365-keyalg RSA -genkey
以下在连接kafka的clientt端执行,如果不要求客户端身份认证(服务器端没有配置ssl.client.auth=required),那么这步可以省略
keytool -keystoreclient.keystore.jks -alias localhost -validity 365-keyalg RSA –genkey
【注】
1、需要将密钥库和密钥密码设置相同
2、keystore 密钥库存储位置、alias证书实体唯一别名、validity 密钥有效期、keyalg加密算法
3、一次密钥方法
keytool-genkey -alias test -keypass test1234-storepass test1234 -validity 365-keystore test.keystore -dname"CN=hadoop001, OU=test, O=test, L=test,ST=test, C=test"
1.2 利用openssl创建CA
openssl req -new-x509 -keyout ca-key -out ca-cert -days 365
【注】
1、keyout 私钥文件(默认当前目录)、out 证书文件(默认当前目录),days 证书有效期(天)
2、CA相当于证书发放机构,提供证书签名服务
3、kafka集群其中一台服务器中执行即可,也可任选集群外机器充当CA
1.3 创建CA客户端证书信任库
kafka server端执行:
keytool -keystoreserver.truststore.jks -alias CARoot -import -file ca-cert
kafka client端执行:
keytool -keystoreclient.truststore.jks -alias CARoot -import -file ca-cert
【注】truststore库存储的是CAclient端应该信任的CA证书集合,导入证书进入自己的信任库意味着信任所有该CA证书机构签发的证书。
1.4 CA对证书进行签名(利用CA证书ca-key,ca-cert签名)
1、迁出证书
keytool -keystoreserver.keystore.jks -alias localhost -certreq -file cert-file
keytool -keystoreclient.keystore.jks -alias localhost -certreq -file cert-file-client
2、CA签名
openssl x509 -req-CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days365-CAcreateserial -passin pass:test1234
openssl x509-req-CA ca-cert -CAkey ca-key -in cert-file-client -out cert-signed-client-days 365-CAcreateserial -passin pass:test1234
1.5 签名证书导入kafka server端信任库
将经过CA签名过的kafkaserver端证书(cert-signed)、client端证书(cert-signed-client)导入server端信任库(server.truststore.jks)
keytool-keystore server.truststore.jks-alias localhost -import -file cert-signed
keytool-keystore server.truststore.jks-alias localhost -import -filecert-signed-client
1.6 签名证书导入kafka client端信任库
将CA签名后的kafkaserver端证书(cert-signed)、client端证书(cert-signed-client)导入kafkaclient端信任库(client.truststore.jks)
keytool-keystore client.truststore.jks-alias localhost -import -file cert-signed
keytool-keystore client.truststore.jks-alias localhost -import -filecert-signed-client
1.7 配置server.properties文件
添加如下关于SSL信息的配置:
#开启9093端口ssl协议请求
listeners=PLAINTEXT://192.168.14.140:9092,SSL://192.168.14.140:9093
#指定kafkaserver秘钥、信任库存储位置,ssl.keystore.location存自己的私钥,ssl.truststore.location存放信任库
ssl.keystore.location=/opt/kafka_2.10-0.10.0.0/ssl/server.keystore.jks
ssl.keystore.password=test1234
ssl.key.password=test1234
ssl.truststore.location=/opt/kafka_2.10-0.10.0.0/ssl/server.truststore.jks
ssl.truststore.password=test1234
#kafkabroker之间也使用ssl通信
security.inter.broker.protocol=SSL
#客户端也需要认证(看需要)
ssl.client.auth=required
1.8 client端配置(producer、consumer关于SSL的配置相同)
如果kafka server端没有配置ssl.client.auth=required,如下是SSL最小化配置:
#通讯协议
security.protocol=SSL
ssl.truststore.location=/opt/kafka_2.10-0.10.0.0/ssl/client.truststore.jks
ssl.truststore.password=test1234
kakfa server端开启了客户端认证,添加如下配置:
#指定kafkaclient秘钥、信任库存储位置,ssl.keystore.location存自己的私钥,#ssl.truststore.location存放信任库
ssl.keystore.location=/opt/kafka_2.10-0.10.0.0/ssl/client.keystore.jks
ssl.keystore.password=test1234
ssl.key.password=test1234
1.9 测试验证
kafka-console-producer.sh--broker-listlocalhost:9093 --topic test --producer.configclient-ssl.properties
kafka-console-consumer.sh--bootstrap-serverlocalhost:9093 --topic test --new-consumer--consumer.configclient-ssl.properties
二 启用 ACL
2.1 配置server.properties文件
启用kafka 自带ACL授权
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
principal.builder.class=org.apache.kafka.common.security.auth.DefaultPrincipalBuilder
添加超级用户,建议kafka server所有broker内部通信采用相同的principle,并将其设为超级用户
super.users=User:CN=hadoop001,OU=test,O=test,L=test,ST=test,C=test
【注】如果开启ACL,默认情况除了超级用户,没有用户允许访问
三 ACL使用
acl的格式定义 "Principal P is [Allowed/Denied]Operation O From Host H OnResource R”,默认情况下,SSL的用户名称的形式是"CN=writeuser,OU=Unknown,O=Unknown,L=Unknown,ST=Unknown,C=Unknown"。
默认kafka集群操作权限可以分为Cluster、producer、consumer,其中Cluster为集群管理权限,kafka server必须拥有该权限。
3.1 查看ACL列表
./kafka-acls.sh--list--authorizer-properties zookeeper.connect=localhost:2181/kafka
3.2 添加producer权限
1、所有topic拥有producer权限
kafka-acls.sh--allow-principalUser:CN=hadoop001,OU=test,O=test,L=test,ST=test,C=test--authorizer-propertieszookeeper.connect= localhost:2188/apache_kafka --producer--add –topic=*
2、指定topic拥有producer权限
kafka-acls.sh--allow-principalUser:CN= hadoop001,OU=test,O=test,L=test,ST=test,C=test--authorizer-propertieszookeeper.connect= localhost:2188/apache_kafka--producer --add –topic=test01
3.3 添加consumer权限
1、所有consumer group对所有topic拥有consumer权限
kafka-acls.sh--authorizer-propertieszookeeper.connect=localhost:2188/apache_kafka--allow-principal User:CN= hadoop001,OU=test,O=test,L=test,ST=test,C=test --consumer --topic=* --group=* --add
2、所有consumer group对某个topic拥有consumer权限
kafka-acls.sh--authorizer-propertieszookeeper.connect=localhost:2188/apache_kafka--allow-principal User:CN= hadoop001,OU=test,O=test,L=test,ST=test,C=test --consumer --topic=test01 --group=* --add
3.4 删除权限
kafka-acls.sh--allow-principalUser:CN= hadoop001,OU=test,O=test,L=test,ST=test,C=test--authorizer-propertieszookeeper.connect= localhost:2188/apache_kafka --producer--remove –topic=*
3.5 原子权限管理(read、write、describe)
1、read
kafka-acls.sh--authorizer-propertieszookeeper.connect=localhost:2188/apache_kafka--allow-principal User:CN=hadoop001,OU=test,O=test,L=test,ST=test,C=test --operation read --topic=* --group=* --add
2、write
kafka-acls.sh--authorizer-propertieszookeeper.connect=localhost:2188/apache_kafka--allow-principal User:CN= hadoop001,OU=test,O=test,L=test,ST=test,C=test --operation write --topic=* --add
3、describe
kafka-acls.sh--authorizer-propertieszookeeper.connect=localhost:2188/apache_kafka--allow-principal User:CN= hadoop001,OU=test,O=test,L=test,ST=test,C=test --operation describe --topic=* --add
四 注意点
1、 Kafka SSL可以单独使用,不开启ACL模式下只要客户端、服务端principle验证通过即可以进行数据通讯
2、 启用SSL后,Kafka sever端每台broker的信任库必须拥有集群所有broker的证书信息,推荐配置为集群内部公用一个principle
3、 自己创建CA时,集群内部需要使用同一个CA进行签名和认证
4、 启用ACL后,kafka集群内部所有角色启动用户的principle必须拥有集群的读、写、集群管理权限,推荐使用超级用户管理集群
5、 Kafka SSL相关的所有执行操作只针对new producer、new consumer有效,老版本的kafka不支持