1. 程式人生 > >MongoDB(3.6.3)的用戶認證初識

MongoDB(3.6.3)的用戶認證初識

超級用戶 用戶名 .com 權限 uri 完成 rep with 有一個

Windows 10家庭中文版,MongoDB 3.6.3,

前言

剛剛安裝好了MongoDB,啟動了服務器-mongod命令,啟動了MongoDB shell-mongo命令,不過,全程都沒有使用username、password!震驚!

原來,MongoDB默認沒有用戶認證的,也沒有默認用戶,因此,都需要自己添加——安全全權交給用戶自己負責

不過,MongoDB裏面是有強大且完備(浮誇了點,但一定是這樣的,還要去了解一下去年還是什麽時候發生的大量MongoDB被黑敲詐比特幣的事件)的安全機制的,對於用戶認證來說,目前孤所知的是可以做下面的事情(實際上還可以做更多):

-啟動MongoDB服務時使用--auth啟動用戶認證(只是啟動這個嗎)

-使用db.createUser(...)添加用戶

本文介紹了如何開啟MongoDB的安全認證、如何添加一個用戶到MongoDB的過程,因為第一天玩MongoDB,所以,不會更多深入。

說明,孤的MongoDB的bin目錄已經添加到環境變量path中。

開啟MongoDB安全認證

打開終端,執行下面的命令查看mongod的使用信息:

>mongod --help

可以看到General options下有一個--auth選項,介紹時run with security,在孤目前的理解來看,就是打開MongoDB的安全認證,其中包括用戶認證,當然,還可能有其它認證方式。

新建文件夾mdb2dir(空白),並基於它啟動MongoDB服務:使用了--auth,打開了安全認證

技術分享圖片

不過,此時MongoDB數據庫中是沒有用戶信息的,因此,任何客戶端都不能訪問MongoDB服務器。使用mongo命令可以連接上,但執行命令時會提示認證錯誤。

技術分享圖片

技術分享圖片

此時使用db.auth(...)加各種參數也無法成功完成認證:

技術分享圖片技術分享圖片

怎麽辦?添加用戶先!

關掉MongoDB服務,重新使用沒有--auth選項的非安全方式啟動(第二行):

技術分享圖片

----

說明,啟動mongo shell的輸出信息只有3行,這比MongoDB沒有開啟安全認證時的輸出信息少太多了,對比下:

技術分享圖片

說明,在上面的啟動中,使用了日誌記錄功能,因此,可以通過日誌文件查看操作過程中發生的事項(哪些日誌要被記錄、什麽級別才被記錄、怎麽控制日誌格式……需要看更多資料才行)。

添加用戶到MongoDB

怎麽添加MongoDB用戶呢?看了兩篇博文——一篇14年的、一篇17年的,使用db.addUser(...)添加用戶。好,結果,孤的MongoDB 3.6.3已經不支持這個命令了。

使用db.help()可以看到其中有一個db.createUser(...)命令:

db.createUser(userDocument)

看時看到了,可什麽事userDocument?怎麽用這個命令呢?此時,mongo shell無法幫助孤獲取更多這個函數的使用信息了!

又看了一遍mongo shell命令和db.help()下的命令,沒有辦法知道這個函數的用法。

那麽,去官網找吧,更快的應該是用搜索引擎找——然後到官網。

官文Enable Auth正是孤想要的(尚未細看,就看了Create the user administrator小節,不過足夠添加一個用戶了,居然還涉及到角色):

技術分享圖片

上面是官文的示例截圖,從結構來看,上面的語句是寫到某種腳本文件中的,然後再執行腳本(JavaScript腳本?怎麽執行?mongo的命令中有一個選項執行.js文件~)。

下圖是自己添加用戶的截圖:

第一次只用了user、pwd,結果失敗,提示要roles;

第二次添加成功了,新用戶 名為sa,角色為userAdminAnyDatabase(孤還以為這個角色是任何數據庫都可以訪問的呢,結果卻並非如此);

技術分享圖片

已經添加了sa用戶,來驗證一下:關閉mongo shell、MongoDB服務器,重新使用--auth選項打開MongoDB服務器,再使用mongo shell連接MongoDB服務器。

使用sa賬號完成認證,執行一些操作的結果如下:原來角色為userAdminAnyDatabase的用戶sa並不是萬能的

技術分享圖片

-默認的mongo shell的db顯示為test(這個test是什麽?有什麽用?不是數據庫的啊!),故認證失敗

技術分享圖片

-切換到admin數據庫,sa賬號認證成功

技術分享圖片

-可以執行show dbs命令,,但是,切換到local數據庫時執行失敗(此問題和角色有關系,也說明自己對MongoDB的這套用戶權限機制不熟悉)

技術分享圖片

-在local數據庫下,認證也失敗,邏輯正確

技術分享圖片

-在數據庫admin執行show collections失敗(不應該的啊!)

技術分享圖片

說明,userAdminAnyDatabase角色從名字上看,是建立管理員權限的賬號並可以訪問任何數據庫,可在上面的操作中,基於它的用戶sa並沒有實現孤的預期,甚至在admin數據庫中執行show collections都失敗——不應該啊!不是有這個權限嗎?

官文Built-In Roles中有對userAdminAnyDatabase的詳細介紹,開始就說了,基於它角色的用戶不可以訪問local、config兩個數據庫(難道show collections的數據涉及到了這兩個數據庫?):

技術分享圖片

看來,需要認真看下MongoDB的用戶權限管理相關官文才可以徹底了解。

參考鏈接

mongodb 權限設置--用戶名、密碼、端口(by 園友 luck_mylife)

官文Enable Auth

官文Built-In Roles

後記

MongoDB的安全機制到底是怎樣的?怎麽合理地建立用戶?角色也可以新建吧?

怎麽建立一個超級用戶?可以用它訪問所有功能——當然是不安全的!

怎麽建立數據庫?mongo shell中沒找到,只有clone、copy、repair、drop數據庫的操作。

創建 記錄集(表):db.createCollection

添加 記錄?

刪除 記錄?

修改 記錄?

查找 記錄集 中的 對象(記錄?):find()或find(...)

對了,MongoDB用戶怎麽 修改?刪除有一個dropUser(...)函數。

繼續dig!

P.S.本文的幹活好像並不是很多的啊!請讀者見諒!

MongoDB(3.6.3)的用戶認證初識