MongoDB最佳安全實踐

2021-10-06 12:36:19 字數 3469 閱讀 5117

近幾年,mongodb應用越來越多,mongodb也越來越火。

從2023年開始,mongodb被一些「非法組織/黑客」盯上了。他們的做法也很簡單,連到你的資料庫上,把你的資料拿走,然後把你的庫清空,留乙個訊息給你,索要位元幣。

跟最近流行的勒索病毒乙個套路。

我在某個雲上有一台伺服器,主要用來做各種研究和測試,隨時可以格了重灌的那種。上面跑著乙個mongodb,是用預設的引數簡單啟動的乙個單例項。

早上起來,跑程式測試時,程式直接報錯。

跟蹤**,發現是頭天寫進去的資料不見了。

進到資料庫,發現資料庫都在,但裡面的表全被清空了,多了乙個readme的表。檢視這個表的內容:

> db.readme.find(

).pretty(

)

簡單來說,這是乙個通知:你的資料被我們綁架了,想要贖回去,需要0.2個位元幣。

一身冷汗。如果這是乙個生產環境,如果這是乙個系統的運營資料,後果不堪設想。

究其原因,這個資料庫在啟動時,用了預設的引數,未加任何防護。

所以,一定不要用預設的設定執行mongodb資料庫!

一定不要用預設的設定執行mongodb資料庫!

mongodb啟動時,使用了幾個預設的埠:

27017: 用於一般的單例項(mongod),或者集群中路由伺服器(mongos)

27018: 用於集群中的分片伺服器

27019: 用於集群中的配置伺服器

實際佈署時可以把預設埠換成別的埠。

命令列:

$ ./mongod --port port_number
配置檔案:

port=port_number
##2. 繫結ip

這個要區分一下mongodb的版本。

查詢mongodb版本的命令:

$ ./mongod --version
在mongodb version 3.6之前,mongodb啟動時預設繫結到伺服器的所有ip上。換句話說,通過所有的ip都可以訪問資料庫,這兒的安全隱患在於外網ip。

在3.6之後,mongodb啟動預設繫結127.0.0.1,從外網無法訪問,去掉了這個隱患。

設定繫結ip,命令列:

$ ./mongod --bind_ip your_ip #單ip繫結

或$ ./mongod --bind_ip your_ip1,your_ip2 #多ip繫結

配置檔案:

bind_ip=your_ip #單ip繫結

或bind_ip=your_ip1,your_ip2 #多ip繫結

mongodb還提供了乙個一次繫結所有ip的引數。命令列:

$ ./mongod --bind_ip_all
配置檔案:

bind_ip_all=true
另外,繫結時,your_ip也可以換成網域名稱your_host,效果是一樣的。

在生產環境中,出於安全的需要,通常可以設定資料庫繫結到伺服器的內網ip,供資料層運算元據庫就好。如果有特殊需要,可以臨時繫結到外網ip,操作完成後再去掉。

資料庫切換繫結ip和埠,對資料庫本身沒有任何影響。

##3. 資料庫伺服器內部身份認證

資料庫伺服器的內部身份認證,是更高乙個層次的安全策略,用於保證主從/複製集/集群中各個資料庫伺服器的安全合法接入。

內部身份認證,首先需要有乙個數字金鑰。

數字金鑰可以使用機構簽發的證書來生成,也可以使用自生成的金鑰。

當然在低安全級別的情況下,你也可以隨手寫乙個金鑰來使用。

自生成金鑰的生成命令:

$ openssl rand -base64 756 > path_to_keyfile
然後設定金鑰檔案的讀寫許可權:

$ chmod 400 path_to_keyfile
看一下金鑰檔案:

$ ls -l

-rw-r--r-- 1 test

test 1024 5 10 17:51 test.key

下面,為資料庫啟用金鑰檔案。命令列:

$ ./mongod --keyfile path_to_keyfile
配置檔案:

keyfile=path_to_keyfile
注意:

mongodb支援為資料庫建立使用者和分配角色,用使用者和角色來管理和使用資料庫。

mongodb建立使用者操作和上面不同。上邊的內容,是在資料庫執行以前進行,而建立使用者,是在資料庫執行以後。

$ ./mongo your_ip:your_port

> use admin

switched to db admin

> db.createuser(]}

)successfully added user:

]}

這樣我們就加入了乙個使用者。

mongodb內建的角色分以下幾類:

角色不詳細解釋了,角色名稱的英文寫的很明白。

在實際操作中,通常會將使用者建在admin中,用roles裡的db來指定使用者可以使用或管理的資料庫名稱。

通過這一通操作,我們已經在資料庫中建立好了使用者。下面需要伺服器啟用鑑權。

命令列:

./mongod --auth
配置檔案:

auth=true
這個用於mongod啟動的資料庫。對於集群的router,即mongos,會預設啟用auth,所以不需要顯式啟用。

當mongodb啟用鑑權後,再用mongo客戶端連線資料庫,就需要輸入使用者帳號資訊了。

$ ./mongo -u user_name -p user_password your_ip:your_port/admin

或$ ./mongo -u user_name -p your_ip:your_port/admin #提示輸入密碼

同樣,在**中,資料庫連線串也同步變成了:

"mongoconnection"

:"mongodb://user_name:user_password@localhost:27017/admin?wtimeoutms=2000"

一般來說,做完上面的安全處理,就可以完全滿足生產環境的安全要求了。

再高的要求,可以通過啟用tls來強化。這會是另乙個文章。

MongoDB 最佳實踐

已經有很多關於 nosql 選擇的文章了。影響你選擇資料庫的因素有 讀 寫操作的吞吐量,永續性,一致性,延遲性等等。nathan hurst 的文章 visual guide to nosql system 很好的總結了這一點。nosql 通用的最佳實踐 1.徹底的測試 模擬你的生產環境,包括流量來...

MongoDB最佳實踐

將mongodb加入到我們的服務支援列表中,是整個團隊年初工作計畫中的首要任務。但我們感覺如果先新增一項對nosql儲存的支援,而不是先公升級已支援的關係型資料庫,可能對使用者不太好,畢竟目前的使用者都使用關係型資料庫。所以我們決定將引入mongodb這項工作放到公升級mysql和postgresq...

mongodb 最佳實踐

不要按照關係型來設計表結構 mongodb可以讓你像關係型資料庫一樣設計表結構,但是它不支援外來鍵,也不支援複雜的join!如果你的程式發現有大量實用join的地方,那你的設計可能需要重新來過。參照以下相關模式設計建議。資料庫集合 collection 的數量不宜太多 mongodb的模式設計基於靈...