MongoDB數據庫未授權訪問漏洞及加固

https://help.aliyun.com/knowledge_detail/37451.html

近日安全團隊經檢測發現部分阿里雲用戶存在MongoDB數據庫未授權訪問漏洞,漏洞危害嚴重,可以導致數據庫數據泄露或被刪除勒索,從而造成嚴重的生產事故。爲保證您的業務和應用的安全,提供以下修復漏洞指導方案。

具體漏洞詳情如下:

1.漏洞危害

開啓MongoDB服務時不添加任何參數時,默認是沒有權限驗證的,登錄的用戶可以通過默認端口無需密碼對數據庫任意操作(增刪改高危動作)而且可以遠程訪問數據庫。

2.漏洞成因

在剛安裝完畢的時候MongoDB都默認有一個admin數據庫,此時admin數據庫是空的,沒有記錄權限相關的信息!當admin.system.users一個用戶都沒有時,即使mongod啓動時添加了—auth參數,如果沒有在admin數據庫中添加用戶,此時不進行任何認證還是可以做任何操作(不管是否是以—auth 參數啓動),直到在admin.system.users中添加了一個用戶。加固的核心是只有在admin.system.users中添加用戶之後,mongodb的認證,授權服務才能生效。

3.MongoDB未授權漏洞加固方案

重要提示:如果您需要自己搭建MongoDB數據庫,強烈推薦您使用yum rpm方式安裝MongoDB Server 服務

MongoDB加固方案如下:

1) 修改默認端口

修改默認的mongoDB 端口(默認爲:TCP 27017)爲其他端口

2) 不要把MongoDB服務器部署在互聯網上或者DMZ

使用安全組防火牆或本地操作系統防火牆對訪問源IP進行控制,如果僅對內網服務器提供服務,建議禁止將mongoDB服務發佈到互聯網上

3) 使用- -bind_ip選項

該選項可以限制監聽接口IP, 當在啓動mongodb的時候,使用 -bind_ip 192.168.0.1表示啓動ip地址綁定,數據庫實例將只監聽192.168.0.1的請求。

4) 啓動基於角色的登錄認證功能

在admin 數據庫中創建用戶,如 supper 密碼爲 sup(此處均爲舉例說明,請勿使用此賬號密碼)
步驟一:在未開啓認證的環境下,登錄到數據庫
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27028 (此處修改了默認端口)
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27028/test
步驟二:切換到admin數據庫

use admin
switched to db admin

步驟三:創建管理員賬號
db.addUser(“supper”, “supWDxsf67%H”) —-賬號不要設置爲常見賬號,密碼需要滿足一定的複雜度,至少8位以上,包括大小寫字母、數字、特殊字符混合體,不要使用生日、姓名、身份證編號等常見密碼。
{ “n” : 0, “connectionId” : 4, “err” : null, “ok” : 1 }
{
“user” : “supper”,
“readOnly” : false,
“pwd” : “51a481f72b8b8218df9fee50b3737c44”,
“_id” : ObjectId(“4f2bc0d357a309043c6947a4”)
}
步驟四:驗證用戶是否創建成功
db.auth(“supper”,”supWDxsf67%H”)
1
exit
bye
步驟五:殺掉進程,重啓mongoDB服務
./mongod –dbpath=/path/mongodb –bind_ip=192.168.0.1 –port=27028 –fork=true logpath=/path/mongod.log &
說明:

1.admin.system.users中將會保存比在其它數據庫中設置的用戶權限更大的用戶信息,擁有超級權限,也就是說在admin中創建的用戶可以對mongodb中的其他數據庫數據進行操作;

2.mongodb系統中,數據庫是由超級用戶來創建的,一個數據庫可以包含多個用戶,一個用戶只能在一個數據庫下,不同數據庫中的用戶可以同名;

