Zookeeper權(quán)限訪問(wèn)控制簡(jiǎn)介及實(shí)操
近日在某項(xiàng)目部署實(shí)施過(guò)程中,進(jìn)行了線上漏洞掃描后,在出具的漏掃報(bào)告中存在一個(gè)需修復(fù)項(xiàng)“Zookeeper 未授權(quán)訪問(wèn)”。通過(guò)查詢了解,得知需通過(guò)添加身份認(rèn)證的方式來(lái)解決該修復(fù)項(xiàng),在修復(fù)、驗(yàn)證以及后續(xù)應(yīng)用上線的過(guò)程中,碰到了系列問(wèn)題,特作記錄分享。
一、 問(wèn)題介紹
Zookeeper是分布式協(xié)同管理工具,常用來(lái)管理系統(tǒng)配置信息,提供分布式協(xié)同服務(wù)。Zookeeper以樹(shù)狀結(jié)構(gòu)保存數(shù)據(jù),znode是Zookeeper的基本單元,可以存放數(shù)據(jù)信息、版本信息等等。如下圖,/是Zookeeper的根節(jié)點(diǎn),A、B、C和D均為znode。
Zookeeper這樣的樹(shù)狀結(jié)構(gòu),在默認(rèn)情況下,只需要提供Zookeeper服務(wù)端的IP和Port信息,任何用戶或者客戶端都可以直接連接服務(wù)端,不需要任何額外的認(rèn)證,就擁有對(duì)znode增、刪、改、查、管理等操作權(quán)限。這樣的訪問(wèn)方式是非常不安全,比較容易受到攻擊和數(shù)據(jù)的篡改。
二、 Zookeeper使用ACL進(jìn)行訪問(wèn)控制
鑒于存在這樣的安全隱患,Zookeeper通過(guò)ACL(Access Control List)的機(jī)制來(lái)解決這個(gè)問(wèn)題。當(dāng)客戶端連接到Zookeeper并且做認(rèn)證的時(shí)候,Zookeeper驗(yàn)證所有從連接的服務(wù)端收集到的id,當(dāng)服務(wù)端試圖訪問(wèn)不同的znode節(jié)點(diǎn)時(shí),將通過(guò)ACL來(lái)做驗(yàn)證。
ACL是由(scheme:expression, perms)對(duì)構(gòu)成,expression的格式為如下內(nèi)置schemes:
a. world 有一個(gè)特定的的id, anyone,代表所有人。
b. auth 不使用任何id,代表任何已認(rèn)證的用戶。
c. digest 用 username:password 字符串來(lái)產(chǎn)生一個(gè)MD5串,然后該串被用來(lái)作為ACL ID。認(rèn)證是通過(guò)明文發(fā)送username:password 來(lái)進(jìn)行的,當(dāng)用在ACL時(shí),表達(dá)式為username:base64 ,base64是password的SHA1摘要的編碼。
d. ip 使用客戶端的主機(jī)IP作為ACL ID 。
Perms的格式為如下操作權(quán)限:
a. CREATE:可以創(chuàng)建子節(jié)點(diǎn),縮寫(xiě)為C;
b. DELETE:可以獲取節(jié)點(diǎn)下的數(shù)據(jù)以及目錄下的列表,縮寫(xiě)為D;
c. WRITE:可以在節(jié)點(diǎn)中寫(xiě)入數(shù)據(jù),縮寫(xiě)為W;
d. DELETE:可以刪除子節(jié)點(diǎn),縮寫(xiě)為D:
e. ADMIN:可以設(shè)置權(quán)限,縮寫(xiě)為A;
這里有一點(diǎn)需要注意的是,ACL只適用于當(dāng)前節(jié)點(diǎn),它是非遞歸的,而且是不可遞歸的。比如/aaa節(jié)點(diǎn)對(duì)用戶aaa只讀,但是/aaa/bbb節(jié)點(diǎn),對(duì)所有用戶來(lái)說(shuō)是world的認(rèn)證方式。
三、 Zookeeper權(quán)限配置
通過(guò)文檔了解后,擬嘗試使用digest的認(rèn)證方式作為漏洞的修復(fù)手段。
首先登錄Zookeeper控制臺(tái),如下圖所示:
獲取當(dāng)前目錄權(quán)限:
由于該服務(wù)器是已修復(fù)的,因此顯示的是digest認(rèn)證的信息。
重新在根目錄下創(chuàng)建目錄:
從這個(gè)步驟可以看出,ACL的認(rèn)證是非遞歸的,即使根目錄的權(quán)限是digest,創(chuàng)建的子目錄權(quán)限仍然是world。
下圖通過(guò)setAcl的命令來(lái)設(shè)置新目錄的權(quán)限,并且查看是生效的。
當(dāng)?shù)卿浐笪词褂胐igster認(rèn)證時(shí),就會(huì)提示權(quán)限不足。
四、 應(yīng)用調(diào)用修改
既然提供服務(wù)的Zookeeper增加了認(rèn)證,那么調(diào)用的java程序也是需要進(jìn)行同步修改的。
按公司應(yīng)用的結(jié)構(gòu),只需要添加對(duì)應(yīng)配置即可。
另外在調(diào)試過(guò)程中發(fā)現(xiàn),公司使用的第三方j(luò)ar包zkclient.jar的版本是0.1,是不支持ACL的,需更換成高版本2.0即可。
作者介紹
陳旭,資深應(yīng)用維護(hù)工程師,畢業(yè)于浙江大學(xué)軟件工程學(xué)院,通過(guò)ITIL認(rèn)證。先后在互聯(lián)網(wǎng)創(chuàng)業(yè)公司、地方電子口岸任職。主要負(fù)責(zé)中間件運(yùn)維和自動(dòng)化運(yùn)維工具研發(fā),致力于提升運(yùn)維服務(wù)的規(guī)范性和應(yīng)用服務(wù)的高可用性。




























