一共涉及这么几个安全项:
zookeeper的节点内容安全。对zookeeper的节点进行ACL限制。
zookeeper的4字指令安全。禁止4字指令查询zookeeper状态。
kafka的消息安全。对kafka的消息内容添加ACL。
官方文档:http://kafka.apache.org/documentation/#security
使用的Kafka版本2.13-2.8.0,解压后主目录:/data/kafka_2.13-2.8.0/
下面的文件及命令都是相对主目录位置,配置文件中列出的内容只涉及安全相关配置,文件中已有的要做修改,没有的增加。
1、可以直接用kafka自带的zookeeper,如果用单独的zookeeper,需要导入相应的kafka包:
kafka-clients-2.8.0.jar
lz4-java-1.7.1.jar
2、config/zookeeper.properties文件配置
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
zookeeper.sasl.client=true
4lw.commands.whitelist= 其中"4lw.commands.whitelist="是禁止zookeeper的4字指令。
3、增加config/jaas.conf文件,不能有注释
Server {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="123456"
user_kafka="123456"
user_admin="123456";
};
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="123456";
};
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="123456"
user_admin="123456"
user_kafka="123456";
};
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="123456";
}; 其中Server是zookeeper服务端配置,配置中添加了2个账号admin和kafka,username和password指明zookeeper间通信使用的账号密码。
Client是kafka与zookeeper通信时的账号及密码。可以用-Dzookeeper.sasl.clientconfig=ZkClient指定不同的配置。
KafkaServer和KafkaClient分别是kafka的服务器端及客户端配置。
4、给zookeeper生成一个超级用户super的密码
$ cd /data/kafka_2.13-2.8.0/libs/
$ java -cp "./zookeeper-3.7.0.jar:./slf4j-api-1.7.30.jar" org.apache.zookeeper.server.auth.DigestAuthenticationProvider super:123456 只取最后一行的输出:
super:123456->super:BBO7K8dPkoek/JxIHqXxM75QRpI=
5、增加启动配置
如果用的是单独的zookeeper:
1.在zkStart.sh中
export JVMFLAGS="$JVMFLAGS -Dzookeeper.DigestAuthenticationProvider.superDigest=super:BBO7K8dPkoek/JxIHqXxM75QRpI=" 2.在kafka-run-class.sh中
export KAFKA_OPTS="$KAFKA_OPTS -Dzookeeper.sasl.client=true -Dzookeeper.sasl.client.username=kafka -Djava.security.auth.login.config=/data/kafka_2.13-2.8.0/config/jaas.conf" 如果用的是kafka自带的zookeeper,只改kafka-run-class.sh即可:
export KAFKA_OPTS="$KAFKA_OPTS -Dzookeeper.sasl.client=true -Dzookeeper.DigestAuthenticationProvider.superDigest=super:BBO7K8dPkoek/JxIHqXxM75QRpI= -Dzookeeper.sasl.client.username=kafka -Djava.security.auth.login.config=/data/kafka_2.13-2.8.0/config/jaas.conf" 6、启动zookeeper
$ cd /data/kafka_2.13-2.8.0/bin/
$ ./zookeeper-server-start.sh -daemon ../config/zookeeper.properties 7、修改config/server.properties
broker.id=1
listeners=SASL_PLAINTEXT://192.168.181.132:9092
advertised.listeners=SASL_PLAINTEXT://192.168.181.132:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
allow.everyone.if.no.acl.found=false
super.users=User:admin
zookeeper.set.acl=true 8、启动kafka
$ cd /data/kafka_2.13-2.8.0/bin/
$ ./kafka-server-start.sh -daemon ../config/server.properties 9、zookeeper添加ACL
一定要用kafka自带的zookeeper客户端,这个客户端将通过kafka用户的sasl方式登录zookeeper,启动类是org.apache.zookeeper.ZooKeeperMainWithTlsSupportForKafka。单独zookeeper客户端启动类是org.apache.zookeeper.ZooKeeperMain,不能以sasl方式登录。
$ cd /data/kafka_2.13-2.8.0/bin/
$ ./zookeeper-shell.sh localhost:2181 添加认证用户:
addauth digest admin:123456
addauth digest kafka:123456 配置ACL:
setAcl / auth:admin:cdrwa
setAcl / auth:kafka:cdrwa 查看ACL:
getAcl /
'sasl,'kafka
: cdrwa
'digest,'admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
: cdrwa
'digest,'kafka:AHviFxZyZ/iL8MsBeboZ4XZzv/M=
: cdrwa 不能用这个命令配置ACL:
setAcl / sasl:kafka:cdrwa 将导致/的ACL只有:
getAcl /
'sasl,'kafka
: cdrwa 如果用单独的zookeeper客户端配置ACL,只能配置成digest或者sasl的方式,不能使2个kafka认证同时生效。
10、测试:
用单独的zookeeper客户端登录:
./zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
Insufficient permission : / 授权登录:
addauth digest admin:123456
ls /
[admin, brokers, cluster, config, consumers, controller_epoch, delegation_token, feature, isr_change_notification, kafka-acl, kafka-acl-changes, kafka-acl-extended, kafka-acl-extended-changes, latest_producer_id_block, log_dir_event_notification, zookeeper] 11、给kafka服务器端的kafka用户授权
给用户kafka所有topic的producer权限
$ ./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --topic * --add --allow-principal User:kafka --producer --group=* 给用户kafka所有topic的consumer权限
$ ./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --topic * --add --allow-principal User:kafka --consumer --group=* 给用户kafka所有topic的操作权限
$ ./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --topic * --add --allow-principal User:kafka --operation all --group "*" 12、测试kafka
$ cd /data/kafka_2.13-2.8.0/bin/ 1) 显示所有topic
$ ./kafka-topics.sh --list --zookeeper localhost:2181 2) 创建topic
$ ./kafka-topics.sh --create --zookeeper localhost:2181 --topic test --partitions 1 --replication-factor 1 3) 发送消息
修改producer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
$ ./kafka-console-producer.sh --topic test --bootstrap-server 192.168.181.132:9092 --producer.config ../config/producer.properties 4) 读取消息
修改consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
$ ./kafka-console-consumer.sh --bootstrap-server 192.168.181.132:9092 --topic test --from-beginning --consumer.config ../config/consumer.properties 5、删除topic
$ ./kafka-topics.sh --zookeeper localhost:2181 --delete --topic test 13、spring配置
spring:
kafka:
properties:
sasl.mechanism: PLAIN
security.protocol: SASL_PLAINTEXT
zookeeper.sasl.client: true
sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="123456"; 14、遗留问题
子目录不会继承根目录的ACL限制,其它一些目录,例如/kafka-acl目录仍然是任意可读的,只是不能修改。