JuiceFS 資料加密原理

語言: CN / TW / HK

JuiceFS 作為分佈檔案系統,每天與海量的資料打著交道,因此資料的安全性尤為關鍵,今天就來介紹一下 JuiceFS 在資料加密方面所做的努力。

傳輸中資料加密

JuiceFS 在網路上傳輸時會對資料進行加密,以防止未經授權的使用者竊聽網路通訊。

JuiceFS 客戶端始終使用 HTTPS 把資料上傳到物件儲存服務,以下情況除外:

  • 使用內部端點上傳至阿里雲 OSS
  • 使用內部端點上傳至 UCloud US3

靜態資料加密

JuiceFS 支援靜態資料加密,即在上傳到物件儲存之前對資料進行加密。在這種情況下,儲存在物件儲存中的資料將會被加密,這可以在物件儲存本身被破壞時有效地防止資料洩露。

JuiceFS 在客戶端加密中採用了行業標準的加密方式(AES-GCM 和 RSA)。加密和解密是在 JuiceFS 客戶端進行的。使用者唯一需要做的是在 JuiceFS 掛載時提供一個私人金鑰或密碼,並像普通檔案系統一樣使用它。它對應用程式是完全透明的。

注意:在客戶端快取的資料是不加密的。不過,只有 root 使用者或所有者可以訪問這些資料。如果要把快取的資料也加密,你可以把快取目錄放在一個加密的檔案系統或塊儲存中。

加密和解密方法

必須為每個加密的檔案系統建立一個全域性 RSA 金鑰 M。在物件儲存中儲存的每個物件都將有自己的隨機對稱金鑰 S。資料用對稱金鑰 S 進行 AES-GCM 加密,S 用全域性 RSA 金鑰 M 進行加密,RSA 金鑰使用使用者指定的口令進行加密。

資料加密的詳細過程如下:

  • 在寫入物件儲存之前,資料塊會使用 LZ4 或 ZStandard 進行壓縮。
  • 為每個塊生成一個隨機的 256 位對稱金鑰 S 和一個隨機種子 N
  • 基於 AES-GCM 使用 SN 對每個塊進行加密。
  • 使用 RSA 金鑰 M 對對稱金鑰 S 進行加密得到密文 K
  • 將加密後的資料、密文 K 和隨機種子 N 組合成物件,然後寫入物件儲存。

資料解密的步驟如下:

  • 讀取整個加密物件(它可能比 4MB 大一點)。
  • 解析物件資料得到密文 K、隨機種子 N 和被加密的資料。
  • 用 RSA 金鑰解密 K,得到對稱金鑰 S
  • 基於 AES-GCM 使用 SN 解密資料得到資料塊明文。
  • 對資料塊解壓縮。

金鑰管理

在啟用加密功能時,RSA 金鑰的安全是極其重要的。如果金鑰被洩露,可能會導致資料洩露。如果金鑰丟失,那麼所有的加密資料都將丟失,而且無法恢復。

當使用 juicefs format 建立一個新卷時,可以通過 --encrypt-rsa-key 引數指定 RSA 私鑰來啟用靜態加密,該私鑰將會被儲存到 Redis。當私鑰被密碼保護時,可以使用環境變數 JFS_RSA_PASSPHRASE 來指定密碼。

使用方法:

生成 RSA 金鑰

$ openssl genrsa -out my-priv-key.pem -aes256 2048

在格式化時提供該金鑰

$ juicefs format --encrypt-rsa-key my-priv-key.pem META-URL NAME

注意:如果私鑰受密碼保護,在執行 juicefs mount 時應使用 JFS_RSA_PASSPHRASE 來指定該密碼。

效能

TLS、HTTPS 和 AES-256 在現代 CPU 中的實現非常高效。因此,啟用加密功能對檔案系統的效能影響並不大。RSA 演算法相對較慢,特別是解密過程。建議在儲存加密中使用 2048 位 RSA 金鑰。使用 4096 位金鑰可能會對讀取效能產生重大影響。

總結

檔案系統加密技術幾乎可以適用於任何基於檔案系統的資料庫儲存加密需求,本文從原理出發到實際操作如何生成並使用金鑰,詳細介紹了 JuiceFS 對資料加密解密的過程 。未來,JuiceFS 將持續努力為您的資料安全保駕護航。

推薦閱讀:知乎 x JuiceFS:利用 JuiceFS 給 Flink 容器啟動加速

如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)