数据加密
数据传输加密
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 密钥,客户端会询问保护该密钥的密码。如果没有密码保护, 输入空字符串即可(直接回车)。
如果要实现自动挂载,需要设置环境变量 JFS_RSA_PASSPHRASE 为所使用的密码 (无密码则为空字符串)。
托管密钥
JuiceFS 同时提供密钥托管功能。如果要使用该方案,需要在 JuiceFS 的官方控制台开启存储加密功能,控制台会随机生成 2048 位 RSA 密钥,并使用用户提供的密码来加密,并安全保存该加密后的密文。该密码可以随时修改,密码修改后,已经挂载后的文件系统不受影响,之后的挂载需要使用新密码。
为了规避密码丢失的风险,JuiceFS 还对 RSA 密钥提供了另外一重保障。在启用存储加密功能时,控制台还会随机生成一个随机恢复码,并用它加密该 RSA 密钥后保存。 该随机恢复码只在启用加密时展示一次(给用户下载),建议保存到安全的地方。 日后万一忘记密码,可以通过它来重置密码(解密得到 RSA 私钥并使用新密码重新加密)。
使用方法:
清空文件系统里的内容
存储加密要求文件系统里的所有内容统一使用相同的加密方法,只能对空文件系统启用加密功能。如果回收站中还有文件, 也请清空, 否则回收站中的文件恢复后将不能正确读取。
在控制台启用存储加密
在文件系统的设置页,可以启用存储加密,设置密码保护, 并安全保存密钥恢复码。
使用密码挂载文件系统
对启用了存储加密的文件系统,客户端会在挂载时提示输入密码。输入错误的密码则不能挂载。如果想实现非交互式挂载,密码可以通过环境变量JFS_RSA_PASSPHRASE 来提供。JuiceFS 客户端 4.3.0 才支持存储加密功能,请用 juicefs version –upgrade 来升级客户端。
性能影响
现在主流的 CPU 都能非常高效的支持 TLS、HTTPS、AES-256,以上传输和存储加密几乎不会影响文件系统的性能。RSA 算法比较慢,尤其是解密部分,推荐使用 2048 位 RSA 密钥来使用存储加密,4096 位密钥会明显影响读数据的性能。