天天看點

Kafka SASL/SCRAM+ACL實作動态建立使用者及權限控制

kafka系列文章

第一章 linux單機安裝kafka

第二章 kafka——叢集安裝部署(自帶zookeeper)

第三章 Kafka SASL/SCRAM+ACL實作動态建立使用者及權限控制

Kafka SASL/SCRAM+ACL實作動态建立使用者及權限控制**

使用SASL / SCRAM進行身份驗證

請先在不配置任何身份驗證的情況下啟動Kafka

1. 建立SCRAM Credentials

Kafka中的SCRAM實作使用Zookeeper作為憑證(credential)存儲。 可以使用kafka-configs.sh在Zookeeper中建立憑據。 對于啟用的每個SCRAM機制,必須通過添加具有機制名稱的配置來建立憑證。 必須在啟動Kafka broker之前建立代理間通信的憑據。 可以動态建立和更新用戶端憑證,并使用更新的憑證來驗證新連接配接。

1.建立broker建通信使用者(或稱超級使用者)

bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --add-config 'SCRAM-SHA-256=[password=admin-sec],SCRAM-SHA-512=[password=admin-sec]' --entity-type users --entity-name admin
           

2.建立用戶端使用者producer

bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=prod-sec],SCRAM-SHA-512=[password=prod-sec]' --entity-type users --entity-name producer
           

3.建立用戶端使用者consumer

bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=prod-sec],SCRAM-SHA-512=[password=cons-sec]' --entity-type users --entity-name consumer
           

4.檢視SCRAM證書

[root@node002229 kafka]# bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --describe --entity-type users --entity-name producer

Configs for user-principal 'fanboshi' are SCRAM-SHA-512=salt=MWwwdWJqcjBncmUwdzY1Mzdoa2NwNXppd3A=,stored_key=mGCJy5k3LrE2gs6Dp4ALRhgy37l1WYPUIdoOncCF+B3Ti3wL2sQNmzg8oEz3tUs9DFsclFCygjbysb0S0BU9bA==,server_key=iTyX0U0Jt02dkddUm6QrVwNf3lJk72dBNs9EDHTqe8kLlNGIp9ypzRkcgkc+WVMd1bkAF3cg8vk9Q1LrJ/2i/A==,iterations=4096,SCRAM-SHA-256=salt=ZDg5MHVlYW40dW9jbXJ6MndvZDVlazd3ag==,stored_key=cgX1ldpXnDL1+TlLHJ3IHn7tAQS/7pQ7BVZUtECpQ3A=,server_key=i7Mcnb5sPUqfIFs6qKWWHZ2ortoKiRc7oabHOV5dawI=,iterations=8192
           

5.删除SCRAM證書

[root@node002229 kafka]# bin/kafka-configs.sh --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --alter  --delete-config 'SCRAM-SHA-512' --entity-type users --entity-name producer
           

2. 配置Kafka Brokers

1.在每個Kafka broker的config目錄中添加一個類似下面的JAAS檔案,我們稱之為kafka_server_jaas.conf:

[root@node002229 config]# cat kafka_server_jaas.conf
KafkaServer {
  org.apache.kafka.common.security.scram.ScramLoginModule required
  username="admin"
  password="admin-secret";
};
           

注:不要少寫了分号

2.将JAAS配置檔案位置作為JVM參數傳遞給每個Kafka broker:

修改 /usr/local/kafka/bin/kafka-server-start.sh

将exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@" 注釋, 增加下面的内容

#exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"
exec $base_dir/kafka-run-class.sh $EXTRA_ARGS -Djava.security.auth.login.config=$base_dir/../config/kafka_server_jaas.conf kafka.Kafka "$@"
           

或者不修改kafka-server-start.sh腳本, 而是将下面的内容添加到~/.bashrc

export KAFKA_PLAIN_PARAMS="-Djava.security.auth.login.config=/usr/local/kafka/config/kafka_server_jaas.conf"
export KAFKA_OPTS="$KAFKA_PLAIN_PARAMS $KAFKA_OPTS"
           

注:未嘗試過,有興趣的老鐵可以試試

3.如此處所述,在server.properties中配置SASL端口和SASL機制。 例如:

# 認證配置
hostname=ip位址
listeners=SASL_PLAINTEXT://ip位址:9092
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256
sasl.enabled.mechanisms=SCRAM-SHA-256

# ACL配置
allow.everyone.if.no.acl.found=true
super.users=User:admin
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
           

在官方文檔中寫的是

listeners=SASL_SSL://host.name:port
security.inter.broker.protocol=SASL_SSL
           

我們可以根據自己的需求選擇SSL或PLAINTEXT, 我這裡選擇PLAINTEXT不加密明文傳輸, 省事, 性能也相對好一些。

