我目前正在尝试和测试 ZFS,我真的很喜欢它。现在,我正在寻找最好的方法来使用它来替代我的基于 luks 的全磁盘加密的标准设置。
ZFS中的加密概念如何,我是否加密整个水池或者只是个人数据集?我的想法是启动,输入密码,然后像往常一样进行其余操作。我不想为池中的每个数据集输入密码,这可能吗?
我已经尝试在 luks 全磁盘加密容器内使用 ZFS 池,它可以工作,但我想这比直接使用 ZFS 的性能要低得多。
我使用的是带有“稳定”内核和 NVME SSD 的 Arch Linux。感谢您的澄清和推荐的设置!
哦,还有一个:我读到您无法加密现有的数据集或池,现在仍然如此吗?
答案1
随着版本 0.8 的发布,ZFS On Linux 添加了加密功能。所以你至少需要那个版本。
在 ZFS 中,加密基于每个数据集,而不是基于池 - 但是,与 ZFS 中的大多数内容一样,数据集可以从其父级(或从已定义的
encryptionroot
而不是父级)继承加密属性。在 ZFS 中对数据集设置加密将不是自动加密其中已有的任何数据。与启用压缩(或更改压缩类型)一样,只有新数据才会被加密。
要加密现有数据,您可以
rsync
将zfs send
其转移到另一个启用了加密的数据集,然后用新的加密数据集替换旧数据集。这可能需要系统处于单用户模式(或者至少暂时关闭任何可能写入旧数据集或在旧数据集上打开文件的程序)
我没有在我的任何 zpool 上使用加密,所以这就是我所知道的全部内容。我强烈建议您进行更多研究并阅读 ZOL 邮件列表的档案并搜索加密相关问题于ZOL github 仓库。
来自加密部分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,因为该实现将一些加密元数据存储在第三个副本通常所在的位置。由于压缩是在加密之前应用的,因此如果访问数据的应用程序允许的话,数据集可能容易受到类似犯罪的攻击。加密重复数据删除会泄露数据集中哪些块是等效的信息,并且每个写入的块会产生额外的 CPU 成本。