数据加密
数据传输加密
JuiceFS 在传输时会对数据进行加密以更好地保护数据安全,防止数据被第三方窃听。
对于元数据部分,JuiceFS 客户端跟元数据服务之间使用按照 TLS 协议加密的 TCP 连接进行通讯。
对于写入到对象存储的数据,会尽量使用 HTTPS 读写数据,以下因为对象存储本身不支持 HTTPS 的情况除外:
- 通过内网域名访问阿里云的 OSS 时;
- 通过内网域名访问 UCloud 的 UFile 时;
- 通过内网域名访问京东云的 JSS 时;
当启用缓存共享功能(挂载时通过 --cache-group
启用)时,客户端之间传输缓存数据的连接没有加密,请在安全的网络环境中使用缓存共享功能。
数据存储加密
JuiceFS 支持存储加密,即对数据进行加密后再上传到对象存储,对象存储中只有加密后的密文,可以有效地防止对象存储的访问权限泄露或者存储被入侵等情况下泄露数据隐私。
JuiceFS 使用业界标准的客户端加密方法(AES-GCM 和 RSA)进行加密。数据的加解密过程由 JuiceFS 提供的客户端完成。用户只需要在挂载 JuiceFS 的时候提供私钥或者密码,之后可以像普通文件系统一样使用,完全对应用透明。
对于客户端所在主机中缓存的数据,并未进行加密(只有 root 或者挂载时的用户能够访问)。如果缓存数据也需要加密的话,建议将缓存目录设置到支持存储加密的单机文件系统或者块存储中。
另外,JuiceFS 中的元数据目前不支持加密存储,请不要在元数据(文件名、目录名,或者扩展属性)中保存敏感信息(比如用户的 email 等隐私信息)。
加解密算法
启用存储加密的文件系统会有一个全局的 RSA 密钥 M,每个写入到对象存储的对象有一个随 机生成的对称密钥 S,使用 S 和 AES-GCM 算法来加解密数据,使用 M 和 RSA 算法来加解密 S。在保存 RSA 私钥 M 时,也会可选地使用密码加密后保存。
详细的数据加密过程如下:
- 对于即将要写入对象存储的数据,先按照 4MB 拆分成 Page,每个 Page 先使用 Zstandard 进行压缩。
- 对每一个 Page,会随机生成一个 256 位的对称密钥 S 和随机种子 N。
- 使用 AES-GCM 算法和 S、N 加密 Page。
- 使用 RSA 密钥 M 来加密该随机对称密钥 S,得到密文 K。
- 将加密后的数据以及密文 K,还有随机种子 N 合并成 Object, 一起写入到对象存储。
数据的解密过程如下:
- 从对象存储中读取一个加密后的完整 Object(可能略大于 4MB)。
- 从 Object 中解析出对称密钥的密文 K,以及所使用的随机种子 N,还有数据密文。
- 使用 RSA 密钥 M 来解密 K 得到对称密钥 S。
- 使用 AES-GCM 算法以及密钥 S 和 N 来解密数据,得到数据源文。
- 解压缩数据 Page,并跟其他解密后的 Page 一起拼装成要读的数据。
密钥管理
当使用存储加密后,RSA 密钥的安全性就变得非常重要,密钥泄露可能导致数据泄露,密钥丢失又会导致所有数据丢失(不可恢复)。
JuiceFS 支持两种密钥管理办法,一种是由用户自行管理,或者用任何第三方来管理;另一种是由 JuiceFS 托管。
自行管 理密钥
如果使用自行管理密钥的方法,无需对文件系统做任何设置,只需要在挂载文件系统时统一提供同样的私钥(以及可选的私钥保护密码)即可。
使用方法:
-
生成 RSA 密钥:
openssl genrsa -out my-priv-key.pem -aes256 2048
备注请妥善保存好该密码,丢失后将无法读取文件系统数据。
-
挂载时提供密钥:
juicefs mount NAME MOUNT-POINT --rsa-key PATH-TO-PRIVATE-KEY
当挂载时提供了 RSA 密钥,客户端会询问保护该密钥的密码。如果没有密码保护,输入空字符串即可(直接回车)。