MongoDB安全事件的防範與反思
近段時間來,全球範圍內數以萬計的MongoDB實例被攻擊,這次事件從技術層面看並沒有什麼高深之處,應對措施也非常方便,下面以網易蜂巢MongoDB服務為例進行介紹。
首先,不要把MongoDB實例直接暴露在公網下,這是原則問題。可以說沒有任何理由將您的數據存儲服務部署在公網環境,蜂巢用戶的MongoDB實例都部署在私有網路中,跟公網相隔離。通過這個措施,可以抵擋掉絕大部分傷害。進一步,MongoDB實例所在的私網是用戶專用的,也就是說,該私網對蜂巢中的其他用戶也是隔離的,這又消除了被同一雲平台下其他用戶攻擊的可能。
其次,為MongoDB實例開啟認證並設置訪問賬號,這也是最基本的。啟動認證後,訪問者若不指定正確的賬號和密碼就無法正常訪問MongoDB實例。密碼應該設置成字母、數字和特殊符號的組合,可以大大提高被破解的難度。顯然,包括蜂巢MongoDB在內的主流MongoDB雲服務都開啟了認證。
可以說,做了上述幾點,基本上可以保證您的MongoDB數據是安全的。但還可以做得更好。
做好賬號許可權控制。MongoDB引入了非常細粒度的基於角色的許可權控制機制(RBAC),實例擁有者可以為不同的MongoDB使用者提供適當許可權等級的賬號,比如僅能讀/寫某個集合、資料庫;為MongoDB管理員提供 dbAdmin/userAdmin等許可權的賬號,可參考官方文檔Role-Based Access Control,該文檔對許可權管理進行了詳細地介紹。這樣,即使某個賬號泄露或被攻破,也可以最大限度減少損失。蜂巢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服務 網易蜂巢-新一代雲計算平台。
推薦閱讀:
※用 perf 和 SystemTap 跟蹤 MongoDB 訪問超時
※一個大型的SNS網站,是否適合資料庫全部用mongodb來做,為什麼?
※MongoDB導入CSV文件
※手把手教你 MongoDB 的安裝與詳細使用(一)
※MongoDB安裝(windows 10環境)