MongoDB數(shù)據(jù)庫(kù)未授權(quán)訪問(wèn)漏洞
更新時(shí)間:2019-04-15 17:52:18
近日阿里云收到國(guó)家互聯(lián)網(wǎng)應(yīng)急中心(簡(jiǎn)稱:CNCERT)單位關(guān)于《阿里云計(jì)算有限公司多個(gè)系統(tǒng)存在MongoDB未授權(quán)訪問(wèn)的情況通報(bào)》的通知,您的阿里云主機(jī)存在MongoDB數(shù)據(jù)庫(kù)未授權(quán)訪問(wèn)漏洞,漏洞危害嚴(yán)重辜王,可以導(dǎo)致數(shù)據(jù)庫(kù)數(shù)據(jù)泄露或被刪除勒索翩活,從而造成嚴(yán)重的生產(chǎn)事故逮刨。為保證您的業(yè)務(wù)和應(yīng)用的安全踱侣,提供以下漏洞修復(fù)指導(dǎo)方案埠戳,具體詳情如下:
開(kāi)啟MongoDB服務(wù)時(shí)不添加任何參數(shù)時(shí)馆衔,默認(rèn)是沒(méi)有權(quán)限驗(yàn)證的瘟判,登錄的用戶可以通過(guò)默認(rèn)端口無(wú)需密碼對(duì)數(shù)據(jù)庫(kù)任意操作(增、刪角溃、改拷获、查高危動(dòng)作)而且可以遠(yuǎn)程訪問(wèn)數(shù)據(jù)庫(kù)。
在剛安裝完畢的時(shí)候MongoDB都默認(rèn)有一個(gè)admin數(shù)據(jù)庫(kù)减细,此時(shí)admin數(shù)據(jù)庫(kù)是空的匆瓜,沒(méi)有記錄權(quán)限相關(guān)的信息!當(dāng)admin.system.users一個(gè)用戶都沒(méi)有時(shí),即使mongod啟動(dòng)時(shí)添加了—auth參數(shù)陕壹,如果沒(méi)有在admin數(shù)據(jù)庫(kù)中添加用戶质欲,此時(shí)不進(jìn)行任何認(rèn)證還是可以做任何操作(不管是否是以—auth 參數(shù)啟動(dòng)),直到在admin.system.users中添加了一個(gè)用戶。加固的核心是只有在admin.system.users中添加用戶之后糠馆,mongodb的認(rèn)證,授權(quán)服務(wù)才能生效嘶伟。
方案1:不要將MongoDB服務(wù)對(duì)互聯(lián)網(wǎng)開(kāi)放
使用安全組防火墻或本地操作系統(tǒng)防火墻對(duì)訪問(wèn)源IP進(jìn)行嚴(yán)格控制,如果僅對(duì)內(nèi)網(wǎng)服務(wù)器提供服務(wù)又碌,建議禁止將MongoDB服務(wù)發(fā)布到互聯(lián)網(wǎng)上九昧。您可以通過(guò)安全組功能管理MongoDB服務(wù)器當(dāng)前的訪問(wèn)控制規(guī)則,僅允許與MongoDB數(shù)據(jù)庫(kù)依賴的服務(wù)器114.114.114.114, 114.114.115.115 訪問(wèn)(這里的IP是示例)毕匀。
該選項(xiàng)可以限制監(jiān)聽(tīng)接口IP為特定的內(nèi)網(wǎng)IP铸鹰, 當(dāng)在啟動(dòng)mongodb的時(shí)候,使用?--bind_ip 10.0.0.1表示啟動(dòng)ip地址綁定皂岔,數(shù)據(jù)庫(kù)實(shí)例將只監(jiān)聽(tīng)10.0.0.1內(nèi)網(wǎng)的請(qǐng)求蹋笼。
mongod --bind_ip 10.0.0.1
方案3:?jiǎn)?dòng)基于角色的登錄認(rèn)證功能
在admin數(shù)據(jù)庫(kù)中創(chuàng)建用戶,如用戶名supper躁垛,密碼supWDxsf67%H(此處為舉例說(shuō)明剖毯,請(qǐng)勿使用此賬號(hào)密碼)。
1)在未開(kāi)啟認(rèn)證的環(huán)境下教馆,登錄到數(shù)據(jù)庫(kù)
[mongodbrac3 bin]$ ./mongo 127.0.0.1:27028 (此處修改了默認(rèn)端口)
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27028/test
> use admin
switchedtodbadmin
賬號(hào)不要設(shè)置為常見(jiàn)賬號(hào)逊谋,密碼需要滿足一定的復(fù)雜度,長(zhǎng)度至少八位以上土铺,并包括大小寫字母胶滋、數(shù)字、特殊字符混合體悲敷,不要使用生日究恤、姓名、身份證編號(hào)等常見(jiàn)密碼镀迂。
說(shuō)明:MongoDB從V3版本開(kāi)始取消使用addUser方法丁溅,采用db.createUser方法創(chuàng)建用戶唤蔗。
> db.addUser("supper", "supWDxsf67%H") 或
{ "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 }
> db.createUser({user:"supper",pwd:"supWDxsf67%H",roles:["root"]})
{
? ? "user" : "supper",
? ? "readOnly" : false,
? ? "pwd" : "51a481f72b8b8218df9fee50b3737c44",
? ? "_id" : ObjectId("4f2bc0d357a309043c6947a4")
}
管理員賬號(hào)將在system.users中探遵。
> db.getCollectionNames()
[ "system.indexes", "system.users", "system.version" ]
> db.auth("supper","supWDxsf67%H")
> exit
bye
結(jié)束進(jìn)程,重啟MongoDB服務(wù)妓柜。
./mongod --dbpath=/path/mongodb --bind_ip=10.0.0.1 --port=27028 --fork=true logpath=/path/mongod.log --auth &
說(shuō)明:
admin.system.users中將會(huì)保存比在其它數(shù)據(jù)庫(kù)中設(shè)置的用戶權(quán)限更大的用戶信息箱季,擁有超級(jí)權(quán)限,也就是說(shuō)在admin中創(chuàng)建的用戶可以對(duì)mongodb中的其他數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行操作棍掐。
MongoDB系統(tǒng)中藏雏,數(shù)據(jù)庫(kù)是由超級(jí)用戶來(lái)創(chuàng)建的,一個(gè)數(shù)據(jù)庫(kù)可以包含多個(gè)用戶作煌,一個(gè)用戶只能在一個(gè)數(shù)據(jù)庫(kù)下掘殴,不同數(shù)據(jù)庫(kù)中的用戶可以同名赚瘦。
特定數(shù)據(jù)庫(kù)(比如DB1)的用戶User1,不能夠訪問(wèn)其他數(shù)據(jù)庫(kù)DB2奏寨,但是可以訪問(wèn)本數(shù)據(jù)庫(kù)下其他用戶創(chuàng)建的數(shù)據(jù)起意。
不同數(shù)據(jù)庫(kù)中同名的用戶不能夠登錄其他數(shù)據(jù)庫(kù),比如DB1病瞳、DB2都有user1揽咕,以u(píng)ser1登錄DB1后,不能夠登錄到DB2進(jìn)行數(shù)據(jù)庫(kù)操作套菜。
在admin數(shù)據(jù)庫(kù)創(chuàng)建的用戶具有超級(jí)權(quán)限亲善,可以對(duì)mongodb系統(tǒng)內(nèi)的任何數(shù)據(jù)庫(kù)的數(shù)據(jù)對(duì)象進(jìn)行操作。
使用db.auth()可以對(duì)數(shù)據(jù)庫(kù)中的用戶進(jìn)行驗(yàn)證逗柴,如果驗(yàn)證成功則返回1蛹头,否則返回0。 db.auth()只能針對(duì)登錄用戶所屬的數(shù)據(jù)庫(kù)的用戶信息進(jìn)行驗(yàn)證戏溺,不能驗(yàn)證其他數(shù)據(jù)庫(kù)的用戶信息掘而。
如果您是MongoDB管理員,也可以使用以下方式檢查是否有進(jìn)一步的入侵行為:
查看MongoDB的日志是否完整于购,并確認(rèn)執(zhí)行刪除數(shù)據(jù)庫(kù)的源IP地址和時(shí)間袍睡、行為;
檢查MongoDB帳戶以查看是否存在未添加密碼(admin)賬戶(使用db.system.users.find()命令)肋僧;
檢查GridFS以查看是否有人存儲(chǔ)任何文件(使用db.fs.files.find()命令)斑胜;
檢查日志文件以查看誰(shuí)訪問(wèn)了MongoDB(show log global命令);
您可以使用云安全中心應(yīng)急漏洞功能一鍵核查。