《MongoDB黑客贖金事件解讀及防范》要點:
本文介紹了MongoDB黑客贖金事件解讀及防范,希望對您有用。如果有疑問,可以聯系我們。
相關主題:非關系型數據庫
維易PHP培訓學院每天發布《MongoDB黑客贖金事件解讀及防范》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
PS:由于本文附圖含有二維碼,無法上傳,所以完整圖文,請點此查看:https://yq.aliyun.com/articles/68906
最近,全球互聯網圈子內發生了一件大事:MongoDB數據庫被黑變亂,被黑掉的MongoDB數據庫中所有的數據都內黑客洗劫一空,并留下信息勒索,要求支付比特幣來贖回數據.截止到目前,受害者數目還在不斷增加.為了更好地解讀該變亂,首先對MongoDB進行簡單介紹,MongoDB數據庫是NoSQL的文檔型數據庫,在DB engines排名中處于第四位.MongoDB最大的優勢在于擁有靈活的表結構以及高可用、高可擴展的特性,因此MongoDB深受初創公司的喜愛.
黑客贖金變亂回顧
此次MongoDB數據庫被黑事件最早由白帽子VictorGevers@GDI Foundation(網名0xDUDE)在2016年12月27日發現,他發現有些在公網上暴露的MongoDB被黑掉,數據庫中的數據都被刪掉,并且黑客創建了一個WARING數據庫(其中包括一張WARING表),其中的文檔要求用戶發送0.2個比特幣到某個地址,然后再通過Email將IP地址發給黑客,黑客再進行相應的數據恢復工作.
在接下來的時間中,陸續有更多的MongoDB數據庫被黑變亂曝光.該變亂最早是由Harak1r1黑客組織發起的,后續有多達20+黑客組織跟進,他們勒索的贖金從0.1到1比特幣不等,短短數天時間已有約3W+MongoDB中招;據不完全統計,3天之內被刪除的MongoDB數據量超過100TB.
原因分析
為什么會有這么多MongoDB數據庫被黑客黑掉呢?是因為MongoDB不平安嗎?
事實上并非如此,導致這次事件的直接原因:一是因為攻擊成本太低(此次攻擊的手段其實很初級),此次受到攻擊的MongoDB用戶共同的特征就是受害者沒有配置鑒權,并且裸露在公網上,同時使用默認端口,導致門戶大開;另外一個直接原因是獲取受害者的成本很低,黑客通過SHODAN搜索引擎可以快速地獲取裸露在公網上的MongoDB受害者的信息(該搜索是無辜的).
但究其根本原因無外乎兩者:一是被攻擊者平安意識薄弱;二是MongoDB自身設計的缺陷,它默認配置沒有開啟鑒權.
了解到被黑的原因后應該如何應對呢?首先,使用者需要查看本身管理的MongoDB是否中招,可以從三個方面入手:一是驗證數據庫和集合是否還在;二是檢查用戶列表,看是否添加了異常的用戶;三是檢查系統日志看是否有來自異常IP的連接,也可以通過監控系統查看磁盤使用量等操作進行確認.
對于已經中招的MongoDB用戶,我們的建議是:首先不要輕易支付贖金,除非有證據注解黑客確實備份了你的數據(據統計,有部分用戶已支付贖金,但數據卻沒有得到恢復);其次,嘗試數據恢復,通過備份(如果有)或文件系統快照(如果有)或其他數據恢復手段.
MongoDB平安Checklist
之所以有大量的MongoDB數據庫被黑,首要原因就是因為沒有開啟鑒權功能.下面將從MongoDB支持的鑒權機制、基于角色的拜訪控制、內部鑒權(Keyfiles)、Sharding集群的鑒權、鑒權的開銷、如何開啟鑒權等方面詳細介紹MongoDB的鑒權功能.
MongoDB支持的鑒權機制
MongoDB的鑒權是基于用戶名和密碼完成的.在MongoDB 3.0以前版本中使用的是MongoDB-CR的鑒權協議.該機制略簡單,對密碼做了一個摘要,然后在服務端通過相同的方式驗證,平安性不高.在3.0版本以后,使用的是SCRAM-SHA-1鑒權機制,該機制雙向驗證,同時驗證客戶端及服務端的身份,平安性較高(強烈建議使用3.0以后的版本),但該協議不兼容舊的客戶端,舊的客戶端使用該協議時需要進行版本升級.
除了用戶名和暗碼之外,MongoDB還支持x.509證書鑒權,但該方式較為復雜,此處不再深入介紹.
基于角色的拜訪控制
在MongoDB中有幾個基本概念:User(用戶);Role(角色)是權限的集合,可以繼承;AuthenticationDatabase即鑒權數據庫,用戶在哪個庫創建就指定在哪個庫進行鑒權.
使用者可以通過Mongo Shell在某個數據庫創建一個用戶并指定具體權限,如通過以下指令創建一個root角色的用戶:db.createUser({user:’用戶名’,pwd:‘暗碼’,roles:[role:’root’,db:’admin’]})
MongoDB數據庫可以實現非常精細的權限控制,除了ROOT角色之外,還有很多預先定義的內建角色,如只讀數據庫角色等;此外,如有特殊需求時,用戶可以自定義角色.
內部鑒權
在MongoDB中,副本集及Sharding集群成員之間也需要鑒權,所有成員之間通過相同的Keyfile內容來實現內部鑒權.Keyfiles生成內容可以有很多種辦法,但是要求內容必須是base64編碼的字符,長度介于[6,1024]之間;此外,需要注意Keyfile文件不能擁有group和other的權限.
事實上,副本集及Sharding集群成員之間的鑒權也是通過SCRAM-SHA-1機制完成的,內部鑒權的用戶名是__system,鑒權數據庫是local數據庫.
Sharding集群的鑒權
Sharding集群的鑒權和副本集鑒權有一定的區別:副本集在Mongod上鑒權,Sharding集群在Mongos上進行鑒權.Sharding集群鑒權時,通過連接Mongos來創建/管理用戶;2.6版本以后,用戶是保留在Config Server上的Admin庫里.在某些場景中,需要直連Shard的一些特殊操作,如cleanupOrphaned/compact/rs.reconfig()等,這種情況下需要在Shard上創建用戶,注意這些在Shard上創建的用戶是無法通過Mongos來連接的.
鑒權的開銷
開啟鑒權勢必會帶來性能的開銷,這是因為鑒權通常需要客戶端和服務端進行一些網絡交互以及CPU計算,比如SCRAM-SHA-1機制會在客戶端和服務端進行一定迭代次數的Hash計算.對于長連接來說,這些性能開銷是可以忽略的,因為長連接建立之后只需要一次鑒權即可進行多次操作;但對于短連接,會對性能有一定影響,因為每次操作都新建連接,都需要進行一次鑒權(這里可以考慮使用阿里云MongoDB,因為我們隊鑒權的性能做了優化,效果能夠達到原來的10倍).鑒權所導致性能開銷和帶來的平安效益兩者相比,顯然后者更為重要,畢竟平安是性能的基礎.
如何開啟鑒權?
鑒權的開啟步調較為簡單:
在配置文件中,通過指定security.authorization:enabled和keyFile:<path-to-keyfile>兩個配置項,前者是打開基礎鑒權,后者是配置副本集及Sharding集群成員內部鑒權.
如果不使用配置文件,直接通過命令行啟動,則通過增加--auth和--keyFile <path-to-key?le>參數即可.
需要注意的是,鑒權開啟之后,需要通過當地Localhost進行連接服務器去創建第一個管理員用戶,建立管理員用戶之后才能建立其他的普通用戶,而且MongoDB需要重新啟動.
除了鑒權之外,為了防止黑客攻擊,還需要進行其他的平安防護措施:
修改監聽端口,即不使用默認27017端口.
限制訪問來源,用戶可以通過net.bindlp選項配置監聽IP(MongoDB默認綁定在所有網卡上監聽IP),此外,可以通過防火墻之類的平安組限制對外暴露的端口.
不要使用Root權限賬戶啟動進程,最好使用單獨的用戶啟動進程,避免高級黑客通過某些手段獲取主機的root權限.
MongoDB默認具有Http相關的接口,用戶可以通過Http的方式查看MongoDB相關的信息,并且可以通過一些REST API進行某些操作.出于平安起見,在生產環境下,需要關閉Http相關接口,具體配置方式:
net.http.enabled:false
net.http.JSONPEnabled:false
net.http.RESTInterfaceEnabled:false
除了上述操作,為了平安起見,還可以對數據進行加密,將業務數據先加密后再存放到MongoDB中,避免數據泄露.
容災
在此次MongoDB數據庫被黑事件中,數據基本上都被黑客刪除了,因此除了做好鑒權等平安工作之外,還需要對數據做好容災,通過一些手段對數據進行定期備份;或者也可以通過配置一個MongoDB的延遲副本集節點來簡單起到備份的效果.
備份和恢復
備份又分為全量備份和增量備份.MongoDB目前支持的全量備份有兩種方式:一種是通過mongodump進行邏輯備份(使用mongorestore進行恢復);另一種是基于文件系統快照或其他手段進行物理備份.
增量備份主要采用抓取oplog的方式實現,這必要用戶自主開發抓取oplog的程序.
配置延遲副本集節點
在MongoDB中,可以指定某個節點配置成比Primary節點最新數據固定延遲一段時間的節點以備數據恢復用,例如可以配置一個比主節點晚一個小時的節點,如果黑客在一個小時內將數據刪掉,則可以通過該節點將數據恢復.
阿里云MongoDB服務
阿里云MongoDB服務強制要求開啟鑒權,同時對MongoDB自身的鑒權進行了優化,使得鑒權性能提升10倍;同時開放用戶管理功能,最大程度保留靈活性.目前,阿里云MongoDB只允許內網訪問(只允許在云ECS上訪問云MongoDB),避免對外暴露IP;同時還支持VPC,可以將MongoDB配置在VPC中;此外,還支持IP白名單,只有指定的IP才能訪問數據庫,大大提高了平安性.
審計
阿里云MongoDB服務還實現了審計功能,可以記錄所有操作、來源、耗時 .上圖是審計結果,可以看到在11:00:48時,某個用戶執行了Drop表的操作,客戶端IP和消耗時間都有記錄.當數據庫內數據被刪除時,可以通過審計日志查看操作者的信息以及發生時間(審計日志查看功能目前還未對外開發,下一步計劃開放).
自動備份/恢復
阿里云MongoDB服務提供了自動備份/恢復功能,目前實現了全量和增量備份.用戶通過阿里云MongoDB可以恢復到任意時間點.
總結
為了避免MongoDB數據庫被黑客入侵,用戶需要開啟鑒權,利用MongoDB強大的權限控制功能,遵循權限最小化原則進行用戶管理;修改監聽端口和限制拜訪來源來預防MongoDB暴露在公網上;另外不要使用ROOT啟動進程,并注意關閉HTTP相關的接口.
除此之外,還需要做好容災,定期進行全量備份;有條件的做增量備份,或者配置延遲副本集節點.如果,既想省心,又想保證MongoDB數據庫的平安性,建議采用阿里云MongoDB服務.
延伸閱讀:
通過MongoDB平安事件來談談為什么要用云服務:https://yq.aliyun.com/articles/68436
MongoDB 平安 checklist 及最優配置模板》:https://yq.aliyun.com/articles/68488
MongoDB數據庫未授權拜訪漏洞及加固:https://help.aliyun.com/knowledge_detail/37451.html
也可以掃描圖中的二維碼閱讀相關文章!
——————————————————————————————————————
關于分享嘉賓:
鄭涔,花名明儼,阿里云數據庫組技術專家,主要關注分布式存儲、NoSQL數據庫等技術領域,目前主要介入MongoDB云數據庫的研發,致力于讓開發者用上最好的MongoDB云服務.