mongodb身份验证_MongoDB身份验证
mongodb身份驗(yàn)證
我最近更新了Mongometer ,使其更加靈活。 發(fā)布新版本后不久,其中一位用戶通過(guò)在帖子中發(fā)表評(píng)論來(lái)反饋問(wèn)題。 我啟動(dòng)了我的機(jī)器,打開(kāi)了我的IDE,發(fā)現(xiàn)了問(wèn)題,并在半小時(shí)內(nèi)將修補(bǔ)程序推送到了github 。 這不是快速的成功案例。 我很快就意識(shí)到,如果將來(lái)我要使用Mongometer做任何事情,我真的應(yīng)該對(duì)用戶如何對(duì)MongoDB中的數(shù)據(jù)庫(kù)進(jìn)行身份驗(yàn)證了解更多。 (我不想花一個(gè)多小時(shí)左右,因?yàn)槲覄倓偞蜷_(kāi)了一瓶Nyetimber Classic Cuvee –我也在煮雞肉派(如果需要的話可以給我烤),我而不是在完成瓶子之前完成這篇文章。)在深入探討MongoDB Security可能存在的任何文檔之前,我將從一些觀察開(kāi)始。
因此,以典型的男人風(fēng)格,讓我們踢一下輪胎,然后如果需要,再踢RTFM。 啟動(dòng)一個(gè)mongod實(shí)例。
創(chuàng)建一個(gè)管理員用戶
> use admin > db.addUser('mongouser','mongopass') 1重新啟動(dòng)mongod
$ sudo kill -15 $(ps -ef | grep mongo | grep -v grep | cut -f8 -d' ') $ /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --fork --auth --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log $ ./mongo --port 27001驗(yàn)證給管理員
> use admin switched to db admin > db.aut('mongouser','mongopass') Thu Jan 31 13:53:31.271 javascript execution failed (shell):1 TypeError: Property 'aut' of object admin is not a function db.aut('mongouser','mongopass') ^> db.aut('mongouser','mongopass')哎呀 胖手指吧。 等等,我認(rèn)為我發(fā)現(xiàn)了問(wèn)題1
第1期
如果管理員用戶輸入的auth命令不是憑據(jù),而不是憑據(jù),那么實(shí)際的憑據(jù)將保留在Shell歷史記錄中,該歷史記錄將在各個(gè)會(huì)話之間持續(xù)存在。 任何其他用戶都可能會(huì)來(lái)查看Shell歷史記錄并獲取憑據(jù)。
另一方面,如果命令正確并且用戶名或密碼或兩者都不正確,或者確實(shí)進(jìn)行了身份驗(yàn)證嘗試,則該命令不會(huì)保留在歷史記錄中。 (可使用與Linux框相同的方式使用mongo shell的命令歷史記錄-使用向上箭頭)
> db.auth('mongouser','mongopass0') { ok: 0.0, errmsg: 'auth fails' } 0 > db.auth('mongouser0','mongopass0') { ok: 0.0, errmsg: 'auth fails' } 0 > db.auth('mongouser0','mongopass') { ok: 0.0, errmsg: 'auth fails' } 0好。 讓我們針對(duì)管理員進(jìn)行身份驗(yàn)證并繼續(xù)。
> use admin switched to db admin > db.auth('mongouser','mongopass') 1哎呀 我?guī)缀踉谀抢镥e(cuò)過(guò)了一個(gè)。
第2期
在mongod實(shí)例重新啟動(dòng)之前,任何用戶都可以…
> use admin switched to db admin > db.system.users.find() { '_id' : ObjectId('510a58c6de50e136190f9ed7'), 'user' : 'mongouser', 'readOnly' : false, 'pwd' : 'c49caa1cb6b287ff6b1deaeeb8f4d149' }…獲取用戶名和哈希。 因此,既然我已經(jīng)重新啟動(dòng)了mongod實(shí)例,那么任何用戶都將必須針對(duì)admin進(jìn)行身份驗(yàn)證才能查看system.users的內(nèi)容。 現(xiàn)在,繼續(xù)輸入不正確的憑據(jù),我將發(fā)起字典攻擊,看看會(huì)發(fā)生什么。 噢親愛(ài)的。 發(fā)現(xiàn)了另一個(gè)問(wèn)題。
問(wèn)題#3
沒(méi)有鎖定。 我寫了一個(gè)快速的技巧來(lái)連接到mongod實(shí)例,切換到admin并嘗試登錄。使用一個(gè)相當(dāng)大的詞典(最后加上'mongopass'),我嘗試登錄了一百萬(wàn)次。 這僅是一次粗略的單線程嘗試,大約需要17秒才能完成,但是它表明沒(méi)有帳戶鎖定。 我有信心,如果需要的話,我可以組裝一個(gè)多線程的暴力破解者。 我需要對(duì)此進(jìn)行進(jìn)一步研究,以查看是否可以配置任何強(qiáng)行強(qiáng)制/字典式攻擊警報(bào),或者是否可以應(yīng)用鎖定策略。 我還沒(méi)有準(zhǔn)備好RTFM。 讓我們仔細(xì)看看system.users中的密碼格式。
c49caa1cb6b287ff6b1deaeeb8f4d149在我看來(lái),這就像MD5 。 讓我們看一下可在github上瀏覽的代碼。 哇! 我很幸運(yùn)。 db.js具有以下方法:
function _hashPassword(username, password) { return hex_md5(username + ':mongo:' + password); }使用hex_md5然后在utils.cpp中引用native_hex_md5 :
void installGlobalUtils( Scope& scope ) { scope.injectNative( 'hex_md5' , native_hex_md5 ); scope.injectNative( 'version' , native_version ); scope.injectNative( 'sleep' , native_sleep ); installBenchmarkSystem( scope ); }static BSONObj native_hex_md5( const BSONObj& args, void* data ) { uassert( 10261, 'hex_md5 takes a single string argument -- hex_md5(string)', args.nFields() == 1 && args.firstElement().type() == String ); const char * s = args.firstElement().valuestrsafe();md5digest d; md5_state_t st; md5_init(&st); md5_append( &st , (const md5_byte_t*)s , strlen( s ) ); md5_finish(&st, d);return BSON( '' << digestToString( d ) ); }是時(shí)候快速回顧一下了。 萬(wàn)一您錯(cuò)過(guò)任何東西:
我認(rèn)為這可能現(xiàn)在就足夠了,否則它將變成tl; dr,并且我可能會(huì)超出自我施加的時(shí)間限制。 回想我有關(guān)MongoDB的任何討論,相同的陳述總是出現(xiàn)在安全性的背景下。
我不得不說(shuō),即使啟用了身份驗(yàn)證,我們?nèi)匀挥龅揭恍┘值膯?wèn)題。 此外,我認(rèn)為不存在受信任的環(huán)境 。 此時(shí),就安全性而言,是時(shí)候進(jìn)行RTFM了。 我希望找到一個(gè)定義好的路線圖來(lái)解決上述問(wèn)題,或者已經(jīng)可以采取一些緩解措施。 因此,在不久的將來(lái)會(huì)有一些 身份驗(yàn)證功能。 看來(lái)新的身份驗(yàn)證功能僅在MongoDB Subscriber Edition下可用,我不確定這意味著什么……我也遇到了這個(gè)已知問(wèn)題 ,它構(gòu)成了……的基礎(chǔ)。
問(wèn)題#4
'如果用戶在多個(gè)數(shù)據(jù)庫(kù)中具有相同的密碼,則所有數(shù)據(jù)庫(kù)上的哈希將相同。 惡意用戶可能會(huì)利用此漏洞使用其他用戶的憑據(jù)來(lái)訪問(wèn)第二個(gè)數(shù)據(jù)庫(kù)。 [原文]讓我們分解一下。
“如果用戶在多個(gè)數(shù)據(jù)庫(kù)中具有相同的密碼,則所有數(shù)據(jù)庫(kù)上的哈希將相同。”
是。 正確。 相同的用戶名,相同的密碼和相同的“鹽”(即“:mongo:”字符串”)等于相同的哈希。 好,很酷,讓我們繼續(xù)前進(jìn)。
“惡意用戶可能會(huì)利用此漏洞使用不同用戶的憑據(jù)來(lái)訪問(wèn)第二個(gè)數(shù)據(jù)庫(kù)。” [原文]
惡意用戶只有當(dāng)在兩個(gè)數(shù)據(jù)庫(kù)中都擁有非只讀用戶時(shí),才能利用此漏洞。
如果他們僅具有只讀訪問(wèn)權(quán)限,則他們將無(wú)法列出system.users集合。 在這種情況下,他們首先將永遠(yuǎn)不會(huì)看到不同數(shù)據(jù)庫(kù)之間的哈希值是相同的。 如果它們不是只讀的,則可以列出system.users集合,并使散列的密碼脫機(jī)以進(jìn)行破解。
總結(jié)來(lái)說(shuō),如果散列在數(shù)據(jù)庫(kù)之間不匹配,那么您將不得不進(jìn)入破解領(lǐng)域:
因此,這里的問(wèn)題在于,用戶(非只讀用戶)可以提取給定數(shù)據(jù)庫(kù)的所有密碼哈希,然后將其脫機(jī)以進(jìn)行破解。 惡意用戶已經(jīng)具有用戶名和“鹽”,他們所需要查找的只是密碼。
結(jié)論
第1期
這有點(diǎn)令人難過(guò)。 正確輸入命令后(忽略憑據(jù)是否正確),命令不會(huì)顯示在歷史記錄中。 如果未正確輸入命令,則很難知道要從命令歷史記錄中排除的內(nèi)容。 我猜您可以追溯刪除導(dǎo)致身份驗(yàn)證之前導(dǎo)致錯(cuò)誤的命令(即無(wú)效命令)。 那不是解決方案……
第2期
可能存在一個(gè)論點(diǎn),即在admin數(shù)據(jù)庫(kù)的system.users中創(chuàng)建了admin用戶后,應(yīng)強(qiáng)制重新啟動(dòng)。
問(wèn)題#3
輕而易舉。 我已經(jīng)多次編寫密碼策略(我過(guò)著什么樣的生活,是嗎?),帳戶鎖定是密碼101。
問(wèn)題#4
似乎為每個(gè)數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)“鹽”(':mongo:')可以解決此問(wèn)題。 查看代碼,看起來(lái)實(shí)現(xiàn)是輕而易舉的事,這是一個(gè)快速輕松的勝利。 添加選項(xiàng)以手動(dòng)設(shè)置將是盛大的。 在幕后實(shí)施一個(gè)獨(dú)特的“鹽”,使用戶不必考慮它,同樣是宏偉的。 這樣,Nyetimber完成了,發(fā)布完成了。 我并不是說(shuō)這篇文章中有什么新的或聰明的地方,這只是粗略的瀏覽。 我沒(méi)有去; 我所提到的只是觀察。 我?guī)缀趺刻於及惭bmongo,因?yàn)樗且粋€(gè)很棒的產(chǎn)品,但是我確實(shí)喜歡擁有平衡的視野并識(shí)別房間中的任何大象。 我會(huì)對(duì)任何反饋感興趣。
參考:來(lái)自我們的JCG合作伙伴 Jan Ettles的MongoDB身份驗(yàn)證 ,位于Exceptionalexception exceptions博客上。
翻譯自: https://www.javacodegeeks.com/2013/02/mongodb-authentication.html
mongodb身份驗(yàn)證
總結(jié)
以上是生活随笔為你收集整理的mongodb身份验证_MongoDB身份验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wps加密XLS解密(wps表格加密解除
- 下一篇: 笔记本电脑主板静电现象(笔记本电脑主板静