MongoDB安全加固,防止資料庫攻擊刪除勒索威脅

2022-12-11 06:00:44

前言:

  今天發現前段時間自己搭建的一個系統的MongoDB資料找不到了,覺得很奇妙,然後登上MongoDB資料庫發現多了一個名為READ__ME_TO_RECOVER_YOUR_DATA的資料庫,裡面還有一個README的集合裡面包含了下面描述的勒索資訊。沒錯我的MongoDB資料庫被攻擊了,不過還好這個系統裡面的資料都是自己學習的一些沒有任何價值的資料。但是換個角度,假如在公司層面遇到這樣的事情那一定是天大的事情了,你要面臨公司、客戶資訊保安問題。所以無論是自己學習,還是工作方面我們都要養成時刻做好保護自己軟體程式,及其資料來源安全的問題。今天主要來講講為什麼MongoDB這麼容易遭遇勒索的原因和我們該如何做好防護措施。

README檔案內容如下:

All your data is a backed up. You must pay 0.06 BTC to 168i2g62fcXwu3GYAJM4FAksxEmNnDjCkm 48 hours for recover it. After 48 hours expiration we will leaked and exposed all your data. In case of refusal to pay, we will contact the General Data Protection Regulation, GDPR and notify them that you store user data in an open form and is not safe. Under the rules of the law, you face a heavy fine or arrest and your base dump will be dropped from our server! You can buy bitcoin here, does not take much time to buy https://localbitcoins.com or https://buy.moonpay.io/ After paying write to me in the mail with your DB IP: [email protected] and/or [email protected] and you will receive a link to download your database dump.

翻譯過來就是:

你所有的資料都有備份。你必須支付0.06位元幣到168i2g62fcXwu3GYAJM4FAksxEmNnDjCkm 48小時來恢復它。在48小時到期後,我們將洩露和暴露您的所有資料。在拒絕付款的情況下,我們將聯絡通用資料保護條例(GDPR),並通知他們您以公開形式儲存使用者資料,這是不安全的。根據法律規定,你將面臨鉅額罰款或逮捕你的資料庫將從我們的伺服器上刪除!你可以在這裡購買位元幣,不需要太多時間購買https://localbitcoins.com或https://buy.moonpay.io/支付後寫信給我的郵件與你的DB IP: [email protected]和/或[email protected],你會收到一個連結下載你的資料庫轉儲。

MongoDB漏洞成因:

  在初始安裝完畢的時候MongoDB都預設有一個admin資料庫,此時admin資料庫是空的,沒有記錄許可權相關的資訊!當admin.system.users一個使用者都沒有時,即使mongod啟動時新增了—auth引數,如果沒有在admin資料庫中新增使用者,此時不進行任何認證還是可以做任何操作(不管是否是以—auth 引數啟動),直到在admin.system.users中新增了一個使用者。加固的核心是隻有在admin.system.users中新增使用者之後,mongodb的認證,授權服務才能生效。

遭遇勒索的原因分析:

  首先我這個MongoDB資料庫是安裝在Docker上面的,因為都是是有預設安裝的方式,並且安裝完成以後都沒有開啟預設許可權驗證登入的功能。開啟MongoDB服務時不新增任何引數時預設是沒有許可權驗證的,登入的使用者可以通過預設埠無需密碼對資料庫任意操作(增刪改高危動作)而且可以遠端存取資料庫。並且我還使用了27017這個預設埠,所以駭客可以通過批次掃描Ip很快就能檢索到。

MongoDB安全加固措施:

 1、設定賬號密碼,開啟MongoDB的許可權存取

Docker安裝MongoDB時開啟許可權驗證的命令:

docker run -itd --name mongo-test -p 27017:27017 mongo --auth

引數說明:

  • -itd:其中,i是互動式操作,t是一個終端,d指的是在後臺執行。
  • --name mongo-test:容器名稱
  • -p 27017:27017 :對映容器服務的 27017 埠到宿主機的 27017 埠。外部可以直接通過 宿主機 ip:27017 存取到 mongo 的服務。
  • --auth:需要密碼才能存取容器服務(注意:安全問題,MongoDB預設是不開啟許可權驗證的,不過設定了這裡就相當於修改MongoDB的設定auth=ture啟用許可權存取)。

2、使用非預設的埠,減少網際網路上被埠掃描並定向爆破的概率

對MongoDB監聽的埠和IP做調整有下面2個目的

  • IP: 預設監聽IP為127.0.0.1,我們可能需要開放特定的CIDR來讓處於不同主機上的使用者端可以連線. 最簡單的就是直接允許任意IP的使用者端連線,這時CIDR為0.0.0.0.但是這也是很危險的一個操作,意味著全球網際網路上的任意一臺電腦都可以連線上來,這雖然方便但是也是最危險的,建議指定具體的CIDR,這樣可以排除網際網路的大量肉雞進行惡意的連線。
  • 埠: 預設的監聽埠為27017,我們可以改為其他埠,躲開網際網路上的惡意程式的掃描和連線。

修改/etc/mongod.conf

vim /etc/mongod.conf

在埠和IP監聽部分我們改為如下設定:

#network interfaces
net:
  port: 7017
  bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.

修改完成後重啟服務:

systemctl restart mongod

如果重啟失敗,可能是SELinux的安全策略限制了MongoDB使用新的埠,我們需要放行MongoDB使用新的埠:

[root@localhost thinktik]# semanage port -a -t mongod_port_t -p tcp 7017
bash: semanage: command not found
# 如果出現上面的錯誤,可以這樣這個解決:
[root@localhost thinktik]# dnf install policycoreutils-python-utils
Last metadata expiration check: 0:10:50 ago on Mon 27 Dec 2021 03:11:19 PM CST.
...

SELinux放行後,我們繼續重啟即可.

設定防火牆

如果你需要服務被網際網路上的其他電腦存取,那麼你需要設定防火牆,執行你的埠被存取

# 開放7017埠
[root@thinkvm01 thinktik]# firewall-cmd --zone=public --add-port=7017/tcp --permanent
# 過載防火牆
[root@thinkvm01 thinktik]# firewall-cmd --reload

3、限制存取IP

MongoDB可以限制只允許某一特定IP來存取,只要在啟動時加一個引數bind_ip即可,或者在/etc/mongodb.conf中新增bind_ip設定,如下:

# 方法一
mongod --bind_ip 127.0.0.1,10.0.133.14

# 方法二
在/etc/mongodb.conf檔案中新增以下內容:
bind_ip = 127.0.0.1,10.0.133.14
這樣之後,MongoDB伺服器端只有127.0.0.1和10.0.133.14這兩個 IP 可以存取了。

4、關閉萬網存取許可權

關閉外網存取許可權,也就是限定只能是內網存取。
在/etc/mongodb.conf中設定:

bind_ip 127.0.0.1

預防方法:

經過這裡勒索經歷,我總結了一下幾點:

  • 不要裸奔,首先把你資料庫的賬戶密碼設定好,做好許可權驗證登入!
  • 儘量不要把你的資料庫擺上公網,業務處理都儘量在內網進行!
  • 如果要擺上公網,一定要設定好存取許可權,繫結存取源 IP!
  • 記得養成資料備份的好習慣!

參考文章:

https://new.qq.com/rain/a/20210330A06AYX00

https://www.cnblogs.com/fundebug/p/how-to-protect-mongodb.html

https://juejin.cn/post/7049315722039656479