標籤:擷取 報錯 supper span 配置 載入 db2 objectid 指定連接埠
早上起來,發現生產資料庫被刪了,留下一個資料庫名叫“PLEASE_READ”,裡面內容如下:
"Info" : "Your DB is Backed up at our servers, to restore send 0.1 BTC to the Bitcoin Address then send an email with your server ip",
"Bitcoin Address" : "地址",
"Email" : "[email protected]"
資料庫部署在亞馬遜,用的預設27017連接埠,而且防火牆設定對0.0.0.0/32開放 (作死啊!)
資料庫也沒有設定密碼。
下面講下如何對MongoDB進行加固處理:
漏洞危害
開啟MongoDB服務後,如不添加任何參數,預設是沒有許可權驗證的。登入的使用者可以通過預設連接埠無需密碼對資料庫進行任意操作(包括增、刪、改、查等高危動作),而且可以遠端存取資料庫。
漏洞成因
安裝完MongoDB服務後預設有一個admin資料庫,此時admin資料庫是空的,沒有記錄任何許可權相關的資訊。當admin.system.users一個使用者都沒有時,即使MongoDB啟動時添加了—auth參數,如果沒有在admin資料庫中添加使用者,此時不進行任何認證還是可以做任何操作(不管是否以—auth 參數啟動),直到在admin.system.users中添加一個使用者。加固的核心方案是實現只有在admin.system.users中添加使用者之後,MongoDB的認證、授權服務才會生效。
如果您是MongoDB管理員,也可以使用以下方式檢查是否有進一步的入侵行為:
查看MongoDB的日誌是否完整,並確認執行刪除資料庫的源IP地址和時間、行為。
檢查MongoDB帳戶,查看是否沒有添加admin使用者的密碼(使用db.system.users.find()
命令)。
檢查GridFS,查看是否儲存任何檔案(使用db.fs.files.find()
命令)。
檢查記錄檔,查看有哪些使用者訪問了MongoDB(使用show log global
命令)
使用—bind_ip選項。
該選項可以限制監聽介面IP。當在啟動MongoDB的時候,使用--bind_ip 192.168.0.1
表示啟動IP地址綁定,資料庫執行個體將只監聽192.168.0.1的請求。
啟動基於角色的登入認證功能。
在admin資料庫中建立使用者,如使用者名稱supper,密碼supWDxsf67%H(此處為舉例說明,請勿使用此帳號密碼)。
在未開啟認證的環境下,登入到資料庫。
[[email protected] 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" ]
說明
- MongoDB從V3版本開始取消使用addUser方法,採用db.createUser方法建立使用者。
- 帳號不要設定為常見帳號,密碼需要滿足一定的複雜度,長度至少八位以上,並包括大小寫字母、數字、特殊字元混合體,不要使用生日、姓名、身份證編號等常見密碼。
驗證使用者是否建立成功。
> db.auth("supper","supWDxsf67%H")
> exit
bye
結束進程,重啟MongoDB服務。
./mongod --dbpath=/path/mongodb --bind_ip=192.168.0.1 --port=27028 --fork=true logpath=/path/mongod.log &
說明
admin.system.users中將會儲存比在其它資料庫中設定的使用者權限更大的使用者資訊,擁有超級許可權,也就是說在admin中建立的使用者可以對mongodb中的其他資料庫資料進行操作。
MongoDB系統中,資料庫是由超級使用者來建立的,一個資料庫可以包含多個使用者,一個使用者只能在一個資料庫下,不同資料庫中的使用者可以同名。
特定資料庫(比如DB1)的使用者User1,不能夠訪問其他資料庫DB2,但是可以訪問本資料庫下其他使用者建立的資料。
不同資料庫中同名的使用者不能夠登入其他資料庫,比如DB1、DB2都有user1,以user1登入DB1後,不能夠登入到DB2進行資料庫操作。
在admin資料庫建立的使用者具有超級許可權,可以對mongodb系統內的任何資料庫的資料對象進行操作。
使用db.auth()可以對資料庫中的使用者進行驗證,如果驗證成功則返回1,否則返回0。 db.auth()只能針對登入使用者所屬的資料庫的使用者資訊進行驗證,不能驗證其他資料庫的使用者資訊。
禁用HTTP和REST連接埠。
MongoDB自身帶有一個HTTP服務和並支援REST介面(在V2.6以後這些介面預設是關閉的)。MongoDB預設使用預設連接埠監聽Web服務,一般不需要通過Web方式進行遠端管理,建議禁用。
修改設定檔或在啟動的時候選擇–nohttpinterface參數即可。
nohttpinterface = false
開啟日誌審計功能。
審計功能可以用來記錄使用者對資料庫的所有相關操作。這些記錄可以讓系統管理員在需要的時候分析資料庫在什麼時段發生了什麼事情。
使用SSL加密功能。
MongoDB叢集之間以及從用戶端串連到MongoDB執行個體的串連應該使用SSL。使用SSL對效能沒有影響並且可以防範類似於man-in-the-middle的攻擊。
注意MongoDB社區版預設並不支援SSL。您可以選用MongoDB企業版(支援SSL),或者從源碼重新編譯MongoDB並使用—ssl選項來獲得SSL功能。
以上所有配置,推薦以設定檔形式儲存配置。
[[email protected] bin]$ vim /path/mongod.confport=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,支援。
然後,啟動MongoDB服務時載入設定檔。
[[email protected] bin]$ ./mongod -f /path/mongod.conf
對業務關鍵敏感性資料進行加密儲存。
建議您梳理業務資料,對關鍵的敏感性資料加密後入庫,例如:帳號、密碼、郵箱地址、手機號碼、身份ID等其他資料。密碼編譯演算法推薦選擇國際通用密碼編譯演算法和多次加鹽組合自訂演算法,防止密碼編譯演算法被破解。
即使駭客擷取資料後,也查看不了資料,通過“看不懂”的資料加密方式將損失降到最低。
對資料進行本地異地備份。
完善的備份策略是保證資料安全的最後一根救命稻草。
推薦:可靠的本地備份+遠程備份儲存方案
MongoDB安全強化方案,防止資料泄露被勒索