一、漏洞詳情
Zookeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。
Zookeeper的默認(rèn)開放端口是2181。Zookeeper 安裝部署之后默認(rèn)情況下不需要任何身份驗(yàn)證,造成攻擊者可以遠(yuǎn)程利用 Zookeeper,通過服務(wù)器收集敏感信息或者在 Zookeeper 集群內(nèi)進(jìn)行破壞(比如:kill命令)。攻擊者能夠執(zhí)行所有只允許由管理員運(yùn)行的命令。
二、使用Java解決zk的未授權(quán)訪問漏洞
還是以digest為例:
//給密碼加密
public String getDigestUserPswd(String idPassword) throws NoSuchAlgorithmException {
return DigestAuthenticationProvider.generateDigest(idPassword);
}
//獲取ACL列表,這里只設(shè)置一個(gè)可訪問用戶,用戶名為user,密碼為pswd。如果你需要多個(gè),繼續(xù)add即可。
public List<ACL> getAclList() {
String idPassword = "user:pswd";
if (idPassword == null) {
logger.warn("no digest config,so use world scheme");
return ZooDefs.Ids.OPEN_ACL_UNSAFE;
}
List<ACL> aclList = new ArrayList<>();
try {
Id zkUser = new Id("digest", getDigestUserPswd(idPassword));
ACL acl = new ACL(ZooDefs.Perms.ALL, zkUser);
aclList.add(acl);
} catch (NoSuchAlgorithmException e) {
logger.error(e);
}
return aclList;
}
//給znode設(shè)置權(quán)限,只有aclList的用戶可以訪問
public void addDigestScheme(){
zk.setACL(znode, aclList, -1);
}
//創(chuàng)建znode的時(shí)候設(shè)置ACL
zk.create(znode,data,aclList,...)
//如何訪問加密的znode
public void client(){
ZooKeeper zk = new ZooKeeper(xxx)
zk.addAuthInfo("digest","user:pswd".getBytes())
//然后zk就可以訪問加密znode了
}
上面的代碼僅說明了核心步驟。
我在這里遇到個(gè)大坑,就是idpasswod為空的情況,之前直接給返回空了,feature正常啟動(dòng),但是服務(wù)沒有成功的發(fā)布出去。重要的是構(gòu)建環(huán)境把我在配置文件配置的user信息給刪掉了(我不知道)才開始跑的,更坑的是它運(yùn)行完后直接清除日志了,哪里錯(cuò)了都看不到。
最后哼哧哼哧的啃代碼,終于定位到位置。
血淚教訓(xùn):空指針情況需要正確處理,別TMD的隨便返回空,運(yùn)行沒問題不代表功能沒問題。
到這里,我們?cè)赾reate節(jié)點(diǎn)的時(shí)候可以為所有的znode設(shè)置訪問權(quán)限,理論上可以保護(hù)我們的數(shù)據(jù)安全了。
漏洞掃描驗(yàn)證
上面我們?cè)趧?chuàng)建znode的時(shí)候進(jìn)行了加密,這樣總可以通過漏洞掃描了吧。
重點(diǎn)來了。
但是如果你使用漏洞掃描工具掃描的話,還是有未授權(quán)訪問漏洞的,為啥呢?
不知道你有沒有注意,zk服務(wù)端啟動(dòng)后,默認(rèn)會(huì)啟動(dòng)這幾個(gè)具有world和cdrwa權(quán)限的znode,“/” "/zookeeper" "/zookeeper/config"和"/zookeeper/quota"(根據(jù)zookeeper的版本不同可能存在不同,并且這幾個(gè)節(jié)點(diǎn)雖然具有world和cdrwa權(quán)限,但是是無法刪除的,不知道為什么,好在我們可以給它設(shè)置ACL列表。另外,官網(wǎng)對(duì)著幾個(gè)節(jié)點(diǎn)也沒有特別說明,估計(jì)和zk本身的一些配置相關(guān)吧,不刪除最好)。就是這幾個(gè)znode,會(huì)導(dǎo)致你的產(chǎn)品無法通過安全工具的漏洞掃描,你說坑不坑,解決辦法也是很簡(jiǎn)單的,用我們前面說過的zk.setACL為這幾個(gè)節(jié)點(diǎn)設(shè)置權(quán)限就OK了,千萬別忘記根節(jié)點(diǎn)"/"了。
好了,到這里,才是真正的解決了這個(gè)未授權(quán)訪問漏洞問題了。文章來源:http://www.zghlxwxcb.cn/news/detail-731449.html
還可以禁用2181端口試試。文章來源地址http://www.zghlxwxcb.cn/news/detail-731449.html
到了這里,關(guān)于zookeeper未授權(quán)漏洞復(fù)現(xiàn)及處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!