我目前正在玩和测试ZFS,我真的很喜欢它。现在,我正在寻找最好的方式来使用它作为我的标准设置与基于luks的全磁盘加密的替代。
在ZFS中加密的概念是怎样的,我是加密整个池还是只加密单个数据集?我的想法是引导,输入一个密码,其余的和往常一样。我不想为池中的每个数据集输入密码,所以有可能吗?
我已经尝试过在luks全磁盘加密容器中使用ZFS池,它可以工作,但我想这比直接使用ZFS要低得多。
我使用Arch与“稳定”内核和NVME SSD。谢谢你的澄清和推荐的设置!
哦,再来一次:我读到你不能加密现有的数据集或池,这仍然是事实吗?
发布于 2019-10-28 02:38:51
encryptionroot而不是父数据集)继承加密属性。rsync或zfs send加密到其他数据集,然后用新加密数据集替换旧数据集。这可能要求系统处于单用户模式(或至少暂时关闭可能写入旧数据集或打开旧数据集的任何程序)。我不对我的任何一个z池使用加密,所以这就是我所知道的全部。我强烈建议做更多的研究,阅读ZOL邮件列表的档案,并在加密相关问题上搜索ZOL github回购。
来自man zfs的加密部分:
加密启用加密特性允许创建加密的文件系统和卷。ZFS将加密文件和zvol、文件属性、ACL、权限位、目录列表、FUID映射和
userused/groupused数据。ZFS不会加密与池结构相关的元数据,包括dataset和快照名称、dataset层次结构、属性、文件大小、文件漏洞和去重复表(尽管数据本身是加密的)。密钥旋转由ZFS管理。更改用户的密钥(例如密码)不需要重新加密整个数据集。数据集可以在不加载加密密钥的情况下被擦除、重新镀银、重命名和删除(有关密钥加载的更多信息,请参见zfs load-key子命令)。创建加密数据集需要在创建时指定encryption和keyformat属性,以及可选的keylocation和pbkdf2iters。输入加密密钥后,创建的数据集将成为加密根目录。默认情况下,任何子代数据集都将从加密根继承其加密密钥,这意味着加载、卸载或更改加密根的密钥对于所有继承的数据集都将隐式地执行相同的操作。如果不需要这种继承,只需在创建子数据集时提供一个keyformat,或者使用zfs change-key破坏现有的关系,在子数据集中创建一个新的加密根。注意,在仍然创建新的keyformat根目录时,子密码的encryption可能与父D27匹配,并且仅更改加密属性并不会创建新的加密根;这将使用与其加密根相同的密钥的不同密码套件。一个例外是克隆将始终使用它们的原始加密密钥。由于此异常,一些与加密相关的属性(即keystatus、keyformat、keylocation和pbkdf2iters)不像其他ZFS属性一样继承,而是使用它们的加密根所确定的值。可以通过只读encryptionroot属性跟踪加密根继承。加密会改变一些ZFS操作的行为。加密是在压缩后进行的,所以压缩比是保持不变的。通常,ZFS中的校验和是256位长,但对于加密数据,校验和是用户选择校验和的128位,以及加密套件中的128位MAC,这为防止恶意更改的数据提供了额外的保护。在启用加密的情况下,仍然可以实现去重复,但是为了安全起见,数据集只会对自己、快照和克隆进行降维。加密数据集有一些限制。加密数据不能通过embedded_data特性嵌入。加密数据集可能没有copies=3,因为实现存储了一些加密元数据,通常第三个副本就在那里。由于压缩是在加密之前应用的,如果访问数据的应用程序允许的话,数据集可能容易受到类似犯罪的攻击。加密的去重复会泄露数据集中哪些块等效的信息,并将导致每个块编写的额外CPU成本。
https://unix.stackexchange.com/questions/548997
复制相似问题