MongoDB怎樣默認(rèn)安全設(shè)置以及MongoDB中JavaScript該怎么執(zhí)行與保護(hù)

MongoDB怎樣默認(rèn)安全設(shè)置以及MongoDB中JavaScript該怎么執(zhí)行與保護(hù),相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

創(chuàng)新互聯(lián)公司專注于秀嶼網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供秀嶼營銷型網(wǎng)站建設(shè),秀嶼網(wǎng)站制作、秀嶼網(wǎng)頁設(shè)計(jì)、秀嶼網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務(wù),打造秀嶼網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供秀嶼網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

在默認(rèn)情況下,mongod是監(jiān)聽在0.0.0.0之上的。而任何客戶端都可以直接連接27017,且沒有認(rèn)證。好處是,開發(fā)人員或dba可以即時(shí)上手,不用擔(dān)心被一堆配置弄的心煩意亂。壞處是,顯而易見,如果你直接在公網(wǎng)服務(wù)器上如此搭建MongoDB,那么所有人都可以直接訪問并修改你的數(shù)據(jù)庫數(shù)據(jù)了。下面創(chuàng)新互聯(lián)小編來講解下MongoDB怎么樣默認(rèn)安全設(shè)置?MongoDB中JavaScript怎么執(zhí)行與保護(hù)?

MongoDB怎么樣默認(rèn)安全設(shè)置

在默認(rèn)情況下,mongod是監(jiān)聽在0.0.0.0之上的。而任何客戶端都可以直接連接27017,且沒有認(rèn)證。好處是,開發(fā)人員或dba可以即時(shí)上手,不用擔(dān)心被一堆配置弄的心煩意亂。壞處是,顯而易見,如果你直接在公網(wǎng)服務(wù)器上如此搭建MongoDB,那么所有人都可以直接訪問并修改你的數(shù)據(jù)庫數(shù)據(jù)了。

默認(rèn)情況下,mongod也是沒有管理員賬戶的。因此除非你在admin數(shù)據(jù)庫中使用db.addUser()命令添加了管理員帳號(hào),且使用–auth參數(shù)啟動(dòng)mongod,否則在數(shù)據(jù)庫中任何人都可以無需認(rèn)證執(zhí)行所有命令。包括delete和shutdown。

此外,mongod還會(huì)默認(rèn)監(jiān)聽28017端口,同樣是綁定所有ip。這是一個(gè)mongod自帶的web監(jiān)控界面。從中可以獲取到數(shù)據(jù)庫當(dāng)前連接、log、狀態(tài)、運(yùn)行系統(tǒng)等信息。如果你開啟了–rest參數(shù),甚至可以直接通過web界面查詢數(shù)據(jù),執(zhí)行mongod命令。

我試著花了一個(gè)晚上掃描了國內(nèi)一個(gè)B段,國外一個(gè)B段。結(jié)果是國外開了78個(gè)MongoDB,而國內(nèi)有60臺(tái)。其中我隨意挑選了10臺(tái)嘗試連接,而只有一臺(tái)機(jī)器加了管理員賬戶做了認(rèn)證,其他則全都是不設(shè)防的城市??梢娖鋯栴}還是比較嚴(yán)重的。

其實(shí)MongoDB本身有非常詳細(xì)的安全配置準(zhǔn)則,顯然他也是想到了,然而他是將安全的任務(wù)推給用戶去解決,這本身的策略就是偏向易用性的,對(duì)于安全性,則得靠邊站了。

用戶信息保存及認(rèn)證過程

類似MySQL將系統(tǒng)用戶信息保存在mysql.user表。MongoDB也將系統(tǒng)用戶的username、pwd保存在admin.system.users集合中。其中pwd=md5(username+“:mongo:”+real_password)。這本身并沒有什么問題。username和:mongo:相當(dāng)于對(duì)原密碼加了一個(gè)salt值,即使攻擊者獲取了數(shù)據(jù)庫中保存的md5hash,也沒法簡單的從彩虹表中查出原始密碼。

我們?cè)賮砜纯碝ongoDB對(duì)客戶端的認(rèn)證交互是如何實(shí)現(xiàn)的。mongoclient和server交互都是基于明文的,因此很容易被網(wǎng)絡(luò)嗅探等方式抓取。這里我們使用數(shù)據(jù)庫自帶的mongosniff,可以直接dump出客戶端和服務(wù)端的所有交互數(shù)據(jù)包:

[root@localhostbin]#./mongosniff--sourceNETlo

sniffing27017

...//省略開頭的數(shù)據(jù)包,直接看看認(rèn)證流程。以下就是當(dāng)用戶輸入db.auth(username,real_passwd)后發(fā)生的交互。

127.0.0.1:34142-->>127.0.0.1:27017admin.62bytesid:88

query:{getnonce:1.0}ntoreturn:-1ntoskip:0

127.0.0.1:27017<<--127.0.0.1:3414281bytesid:77-8 replyn:1cursorid:0="" 127.0.0.1:34142--="">>127.0.0.1:27017admin.152bytesid:99

query:{authenticate:1.0,user:"admin",nonce:"df97182fb47bd6d0",key:"3d839522b547931057284b6e1cd3a567"}ntoreturn:-1ntoskip:0

