導言
大意失荊州,裸奔的
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
較高的安全性,可這卻是非常容易忽略的點。希望大家引以為戒。
MongoDB
總結
- 一定不能疏忽大意,安全意識要加強。
- 一定要結果實際驗證,才能下結論。不能不清楚外置條件,人雲亦雲。
- 不要有我的應用小,就不會被黑這種想法。批量攻擊,才不會放過你。
- 定期做好資料備份,被攻擊是一回事,能否恢複又是另外一回事了。