轉自:http://www.cnblogs.com/valor-xh/p/6369432.htmlhtml
1、關於權限的默認配置web
在默認狀況下,mongod是監聽在0.0.0.0之上的,任何客戶端均可以直接鏈接27017,且沒有認證。這樣作的好處是,用戶能夠即時上手,不用擔憂被一堆配置弄的心煩意亂。然而壞處也是顯而易見,若是直接在公網服務器上如此搭建MongoDB,那麼全部人均可以直接訪問並修改數據庫數據了。mongodb
默認狀況下,mongod也是沒有管理員帳戶的。所以除非你在admin數據庫中使用db.addUser()命令添加了管理員賬號,且使用–auth參數啓動mongod,不然在數據庫中任何人均可以無需認證執行全部命令。包括delete和shutdown。數據庫
此外,mongod還會默認監聽28017端口,一樣是綁定全部ip。這是一個mongod自帶的web監控界面。從中能夠獲取到數據庫當前鏈接、log、狀態、運行系統等信息。若是你開啓了–rest參數,甚至能夠直接經過web界面查詢數據,執行mongod命令。安全
其實MongoDB自己有很是詳細的安全配置準則,顯然開發者也是想到了,然而他是將安全的任務推給用戶去解決,這自己的策略就是偏向易用性的,對於安全性,則得靠邊站了。服務器
2、MongoDB用戶類型測試
MongoDB的用戶分爲兩種,一種是admin用戶,另外一種是特定數據庫用戶。admin用戶擁有最高的權限,而特定數據庫用戶則只能訪問特定的數據庫。當MongoDB的admin庫裏沒有任何用戶的時候,也就是說整個MongoDB沒有一個MongoDB用戶的時候,即使–auth權限需求打開了,用戶仍是能夠經過localhost界面進入MongoDB進行用戶設置,不然的話整個MongoDB就徹底無法訪問了。而當這個用戶建立完成以後,以後的用戶登陸和操做就須要受權了,不是直接登陸就能使用的了。spa
MongoDB有一個比較奇怪的設置是,即使是一個admin用戶,受權也必須在admin數據庫下進行,而不能在其餘數據庫下進行。而受權以後admin用戶就能夠在任何數據庫下進行任何操做了。固然數據庫級別的用戶在他本身的數據庫下受權以後是不能到其餘數據庫進行操做的。舉例來講:.net
> use test
> db.auth(「someAdminUser」, password)rest
操做失敗,提示尚未在admin數據庫下對afmin用戶進行受權。
3、操做實例
啓動MongoDB,在cmd命令框裏進入數據庫的bin目錄;
1. 輸入命令:show dbs,你會發現它內置有兩個數據庫,一個名爲admin,一個名爲local;本文只對admin庫進行描述
2. 輸入命令:use admin,你會發現該DB下包含了一個名爲system.user的collection,這是用戶表,用來存放超級管理員的
備註:本文使用的數據庫版本是2.0.1,沒有默認的admin數據庫,可是在執行第二步以後自動建立了一個admin庫; 固然也沒有默認的system.user表,運行後面的第三步後會自動建立 system.user和system.indexes )
3. 輸入命令:db.addUser('root','root'),這裏我添加一個超級管理員用戶,username爲root,password也爲root。先退出 (ctrl+c)程序,測試重啓服務後再次鏈接MongoDB是否須要按提示輸入用戶名、密碼進行操做。
4. 輸入命令:use admin
5. 輸入命令:show collections,查看該庫下全部的表,你會發現,MongoDB並無提示你輸入用戶名、密碼,緣由是,在文章最開始提到了,MongoDB默認設置爲無權限訪問限制,咱們須要先把它設置成爲須要權限訪問
6.重新打開cmd,在mongodb路徑的bin目錄下,執行mongod --dbpath d:\work\data\mongodb\db --auth
7. 輸入命令:use admin
8. 輸入命令:show collections,提示:"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1"
顯然,已經提示沒有權限;用剛纔設置的用戶名、密碼來訪問集合
9. 輸入命令:db.auth(「root」,」root」),輸出一個結果值爲1,說明這個用戶匹配上了,若是用戶名、密碼不對,輸出爲0
10. 輸入命令:show collections,將成功顯示結果
繼續操做,能夠訪問已經存在的數據庫,但對於新建的數據庫仍然沒有權限;繼續操做,先退出(ctrl+c)服務
11. 輸入命令:mongo TestDB
12. 輸入命令:show collections,提示:沒有權限
13. 輸入命令:db.auth(「root」, 「root」),輸出結果爲0,說明用戶名或者密碼有問題,剛剛前面才建立,怎麼會不對呢?緣由在於:當咱們單獨訪問MongoDB的數據庫時,須要權限訪問的狀況下,用戶名密碼並不是超級管理員,而是該庫的system.user表中的用戶,注意,我這裏說的是單獨訪問的狀況,什麼是不單獨訪問的狀況呢?後面再講。針對上述狀況,接下來操做:
14. 輸入命令:db.addUser('test','111111'),仍然提示沒有權限,新的數據庫使用超級管理員也沒法訪問,建立用戶也沒有權限,不過即然設定了超級管理員用戶,那它就必定有權限訪問全部的庫
15. 輸入命令:use admin
16. 輸入命令:db.auth(「root」, 「root」)
17. 輸入命令:use TestDB
18. 輸入命令:show collections,以後能夠利用超級管理員用戶訪問其它庫了,這個就是不單獨訪問的狀況。在上述操做過程當中,咱們是先進入admin庫,再轉到其它庫來的,admin至關因而一個最高級別用戶所在的區域,對數據庫操做,須要通過最高級別用戶,以後能夠建立每一個數據庫的用戶。
19. 輸入命令:db.addUser('test','12345'),咱們給TestDB庫添加一個用戶,之後每次訪問該庫,我都使用剛剛建立的這個用戶,咱們先退出(ctrl+c)
20. 輸入命令:mongo TestDB
21. 輸入命令:show collections,提示沒有權限
22. 輸入命令:db.auth('test','12345'),輸出結果1,用戶存在,驗證成功
23. 輸入命令:show collections,成功顯示結果
4、啓動和關閉MongoDB的各類參數
詳見:http://blog.csdn.net/pgwindwind/article/details/8005262
好比要改變MongoDB的默認端口,則能夠這樣使用--port參數:
打開cmd,在mongodb路徑的bin目錄下,執行mongod --port 50107 --dbpath d:\work\data\mongodb\db --auth
這樣訪問MongoDB就是以50107的端口訪問了