Kafka SASL ACL配置踩坑總結

源起:工程現階段中間件採用的是kafka。知足了大數據的高吞吐,項目間的解耦合,也加強了工程的容錯率與擴展性。可是在安全這一塊還有漏洞,kafka集羣中,只要網站內的任何人知道kafka集羣的ip與topic,均可以肆無忌憚的往集羣中的topic中發送數據與消費數據。java

通過調研:kafka的sasl acl能夠設置安全機制,給每一個主題設置多個用戶,不一樣的用戶賦予不一樣的讀寫權限。spring

A B 倆個用戶,A用戶容許讀寫kafka中的topic1,B用戶不容許讀寫kafka中的topic1,這就成功控制了kafka的讀寫權限。ubuntu

     因而開始了長期的探索與配置kafka和zookeeper的相關配置文件。在配置過程當中踩了n多坑,終於成功搞定,知足了現下工程所需,帶來了滿滿的成就感。vim

    使用軟件以及版本 jdk1.80_14四、zookeeper3.4.10(3.5.7也能夠)、kafka_2.13-2.5.0,切記kafka版本必定要使用正確,本人以前嘗試了kafka2.1.0與2.1.2,按照kafka官網上的文檔,書上的教程以及網上的教程進行配置後,均未生效。因此版本必定要選對   !!!!!,如有其餘版本將該功能實現的同窗也能夠留言一塊兒交流。我在centos7.6 與ubuntun14.0四、18.04進行過嘗試且成功,該權限的設置應該與服務器無關。centos

   選好版本後就能夠在服務器上進行配置了,我是在單節點上配置成功後,再將該配置進行擴展到 zookeeper用3臺服務器,kafka用3臺服務器,且分別用java原生語言與springboot各自寫了一份demo。能夠成功的控制不一樣用戶對不一樣topic的讀寫權限。安全

開始 springboot

 使用命令 tar -zxvf 解壓jdk zookeeper kakfa 服務器用戶爲root用戶在/etc/profile文件內進行路徑配置,普通用戶在該用戶的根目錄節點中找到 .bashrc文件(該文件是隱藏的)進行路徑配置。配置成功後輸入jps,會顯示一個jps進程以下圖bash

 

 

 

而後開始zookeeper與kafka的配置 服務器

 

zookeeper的配置ide

1.進入到zookeeeper的conf目錄 使用命令 cp zoo_sample.cfg zoo.cfg 複製一份zoo.cfg配置文件

2.使用vim zoo.cfg進入該配置文件 

 

 

 

 

紅框1是存放zookeeper的數據與日誌的部分

紅框2是zookeeper配置SASL支持,如果zookeeper集羣的話,則authProvider.1後面的數字在不一樣的服務器上要不同 

紅框3是配置zookeeper集羣的,單節點不用考慮該配置。如果集羣應添加 server.2 server.3...而且在紅框1的dataDir目錄下建立myid文件,且在文件內添加server.n中的數字n

 

3 在zookeeper的conf目錄下添加 zoo_jaas.conf文件 ,添加帳號認證信息

 

4 在zookeeper中添加kafka jar包的依

 

 

 

5 修改 zookeeper bin目錄下的zkEnv.sh 腳本

 

 

 vim zkEnv.sh打開該腳本,在最後添加紅框內的內容。

6 啓動zookeeper

    zkServer.sh start ,若以上步驟都正確配置後,zookeeper會正常啓動,運行jps命令,下圖紅框中的進程會成功啓動。若不能成功啓動,必定要檢查上述步驟中的文件配置路徑無誤後,

再去日誌目錄中查看日誌

 

 

 kafka的配置

1.在kafka config目錄中添加、修改 相應配置文件

 

 

 紅框1 是新建的文件。 kafka_server_jaas.conf是kafka服務器中須要的用戶配置文件。kafka_client_jaas.conf與kafka_producer.jaas.conf是客戶端的配置文件,在服務器添加這兩個文件是方便在服務器內進行腳本測試,實際開發中客服端配置文件是要用java代碼讀取的,不須要服務器上的。

 紅框2是kafka自帶的文件,這些文件須要修改。server.properties 是kafka的核心配置文件,咱們會在裏面配置相應的信息。consumer.properties與 producer.properties是消費者腳本與生產者腳本須要的配置文件,在服務器上用腳本測試須要這兩個文件。實際開發中能夠在java代碼中配置相應內容,不須要服務器上的。各個文件的內容以下圖所需

 

kafka_server_jaas.conf

 

 參考網上你們都是這麼配置的  KafkaServer中是 表明一些客戶端用戶,這些用戶根據被賦予的權限來對kafka的主題進行相關操做。

 Client中的用戶要與zoo_jaas.cfg中的用戶一致 user_producer="prod-sec"的意思是帳戶名爲producer,密碼是 prod-sec

kafka_client_jaas.conf  kafka_producer_jaas.conf 

 

 這個文件裏面放的是客戶端用戶了

server.properties

 

 

 1是與zookeeper創建連接,我這個是用的本地的zookeeper,集羣的同窗另行配置。

 2 即是給kafka配置SASL權限,其中zsh是超級用戶,不授權限影響。

 

producer.proerties、consumer.properties內容添加以下

 

 

2 在kafka的bin目錄下修改如下腳本信息

kafka-server-start.sh修改以下

 

 

 

kafka-topic.sh修改以下

 

 

kafka-console-producer.sh 與 kafka-console-consumer.sh修改以下

 

 

以上配置就所有完成,啓動命令 kafka-server.sh ../config/server.propertie,kafka即可以成功啓動,若是啓動不成功,不要慌。多啓動幾回試試,就成功了。很奇怪,不知道爲啥這樣子

 

3 使用 kafka-acl.sh腳本控制不一樣用戶對指定topic的權限。 

./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic acl_0305  建立主題

 ./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 -add --deny-principal User:* --operation Write --topic acl_0305 禁止全部主題對該用戶的讀寫權限

./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 -add --allow-principal User:consumer --operation Write --topic acl_0305  容許 consumer 用戶讀寫該主題

./kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 -remove --deny-principal User:*--operation Write --topic acl_0305  取消全部用戶對該主題的禁止

本人在測試過程當中發現,這個版本的kafka acl腳本只能按照這樣的順序控制權限。先禁止全部用戶,而後容許一個用戶,再取消對全部用戶的禁止。後面就能夠正常的對每一個用戶再進行權限控制了(容許的用戶能夠訪問主題,沒有添加容許的用戶不能訪問主題),嚴重懷疑kafka的acl源代碼沒有完善的控制權限的機制。並且每一個用戶對主題讀寫權限是一塊兒控制的,讀與寫並無分開。無論怎麼樣,這樣已經知足當下的需求了,只不過操做麻煩,還有待完善。

 

 

 JAVA代碼 

 原生代碼核心

1.在建立Properties(props)前讀取客戶端配置文件。2. 給props添加 sasl配置.3其餘代碼按照常見的kafka生產者發數據,消費者消費數據配置便可

System.setProperty("java.security.auth.login.config", "d:\\conf\\kafka_client_jaas.conf");

        props.put("security.protocol", "SASL_PLAINTEXT");
        props.put("sasl.mechanism", "PLAIN");
相關文章
相關標籤/搜索