深入MongoDB4.2新特性:字段級加密 Client-Side Field Level Encryption

MongoDB4.2已經發布,新增了幾大特性,其中安全改進,提供了字段級加密 Client-Side Field Level Encryption加密新特性。今天我們來深入學習一下這個新特性,以及使用的場景。

1、MongoDB字段級加密新特性介紹

MongoDB4.2驅動程序也提供客戶端字段級加密支持。

這種加密機制依賴于客戶端代碼實現。

1.1加密場景

作為使用過MySQL或者之前MongoDB數據庫的同學,應該很容易理解,絕大部分的電商、銀行、社交平臺的數據庫敏感字段都會考慮加密處理。例如:支付寶、微信、微博賬號的密碼、賬戶余額、銀行卡賬號、授權碼等等。一些商品的進貨價格,供貨商聯系方式等。

但是也有很多系統不會做加密,比如早期的12306數據庫里的用戶信息字段(后面已經修復漏洞)。

早期的做法,如果有加密字段的需求,都是在業務邏輯層,設計加密算法。

常見的做法,比如對商品原始價格加密,對稱加密Key直接計算。或者變換方式處理。

這些通常要程序員寫代碼完成。

1.2數據庫透明加密

現在一些先進的數據庫都開始提供DB級別的加密支持,比如Oracle、SQL Server,阿里云MySQL,現在MongoDB也開始支持這個特性。

應用程序可以在通過網絡將數據傳輸到服務器之前提前加密Document文檔中的某些字段,比如商品的價格Price,或者用戶賬號的存款余額。

只有能夠訪問正確加密密鑰的應用程序才能解密和讀取受保護的數據。

刪除加密密鑰會將使用該密鑰加密的所有數據呈現為永久不可讀。

MongoDB集群使用TLS加密來保護傳輸中的數據。集群還使用MongoDB加密存儲引擎來保護磁盤上的數據。

請思考以下安全場景:
A、員工具有集群及其主機的管理訪問權限。員工的訪問級別允許他們在解密狀態下查看敏感數據。
B、第三方托管MongoDB集群。提供程序具有主機或數據庫級安全漏洞,未授權方在解密狀態下訪問數據。
C、第三方數據分析公司可以訪問包含私人,個人或機密數據。第三方公司將解密的數據加載到未經授權的各方可以訪問的不安全的存儲區中。

對于上面的每種情況,具有MongoDB群集或主機的特權訪問權限的用戶都可以繞過加密來讀取私有的機密數據。
所以在寫入服務器之前,我們使用客戶端字段級加密新特性,可以保護數據,降低在網絡傳輸中暴露數據或繞過磁盤加密竊取數據的風險。

2、用戶文檔加密字段例子

下面是一個用戶Document文檔數據的例子:

{
“name” : “Frank Xu”,
“address” : {
“street” : “1234前門外大街”,
“city” : “杭州”,
“zip” : 99999
},
“phone” : “123-45-6789″,
“age” : “18″
}

假設是一個戀愛交友網站,手機號、年齡是敏感字段,不希望泄露。

我們可以使用客戶端字段級加密功能,專門加密敏感信息,如age和phone。 加密數據可以保存為具有子類型的二進制數據格式。

{
“name” : “Frank Xu”,
“address” : {
“street” : “1234 前門外大街”,
“city” : “杭州”,
“zip” : 99999
},
“phone” : BinData(6,”U2FsdGVkX1+CGIDGUnGgtS46+c7R5u17SwPDEmzyCbA=”),
“age” : BinData(6,”AaloEw285E3AnfjP+r8ph2YCvMI1+rWzpZK97tV6iz0jx”)
}

那些黑客,無法訪問所需密,因此這些非法的MongoDB服務器的用戶無法解密加密過的字段。

MongoDB支持兩種使用官方MongoDB 4.2兼容驅動程序進行客戶端字段級加密的方法:

3、字段的顯式(手動)加密方式

MongoDB4.2兼容驅動程序支持使用特定數據密鑰和加密算法顯式加密或解密字段。

應用程序必須修改與構造讀寫操作相關的任何代碼,以通過驅動程序加密庫包含加密/解密邏輯。應用程序負責根據每個操作選擇適當的加密/解密數據密鑰。

4、字段的自動加密方式

MongoDB 4.2 Enterprise 企業版擴展了4.2兼容的驅動程序加密支持,包括使用JSON模式語法的自動字段級加密。

應用程序必須修改驅動程序客戶端對象配置代碼以包括自動加密設置。

通過加密配置客戶端對集群的所有讀/寫操作都將使用預定義的自動加密規則自動進行加密和解密。

之前的讀和寫操作相關的代碼不需要額外的修改。

MongoDB客戶端字段級加密僅支持加密文檔中的單個字段。要加密整個文檔,必須配置加密文檔中的每個字段。

自動化字段加密 Automatic Field Level Encryption
自動化字段加密,只有MongoDB4.2 Enterprise企業版支持。

MongoDB 4.2驅動程序支持自動客戶端字段級加密。配置為自動客戶端字段級加密的應用程序識別文檔中的特定字段以進行加密和解密。 4.2驅動程序使用為客戶端指定的自動加密規則來識別加密字段及其關聯的加密密鑰。

