標籤:方式 環境變數 ica The cti mil 機制 com 前言
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)的使用者認證初識