MongoDB安全強化方案,防止資料泄露被勒索

來源:互聯網
上載者:User

標籤:擷取   報錯   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管理員,也可以使用以下方式檢查是否有進一步的入侵行為:

  1. 查看MongoDB的日誌是否完整,並確認執行刪除資料庫的源IP地址和時間、行為。

  2. 檢查MongoDB帳戶,查看是否沒有添加admin使用者的密碼(使用db.system.users.find()命令)。

  3. 檢查GridFS,查看是否儲存任何檔案(使用db.fs.files.find()命令)。

  4. 檢查記錄檔,查看有哪些使用者訪問了MongoDB(使用show log global命令)

    1. 使用—bind_ip選項。

      該選項可以限制監聽介面IP。當在啟動MongoDB的時候,使用--bind_ip 192.168.0.1表示啟動IP地址綁定,資料庫執行個體將只監聽192.168.0.1的請求。

    2. 啟動基於角色的登入認證功能。

      在admin資料庫中建立使用者,如使用者名稱supper,密碼supWDxsf67%H(此處為舉例說明,請勿使用此帳號密碼)。

      1. 在未開啟認證的環境下,登入到資料庫。

        [[email protected] bin]$ ./mongo 127.0.0.1:27028 (此處修改了預設連接埠)
        MongoDB shell version: 2.0.1
        connecting to: 127.0.0.1:27028/test

      2. 切換到admin資料庫。

        > use admin
        switched to db admin
        >

      3. 建立管理員帳號。

        > 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方法建立使用者。
        • 帳號不要設定為常見帳號,密碼需要滿足一定的複雜度,長度至少八位以上,並包括大小寫字母、數字、特殊字元混合體,不要使用生日、姓名、身份證編號等常見密碼。
      4. 驗證使用者是否建立成功。

        > db.auth("supper","supWDxsf67%H")
        > exit
        bye

      5. 結束進程,重啟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()只能針對登入使用者所屬的資料庫的使用者資訊進行驗證,不能驗證其他資料庫的使用者資訊。

    3. 禁用HTTP和REST連接埠。

      MongoDB自身帶有一個HTTP服務和並支援REST介面(在V2.6以後這些介面預設是關閉的)。MongoDB預設使用預設連接埠監聽Web服務,一般不需要通過Web方式進行遠端管理,建議禁用。
      修改設定檔或在啟動的時候選擇–nohttpinterface參數即可。

      nohttpinterface = false

    4. 開啟日誌審計功能。

      審計功能可以用來記錄使用者對資料庫的所有相關操作。這些記錄可以讓系統管理員在需要的時候分析資料庫在什麼時段發生了什麼事情。

    5. 使用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,支援。

 

  1. 然後,啟動MongoDB服務時載入設定檔。

    [[email protected] bin]$ ./mongod -f /path/mongod.conf

  2. 對業務關鍵敏感性資料進行加密儲存。

    建議您梳理業務資料,對關鍵的敏感性資料加密後入庫,例如:帳號、密碼、郵箱地址、手機號碼、身份ID等其他資料。密碼編譯演算法推薦選擇國際通用密碼編譯演算法和多次加鹽組合自訂演算法,防止密碼編譯演算法被破解。

    即使駭客擷取資料後,也查看不了資料,通過“看不懂”的資料加密方式將損失降到最低。

  3. 對資料進行本地異地備份。

    完善的備份策略是保證資料安全的最後一根救命稻草。

    推薦:可靠的本地備份+遠程備份儲存方案

    • 本地備份

      MongoDB備份方式

      1. >mongodump -h dbhost -d dbname -o dbdirectory
      2. -h:
      3. MongDB所在伺服器位址,例如:127.0.0.1,當然也可以指定連接埠號碼:127.0.0.1:27017
      4. -d:
      5. 需要備份的資料庫執行個體,例如:test
      6. -o:
      7. 備份的資料存放位置,例如: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。--drop:恢複的時候,先刪除當前資料,然後恢複備份的資料。就是說,恢複後,備份後添加修改的資料都會被刪除,慎用!

       

      Mongodump命令選擇性參數列表如下所示。

      • 備份策略

        全量備份:可以最快的時間快速恢複所有資料,缺點是備份成本大,時間長。

        全量備份+增量備份:可以較快的恢複所有資料,缺點是恢復長,如果增量資料有問題,無法恢複所有資料。

        搭建從庫:直接切換到從庫,前提是從庫的資料安全可靠。

      • 如果部署在公用雲端上,可以用公用雲端推薦的加固方案,配置好安全性群組。

MongoDB安全強化方案,防止資料泄露被勒索

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.