『堅如磐石的 PieCloudDB』:透明加密模塊的設計與實現

語言: CN / TW / HK
導讀:2月17日,由中國開源軟件推進聯盟PostgreSQL分會&中科院軟件所&CSDN聯合舉辦的“中國 PostgreSQL 數據庫生態大會”盛大召開。拓數派(OpenPie)作為冉冉升起的新一代雲原生分佈式數據庫廠商,受邀參加本屆大會。 

本文為演講的文字版摘要,主要內容包括: 

  • 透明加密的設計思路 
  • 透明加密模塊的架構 
  • 三級密鑰的實現 
  • 密鑰管理的實現 

分享嘉賓:PieCloudDB 資深技術專家 王淏舟 

回訪視頻: http://www.bilibili.com/video/BV1X54y1w76L/ 

PPT鏈接: http://openpie.com/download/PostgresConf_PieCloudDB_Database_Unbreakable.pdf 

 

一、數據安全的重要性 

今年來,關於數據安全的政策和熱點新聞層出不窮。無論是政府、企業或是各個廠商都對數據安全給予了很高的重視。過往的案例表明,如果出現敏感數據的泄露或丟失,將給企業和用户帶來巨大的損失。 對於雲上用户來説,雲上數據的安全更是其最關注的需求之一。 

作為一款存算分離的雲原生數據庫產品,PieCloudDB 做到了三大區域的安全特性設計,全鏈路地保證用户數據安全,包括: 

  • 雲原生安全 
  • 存儲安全 
  • 計算安全 

其中,針對雲原生安全,PieCloudDB 實現了傳輸層加密和緩存數據加密。作為一款雲原生的 eMPP(彈性大規模並行計算)數據庫,數據會在不同節點間進行傳輸,因此對於傳輸過程的數據加密至關重要。在執行用户查詢時,PieCloudDB 會生成相應的緩存數據,用以加速查詢結果的生成。緩存數據中會包含一部分的用户數據,對緩存數據的加密將更好的保證用户的數據安全。 

針對存儲安全,元數據作為數據庫的「心臟」,一旦出現丟失或損壞,將導致數據庫的不可用。為此,PieCloudDB 實現了對於元數據的持久化存儲。PieCloudDB 的用户數據被多副本加密存儲,以保證用户數據的徹底安全。 

針對計算安全,PieCloudDB 採用 eMPP 存算分離架構,並支持ACID,在集羣單一節點或更多節點失效的情況下,不會造成用户數據的丟失或損壞。 

本文將着重介紹 PieCloudDB 是如何通過透明加密模塊實現雲原生安全層的緩存數據加密,和存儲安全層的用户數據加密存儲的。 

二、PieCloudDB 透明加密設計思路 

PieCloudDB 打造的透明加密模塊讓數據從傳統的明文存儲轉為加密存儲,可以有效地防止數據被系統運維人員直接讀出,保證存儲在數據文件中的數據安全。透明加密是指密鑰生成、密鑰管理和加解密過程由數據庫管理系統自動完成,用户無感知。也就是説,透明加密的加密和解密過程對用户來説就是透明的,用户讀寫數據非常方便,數據寫入自動加密,讀取自動解密。此外,PieCloudDB 的透明加密模塊不依賴於公有云/私有云/系統自帶的加密,真正實現了自主可控,同時滿足數據安全審計和業務安全審計等用户合規需求。 

PieCloudDB 透明加密模塊的設計和實現過程中,研發團隊充分考慮和總結了用户需求與技術挑戰,讓透明加密模塊實現了以下幾個特性: 

  • 用户側,PieCloudDB 透明加密模塊符合審計流程,做到用户無感知,能夠與用户業務擬合,無需對業務進行改變。 
  • 研發側, PieCloudDB 透明加密模塊作為一個獨立模塊,與數據庫存儲模塊結合,不影響內核迭代,方便後續擴展,無歷史包袱。 

三、PieCloudDB 透明加密的實現細節 

PieCloudDB 透明加密模塊採用目前主流的多級密鑰機制和有效的密鑰管理機制防範了數據泄露風險,確保了用户的數據安全。每個租户數據完全隔離,擁有獨立的密鑰體系。 

密鑰管理的實現 

在 PieCloudDB 中,主密鑰是由用户自主生成、保存與控制的,保存於用户的信任域中,PieCloudDB 的透明加密模塊不會嘗試訪問主密鑰,確保主密鑰的安全。 

此外,PieCloudDB 的最小加密單位為數據頁,每個數據頁都由單個密鑰進行加密。加密密鑰支持輪換,可以按一段時間、或某些條件進行新的密鑰的輪換,來最大化保證數據安全。同時,在輪換時,需要避免中斷服務,無需停機。 

PieCloudDB 採用三級密鑰機制,輪換上級密鑰無需重新加解密數據,只需加解密密鑰。同時,PieCloudDB 透明加密模塊支持按頁/按表輪換密鑰,避免整個用户集羣停機輪換密鑰,最大限度的減少對用户業務的影響。 

密鑰保存是透明加密模塊中非常重要的部分,一旦密鑰丟失,數據將無法解密,從而徹底無法訪問。PieCloudDB 透明加密模塊的所有次級密鑰均進行了持久化存儲,保證密鑰的安全,底層頁級密鑰與數據共存,數據多副本備份,防止頁級密鑰的丟失造成無法挽救的損失。此外,由於頁級密鑰可能會很大,頁級密鑰與數據的共存,也能避免在訪問密鑰時頻繁訪問持久化存儲,減少查詢的延遲。 

PieCloudDB 多級密鑰

