+ xPKQ90ht2zqmFz / sNF / sycDi6hYTYvF8Fcg9x -

OpenZFS本机加密的快速入门指南

通过这个简短的指南了解OpenZFS加密的方法、原因和内容。

如何进行加密?

现在我们已经讨论了为什么和什么,让我们讨论更多关于如何。以下是需要了解的重要命令和参数:

zfs创建

ZFS加密的第一步是创建加密的数据集或zvol本身。您不能加密已存在的数据集或zvol—它需要从一开始就以这种方式创建。(你可以,如有必要,将现有数据集完全复制到加密父数据集的新子数据集上,从而保留快照历史和其他细节。只需在复制完成并验证一切正常后删除源代码。)

zfs创建-o encryption=[algorithm] -o keylocation=[location] -o keyformat=[format]poolname / datasetname

现在,让我们来解决每个粗体的论点。如果你一直在阅读,加密是很简单的:如果你把这个设置为,您将得到默认的加密算法-的变体aes - 256这取决于您特定的OpenZFS版本。否则,您可以直接指定当前算法,支持aes在宽度128192,或256在这两种ccmgcm变体。我们目前推荐aes - 256 gcm严格地基于它是当前最新版本OpenZFS中使用的默认算法!

Keylocation可以是任何一个提示(提示您在必要时键入它)或键文件的路径(在表单file:///path/to/keyfile).不幸的是,你不能轻易地从交互式切换提示一旦创建了数据集或zvol,就将其存储到一个密钥文件中—因此这里需要提前进行一些计划。使用密钥文件允许在使用引导时自动挂载加密的ZFS卷提示每次都需要人工解锁加密的卷。

Keyformat可以是任何一个密码十六进制,或.口令长度必须在8到512字节之间十六进制而且密钥长度必须精确到32字节。生成原始密钥Dd if=/dev/urandom bs=32 count=1 of=/path/to/keyfile

keylocation存储为任何使用它的数据集或zvol的ZFS属性。这允许自动挂载加密的数据集和zvol,当该位置是文件而不是交互式提示符时。

最后注意:ZFS实际上并不直接使用提供的密码来加密数据;它用伪随机生成的主密钥加密您的数据。您的密码短语解锁主密钥,然后可以使用它来处理卷本身!

zfs输入键

在创建加密数据集之后,它会自动挂载—但在系统重新启动之后,它不会自动挂载。为了使加密的卷可以再次访问,您将使用zfs输入键命令。

zfs输入键-nr] [-L location] [-a]poolname / zvol-or-dataset

和往常一样,是可选的- r是为递归,它将加载指定的卷和任何子卷。——一个所有更进一步,为当前导入的所有池中找到的所有加密卷加载密钥。

同样,对于Linux实用程序,- n无操作又名预演。比如表演,ZFS load-key -n -a方法中指定的所有键keylocation加密数据集和zvols的属性是可用的,而且是正确的——但是这样做并不需要实际更改密钥或挂载状态。

最后,- l位置覆盖了keylocation属性存储在ZFS数据集或zvol本身。例如,假设您使用交互式提示的密码短语创建了一个加密数据集正确的马电池钉.你可以把那个短语输入/home/me/myzfskey.txt,然后做zfs load-key -L file:///home/me/myzfskey.txt poolname/datasetname .txt,键将加载正常。

警告:简单地加载键实际上并不您的数据集或zvol -这是一个单独的操作,需要在键加载后执行,例如,ZFS挂载ZFS挂载poolname/datasetname

如果你想在启动时自动加载键,Arch Linux wiki上有样例systemd服务定义可用

zfs unload-key

只要不是就行(通常意味着挂载),您可以从加密卷卸载密钥。此命令共享- r而且——一个国旗与zfs输入键.卸载后,ZFS获取keystatus poolname/datasetname将返回不可用,在重新加载密钥之前,可能无法挂载该卷。

记住:没有加载键的卷不能被读取或写入,但是它们可以使用- w国旗zfs发送!维护级别的ZFS操作,如擦除、恢复,甚至(数据集或zvol级别)重命名,在锁定的卷上也可以很好地工作。

zfs改变键

该命令可用于修改keylocationkeyformat和/或pbkdf2iters加密卷的属性,以及实际密钥本身。使用zfs改变键要求重新加密受影响卷中的所有数据Key保持不变;什么zfs改变键更改加密相关的ZFS属性,和/或更改用于的密码短语解锁主密钥。

zfs改变键[-l] [-o keylocation=location] [-o keyformat=format] [-o pbkdf2= value]poolname / dataset-or-zvol

- l(小写L)在更改之前加载键-这在功能上等价于ZFS load-key poolname/dataset;ZFS更改密钥池名称/数据集

keyformat而且keylocation就像他们听起来的那样:看到了吗zfs输入键以上为解释。pbkdf2iters为生成默认的主密钥而应用于密码短语的PBKDF迭代次数是多少One hundred.不应该被那些无知的凡人所干扰完全这意味着什么(以及它的含义是什么),而不需要进一步阅读。