127.0.0.1:27017<<--127.0.0.1:3414253bytesid:88-9    replyn:1cursorId:0    {ok:1.0}   

 第一步,client向server發(fā)送一個(gè)命令getnonce,向server申請(qǐng)一個(gè)隨機(jī)值nonce,server返回一個(gè)16位的nonce。這里每次返回的值都不相同。    第二步,client將用戶輸入的明文密碼通過算法生成一個(gè)key,即key=md5(nonce+username+md5(username+“:mongo:”+real_passwd)),并將之連同用戶名、nonce一起返回給server,server收到數(shù)據(jù),首先比對(duì)nonce是否為上次生成的nonce,然后比對(duì)key==md5(nonce+username+pwd)。如果相同,則驗(yàn)證通過。    由于至始至終沒有密碼hash在網(wǎng)絡(luò)上傳輸,而是使用了類似挑戰(zhàn)的機(jī)制,且每一次nonce的值都不同,因此即使攻擊者截取到key的值,也沒用辦法通過重放攻擊通過認(rèn)證。    然而當(dāng)攻擊者獲取了數(shù)據(jù)庫中保存的pwdhash,則認(rèn)證機(jī)制就不會(huì)起到作用了。即使攻擊者沒有破解出pwdhash對(duì)應(yīng)的密碼原文。但是仍然可以通過發(fā)送md5(nonce+username+pwd)的方式直接通過server認(rèn)證。這里實(shí)際上server是將用戶的pwdhash當(dāng)作了真正的密碼去驗(yàn)證,并沒有基于原文密碼驗(yàn)證。在這點(diǎn)上和我之前分析的mysql的認(rèn)證機(jī)制其實(shí)沒什么本質(zhì)區(qū)別。當(dāng)然或許這個(gè)也不算是認(rèn)證機(jī)制的弱點(diǎn),但是畢竟要獲取MongoDB的username和pwd的可能性會(huì)更大一些。    然而在Web的監(jiān)控界面的認(rèn)證中則有一些不同。當(dāng)client來源不是localhost,這里的用戶認(rèn)證過程是基于HTTP401的。其過程與mongo認(rèn)證大同小異。但是一個(gè)主要區(qū)別是:這里的nonce并沒有隨機(jī)化,而是每次都是默認(rèn)為”abc”。    利用這個(gè)特點(diǎn),如果攻擊者抓取了管理員一次成功的登錄,那么他就可以重放這個(gè)數(shù)據(jù)包,直接進(jìn)入Web監(jiān)控頁面。    同樣,攻擊者還可以通過此接口直接暴力破解mongo的用戶名密碼。實(shí)際上27017和28017都沒有對(duì)密碼猜解做限制,但Web由于無需每次獲取nonce,因此將會(huì)更為簡便。    

MongoDB中JavaScript怎么執(zhí)行與保護(hù)    MongoDB本身最大的特點(diǎn)之一,就是他是使用JavaScript語言作為命令驅(qū)動(dòng)的。黑客會(huì)比較關(guān)注這一點(diǎn),因?yàn)槠涿畹闹С殖潭?,就是獲取MongoDB權(quán)限之后是否能進(jìn)一步滲透的關(guān)鍵。

JavaScript本身的標(biāo)準(zhǔn)庫其實(shí)相當(dāng)弱。無論是spidermonkey或者是v8引擎,其實(shí)都沒有系統(tǒng)操作、文件操作相關(guān)的支持。對(duì)此,MongoDB做了一定的擴(kuò)展??梢钥吹?,ls/cat/cd/hostname甚至runProgram都已經(jīng)在JavaScript的上下文中有實(shí)現(xiàn)??吹竭@里是不是已經(jīng)迫不及待了?mongoshell中試一下輸入ls(“./”),看看返回。    等等?結(jié)果怎么這么熟悉?哈哈,沒錯(cuò),其實(shí)這些api都是在client的上下文中實(shí)現(xiàn)的。一個(gè)小小玩笑。    那么在server端是否可以執(zhí)行js呢?答案是肯定的。利用db.eval(code)——實(shí)際上底層執(zhí)行的是db.$cmd.findOne({$eval:code})——可以在server端執(zhí)行我們的js代碼。    當(dāng)然在server端也有js的上下文擴(kuò)展。顯然mongod考慮到了安全問題(也可能是其他原因),因此在這里并沒有提供client中這么強(qiáng)大的功能。當(dāng)然MongoDB還在不斷更新,長期關(guān)注這個(gè)list,說不定以后就有類似load_file/exec之類的實(shí)現(xiàn)。     

 一勞永逸解決服務(wù)端js執(zhí)行帶來的問題可以使用noscripting參數(shù)。直接禁止server-side的js代碼執(zhí)行功能。      

看完上述內(nèi)容,你們掌握MongoDB怎樣默認(rèn)安全設(shè)置以及MongoDB中JavaScript該怎么執(zhí)行與保護(hù)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

當(dāng)前題目:MongoDB怎樣默認(rèn)安全設(shè)置以及MongoDB中JavaScript該怎么執(zhí)行與保護(hù)
分享地址:http://muchs.cn/article0/ighhio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)關(guān)鍵詞優(yōu)化、外貿(mào)建站服務(wù)器托管、微信公眾號(hào)網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司