MongoDB安全:創建第1個、第2個、第3個用戶
Windows 10家庭中文版,MongoDB3.6.3,
前言
使用mongod命令基於某個空白文件夾(存放數據)啟動MongoDB服務器時,要是沒有使用--auth選項,啟動後,任何客戶端是可以無需認證就連接MongoDB服務器的。
比如,在MongoDB服務器啟動後,在本機的終端輸入mongo命令即可連接到MongoDB服務。
沒有認證,不安全,在MongoDB服務器發布後,這是決不允許的!
因此,在使用mongod命令啟動MongoDB服務器時,需要添加--auth選項,增加安全認證功能。
註意,
MongoDB默認沒有添加用戶的,基於易用性考慮;
在默認沒有用戶時,也是可以開啟--auth選項的,因為MongoDB提供了一個localhost exception的功能,此功能允許用戶在admin數據庫中
說明,
MongoDB的安全體系支持下面三種認證機制:
-SCRAM(默認)
-MongoDB Challenge and Response (MONGODB-CR)(在3.6時被廢棄)
-x.509證書鑒別(Certificate Authentication,孤不熟悉,短時間內不準備去了解)
創建第1個用戶:必須
第1個用戶必須是用戶管理員,其角色為userAdmin或userAdminAnyDatabase,這個用戶可以用下面的方式管理用戶:
-創建用戶
-給用戶賦予(grant)或取消(revoke)某角色
-創建或修改定制角色
總之,創建第一個用戶使用userAdmin或userAdminAnyDatabase角色就對了!
孤的操作(mongod的配置參數請參考其help信息):
在空文件夾使用mongod命令啟動MongoDB服務器:使用了--auth選項
mongod --dbpath d:\p\mdb018 --logpath d:\p\mdb018\log --logappend --auth --directoryperdb
創建一個基於角色userAdminAnyDatabase、用於admin數據庫的用戶admin:
-先在Notepad++中寫入腳本(JavaScript?),如下:
1 db.createUser( 2 { 3 user: "admin", 4 pwd: "111111", 5 roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] 6 } 7 )
-使用mongo命令連接MongoDB服務器,切換到admin數據庫
-將前面的腳本拷貝到命令行並執行:添加用戶admin成功;使用db.auth(‘admin‘, ‘111111‘)驗證,返回1,成功!
-檢查用戶admin及其角色的信息:使用db.getUser(...)和db.getRole(....)命令
斷開連接,使用選項--authenticationDatabase "admin"登錄:建立連接後,db並非admin,仍然是test(與預期不符!),尚不清楚是怎麽回事!
不管如何,第1個用戶建立好了,角色為userAdminAnyDatabase,官文介紹說,除了local和config外,此角色的用戶可以對其它數據庫進行其角色允許的操作——簡單地說就是,用戶管理。
創建第2個用戶:內建角色
MongoDB 3.6共有7類共17個內建角色,其中,Database User Roles、Database Administration Roles是所有數據庫都有的角色,而其它類別的角色是admin數據庫獨有的。
目前MongoDB服務器中只有內建數據庫,那麽,添加一個名為test0709的數據庫——使用use,然後編寫腳本,建立用戶admin0709,密碼為111111,使用內建角色readWrite、dbAdmin,腳本如下:
1 db.createUser( 2 { 3 user: "admin0709", 4 pwd: "111111", 5 roles: [ 6 { role: "readWrite", db: "test0709" }, 7 { role: "dbAdmin", db: "test0709" } 8 ] 9 } 10 )
腳本拷貝到終端執行:用戶添加成功!
測試:
-切換到admin,使用admin0709驗證;
-切換回test0709,使用admin0709驗證;
-查看數據庫、集合、用戶信息;
-已經在數據庫test0709中添加了用戶admin0709,但在show dbs中卻沒有看到數據庫test0709,為什麽?那麽,斷開連接後,再次連接到MongoDB服務器,是否還存在數據庫test0709和其上的用戶admin0709呢?測試!
結果顯示:show dbs查看不到數據庫,但用戶admin0709的信息還在。
-admin0709的其中一個角色為readWrite,那麽,測試添加、刪除文檔——在新的數據集fruit中;
-dbAdmin角色有創建集合的功能,那麽,可以使用db.createCollection(name, options)函數創建集合;
a.普通集合
b.固定大小集合(capped)
-其它測試
...
註意:用戶admin0709在test0709下無法執行show dbs!
說明,孤對這些操作還不夠熟練,需要多多練習才是啊!
創建第3個用戶:自定義角色
除了內建角色,MongoDB還提供機制自建角色,以滿足各種各樣的需求,使用db.createRole()函數。
db.createRole()函數語法如下:
db.createRole(role, writeConcern)
參數role、wrieConcern都是文檔,本文僅關註role文檔,下面是官方示例:具體信息請參考官網
下面新建一個角色myRole:可以在前面的test0709數據庫中的集合中添加文檔——insert操作。
同樣,將添加角色的腳本(腳本的書寫規則是什麽?官文在哪裏?)寫入到文本文件中,然後拷貝到終端執行——用admin可以添加此角色(admin0709不具備此權限):
角色myRole添加成功,現在,基於此角色添加用戶insertUser(還是用admin用戶),腳本如下:
1 db.createUser( 2 { 3 user: "insertUser", 4 pwd: "111111", 5 roles: [ 6 { role: "myRole", db: "test0709" } 7 ] 8 } 9 )
拷貝到終端時,執行出錯,無法建立用戶insertUser,原因是無法找到之前建立的角色myRole!需要做類似flush的操作嗎?可是下午添加另一個角色未發現異常啊!
意外關閉終端後,再次進入終端,此時進入數據庫test0709,檢查又發現了角色myRole,並且成功添加了用戶insertUser:
為什麽會這樣呢?!檢查了MongoDB服務器的日誌信息,也沒有發現相關的失敗操作,此時,怎麽查找問題原因呢?哪些工具可以使用?
測試insertUser用戶:在fruit數據集中插入文檔,成功!但是,無法使用insertUser用戶查看fruit數據集的文檔,因為其不具備find權限!切換為admin0709查看結果,添加成功!
後記
總算寫完了,今天第四篇,都挺基礎的,但真的用力了!
之前看了菜鳥教程(RUNOOB) ,但因為沒有實際操作,結果全忘記了,經過這一遍,好多了,不過呢,還有很多需要練習的!
更新啊、刪除啊……各種!無論是角色還是用戶!
居然可以直接存中文,挺好的,至少目前不用為字符集煩惱了,那麽,和Web應用結合起來呢?過兩天就知道了!
就這樣!
可以創建第一個用戶了、可以創建角色了、可以創建用戶了,那麽,單例MongoDB的基本安全應該可以保證了吧!放到公網也不用過於擔心被壞人破壞了吧!比特幣孤是沒有的!萬分之一枚也沒有的!
有一個疑問,是否可以在創建數據庫之前為數據庫、數據集創建角色和用戶?此問題源於之前角色創建好勒,可show dbs看不到數據庫test0709。
問題還有一些,一個一個解決,這段時間解決了不少問題了,後面,應該還會更多!(這個藍色清楚不掉,編輯器的問題吧)
MongoDB安全:創建第1個、第2個、第3個用戶