標籤:cti org add 改變 author 使用者登入 cli 使用者名稱 綁定
一、關於許可權的預設配置
在預設情況下,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的連接埠訪問了
mongodb 使用權限設定--使用者名稱、密碼、連接埠