對于寫操作,4.2驅動程序在寫入MongoDB數據庫之前加密字段值。

對于讀取操作,4.2驅動程序在發出讀取操作之前加密查詢中的字段值。

4.2僅當客戶端可以訪問用于保護字段的加密密鑰時,驅動程序才能解密文檔中返回的加密值。

在實例化客戶端以啟用自動客戶端字段級加密時,應用程序必須指定以下組件參數:
A、存儲數據密鑰密鑰庫的MongoDB集群。
B、用于存儲加密數據密鑰的密鑰庫命名空間(。)。
C、密鑰管理服務(KMS)提供程序用于管理客戶主密鑰(CMK)。 MongoDB使用CMK加密所有數據密鑰,然后將其存儲在密鑰保管庫中,只保留未加密的元數據。驅動程序需要訪問KMS才能加密和解密受保護的字段或創建新的數據密鑰。
D、使用JSON模式語法( JSON schema syntax)的每字段加密規則。

注意:兼容4.2的驅動程序使用僅限企業版的mongocryptd進程來解析JSON模式數據,并在讀取或寫入文檔時應用加密規則。自動加密和解密需要mongocryptd進程來完成。

官方MongoDB4.2兼容驅動程序都引入了支持自動加密和數據密鑰管理的新功能。特別的說明規則,請參閱官方文檔。

5、加密算法

MongoDB字段級加密使用encrypt-then-MAC方法與確定性或隨機初始化的向量相結合來加密字段值。MongoDB僅支持HMAC-SHA-512 MAC與AES-256-CBC加密算法的組合。

5.1確定性加密

確定性加密算法確保每次執行算法時給定輸入值始終加密到相同的輸出值。雖然確定性加密為讀取操作提供了更大的支持,但具有低基數的加密數據易受頻率分析恢復的影響。也就是所謂的撞庫破解方式。大概率撞擊高頻秘鑰。

對于未在讀取操作中使用的敏感字段,應用程序可以使用隨機加密來改進對頻率分析恢復的保護。

5.2隨機加密

隨機加密算法確保每次執行算法時給定輸入值始終加密得到不同的輸出值。雖然隨機加密提供了對數據機密性的最強保證,但它也阻止了必須對加密字段進行操作以評估查詢的任何讀取操作的支持。也就是對比多次加密值再進行其他操作的可能性。

隨機加密也可以支持加密整個對象或數組。例如下面的例子文檔:

{
“personal_information” : {
“age” : “123-45-6789″,
“credit_score” : 750,
“credit_cards” : [ "1234-5678-9012-3456", "9876-5432-1098-7654"]
},
“phone_numbers” : [ "(010) 555-0153" ]
}

使用隨機加密算法加密personal_information和phone_numbers字段會加密整個對象。雖然這可以保護嵌套在這些字段下的所有字段,但它也會阻止查詢那些嵌套被加密的字段。

對于在讀取操作中使用的敏感字段,應用程序必須使用確定性加密來改進對加密字段的讀取支持。

6、加密組件

MongoDB客戶端字段級加密使用以下組件:
A、用于存儲和檢索客戶主密鑰(CMK)的第三方密鑰管理服務(KMS)。 MongoDB目前僅支持Amazon Web Services密鑰管理服務。
或者,客戶端字段級加密支持用于加密數據密鑰的本地密鑰文件。本地密鑰文件數據密鑰加密應僅用于開發或評估階段,不要用于生產環境。
B、可選的服務器端JSON模式,用于指定加密驗證規則。
C、存儲數據密鑰密鑰庫的MongoDB集群。密鑰保管庫群集可能與存儲客戶端加密數據的群集不同。
D、用于支持自動加密的mongocryptd守護程序。僅MongoDB Enterprise企業版支持。
E、libmongocrypt庫,用于管理KMS和mongocryptd之間的加密,解密和通信。包含在MongoDB 4.2驅動程序。

下圖說明了驅動程序與每個加密組件之間的關系:

驅動程序與加密組件之間的關系

mongocryptd
僅限MongoDB企業版
mongocryptd非常重要,是一個驅動程序生成的客戶端進程,用于解析和驗證JSON模式加密規則。 是自動字段加密和解密的必備組件。

MongoDB4.2驅動程序自動生成mongocryptd進程。 應用程序可以配置參數,來控制產生行為,不需要自己編譯生成。 詳細配置請參閱驅動程序文檔,了解控制mongocryptd產生的特定參數和語法。

6.2驅動程序兼容性表

以下編程語言驅動程序版本中支持自動字段加密的:
A、Node 3.3.0-beta 1
B、Java 3.11.0-rc0

參考資料:https://docs.mongodb.com/manual/core/security-client-side-encryption/#automatic-field-level-encryption

作者簡介:

徐雷

1)MongoDB中文社區聯席主席;
2)《MongoDB實戰》第2版譯者;
3)阿里云大學講師;阿里云棲社區講師;
4)目前就職于阿里巴巴,架構師。

發表評論