天天看點

記一次MongoDB裸奔

導言

大意失荊州,裸奔的

MongoDB

被黑了。雖然并不是什麼非常重要的資料,但也給自己敲響的一個警鐘。雖然我們平時不容易接觸到資料安全,但我們在開發,部署項目的時候,一定要養成良好的安全意識。

根據木桶原理,整個系統的安全性,取決于整個系統最薄弱的環節。是以,我們要盡可能多的考慮更多組成部分的安全性。

事件發現

本月初,發生了大家所熟知的

MondoDB贖金事件

。當時本人也保持了一定的關注,并去 https://www.shodan.io/ 溜達了一圈,順便連了幾個裸奔的MongoDB(當然,絕未做任何更改)。

直到昨天下午,發現我應用的管理者賬戶登入不上了。多次檢查密碼,發現還是無法解決,此時有點懷疑被黑了。由于應用有建立使用者功能,建立一個和管理者賬戶同名的賬戶,居然成功了。這個時候,我想多半是遭了,隻等晚上回去确認了。

回到家,遠端到伺服器,一連接配接,果然遭了(可憐我那幾十個代碼片段 + 幾個Gist),需要贖金0.1BTC。

原因分析

此時可能就要問了,都知道了裸奔不安全,為嘛還不修複?

我能說我懶麼?心大麼?

因為當時我部署的版本的3.2,據說3.2預設沒有開啟外網通路。我心大到直接未經嘗試就認為這是對的。

實際這句話也沒錯,Linux版本的

3.x

确實是預設綁定到

127.0.0.1

上的。可TM我是運作在

Windows

上的,由于安裝的時候,預設沒有建立配置檔案,導緻一運作就綁定到所有host上了。

當上,以上都是外因!根本原因還是自己疏忽大意,安全意識薄弱。

解決(重頭再來)

沒有備份,直接無法恢複。

另外,0.1個BTC我是拿不出來的(我也不相信他會好心給你恢複),再加上資料也不是太重要,就直接把安全設定配置上,重頭開始。

那現在是如何配置安全性的呢?

以下操作,均在未開啟授權通路時執行

首先是添加使用者并設定角色:

# 切換到admin庫
use admin

# 建立User
db.createUser({user: '<name>', pwd: '<password>', roles: [
	{role: 'readWrite', db: '<dbname>'},
	{role: 'dbAdmin', db: '<dbname>'}
]})
           

接下來就是建立一個配置檔案(2.6之後,配置檔案是yaml格式),内容如下:

systemLog:
    destination: file
    path: c:\data\log\mongod.log
storage:
    dbPath: c:\data\db
net:
    bindIp: 127.0.0.1
    port: 27017
           

注意:配置檔案中一定要設定

log path

db path

注意2:如果要限制外網通路,就可以配置 net -> bindIp,另外也可以調整端口

此時如何運作呢?

mongod --config "D:\MongoDB\mongod.conf" --auth
           

帶上

--auth

就是開啟授權通路。

最後用戶端通路也需要稍微修改下,隻需要修改

mongoAddress

配置即可:

# MongoDB Connection String Format
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

# 執行個體位址
const mongoAddress = 'mongodb://admin:[email protected]:27017/dojo'
           

就這麼一點簡單的步驟,就能實作

MongoDB

較高的安全性,可這卻是非常容易忽略的點。希望大家引以為戒。

總結

  1. 一定不能疏忽大意,安全意識要加強。
  2. 一定要結果實際驗證,才能下結論。不能不清楚外置條件,人雲亦雲。
  3. 不要有我的應用小,就不會被黑這種想法。批量攻擊,才不會放過你。
  4. 定期做好資料備份,被攻擊是一回事,能否恢複又是另外一回事了。