源起:工程現階段中介軟體採用的是kafka。滿足了大資料的高吞吐,專案間的解耦合,也增強了工程的容錯率與擴充套件性。但是在安全這一塊還有漏洞,kafka叢集中,只要網站內的任何人知道kafka叢集的ip與topic,都可以肆無忌憚的往叢集中的topic中傳送資料與消費資料。
經過調研:kafka的sasl acl可以設定安全機制,給每個主題設定多個使用者,不同的使用者賦予不同的讀寫許可權。
A B 倆個使用者,A使用者允許讀寫kafka中的topic1,B使用者不允許讀寫kafka中的topic1,這就成功控制了kafka的讀寫許可權。
於是開始了長期的探索與配置kafka和zookeeper的相關配置檔案。在配置過程中踩了n多坑,終於成功搞定,滿足了現下工程所需,帶來了滿滿的成就感。
使用軟體以及版本 jdk1.80_144、zookeeper3.4.10(3.5.7也可以)、kafka_2.13-2.5.0,切記kafka版本一定要使用正確,本人之前嘗試了kafka2.1.0與2.1.2,按照kafka官網上的文件,書上的教程以及網上的教程進行配置後,均未生效。所以版本一定要選對 !!!!!,若有其他版本將該功能實現的同學也可以留言一起交流。我在centos7.6 與ubuntun14.04、18.04進行過嘗試且成功,該許可權的設定應該與伺服器無關。
選好版本後就可以在伺服器上進行配置了,我是在單節點上配置成功後,再將該配置進行擴充套件到 zookeeper用3臺伺服器,kafka用3臺伺服器,且分別用java原生語言與springboot各自寫了一份demo。可以成功的控制不同使用者對不同topic的讀寫許可權。
開始
使用命令 tar -zxvf 解壓jdk zookeeper kakfa 伺服器使用者為root使用者在/etc/profile檔案內進行路徑配置,普通使用者在該使用者的根目錄節點中找到 .bashrc檔案(該檔案是隱藏的)進行路徑配置。配置成功後輸入jps,會顯示一個jps程式如下圖
然後開始zookeeper與kafka的配置
zookeeper的配置
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");