1. 程式人生 > >MongoDB安全事件的防範與反思

MongoDB安全事件的防範與反思

此文已由作者溫正湖授權網易雲社群釋出。

歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。


近段時間來,全球範圍內數以萬計的MongoDB例項被攻擊,作為旨在為使用者提供最優MongoDB雲服務的網易蜂巢MongoDB團隊在第一時間跟進了相關報道,雖然蜂巢MongoDB服務從設計初就將資料的安全性列為第一位,確保使用者資料安全,但本著高度負責的態度我們對MongoDB服務又進行了安全自檢,顯然,結果也沒讓大家失望。這次事件從技術層面看並沒有什麼高深之處,應對措施也非常方便,下面結合蜂巢MongoDB進行介紹。


首先,不要把MongoDB例項直接暴露在公網下,這是原則問題。可以說沒有任何理由將您的資料儲存服務部署在公網環境,蜂巢使用者的MongoDB例項都部署在私有網路中,跟公網相隔離。通過這個措施,可以抵擋掉絕大部分傷害。進一步,MongoDB例項所在的私網是使用者專用的,也就是說,該私網對蜂巢中的其他使用者也是隔離的,這又消除了被同一雲平臺下其他使用者攻擊的可能。


其次,為MongoDB例項開啟認證並設定訪問賬號,這也是最基本的。啟動認證後,訪問者若不指定正確的賬號和密碼就無法正常訪問MongoDB例項。密碼應該設定成字母、數字和特殊符號的組合,可以極大降低被破解的難度。顯然,包括蜂巢MongoDB在內的主流MongoDB雲服務都開啟了認證。


可以說,做了上述幾點,基本上可以保證您的MongoDB資料是安全的。但還可以做得更好。


做好賬號許可權控制。MongoDB引入了非常細粒度的基於角色的許可權控制機制(RBAC),例項擁有者可以為不同的MongoDB使用者提供適當許可權等級的賬號,比如僅能讀/寫某個集合、資料庫;為MongoDB管理員提供 dbAdmin/userAdmin等許可權的賬號,可參考官方文件

https://docs.mongodb.com/manual/core/authorization/,該文件對許可權管理進行了詳細地介紹。這樣,即使某個賬號洩露或被攻破,也可以最大限度減少損失。蜂巢MongoDB服務為使用者提供readWriteAnyDatabase許可權的賬號,使用者僅能通過雲控制檯來修改密碼。避免賬號洩露密碼被篡改。後續,我們還將為使用者提供增強版的MongoDB資料庫和賬號管理功能,敬請期待!


將MongoDB埠設定為非預設埠。大家都知道27017埠是MongoDB的,3306是埠MySQL的,暴露在公網的MongoDB例項,如果使用預設埠,別有用心的他們telnet下就連上了。當然了,你選擇其他埠無法從根本上解決問題,但至少加了層防護,所以也應該考慮。在網易蜂巢雲平臺,使用者在建立蜂巢MongoDB例項時可以指定埠。


在網易蜂巢(雲端計算基礎服務),除了以上防護外,我們還提供了平臺級的安全保證,網易內部有專門的安全部門負責掃描和識別安全隱患,一旦發現既會通知相應的產品負責人第一時間解決問題,排除隱患。


如果因為上述防護沒有做到位等原因,您的MongoDB例項還是被攻破了,資料被刪或被勒索,那麼至少應該有備份可以用來恢復資料。所以平時做好資料備份是非常重要的,不僅僅在防“盜”(黑客)時有用,防“火”(軟硬體故障)時也很有用,同時也可以用來防止資料被誤刪。蜂巢MongoDB提供手動備份功能,使用者可以隨時為您的例項進行備份,比如在load完一批重要資料後;還提供了自動備份能力,週期性地將您的資料備份到網易物件儲存服務NOS上,免費的哦!在需要進行資料恢復時,使用者可選擇對應時間點的備份,將資料恢復到一個新的例項上。


到此,本文可以結束了。但我一直有個疑問未解:為什麼會有那麼多裸奔的MongoDB例項?我認真閱讀了該事件被報道後的幾乎每篇文章,但目前還沒有分析這些例項的具體情況,這些例項建立者到底是些什麼人,是不是“傻子太多,騙子不夠用了”?下面談談我的看法:


裸奔的MongoDB很多是用於學習的。MongoDB目前已經在全球資料庫排老四了,肯定有一大波App開發者、資料庫運維、在校學生和其他對MongoDB感興趣的朋友們在學習MongoDB,那麼在公有云平臺上搭建個測試例項用於學習這種事情很好理解。什麼,開啟認證設定密碼?一是或許還不會,二是估計也是嫌麻煩,反正裸奔也挺時尚。


裸奔的MongoDB很多是用於測試的。這麼火的MongoDB,公司要上新業務做資料庫選型時,怎麼也得納入候選列表,那就得搭個測試環境,調研試用一番,再測測功能。於是,也會產生一堆例項,或許資料量還挺大的。


如果上面兩種情況佔了裸奔例項大部分,那麼不是壞事,我們應該以積極的心態來看待。當然,可能還有很多的確是跑著線上業務的。對於這部分例項,可能又可以分為兩種:


一是,程式開發者搭建的。因為MongoDB對移動App開發者等程式設計師來說比較友好,使用JSON、模式自由、故障移動處理,所以很省事、上手很快,某些專案為了趕進度,或為了控制成本,團隊中沒有專門的資料庫運維,直接讓App開發搭個用於儲存後端資料的MongoDB例項,於是,難免就出現在公網裸奔的MongoDB例項。對於這種情況,真不能怪App開發,人家本來就不是幹這塊的。MongoDB能夠大大提高專案的開發效率,確實很好用,但團隊中如果沒有MongoDB運維能人,勸專案的負責人還是將MongoDB部署在專業的MongoDB雲服務平臺上或請MongoDB官方技術團隊協助吧,但相比應該前一種更實惠,尤其是網易蜂巢MongoDB雲服務。


二是,確實是團隊專職的運維人員負責搭建的。對於這類,只能說:“把資料庫暴露在公網實在是心太大…”。暴露在公網而且不設密碼,這行為絕對是公害啊,被坑的專案負責人應該把他們一個個找出來判刑,並把名單全球公佈,永久封殺。然後把MongoDB例項遷到蜂巢上。


最後總結下,對於資料儲存這類安全性要求極高的服務,應該把部署和運維交給專業的團隊,不能用“臨時工”。歡迎大家使用網易蜂巢(雲端計算基礎服務)MongoDB服務。




網易雲免費體驗館,0成本體驗20+款雲產品! 

更多網易技術、產品、運營經驗分享請點選





相關文章:
【推薦】 IOS渠道追蹤方式
【推薦】 Google準實時資料倉庫Mesa(一)