mongodb 權限設置--用戶名、密碼、端口


 

一、關於權限的默認配置

   在默認情況下,mongod是監聽在0.0.0.0之上的,任何客戶端都可以直接連接27017,且沒有認證。這樣做的好處是,用戶可以即時上手,不用擔心被一堆配置弄的心煩意亂。然而壞處也是顯而易見,如果直接在公網服務器上如此搭建MongoDB,那么所有人都可以直接訪問並修改數據庫數據了。

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

    此外,mongod還會默認監聽28017端口,同樣是綁定所有ip。這是一個mongod自帶的web監控界面。從中可以獲取到數據庫當前連接、log、狀態、運行系統等信息。如果你開啟了–rest參數,甚至可以直接通過web界面查詢數據,執行mongod命令。

    其實MongoDB本身有非常詳細的安全配置准則,顯然開發者也是想到了,然而他是將安全的任務推給用戶去解決,這本身的策略就是偏向易用性的,對於安全性,則得靠邊站了。

    二、MongoDB用戶類型

   MongoDB的用戶分為兩種,一種是admin用戶,另一種是特定數據庫用戶。admin用戶擁有最高的權限,而特定數據庫用戶則只能訪問特定的數據庫。當MongoDB的admin庫里沒有任何用戶的時候,也就是說整個MongoDB沒有一個MongoDB用戶的時候,即便–auth權限需求打開了,用戶還是可以通過localhost界面進入MongoDB進行用戶設置,否則的話整個MongoDB就完全沒法訪問了。而當這個用戶創建完成之后,之后的用戶登錄和操作就需要授權了,不是直接登錄就能使用的了。

MongoDB有一個比較奇怪的設置是,即便是一個admin用戶,授權也必須在admin數據庫下進行,而不能在其他數據庫下進行。而授權之后admin用戶就可以在任何數據庫下進行任何操作了。當然數據庫級別的用戶在他自己的數據庫下授權之后是不能到其他數據庫進行操作的。舉例來說:

    > use test
    > db.auth(“someAdminUser”, password)

    操作失敗,提示還沒有在admin數據庫下對afmin用戶進行授權。

   三、操作實例

   啟動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,成功顯示結果

四、啟動和關閉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的端口訪問了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM