近日安全團隊經檢測發現部分阿里雲用戶存在MongoDB數據庫未授權訪問漏洞,漏洞危害嚴重,可以導致數據庫數據泄露或被刪除勒索,從而造成嚴重的生產事故。為保證您的業務和應用的安全,提供以下修復漏洞指導方案。
具體漏洞詳情如下:
1.漏洞危害
開啟MongoDB服務時不添加任何參數時,默認是沒有權限驗證的,登錄的用戶可以通過默認端口無需密碼對數據庫任意操作(增、刪、改、查高危動作)而且可以遠程訪問數據庫。
2.漏洞成因
在剛安裝完畢的時候MongoDB都默認有一個admin數據庫,此時admin數據庫是空的,沒有記錄權限相關的信息!當admin.system.users一個用戶都沒有時,即使mongod啟動時添加了—auth參數,如果沒有在admin數據庫中添加用戶,此時不進行任何認證還是可以做任何操作(不管是否是以—auth 參數啟動),直到在admin.system.users中添加了一個用戶。加固的核心是只有在admin.system.users中添加用戶之后,mongodb的認證,授權服務才能生效。
3.漏洞自查
您可以登錄到阿里雲雲盾控制台,使用雲盾安騎士MongoDB檢測是否存在此安全問題:
如果您是MongoDB管理員,也可以使用以下方式檢查是否有進一步的入侵行為:
1.查看MongoDB的日志是否完整,並確認執行刪除數據庫的源IP地址和時間、行為;
2.檢查MongoDB帳戶以查看是否沒有人添加了密碼(admin)用戶(使用db.system.users.find()命令);
3.檢查GridFS以查看是否有人存儲任何文件(使用db.fs.files.find()命令);
4.檢查日志文件以查看誰訪問了MongoDB(show log global命令)。
4.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 密碼為 supWDxsf67%H(此處均為舉例說明,請勿使用此賬號密碼)
步驟一:在未開啟認證的環境下,登錄到數據庫
[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")
或
>db.createUser({user:"supper",pwd:"supWDxsf67%H",roles:["root"]})
{ "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 }
{
"user" : "supper",
"readOnly" : false,
"pwd" : "51a481f72b8b8218df9fee50b3737c44",
"_id" : ObjectId("4f2bc0d357a309043c6947a4")
}
新增的用戶在system.users中
> db.getCollectionNames()
[ "system.indexes", "system.users", "system.version" ]
說明:
1)MongoDB從V3版本開始取消使用addUser方法,采用db.createUser方法創建用戶;
2)賬號不要設置為常見賬號,密碼需要滿足一定的復雜度,至少8位以上,包括大小寫字母、數字、特殊字符混合體,不要使用生日、姓名、身份證編號等常見密碼。
步驟四:驗證用戶是否創建成功
> 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
8)對業務關鍵敏感數據進行加密存儲
建議用戶梳理業務數據,對關鍵的敏感數據加密后入庫,例如:賬號、密碼、郵箱地址、手機號碼、身份ID等其他數據,加密算法推薦選擇國際通用加密算法和多次加鹽組合自定義算法,防止加密算法被破解。
黑客如果獲取數據后,也查看不了數據,通過“看不懂”的數據加密方式將損失降到最低。
9)對數據進行本地異地備份
好的備份策略是保證數據安全的最后一根救命稻草。
推薦:可靠的本地備份+遠程備份存儲方案
MongoDB備份方式:
>mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
-d:
需要備份的數據庫實例,例如:test
-o:
備份的數據存放位置,例如:c:\data\dump,該目錄需要提前建立,在備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里面存放該數據庫實例的備份數據。
MongoDB數據恢復
mongodb使用 mongorestore 命令來恢復備份的數據。
語法
mongorestore命令腳本語法如下:
>mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
-h:
MongoDB所在服務器地址
-d:
需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
--directoryperdb:
備份數據所在位置,例如:c:\data\dump\test,這里為什么要多加一個test,而不是備份時候的dump。
--drop:
恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,備份后添加修改的數據都會被刪除,慎用哦!
mongodump 命令可選參數列表如下所示:
-
備份策略
全量備份:可以最快的時間快速恢復所有數據,缺點是備份成本大,時間長;
全量備份+增量備份:可以較快的恢復所有數據,缺點是恢復時間長,如果增量數據有問題,無法恢復所有數據;
搭建從庫,直接切換到從庫,前提是從庫的數據安全可靠。
10)使用阿里雲MongoDB雲服務
您可以使用更低的成本解決MongoDB的安全問題,阿里雲MongoDB雲數據庫服務從設計之初就重點考慮了安全問題,比如,針對刪除數據庫的勒索事件,完全不受影響。
更多關於MongoDB加固內容參見:MongoDB security checklist