请记住,我们不会更改主密钥,只更改用户的“包装”密钥—因此更改此密钥并不能绝对保证原始包装密钥已被破坏的数据的安全性。一个足够高级的攻击者可能已经发现了主- - - - - -Key,因此在严重的泄露事件中,你会想要完全重写数据集(例如,通过复制到一个新的数据集,用不同的密钥加密的父数据集的子数据集)。

zfs发送

zfs发送而且zfs接收对于正常的ZFS是否使用相同的命令,以相同的方式使用复制像往常一样工作……有几个非常重要的警告。要使用加密复制,必须指定- w参数zfs发送.使用- w发送的数据与磁盘上已经存储的数据完全一致——除了加密之外,还保留了压缩的完整性。

如果你忘记使用- wzfs发送装载了密钥的数据集,复制将正常工作,但目标将未加密!

请记住,ZFS复制是基于快照的,因此您需要创建、管理和使用快照才能利用复制。如果没有额外的工具,这个过程看起来像这样:

root@banshee: ~ # zfs快照女妖/ encrypted-source@snapshot1 root@banshee: ~ # zfs - w女妖发送/ encrypted-source@snapshot1 | zfs接收女妖/ encrypted-target root@banshee: ~ # zfs快照女妖/ encrypted-source@snapshot2 root@banshee: ~ # zfs - w -我发送女妖/ encrypted-source@snapshot1女妖/ encrypted-source@snapshot2 | zfs接收女妖/ encrypted-target root@banshee: ~ # zfs rt吸附效果参考使用女妖/ encrypted-target名称列表挂载点女妖/ encrypted-target@snapshot1 16 k-672K - banshee/encrypted-target@snapshot2 0B - 672K - root@banshee:~# zfs get keystatus banshee/encrypted-target NAME PROPERTY VALUE SOURCE banshee/encrypted-target keystatus unavailable -

在上面的示例中,我们首先执行基于@snapshot1的增量复制@snapshot1@snapshot2.我们可以验证快照是否在目标上存在并且是正确的ZFS list -rt快照,即使没有加载键,但尝试访问实际数据也会失败,因为没有为目标数据集加载键,也没有挂载。

为了获取数据,我们可以zfs输入键而且zfs山目标数据集,或者我们可以ZFS send -w又回到了源头。

如果这一切看起来太复杂和难以自动化,我自己的工具syncoid能帮我指明吗——sendoptions = w你要去参加比赛;syncoid自动处理匹配的普通快照,甚至在必要时创建快照。

(除了提供的Github链接上的主版本,syncoid的父包sanoid目前可以从大多数主要发行版的默认存储库中获得,例如,Apt安装sanoidUbuntu 20.04。)

root@banshee:~# zfs destroy -r banshee/encrypted-target root@banshee:~# syncoid——compress=none——sendoptions=w banshee/encrypted-source banshee/encrypted-target INFO: Sending old full snapshot banshee/encrypted-source@1 (~ 491 KB) to new target filesystem: 418KiB 0:00:00 [50.2 mib /s] [===========================>] 85% INFO: Updating new target filesystem with incremental banshee/encrypted-source@1…syncoid_banshee_2021-06-23:17:31:24 (~ 19 KB): 525,000 kib 0:00:00 [391KiB/s] [================================] 269% root@banshee:~# zfs list -rt snap banshee/ encryption -target NAME USED AVAIL REFER MOUNTPOINT banshee/encrypted-target@snapshot1 16K - 672K - banshee/encrypted-target@snapshot2 16K - 672K - banshee/encrypted-target@syncoid_banshee_2021-06-23:17:31:24 0B - 672K -

注意,我们还使用了——压缩=没有,因为加密的源数据是不可压缩的。在磁盘上应用的任何ZFS压缩都将保持完整——压缩=没有syncoid选项仅在运行中压缩数据,与磁盘使用无关。如果你忘记指定——压缩=没有,它不会伤害任何东西;你只会在非常快速和低影响上浪费几个CPU周期lzo默认飞行压缩。

结论

希望您现在对ZFS加密的理解比阅读本文时更好。与许多ZFS特性一样,磁盘加密是已经可用的,而且在某些方面,在原始层中更简单。但是将其直接包装到OpenZFS系统中可以实现许多有趣的新可能性——特别是“原始发送”概念,该概念允许OpenZFS出色的异步增量复制发挥作用没有装钥匙,可以改变游戏规则。

请记住zfs输入键而且zfs山在这里非常非常重要——它们对源头和目标都很重要。如果您遇到这样一种情况,即所有文件似乎都消失了,但没有抛出明显的错误,那么几乎可以肯定,您只是忘记挂载数据集,或者在某些情况下,将其挂载到与预期不同的位置。

如果您需要ZFS加密、ZFS复制甚至sanoid/syncoid本文中简要提到的编排工具,您可能想看一看r / zfs,以及本文本身的评论部分。

你必须置评。

通道Ars Technica