1. 程式人生 > >MongoDB安全:創建第1個、第2個、第3個用戶

MongoDB安全:創建第1個、第2個、第3個用戶

三種 另一個 選項 原因 配置 書寫規則 ati ins 時間

Windows 10家庭中文版,MongoDB3.6.3,

前言

使用mongod命令基於某個空白文件夾(存放數據)啟動MongoDB服務器時,要是沒有使用--auth選項,啟動後,任何客戶端是可以無需認證就連接MongoDB服務器的。

比如,在MongoDB服務器啟動後,在本機的終端輸入mongo命令即可連接到MongoDB服務。

沒有認證,不安全,在MongoDB服務器發布後,這是決不允許的!

因此,在使用mongod命令啟動MongoDB服務器時,需要添加--auth選項,增加安全認證功能。

註意,

MongoDB默認沒有添加用戶的,基於易用性考慮;

在默認沒有用戶時,也是可以開啟--auth選項的,因為MongoDB提供了一個localhost exception的功能,此功能允許用戶在admin數據庫中

創建一個用戶管理員(user administrator),此用戶也是下一節要講的創建的第1個用戶。

說明,

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個用戶