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
有关密钥加载的更多信息,请参阅子命令)。创建加密数据集需要在创建时指定
encryption
和keyformat
属性,以及可选的keylocation
和pbkdf2iters
。输入加密密钥后,创建的数据集将成为加密根。默认情况下,任何后代数据集都会从加密根继承其加密密钥,这意味着加载、卸载或更改加密根的密钥将对所有继承数据集隐式执行相同的操作。如果不需要这种继承,只需keyformat
在创建子数据集时提供 a 或用于zfs change-key
破坏现有关系,在子数据集上创建新的加密根。请注意,子
keyformat
节点可能与父节点匹配,同时仍会创建新的encryption
根,并且仅更改加密属性不会创建新的加密根;这将简单地使用不同的密码套件,其密钥与其加密根相同。一个例外是克隆将始终使用其源的加密密钥。由于此异常,某些与加密相关的属性(即keystatus
、keyformat
、keylocation
和pbkdf2iters
)不像其他 ZFS 属性那样继承,而是使用由其加密根确定的值。可以通过只读encryptionroot
属性跟踪加密根继承。加密改变了一些 ZFS 操作的行为。压缩后应用加密,因此压缩率得以保留。ZFS 中的校验和通常为 256 位长,但对于加密数据,校验和是用户选择的校验和的 128 位和加密套件中的 128 位 MAC,这提供了额外的保护以防止恶意更改数据。在启用加密的情况下仍然可以进行重复数据删除,但为了安全起见,数据集将仅针对自身、其快照和克隆进行重复数据删除。
加密数据集有一些限制。无法通过该
embedded_data
功能嵌入加密数据。加密数据集可能没有副本 = 3,因为实现存储了一些加密元数据,而第三个副本通常会在那里。由于压缩是在加密之前应用的,如果访问数据的应用程序允许,数据集可能容易受到类似 CRIME 的攻击。带有加密的重复数据删除将泄漏有关数据集中哪些块等效的信息,并且会导致每个写入块的额外 CPU 成本。