3.當admin.system.users一個用戶都沒有時,即使mongod啓動時添加了—auth參數,如果沒有在admin數據庫中添加用戶,此時不進行任何認證還是可以做任何操作(不管是否是以—auth 參數啓動),直到在admin.system.users中添加了一個用戶;

4.特定數據庫比如DB1下的用戶User1,不能夠訪問其他數據庫DB2,但是可以訪問本數據庫下其他用戶創建的數據;

5.不同數據庫中同名的用戶不能夠登錄其他數據庫,比如DB1,DB2都有user1,以user1登錄DB1後,不能夠登錄到DB2進行數據庫操作;

6.在admin數據庫創建的用戶具有超級權限,可以對mongodb系統內的任何數據庫的數據對象進行操作;

7.使用db.auth()可以對數據庫中的用戶進行驗證,如果驗證成功則返回1,否則返回0! db.auth() 只能針對登錄用戶所屬的數據庫的用戶信息進行驗證,不能驗證其他數據庫的用戶信息,因爲訪問不了其他數據庫。

更多選項參見:MongoDB – Add Users and Authenticate

5)禁用HTTP和REST端口

MongoDB自身帶有一個HTTP服務和並支持REST接口。在2.6以後這些接口默認是關閉的。mongoDB默認會使用默認端口監聽web服務,一般不需要通過web方式進行遠程管理,建議禁用。修改配置文件或在啓動的時候選擇–nohttpinterface 參數nohttpinterface = false

6)開啓日誌審計功能

審計功能可以用來記錄用戶對數據庫的所有相關操作。這些記錄可以讓系統管理員在需要的時候分析數據庫在什麼時段發生了什麼事情。具體請參見:Mongodb審計功能

7)使用SSL加密功能

MongoDB集羣之間以及從客戶端連接到MongoDB實例的連接應該使用SSL。使用SSL對性能沒有影響並且可以防範類似於man-in-the-middle的攻擊。

注意MongoDB社區版默認並不支持SSL。您可以選用MongoDB企業版(有SSL支持),或者從源碼重新編譯MongoDB並使用 —ssl 選項來獲得SSL功能。

具體請參見:Configure mongod and mongos for TLS/SSL

以上所有配置推薦以配置文件形式保存配置

[mongodb@rac3 bin]$ vim /path/mongod.conf
port=27028——-端口。默認27017,MongoDB的默認服務TCP端口,監聽客戶端連接。要是端口設置小於1024,比如1021,則需要root權限啓動,不能用mongodb帳號啓動,(普通帳號即使是27017也起不來)否則報錯:[mongo –port=1021 連接]
bind_ip=192.168.0.1——綁定地址。默認127.0.0.1,只能通過本地連接。進程綁定和監聽來自這個地址上的應用連接。要是需要給其他服務器連接,則需要註釋掉這個或則把IP改成本機地址,如192.168.200.201[其他服務器用 mongo –host=192.168.200.201 連接] ,可以用一個逗號分隔的列表綁定多個IP地址。
logpath=/path/mongod.log——開啓日誌審計功能,此項爲日誌文件路徑,可以自定義指定
pidfilepath=/path/mongod.pid——進程ID,沒有指定則啓動時候就沒有PID文件。默認缺省。
auth=true——用戶認證,默認false。不需要認證。當設置爲true時候,進入數據庫需要auth驗證,當數據庫裏沒有用戶,則不需要驗證也可以操作。直到創建了第一個用戶,之後操作都需要驗證。
logappend=true——寫日誌的模式:設置爲true爲追加。默認是覆蓋。如果未指定此設置,啓動時MongoDB的將覆蓋現有的日誌文件。
fork=true——是否後臺運行,設置爲true 啓動 進程在後臺運行的守護進程模式。默認false。
nohttpinterface = false——是否禁止http接口,即28017 端口開啓的服務。默認false,支持。
然後啓動mongod時加載配置文件

[mongodb@rac3 bin]$ ./mongod -f /path/mongod.conf

發佈了121 篇原創文章 · 獲贊 16 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章