Linux 上的 ZFS 加密池?

Rob*_*Rob 7 filesystems zfs arch-linux encryption

我目前正在玩和测试 ZFS,我真的很喜欢它。现在我正在寻找最好的方法来使用它来替代我的基于 luks 的全盘加密的标准设置。

ZFS 中的加密概念如何,我是加密整个还是仅加密单个数据集?我的想法是像往常一样启动,输入密码和其余部分。我不想为池中的每个数据集输入密码,这可能吗?

我已经尝试在 luks 全盘加密容器中使用 ZFS 池,它可以工作,但我想这会比直接使用 ZFS 的性能低得多。

我正在使用带有“稳定”内核和 NVME SSD 的 Arch Linux。感谢您的澄清和推荐的设置!

哦,还有一个:我读到你不能加密现有的数据集或池,还是这样吗?

cas*_*cas 11

  • 随着 0.8 版的发布,加密被添加到 ZFS On Linux 中。所以你至少需要那个版本。

  • 在 ZFS 中,加密是基于每个数据集的,而不是基于池的 - 但是,与 ZFS 中的大多数事物一样,数据集可以从其父级(或从定义encryptionroot而不是父级)继承加密属性。

  • 对 ZFS 中的数据集设置加密不会自动加密其中已有的任何数据。与启用压缩(或更改压缩类型)一样,只会加密新数据。

  • 加密现有的数据,可以rsync或者zfs send到另一个数据集启用加密,然后替换旧的数据集用新加密的一个。这可能需要系统处于单用户模式(或者,至少,暂时关闭任何可能写入旧数据集或在旧数据集上打开文件的程序)

我没有在我的任何 zpool 上使用加密,所以这就是我对它的全部了解。我强烈建议进行更多研究并阅读 ZOL 邮件列表的档案,并在ZOL github repo上搜索与加密相关的问题

加密部分man zfs

加密

启用加密功能允许创建加密的文件系统和卷。ZFS 将加密文件和 zvol 数据、文件属性、ACL、权限位、目录列表、FUID 映射和userused/groupused数据。ZFS 不会加密与池结构相关的元数据,包括数据集和快照名称、数据集层次结构、属性、文件大小、文件漏洞和重复数据删除表(尽管重复数据删除数据本身已加密)。

密钥轮换由 ZFS 管理。更改用户的密钥(例如密码)不需要重新加密整个数据集。可以在不加载加密密钥的情况下清理、重新同步、重命名和删除数据集(zfs load-key有关密钥加载的更多信息,请参阅子命令)。

创建加密数据集需要在创建时指定encryptionkeyformat属性,以及可选的 keylocationpbkdf2iters。输入加密密钥后,创建的数据集将成为加密根。默认情况下,任何后代数据集都会从加密根继承其加密密钥,这意味着加载、卸载或更改加密根的密钥将对所有继承数据集隐式执行相同的操作。如果不需要这种继承,只需keyformat在创建子数据集时提供 a 或用于zfs change-key破坏现有关系,在子数据集上创建新的加密根。

请注意,子keyformat节点可能与父节点匹配,同时仍会创建新的encryption根,并且仅更改加密属性不会创建新的加密根;这将简单地使用不同的密码套件,其密钥与其加密根相同。一个例外是克隆将始终使用其源的加密密钥。由于此异常,某些与加密相关的属性(即keystatuskeyformatkeylocationpbkdf2iters)不像其他 ZFS 属性那样继承,而是使用由其加密根确定的值。可以通过只读 encryptionroot属性跟踪加密根继承。

加密改变了一些 ZFS 操作的行为。压缩后应用加密,因此压缩率得以保留。ZFS 中的校验和通常为 256 位长,但对于加密数据,校验和是用户选择的校验和的 128 位和加密套件中的 128 位 MAC,这提供了额外的保护以防止恶意更改数据。在启用加密的情况下仍然可以进行重复数据删除,但为了安全起见,数据集将仅针对自身、其快照和克隆进行重复数据删除。

加密数据集有一些限制。无法通过该embedded_data功能嵌入加密数据。加密数据集可能没有副本 = 3,因为实现存储了一些加密元数据,而第三个副本通常会在那里。由于压缩是在加密之前应用的,如果访问数据的应用程序允许,数据集可能容易受到类似 CRIME 的攻击。带有加密的重复数据删除将泄漏有关数据集中哪些块等效的信息,并且会导致每个写入块的额外 CPU 成本。