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的數據涉及到了這兩個數據庫?):

0705-1541更新:
使用不添加--auth的方式重啟了MongoDB服務器,查看其中之前添加的用戶sa:
最初,數據庫admin下只有system.version記錄集,但在添加用戶sa后,多了一個system.users記錄集。使用 記錄集的find()命令可以查看其中所有用戶信息,不過目前只有一個用戶sa。

看來,需要認真看下MongoDB的用戶權限管理相關官文才可以徹底了解。
參考鏈接
mongodb 權限設置--用戶名、密碼、端口(by 園友 luck_mylife)
后記
MongoDB的安全機制到底是怎樣的?怎么合理地建立用戶?角色也可以新建吧?
怎么建立一個超級用戶?可以用它訪問所有功能——當然是不安全的!
怎么建立數據庫?mongo shell中沒找到,只有clone、copy、repair、drop數據庫的操作。
創建 記錄集(表):db.createCollection
添加 記錄?
刪除 記錄?
修改 記錄?
查找 記錄集 中的 對象(記錄?):find()或find(...)
MongoDB的圖形化管理工具是什么?MongoDB Compass?
對了,MongoDB用戶怎么 修改?刪除有一個dropUser(...)函數。
繼續dig!
P.S.本文的干活好像並不是很多的啊!請讀者見諒!
