【運維相關】MongoDB那些坑


 

前言

某個早期技術債務項目線上有一個mongoDB服務,用途很簡單,存一些文件而已。不過用戶那邊突然報個bug說上邊的圖片丟失了,起初沒當回事認為是代碼遇到錯了,直到后來看了用戶詳細的bug復現后,登進db一看,發現竟然是被入侵了。還被入侵者留了個Warning數據庫,只寫了一句: 你丫的數據備份在我們安全服務器上,0.2個比特幣就還你。

 

【入侵分析】

當然,根據大家前段時間的比特幣勒索的情況看,支付也沒用的概率極大,何況也僅僅是大約10M的文件而已。既然不影響生產,也就無所謂恢復不恢復了。

從MongoDB的日志中發現幾個被ipip.Net標注為機器人、肉雞的地址,反查了下時間發現正好對得上被清除的數據時間。當然,這個攻擊是來自公網的,很不走運,被攻擊的那段時間某個坑逼圖方便把到db的端口映射到了公網上,然后就GG了。

當然GG的更深原因是,項目時間太早,MongoDB版本還是2.x,寫文件服務的人還在用一個很早版本的.Net Driver,據開發說這個Driver最大的bug是不能執行用戶名密碼登錄,會報錯,而Java版本卻沒問題,因此在配置時就沒有要求mongoDB帶驗證,更別說ssl了。【根據目前對mongoDB的研究,個人對此表示懷疑...】 總之,這次事件鐵定是某開發的鍋,當然沒有及時采用新版Driver等也是不合理的。

在及時止損把服務端口從路由器上去掉、服務器全盤查殺並重新配置了防火牆策略后,還是決定重新建獨立的文件服務,讓MongoDB不會有機會再暴露,也正好迭代一下舊產品的技術。

 

【正文開始】

這篇博客主要聊聊部署測試環境時遇到的幾個坑。

首先,MongoDB已經升級到3.6版本,最新的Driver是2.5版本,是17年12月發布的Release,同樣可以在Nuget上更新。因此,測試環境放在Server 2016服務器上,防火牆開啟,MongoDB采用配置文件方式啟動並注冊為服務。

mongoDB如今支持通過配置文件形式啟動,這就遠比之前編寫bat方便得多。其配置文件語法為YAML,是從2.6開始引入的方式。官方介紹地址:https://docs.mongodb.com/manual/reference/configuration-options

這么一看發現配置項還真不少。很長時間沒再回來細看MongoDB的東西,發現原來這么復雜。當然目前的用途我們只需要配置以下這些信息即可:

帶配置文件啟動很簡單:

.\mongod --config ".\MongoDB\mongo.conf" --install

--install參數是用來安裝Windows服務的,關於服務的設置,參見配置文件中 processManagement部分。

 

然而現實是:

仔細對比了很久也沒發現配置上有錯,並且這個error的提示基本等於沒說。

在調整了幾遍配置順序后幾近崩潰,最終決定復制錯誤信息去查,結果發現還真是同樣的報錯信息,原因是——配置文檔中不能用Tab

當然附帶的一個小問題是文件的編碼必須是ASCI,否則會解析出錯。

 

改完之后,服務正確安裝了,啟動后可以進行連接。

切換到admin數據庫,由於我們是設置帶驗證登錄,目前是沒有賬戶的,所以需要在Admin中創建。

於是我們嘗試執行:

db.createUser({user:"user01"})

然而報錯:

到這我們是可以想到的,由於服務已經帶驗證啟動了,所以目前直接登錄雖然允許訪問admin數據庫,但是沒有任何權限。

所以我們要將服務改為不帶驗證的方式。

因為服務安裝時指定了配置文件,所以我們只需要注釋掉配置文件中的authoriation項或改為disabled即可,重啟服務后生效。

這時候我們跟着官方文檔走,創建一個管理員賬戶:

db.createUser(
    {
    user:"usr01", 
    pwd:"123456",
    roles:["dbAdmin"]
    }    
)

參考官方介紹, roles參數是一個Bson結構的數組,寫法可以是簡化的角色名,也可以是完整的角色對象:

roles:[
	{role:"readWrite", db:"file"},
	{role:"DbAdmin", db:"file"}
]

 

 用戶創建好了之后,就可以將服務改回帶驗證啟動了。

再登錄:

.\mongo.exe -u usr01 -p 123456rt --authenticationDatabase "admin" -port 27018

 即可進入被授權的admin數據庫。

關於mongoDB的用戶角色分為內置角色和用戶定義角色,具體可參考:

https://docs.mongodb.com/manual/reference/built-in-roles/#built-in-roles

這里有一點坑的是,當我在localhost下以前邊創建的usr01賬戶登錄,並且希望為新的Collection創建一個專用賬戶並賦予權限時,始終報錯提示我沒有權限進行操作,即便我重新使用root賬戶登錄,也依然不行。

最后是在官方文檔里發現這樣一段:

 

換到另一台機器上,使用客戶端連接,可以修改或新增用戶了。

 

 

【其他】

順便一提,配置文件中的BindIP選項不知道是什么原理,如果第一位寫了127.0.0.1,雖然官方文檔說可以 用逗號分隔,設置多個地址,但這樣配置之后只能通過localhost客戶端去連接。大概需要把范圍更大的放前邊吧。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM