1. 程式人生 > >MongoDB二次勒索過後,如何加強資料庫安全防範?

MongoDB二次勒索過後,如何加強資料庫安全防範?

作者介紹

上海小胖[Miracle Young],中國第十五位MONGODB PROFESSIONAL獲得者,資深Python開發、DBA。DevOps的踐行者,曾獨立開發Web服務平臺,電商爬蟲系統、運維管理系統,涵蓋資料熱力圖、核心資料監控、伺服器監控系統等。個人部落格:https://segmentfault.com/u/shanghaixiaopang。

原本這周想寫一個系列關於 GDPR(General Data Protection Regulation) MongoDB 的,但是9月5日爆出了超2.6W 個MongoDB 節點被劫持。所以臨陣變卦,決定寫一篇關於MongoDB安全的文章。

是什麼心理讓各位Developer & DBAer 在發生瞭如此大的比特幣勒索事件後,還是敢於裸奔?縱使覺得資料不重要、有備份,出於對安全的意識,是不是也應該使用一些安全保護措施呢?

注:裸奔在此處的解釋為,使用預設埠27017,並對公網開放,未做任何防火牆措施,同時未開啟認證和鑑權的MongoDB 資料庫)

一、現狀

此前我再次驗證了目前的MongoDB 節點裸奔的情況,情況非常不容樂觀。通過檢視 SHODAN,我發現目前還有超過5W個節點的MongoDB 是在使用預設埠27017的,其中老美和中國佔據半壁江山。
MongoDB
而在第一頁中,我就看到一個裸奔的節點:
資料量並不大,為了驗證節點的有效性,這裡僅作為論證參考,不對該節點進行任何影響。
MongoDB
從圖中,我們可以看到,這臺機器顯然並沒有逃過hacker的攻擊,當hacker們攻擊了MongoDB的節點之後,會備份你的資料,並刪除所有資料,同時會刪除journal 日誌,這樣就算是 Enterprise 版本,也審計不到了。hacker的攻擊方式其實非常簡單,可以簡單分為以下幾步:
  1. 通過類似SHODAN 這樣的網站(諸如:ZoomEye等)提供的API,進行全網掃描,MongoDB 那就是掃描27017埠
  2. 獲取到IP後,進行嗅探
  3. 如果可以獲取到登入資訊,那麼執行指令碼(備份全庫、清理journal、留下打款賬號資訊)
  4. 具體的實現,這裡不做過多描述,目的不是為了教學攻破MongoDB,而是為了給大家敲響警鐘。

二、防範

通過以上,我們可以清楚地意識到只要做到基本的防範措施,不處於裸奔狀態,黑客就不會那麼輕易的進入我們DB中了。需要強調的是,MongoDB官方給出一個預設不加密的配置,是為了方便developer的快速搭建環境,但並不意味著可以如此上線。因此,在上線前,我們需要對照著MongoDB 官方給出的CheckList去校驗一次。Enable Access Control and Enforce Authentication首先肯定是開啟我們的authentication。
開啟方式非常簡單:1.在admin資料庫中,建立一個admin 使用者

use admin

db.createUser(

{

user: “myUserAdmin”,

pwd: “abc123”,

roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ]

}

)

2.在啟動項中加入–auth,或者在配置檔案中加入 security.authorization: enabled.

mongod –auth –port 27017 –dbpath /data/db1

3.使用之前建立的myUserAdmin 使用者登入mongo

mongo –port 27017 -u “myUserAdmin” -p “abc123” –authenticationDatabase “admin”

4.在應用庫中建立一個具有讀寫許可權的應用賬號。(注意:在MongoDB中,賬號跟著資料庫走,也就是說在哪個資料庫下建立的,該賬號就屬於哪個庫)

use test

db.createUser(

{

user: “myTester”,

pwd: “xyz123”,

roles: [ { role: “readWrite”, db: “test” },

{ role: “read”, db: “reporting” } ]

}

)

Configure Role-Based Access Control

這裡需要明確的是,MongoDB的基本安全分為兩種:一種是認證,一種是鑑權。其實英語會說的比較明白點: authorization, authentication。

認證是作為使用者登入的一種賬號密碼校驗,類似MySQL 的 root/password ,在大部分應用中,一旦建立一個連線(用於連線池的),那麼該連線只會做一次,所以大可不必擔心因為認證而帶來的開銷。

鑑權是在資料庫中的賬號擁有的許可權做鑑定,類似MySQL中的privilege。

Encrypt Communication

開啟MongoDB 的TLS/SSl 的配置,社群版需要下載一個SSL版本,或者可以從社群版通過升級步驟升級到SSl版本,企業版自帶SSL。

SSL 可以保證MongoDB的 所有連線(輸入和輸出的連線)都是加密的。

Encrypt and Protect Data

MongoDB 3.2 WT 引擎推出了一個新的加密功能,僅限企業版,可以對物理資料檔案進行加密,若不開啟,則預設通過系統對檔案進行加密。

Limit Network Exposure

通過指定bindIp ,並在生產線上關閉MongoDB 的Http介面來達到規避網路進口的安全問題。

Audit System Activity

MongoDB 企業版同時提供了審計功能,幫助使用者更好的巡檢自己的資料庫。

Run MongoDB with a Dedicated User

使用MongoDB使用者 啟動MongoDB,而不是使用root 使用者。

三、後續

希望大家在經過2次 MongoDB 的打劫後,都提高警惕了。把自己的生產節點都check 一遍。避免同樣的悲劇在發生。

原文來自微信公眾號:DBAplus社群