3.重新開機ZK/Kafka

到這一步整個kafka叢集已經啟動了SASL/SCRAM身份認證及權限控制功能。

4.用戶端配置

1.修改 config/consumer.properties檔案,增加

[root@node002229 kafka]# vim config/consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
           

2.修改 config/producer.properties檔案,增加

[root@node002229 kafka]# vim config/producer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
           

3.建立config/kafka_client_producer_jaas.conf檔案用于設定生産者用戶端的使用者名及密碼

[root@node002229 kafka]# vim config/kafka_client_producer_jaas.conf
KafkaClient {
  org.apache.kafka.common.security.scram.ScramLoginModule required
    username="producer"
    password="prod-sec"
};
           

4.修改kafka-console-producer.sh腳本

vim bin/kafka-console-producer.sh
#exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=$(dirname $0)/../config/kafka_client_producer_jaas.conf kafka.tools.ConsoleProducer "$@"
           

注:檔案路徑也可使用絕對路徑

5.建立config/kafka_client_consumer_jaas.conf檔案用于設定消費者用戶端的使用者名及密碼

[root@node002229 kafka]# vim config/kafka_client_consumer_jaas.conf
KafkaClient {
  org.apache.kafka.common.security.scram.ScramLoginModule required
    username="consumer"
    password="cons-sec"
};
           

6.修改kafka-console-consumer.sh腳本

vim bin/kafka-console-consumer.sh
#exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
exec $(dirname $0)/kafka-run-class.sh -Djava.security.auth.login.config=$(dirname $0)/../config/kafka_client_consumer_jaas.conf kafka.tools.ConsoleProducer "$@"
           

注:檔案路徑也可使用絕對路徑

7.建立測試topic

bin/kafka-topics.sh -create --zookeeper 10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 -replication-factor 3 --partitions 3 --topic test
           

8.測試生産消息

bin/kafka-console-producer.sh --bootstrap-server 10.2.36.42:9092,10.2.36.149:9092,10.2.36.168:9092 --topic test --producer.config config/producer.properties
           

注:需給使用者授權才可進行釋出消息

9.測試消費消息

bin/kafka-console-consumer.sh --bootstrap-server 10.2.36.42:9092,10.2.36.149:9092,10.2.36.168:9092 --topic test --from-beginning --consumer.config config/consumer.properties
           

注:需給使用者授權才可消費消息

ACL配置

1.授予producer使用者對test topic 寫權限, 隻允許 192.168.2.* 網段

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --add --allow-principal User:producer --operation Write --topic test --allow-host 192.168.2.*
           

注:網段限制可以不加

授予consumer使用者對test topic 讀權限, 隻允許 192.168.2.* 網段

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --add --allow-principal User:consumer--operation Read --topic test --allow-host 192.168.2.*
           

授予consumer使用者, consumer-group 消費者組 對test topic 讀權限, 隻允許 192.168.2.* 網段

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181 --add --allow-principal User:consumer--operation Read --group consumer-group --allow-host 192.168.2.*
           

檢視acl配置

[root@node002229 kafka]# bin/kafka-acls.sh --list --authorizer-properties zookeeper.connect=10.2.36.42:2181,10.2.36.149:2181,10.2.36.168:2181
Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test1, patternType=LITERAL)`: 
 	(principal=User:producer, host=*, operation=WRITE, permissionType=ALLOW) 

Current ACLs for resource `ResourcePattern(resourceType=GROUP, name=consumer-group, patternType=LITERAL)`: 
 	(principal=User:consumer, host=*, operation=READ, permissionType=ALLOW)
	(principal=User:abcconsumer, host=*, operation=READ, permissionType=ALLOW) 

Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=10000082, patternType=LITERAL)`: 
 	(principal=User:producer, host=*, operation=WRITE, permissionType=ALLOW)
	(principal=User:abcconsumer, host=*, operation=READ, permissionType=ALLOW) 

Current ACLs for resource `ResourcePattern(resourceType=TOPIC, name=test, patternType=LITERAL)`: 
 	(principal=User:producer, host=*, operation=WRITE, permissionType=ALLOW)
	(principal=User:consumer, host=*, operation=READ, permissionType=ALLOW)
           

删除配置

bin/kafka-acls.sh --authorizer kafka.security.auth.SimpleAclAuthorizer --authorizer-properties zookeeper.c
           

(完)

---------------------------------歡迎留言--------------------------------------------

---------------------如果對你有幫助,請點個贊---------------------------------

文檔資訊

版權聲明:***轉載-非商用-非衍生-保持署名(創意共享3.0許可證)

發表日期: 2021年2月5日