深入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” : “MongoChina”,
“address” : {
“street” : “1234 前門外大街”,
“city” : “北京”,
“zip” : 99999,
“website” : “https://www.mongochina.com/”,
},
“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