一汤功、關于權限的默認設置
- 在默認情況下物邑,mongod是監(jiān)聽在
0.0.0.0
之上的,任何客戶端都可以直接連接27017
滔金,且沒有認證拂封。這樣做的好處是,用戶可以即時上手鹦蠕,不用擔心被一堆配置弄的心煩意亂。壞處則是如果直接在公網服務器上如此搭建MongoDB在抛,那么所有人都可以直接訪問并修改數(shù)據(jù)庫數(shù)據(jù)了钟病。 - 默認情況下,mongod也是沒有管理員賬戶的刚梭。因此除非你在admin數(shù)據(jù)庫中使用
db.addUser()
命令添加了管理員帳號肠阱,且使用–auth參數(shù)啟動mongod,否則在數(shù)據(jù)庫中任何人都可以無需認證執(zhí)行所有命令朴读。包括delete和shutdown屹徘。
MongoDB用戶類型
- MongoDB的用戶分為兩種,一種是admin用戶衅金,另一種是特定數(shù)據(jù)庫用戶噪伊。admin用戶擁有最高的權限,而特定數(shù)據(jù)庫用戶則只能訪問特定的數(shù)據(jù)庫氮唯。
- 當MongoDB的admin庫里沒有任何用戶的時候鉴吹,也就是說整個MongoDB沒有一個MongoDB用戶的時候,即便–auth權限需求打開了惩琉,用戶還是可以通過localhost界面進入MongoDB進行用戶設置豆励,否則的話整個MongoDB就完全沒法訪問了。而當這個用戶創(chuàng)建完成之后瞒渠,之后的用戶登錄和操作就需要授權了良蒸,不是直接登錄就能使用的了技扼。
- MongoDB有一個比較奇怪的設置是,即便是一個admin用戶嫩痰,授權也必須在admin數(shù)據(jù)庫下進行剿吻,而不能在其他數(shù)據(jù)庫下進行。而授權之后admin用戶就可以在任何數(shù)據(jù)庫下進行任何操作了始赎。當然數(shù)據(jù)庫級別的用戶在他自己的數(shù)據(jù)庫下授權之后是不能到其他數(shù)據(jù)庫進行操作的和橙。舉例來說:
> use test
> db.auth(“someAdminUser”, password)
//操作失敗,提示還沒有在admin數(shù)據(jù)庫下對afmin用戶進行授權造垛。
三魔招、操作實例
啟動MongoDB,在cmd命令框里進入數(shù)據(jù)庫的bin目錄五辽;
- 輸入命令:
show dbs
办斑,你會發(fā)現(xiàn)它內置有兩個數(shù)據(jù)庫,一個名為admin杆逗,一個名為local乡翅; - 輸入命令:
use admin
,你會發(fā)現(xiàn)該db下包含了一個名為system.user的collection罪郊,這是用戶表蠕蚜,用來存放超級管理員; - 輸入命令:
db.createUser(
... {
... user:"root",
... pwd:"root",
... roles:["userAdminAnyDatabase"]
... }
... )
添加一個超級管理員用戶,username為root悔橄,password也為root靶累。先退出 (ctrl+c)程序,測試重啟服務后再次連接MongoDB是否需要按提示輸入用戶名癣疟、密碼進行操作;
- 輸入命令:
use admin
- 輸入命令:
show collections
挣柬,查看該庫下所有的表,你會發(fā)現(xiàn)睛挚,MongoDB并沒有提示你輸入用戶名邪蛔、密碼,原因是MongoDB默認設置為無權限訪問限制扎狱,我們需要先把它設置成為需要權限訪問; - 從新打開cmd侧到,在mongodb路徑的bin目錄下,執(zhí)行
./mongod -f mongodb.conf --auth
和./mongo
- 輸入命令:
use admin
- 輸入命令:
show collections
委乌,提示:"errmsg" : "not authorized on admin to execute command { listCollections: 1.0, filter: {}, $db: "admin" }",
顯然床牧,已經提示沒有權限;需要用剛才設置的用戶名遭贸、密碼來訪問集合 - 輸入命令:
db.auth(“root”,”root”)
戈咳,輸出一個結果值為1,說明這個用戶匹配上了,如果用戶名著蛙、密碼不對删铃,輸出為0 - 輸入命令:
show collections
,將成功顯示結果
繼續(xù)操作踏堡,可以訪問已經存在的數(shù)據(jù)庫猎唁,但對于新建的數(shù)據(jù)庫仍然沒有權限;繼續(xù)操作顷蟆,先退出(ctrl+c)服務 - 輸入命令:
mongo TestDB
- 輸入命令:
show collections
诫隅,提示:沒有權限 - 輸入命令:
db.auth(“root”, “root”)
,輸出結果為0帐偎,說明用戶名或者密碼有問題逐纬,剛剛前面才創(chuàng)建,怎么會不對呢削樊?原因在于:當我們單獨訪問MongoDB的數(shù)據(jù)庫時豁生,需要權限訪問的情況下,用戶名密碼并非超級管理員漫贞,而是該庫的system.user表中的用戶甸箱,注意,我這里說的是單獨訪問的情況迅脐,什么是不單獨訪問的情況呢芍殖?后面再講。針對上述情況谴蔑,接下來操作: - 輸入命令:
db.addUser('test','111111')
围小,仍然提示沒有權限,新的數(shù)據(jù)庫使用超級管理員也無法訪問树碱,創(chuàng)建用戶也沒有權限,不過即然設定了超級管理員用戶变秦,那它就一定有權限訪問所有的庫 - 輸入命令:
use admin
- 輸入命令:
db.auth(“root”, “root”)
- 輸入命令:
use TestDB
- 輸入命令:
show collections
成榜,之后可以利用超級管理員用戶訪問其它庫了,這個就是不單獨訪問的情況蹦玫。在上述操作過程中赎婚,我們是先進入admin庫,再轉到其它庫來的樱溉,admin相當于是一個最高級別用戶所在的區(qū)域挣输,對數(shù)據(jù)庫操作,需要經過最高級別用戶福贞,之后可以創(chuàng)建每個數(shù)據(jù)庫的用戶撩嚼。 - 輸入命令:
db.addUser('test','12345')
,我們給TestDB庫添加一個用戶,以后每次訪問該庫完丽,我都使用剛剛創(chuàng)建的這個用戶恋技,我們先退出(ctrl+c) - 輸入命令:
mongo TestDB
- 輸入命令:
show collections
,提示沒有權限 - 輸入命令:
db.auth('test','12345')
逻族,輸出結果1蜻底,用戶存在,驗證成功 - 輸入命令:
show collections
聘鳞,成功顯示結果
可能需要用到的操作
- 查看關于mongo的線程
ps -ef | grep mongo
//查詢結果示例
lujiafengdeMBP:~ lujiafeng$ ps -ef | grep mongo
501 2575 1 0 5:04下午 ?? 0:01.51 ./mongod -f mongodb.conf
501 2583 1247 0 5:05下午 ttys000 0:00.11 ./mongo
501 2585 2463 0 5:05下午 ttys001 0:00.00 grep mongo
- 殺死線程
kill 1247