kafka叢集安全化之啟用kerberos與acl
一、背景
在我們部署完kafka之後,雖然我們已經可以“肆意”的用kafka了,但是在一個大公司的實際生產環境中,kafka叢集往往十分龐大,每個使用者都應該只關心自己所負責的Topic,並且對其他人所使用的Topic沒有許可權。這樣一來可以將資源隔離開來,二來可以防止誤操作。
在許可權控制之前,我們必須要啟用的就是使用者認證,沒有使用者,自然沒有許可權一說了。
二、kafka啟用kerberos認證
2.1 在KDC中新增kafka使用者,並生成keytab
新建kfaka使用者 | kadmin.local -q 'addprinc -randkey kafka/{hostname}@{REALM}' |
生成keytab | kadmin.local -q "ktadd -k /etc/security/keytabs/{keytabname}.keytab kafka/{hostname}@{REALM}" |
注意:
1、如果之前zookeeper沒有啟用kerberos,這裡也要啟用zookeeper的kerberos
2、如果之前在CM中啟用了kerberos,我們可以直接從CM中獲取keytab,但是注意keytab一定要保持最新的,否則認證不會通過,keytab的位置是:
/var/run/cloudera-scm-agent/process/****-kafka-KAFKA_BROKER/kafka.keytab
/var/run/cloudera-scm-agent/process/****-zookeeper-server/zookeeper.keytab
2.2 修改server.properties
//修改這一句 listeners=SASL_PLAINTEXT://host.name:port //新增以下 authorizer.class.name = kafka.security.auth.SimpleAclAuthorizer security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=GSSAPI sasl.enabled.mechanisms=GSSAPI sasl.kerberos.service.name=kafka super.users=User:kafka |
2.3 新建kafka_server.jaass
KafkaServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="kafka" keyTab="/etc/keytab/kafka_122.keytab" //替換為自己的keytab所在位置 principal="kafka/{hostname}@{REALM}";//替換為自己的keytab所對應principle }; // Zookeeper client authentication,因為卡夫卡使用過程中會和zookeeper進行互動 Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="zookeeper" keyTab="/etc/keytab/kafka_122.keytab" //替換為自己的keytab所在位置 principal="kafka/{hostname}@{REALM}";//替換為自己的keytab所對應principle }; |
2.4 修改啟動指令碼
export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka/config/kafka_server.jaas" //剛才的kafka_server.jaas位置 |
2.5重啟broker
bin/kafka-server-stop.sh bin/kafka-server-start.sh |
2.6 客戶端啟用kerberos
在broker啟用kerberos之後,如果我們後續需要在命令列介面進行操作,及consumer與producer操作,我們需要在這些客戶端也配置上kerberos
2.6.1新增kafka_client.jaas
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/etc/keytab/kafka_122.keytab" serviceName="kafka" principal="kafka/{hostname}@{REALM}"; }; // Zookeeper client authentication Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="zookeeper" keyTab="/etc/keytab/kafka_122.keytab" principal="kafka/{hostname}@{REALM}"; }; |
2.6.2配置生效
當前會話生效: export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/kafka_client.jaas" |
配置到環境變數中 vim /etc/profile 增加 export KAFKA_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/kafka/config/kafka_client.jaas" |
2.6.3若有用到consumer或者producer,在consumer.properties或producer.properties中增加
security.protocol=SASL_PLAINTEXT sasl.mechanism=GSSAPI sasl.kerberos.service.name=kafka |
三、kafka啟用acl(參考http://orchome.com/185)
Kafka認證管理CLI(和其他的CLI指令碼)可以在bin目錄中找到。CLI指令碼名是kafka-acls.sh。啟用之前,需要在server.properties裡新增這句:
allow.everyone.if.no.acl.found=false |
以下列出了所有指令碼支援的選項:
選項 | 描述 | 預設 | 型別選擇 |
--add | 新增一個acl | Action | |
--remove | 移除一個acl | Action | |
--list | 列出acl | Action | |
--authorizer | authorizer的完全限定類名 | kafka.security.auth.SimpleAclAuthorizer | Configuration |
--authorizer-properties | key=val,傳給authorizer進行初始化,例如:zookeeper.connect=localhost:2181 | Configuration | |
--cluster | 指定叢集作為資源。 | Resource | |
--topic [topic-name] | 指定topic作為資源。 | Resource | |
--group [group-name] | 指定 consumer-group 作為資源。 | Resource | |
-allow-principal | 新增到允許訪問的ACL中,Principal是PrincipalType:name格式。 | Principal | |
--deny-principal | 新增到拒絕訪問的ACL中,Principal是PrincipalType:name格式。 | Principal | |
--allow-host | --allow-principal中的principal的IP地址允許訪問。 | 如果--allow-principal指定的預設值是*,則意味著指定“所有主機” | Host |
--deny-host | 允許或拒絕的操作。 | ALL | Operation |
--operation | --deny-principal中的principals的IP地址拒絕訪問。 | 如果 --deny-principal指定的預設值是 * 則意味著指定 "所有主機" | Host |
--producer | 為producer角色新增/刪除acl。生成acl,允許在topic上WRITE, DESCRIBE和CREATE叢集。 | Convenience | |
--consumer | 為consumer role新增/刪除acl,生成acl,允許在topic上READ, DESCRIBE 和 consumer-group上READ。 | Convenience | |
--force | 假設所有操作都是yes,規避提示 | Convenience |
常用命令舉例:因為kafka的acl資訊是存在zookeeper上的,所以需要提供zookeeper.connect引數,並且acl的存在與否與資源的存在與否無關。
最後的資源可以是topic,也可是cluster,也可以是consumer-group
給Bob和Alice從198.168.159.0(1)對test讀寫的許可權 | bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Bob --allow-principal User:Alice --allow-host 198.168.159.0 --allow-host 198.168.159.1 --operation Read --operation Write --topic test |
只拒絕BadBob從198.168.159.3對test的讀許可權 | bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:* --allow-host * --deny-principal User:BadBob --deny-host 198.168.159.3 --operation Read --topic test |
列出test的所有許可權 | bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list --topic test |
刪除許可權 | bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --remove --allow-principal User:* --allow-host * --deny-principal User:BadBob --deny-host 198.168.159.3 --operation Read --topic test |
給生產者Bob對test的生產許可權 | bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Bob --producer --topic test |
給消費者Bob對test的消費許可權 | bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:Bob --consumer --topic test --group Group-1 |
四、MirrorMaker的跨域同步
4.1 修改kerberos配置
新增互信principle | kadmin.local下操作 addprinc krbtgt/{REALMA}@{REALMB} addprinc krbtgt/{REALMB}@{REALMA} |
修改krb5.conf | [realms]//realms 裡配上兩個域的資訊 HADOOP.SPADE.COM = { kdc = hb21-bd-cm-130-61:88 admin_server = hb21-bd-cm-130-61:749 } HADOOP.TEST.COM = { kdc = tk-dba-hadoop-152:88 admin_server = tk-dba-hadoop-152:749 } [domain_realm] //domain_realm 配上域名和主機名的對映,有多少機器就要配多少 tk-dba-hadoop-154 = HADOOP.TEST.COM hb21-dba-kfk-130-120 = HADOOP.SPADE.COM [capaths] //capaths 配上互信的域的對映 HADOOP.SAPDE.COM ={ HADOOP.TEST.COM = . } HADOOP.TEST.COM={ HADOOP.SPADE.COM = . } |
4.2 修改broker配置
新增sasl.kerberos.principal.to.local.rules屬性
sasl.kerberos.principal.to.local.rules=RULE:[1:[email protected]$0](.*@\HADOOP.TEST.COM$)s/@\HADOOP.TEST.COM$//,RULE:[2:[email protected]$0](.*@\HADOOP.TEST.COM$)s/@\HADOOP.TEST.COM$//,RULE:[1:[email protected]$0](.*@\HADOOP.SPADE.COM$)s/@\HADOOP.SPADE.COM$//,RULE:[2:[email protected]$0](.*@\HADOOP.SPADE.COM$)s/@\HADOOP.SPADE.COM$//,DEFAULT |
4.3 驗證互信是否成功
從域B中複製出keytab到域A的機器中,然後在A中使用該keytab,配置jaas檔案,匯入環境變數中。用該keytab操作叢集A或者叢集B中的topic,能正常寫入資料即為成功。
五、啟用kerberos之後的平滑過度期
生產環境啟用kerberos之後,為了給業務向的consumer和producer一個平滑的接入認證系統的緩衝時間,這段時間我們可以給kafka啟用兩個監聽埠,一個是需要kerberos認證的埠,一個不需要認證的埠。讓他們共同存在,同時服務。
5.1 增加監聽埠
修改server.properties | listeners=SASL_PLAINTEXT://10.21.130.120:9092,PLAINTEXT://10.21.130.120:9093 allow.everyone.if.no.acl.found=false |
5.2 新增ANONYMOUS使用者的訪問許可權
bin/kafka-acls.sh --add --authorizer-properties zookeeper.connect={host:port/childpath} --allow-principal User:ANONYMOUS --allow-host * --operation All --topic {topicname} |
5.3 測試不同認證方式共存成功與否
刪除jaas環境變數 | unset {變數名} |
producer測試 | bin/kafka-console-producer.sh --broker-list {host}:9093 --topic{topicname} |
六、啟用zookeeper的acl同步
kafka的bin目錄下的zookeeper-security-migration.sh,可以將kafka的許可權,遍歷賦給zookeeper中每個子節點,然後分別設定acl,因為zookeeper的acl是僅對當前節點生效,對其下節點不生效的,單獨賦許可權很麻煩。zookeeper-security-migration.sh解決了這個問題。
修改server.properties,增加 zookeeper.set.acl=true |
重啟kafka叢集(批量重啟或滾動重啟) |
啟動zookeeper-security-migration.sh指令碼,secure設定同步,unsecure取消同步 bin/zookeeper-security-migration --zookeeper.acl=secure --zookeeper.connect={host}:{port}/{path} |
相關推薦
kafka叢集安全化之啟用kerberos與acl
一、背景在我們部署完kafka之後,雖然我們已經可以“肆意”的用kafka了,但是在一個大公司的實際生產環境中,kafka叢集往往十分龐大,每個使用者都應該只關心自己所負責的Topic,並且對其他人所使用的Topic沒有許可權。這樣一來可以將資源隔離開來,二來可以防止誤操作。
kafka叢集訊息格式之V0版本到V2版本的平滑過渡詳解-kafka 商業環境實戰
版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何商業交流,可隨時聯絡。 1 Kafk
23.內網安全部署之埠隔離與MAC地址認證
拓撲 拓撲可以儲存到本地,然後擴大檢視,這樣才能看的更清楚。(拖動到新視窗開啟即可) 埠隔離技術部署 [boss]port-group 1 [boss-port-group-1]port-isolate enable 說明:這裡有幾個地方不需要部署,就是需要訪問的,
Android業務元件化之現狀分析與探討
前言: 從個人經歷來說的話,從事APP開發這麼多年來,所接觸的APP的體積變得越來越大,業務的也變得越來越複雜,總來來說只有一句話:這是一個APP臃腫的時代!所以為了告別APP臃腫的時代,讓我們進入一個U盤時代,每個業務模組都是一個具備獨立執行的U盤,插在哪
網路安全知識之對稱加密與base64
網路安全知識之對稱加密 1:DES加密 講解DES加密之前我們先來了解一下什麼是對稱加密. 對稱加密:採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 對稱加密的使用率比較高,相對於非對
機器學習中的範數規則化之(一)L0、L1與L2範數
[0 證明 基本上 復雜度 所有 img 方法 風險 機器學習 機器學習中的範數規則化之(一)L0、L1與L2範數 [email protected]/* */ http://blog.csdn.net/zouxy09 轉自:http://blog.csdn.n
Python 之 __new__() 方法與實例化(轉)
啟動 是否 copy 調用 def 得到 互調 沒有 客戶 _new__() 是在新式類中新出現的方法,它作用在構造方法建造實例之前,可以這麽理解,在 Python 中存在於類裏面的構造方法 __init__() 負責將類的實例化,而在 __init__() 啟動之前,__
序列化之Java默認序列化技術(ObjectOutputStream與ObjectInputStream)
object java outputstream Java默認序列化技術 主要是通過對象輸出流java.io.ObjectOutputStream對象輸入流java.io.ObjectInputStream來實現的 package com.xingej.ser; public
JavaScript模塊化編程之require.js與sea.js
新的 fin 可能 關鍵字 個數 們的 文件 頁面 停止 個人傾向於require.js AMD 是 RequireJS 在推廣過程中對模塊定義的規範化產出。CMD 是 SeaJS 在推廣過程中對模塊定義的規範化產出。類似的還有 CommonJS Modules/2.
網絡數據傳輸安全之公鑰與私鑰
加密算法 加密解密過程數據在互聯網上傳輸過程中存在三個隱患:安全性:數據在傳輸過程中內容可能泄露。完整性:數據在傳輸過程中可能被篡改。身份認證:接受數據的一方很難確認發送者的身份。針對這三種隱患科研人員設計了多種對數據加密的算法,著名的算法有如下幾種:單項加密法:此方法不可解密,很好的解決了數據的完整性,它的
機器學習中的範數規則化之L0、L1與L2範數
實驗 方程 為什麽 over 大數據 來講 退回 數據庫 解釋 今天看到一篇講機器學習範數規則化的文章,講得特別好,記錄學習一下。原博客地址(http://blog.csdn.net/zouxy09)。 今天我們聊聊機器學習中出現的非常頻繁的問題:過擬合與規則化。我
網站安全檢測之用戶密碼找回網站漏洞的安全分析與利用
安全測試 短信驗證 網站漏洞 -o 一個 驗證碼 做到 重要 添加 我們SINE安全在對網站,以及APP端進行網站安全檢測的時候發現很多公司網站以及業務平臺,APP存在著一些邏輯上的網站漏洞,有些簡簡單單的短信驗證碼可能就會給整個網站帶來很大的經濟損失,很簡單的網站功能,比
大資料學習之路94-kafka叢集安裝
解壓 Kafka 安裝包 修改配置檔案 config/server.properties vi server.properties broker.id=0 //為依次增長的:0、1、2、3、4,叢集中唯一id log.dirs=/kafkaData/logs // Kafka
資料和安全之訪問授權與鑑權方式
訪問授權(Authorization) 最靈活的保護你應用資料安全的方式是通過訪問控制列表(Access Control List),通常簡稱為「ACL 機制」。ACL 背後的機制是將每個操作授權給一部分 使用者(User)或者 角色(Role),只允許這些使用者或角色執行這
0013-如何在Kerberos與非Kerberos的CDH叢集BDR不可用時複製資料
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。 1.概述 本文件描述了在Kerberos與非Kerberos的CDH叢集之間BDR不可用的情況下實現資料互導。文件主要講述 1.測試叢集環境描述 2.CDH的BDR功能驗證 3.叢集之間資料複製要求和限制 4.叢集之間資料複
0027-如何在CDH叢集啟用Kerberos
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。 1.文件編寫目的 本文件講述如何在CDH叢集啟用及配置Kerberos,您將學習到以下知識: 1.如何安裝及配置KDC服務 2.如何通過CDH啟用Kerberos 3.如何登入Kerberos並訪問Hadoop相關服務
微服務之服務呼叫與安全控制
轉載本文需註明出處:EAWorld,違者必究。 引言: 近年來,大多數企業IT軟體均在向微服務架構轉型,由於微服務架構採用了更細粒度的分散式拆分,對於服務呼叫安全方面的問題更復雜,更需要重視,需要整體的系統化解決方案。本文將分享普元EOS8.0版本的服務呼叫安
面向物件—的__new__()方法詳解 [Python] Python 之 __new__() 方法與例項化
[Python] Python 之 __new__() 方法與例項化 __new__() 是在新式類中新出現的方法,它作用在構造方法建造例項之前,可以這麼理解,在 Python 中存在於類裡面的構造方法 __init__() 負責將類的例項化,而在 __init__()
kafka叢集Controller競選與責任設計思路架構詳解-kafka 商業環境實戰
本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。期待加入IOT時代最具戰鬥力的團隊。QQ郵箱地址:[email protected],如有任何學術交流,可隨時聯絡。
#Java之Object流與序列化,看完提高3成開發效率
Object流與序列化 這個也很簡單,java提供了ObjectOutputStream和ObjectInputStream用來對整個物件進行讀寫。 但是記住: (1)物件類必須序列化,即實現Serializable介面,才能整個讀寫。 (2)如果物件的成員變數前加上transien