MongoDB(3.6.3)的用戶認證初識
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)的用戶認證初識