在多級密鑰的過程中,用户會在用户信任域中創建主密鑰,並保存在信任域中。任何情況下,主密鑰都會被保持在用户信任域中。當創建新的租户時,透明加密模塊會創建新的租户密鑰,將密鑰送進信任域中,用主密鑰進行加密,並將加密後的密鑰存儲在 PieCloudDB 的持久化存儲區域中。 

當用户創建表時,PieCloudDB 的透明加密模塊會自動生成表密鑰,由租户密鑰進行加密,並存儲在 PieCloudDB 的持久化存儲區域中。 當有數據寫入、需要創建一個新的數據頁時,透明加密模塊會創建一個新的頁密鑰,由表密鑰進行加密,並將加密後的頁密鑰存儲和數據一起存儲在數據存儲區域中。選擇存儲到數據存儲區域而非持久化存儲區域中,是為了減少持久化存儲區域的訪問密度,減少持久化存儲區域的負載,降低用户查詢延遲,提升性能。當對頁進行刪除時,會將對應的密鑰一併刪除。 

透明加密的模塊化實現 

PieCloudDB 透明加密採用模塊化的實現。優化器、執行器將不會感知到透明加密模塊的存在。在持續並行開發優化器、執行器等數據內核模塊時,無需考慮對透明加密模塊的適配。當進行升級時,雙方也不耦合,符合雲原生解耦的特性。 

此外,透明加密模塊完美支持 PieCloudDB 的存儲引擎「簡墨」,最大化利用存儲性能,減少加密導致的性能損失。根據實測數據,透明加密導致的性能損失對用户查詢造成的性能影響微乎其微,可忽略不計。 

根據用户需求,PieCloudDB 實現了可插拔加密算法庫,針對不同的硬件,能夠支持不同的加密算法,充分利用硬件加速。PieCloudDB 提供了多種類型的高強度加密算法,包括DES、AES、RC4等。同時,針對國內用户,增加了對國密標準的支持,符合審計流程和合規要求。此外,為了做到真正的自主可控,加密算法做到了可選。 

PieCloudDB 透明加密模塊與用户原有業務完全擬合。在透明加密後,不會對原有用户的查詢\業務造成影響,用户無需對原有業務進行更改,做到開箱即用。外圍組件也無需針對透明加密模塊進行適配,例如使用ETL工具對數據進行導入時,數據會自動加密;導出接入ETL時,數據已經自動完成解密。不會發生 ETL 讀到加密的數據導致任務的失敗的情況,ETL 也不會感知到透明加密模塊的存在。 

透明加密的實現 

  • 透明加密組件架構 

首先,我們來了解一下 PieCloudDB 透明加密組件的架構,當用户發起一個查詢請求時, PieCloudDB 優化器會生成執行計劃樹,執行器將根據此計劃樹進行執行。當需要訪問數據時,執行器將訪問 PieCloudDB 存儲引擎「簡墨」提供的存儲接口,通過存儲接口訪問數據,並對數據進行查詢、插入等操作。PieCloudDB 在存儲接口與數據訪問中間添加了一層透明加密組件。組件位於存儲接口的下面,從而做到了優化器和執行器對模塊的無感知。 

PieCloudDB 的透明加密組件包括三個模塊:加密模塊、密鑰管理模塊、和函數接口。為了實現加密算法庫的可插拔,加密模塊獨立於密鑰管理模塊,使 PieCloudDB 能夠針對不同的透明加密算法庫提供不同的接口,並保證內部的加密流程的統一性。這樣的設計也可以減少 bug 的產生、讓整個開發流程更順滑,使用户的行為也更加的統一。 

透明加密組件架構 

  • 租户密鑰的生成和讀取 

租户密鑰的生成主要分為以下幾個步驟。當租户創建請求,PieCloudDB  透明加密模塊將使用強隨機算法生成新的主密鑰,存儲在用户信任域中。主密鑰會對其進行加密,生成租户密鑰。整個加密過程是在用户的信任域中完成的。PieCloudDB 不會嘗試訪問主密鑰。用户信任域返回加密的租户密鑰後,會被存儲在持久化存儲區域中。 

 

租户密鑰的生成 

當需要使用租户密鑰時,PieCloudDB 透明加密模塊會將加密後的密鑰從持久化存儲區域讀出,送入用户信任域中,使用主密鑰將加密後的密鑰進行解密,並將解密後的密鑰存儲在密鑰存儲區中。此外,PieCloudDB 透明加密模塊還在這裏設置了定時器,在經過一定時間後,密鑰會被自動銷燬,避免對解密密鑰的持有,減少密鑰泄露風險。 

租户密鑰的讀取 

  • 次級密鑰的生成與讀取 

包括表密鑰和頁密鑰在內的次級密鑰的生成方式與租户密鑰類似。當用户發起查詢請求時,PieCloudDB 透明加密模塊將使用強加密算法隨機生成密鑰,並用上級密鑰進行加密,並存儲到相對應的存儲區域。 

次級密鑰的生成 

當需要進行次級密鑰的讀取時,與租户密鑰的讀取過程類似,PieCloudDB 透明加密模塊會將數據從對應的存儲區域將加密後的密鑰讀取出,用上級密鑰進行解密。 

頁級密鑰的處理會有所不同,解密後的頁級密鑰會被存儲在內存,而非存儲區域中,避免對存儲區域造成負擔。定時器的存在,會讓密鑰在一段時間後徹底從內存中銷燬。在此過程中,透明加密模塊也會為密鑰添加隨機值,避免密鑰從內存中被讀取,減少泄露風險。任何密鑰都不會被存儲在磁盤或緩衝區域,避免密鑰因為某種不可控因素而泄露。 

次級密鑰的讀取 

通過透明加密等安全模塊,PieCloudDB 實現了文件級別的安全性保護,有效避免了數據的泄露,為用户打造了更加可靠的數據安全堡壘。