OpenZFS带来的众多特性之一是ZFS本机加密。本机加密最初是在OpenZFS 0.8中引入的,它允许系统管理员透明地加密ZFS内部的静态数据。这样就不需要单独的工具陆,VeraCrypt,或磁盘加密.
OpenZFS的加密算法默认是任意一种aes - 256 - ccm
(在0.8.4之前)或aes - 256 gcm
(>= 0.8.4)时加密上=
是集。但也可以直接指定。目前支持的算法有:
aes - 128 - ccm
aes - 192 - ccm
aes - 256 - ccm
(默认在OpenZFS < 0.8.4)aes - 128 gcm
aes - 192 gcm
aes - 256 gcm
(默认在OpenZFS >= 0.8.4)
但是,除了使用的算法之外,OpenZFS本地加密还有更多的内容,因此我们将尝试从系统管理员的角度简要而扎实地介绍“为什么”和“什么”以及简单的“如何”。
为什么(或者为什么不)OpenZFS本地加密?
显然,一个聪明的系统管理员如果想要提供静态加密,实际上并不需要OpenZFS本机加密。正如在介绍中提到的,陆
,VeraCrypt
,以及许多其他可用的方案,可以在OpenZFS本身的下面或上面分层。
首先,“为什么不呢”
比如Linux陆
OpenZFS有一个优势——使用整个磁盘加密后,攻击者将无法再看到ZFS的名称、大小或属性数据集
而且zvols
不能拿到钥匙。事实上,攻击者不一定能看到正在使用ZFS !
但这种做法也有明显的缺点陆
(或类似)在OpenZFS下面。其中最粗糙的是每一个个人必须对将成为ZFS池一部分的磁盘进行加密,在装入ZFS池之前加载和解密每个卷进口
阶段。对于具有许多磁盘(在某些情况下是许多磁盘)的ZFS系统来说,这可能是一个明显的挑战数以千万计的磁盘。ZFS下加密的另一个问题是,额外的层是一个容易出错的东西,它可以撤销ZFS的所有正常完整性保证。
把陆
或类似于OpenZFS之上的应用程序消除了前面提到的问题- a陆
加密zvol
无论涉及多少磁盘,都只需要一个键,并且陆
层不能从这里撤销OpenZFS的完整性保证。不幸的是,加密顶部- zfs引入了一个新问题——它有效地削弱了OpenZFS内联压缩,因为加密的数据通常是不可压缩的。这种方法也是需要一个的使用zvol
每个加密的文件系统,以及一个客户文件系统(例如,ext4
)以格式化陆
体积本身。
现在,“为什么”
OpenZFS本地加密解决了这一问题:它运行在正常的ZFS存储层之上,因此不会削弱ZFS自身的完整性保证。但它也不会干扰ZFS压缩——数据在保存到加密文件之前会被压缩数据集
或zvol
.
rsync
而原始发送不仅可以加密复制数据集
年代和zvol
S,但是这样做不会将密钥暴露给远程系统。这意味着您可以使用ZFS复制将数据备份到不可信的位置,无需担心您的私人数据被读取。使用原始发送,您的数据可以在不需要解密的情况下复制—备份目标根本无法解密它。这意味着你可以复制你的异地备份到一个朋友的房子或商业服务,如rsync.net或zfs.rent不损害你的隐私,即使服务(或朋友)本身受到损害。
如果需要恢复脱机备份,可以简单地复制它回来到你自己的位置——然后,然后只有然后,加载解密密钥以实际访问数据。这适用于完全复制(在线路上移动每个块)或异步增量复制(从一个通用的快照开始,只移动自该快照以来发生变化的块)。
什么是加密的,什么不是?
OpenZFS本机加密不是一个全磁盘加密方案——它是根据每个数据集/每个zvol启用或禁用的,并且不能为整个池作为一个整体打开它。加密数据集或zvols的内容受到保护,不受静态间谍的监视,但描述数据集/zvols本身的元数据却没有。
假设我们创建了一个加密数据集池/加密
,在它下面我们创建更多的子数据集。的加密
属性默认从父数据集继承,因此我们可以看到以下内容:
root@banshee:~# zfs create -o encryption=on -o keylocation=prompt -o keyformat=passphrase banshee/encrypted Enter passphrase: Re-enter passphrase:zfs root@banshee: ~ #创建女妖/加密/ child1 root@banshee: ~ # zfs创建女妖/加密/ child2 root@banshee: ~ # zfs创建女妖/加密/格root@banshee: ~ #效果参考使用zfs - r女妖/加密列表名称挂载点女妖/加密1.58米848克432 k /女妖/加密的女妖/加密/ child1 320 k 848克320 k /女妖/加密/ child1女妖/加密/ child2 320 k 848克320 k /女妖/加密/ child2女妖/加密/格320 k 848克320 k /女妖/加密/格root@banshee:~# zfs get encryption banshee/encrypted/child1 NAME PROPERTY VALUE SOURCE banshee/encrypted/child1 encryption aes-256-gcm - .
目前,我们的加密数据集都已挂载。但是,即使我们卸载它们并卸载加密密钥(使它们无法访问),我们仍然可以看到它们存在,以及它们的属性:
root@banshee:~# wget -qO /banshee/encrypted/child2/ huckfin .txt http://textfiles.com/etext/AUTHORS/TWAIN/huck_finn root@banshee:~# zfs unmount banshee/encrypted 1 / 1 key(s) successfully unloaded root@banshee:~# zfs mount banshee/encrypted cannot mount 'banshee/encrypted':加密密钥未加载root@banshee:~# ls /banshee/encrypted/child2 ls:无法访问'/banshee/encrypted/child2':没有这样的文件或目录root@banshee:~# zfs list -r banshee/encrypted NAME USED AVAIL REFER MOUNTPOINT banshee/encrypted 2.19M 848G 432K /banshee/encrypted/child1 320K 848G 320K /banshee/encrypted/child1 banshee/encrypted/child2 944K 848G 720K /banshee/encrypted/child3 320K 848G 320K /banshee/encrypted/child3
正如我们在上面看到的,卸载加密密钥后,我们不能再看到我们新下载的拷贝《哈克贝利·费恩历险记》在/女妖/加密/ child2 /
.我们可以仍然可以看到整个zfs加密树的存在和结构。我们还可以看到每个加密数据集的属性,包括但不限于使用
,效果
,请参考
每个数据集的。
值得注意的是试图ls
未加载密钥的加密数据集不一定会产生错误:
root@banshee:~# zfs get keystatus banshee/encrypted NAME PROPERTY VALUE SOURCE banshee/encrypted keystatus unavailable - root@banshee:~# ls /banshee/encrypted root@banshee:~#
这是因为主机上存在一个裸目录,即使实际的数据集没有被挂载。重新加载键也不会自动重新挂载数据集:
root@banshee:~# zfs load-key -r banshee/encrypted Enter passphrase for 'banshee/encrypted': 1 / 1 key(s) successfully loaded root@banshee:~# zfs mount | grep encr root@banshee:~# ls /banshee/encrypted/child2 ls: cannot access '/banshee/encrypted/child2':没有这样的文件或目录
才能拿到我们最新的《哈克贝利·费恩历险记》,我们还需要实际挂载新键重载的数据集:
root@banshee:~# zfs get keystatus banshee/encrypted/child2 NAME PROPERTY VALUE SOURCE banshee/encrypted/child2 keystatus available - root@banshee:~# ls -l /banshee/encrypted/child2 ls:无法访问'/banshee/encrypted/child2':没有这样的文件或目录root@banshee:~# zfs mount -a root@banshee:~# ls -lh /banshee/encrypted/child2 total 401K -rw-r——r——1 root root 554K Jun 13 2002 huckfin .txt
既然我们都装上了必要的钥匙而且挂载数据集后,我们可以再次看到加密数据。
读者评论
我猜一个用户(我想更多的个人笔记本电脑与Linux/*BSD与ZFS)可以有基本的主目录是不加密的,但所有的子目录都是加密数据集的一部分,然后,在第一次登录UI时,它提示密码来加载密钥。
按https://zfsonlinux.org/manpages/0.8.6/man8/zfs.8.html
控制此数据集使用的加密密码套件(分组密码、密钥长度和模式)。要求在池上启用加密特性。要求在数据集创建时设置键格式。
在创建数据集时选择encryption = on表示将选择默认的加密套件,目前为aes-256-gcm。为了提供一致的数据保护,必须在创建数据集时指定加密,之后不能更改加密。
有关加密的详细信息和注意事项,请参阅加密部分。
编辑:更新链接到最新的manpage版本,我链接到一个过时的旧版本。
最后编辑:Drizzt3212021年6月23日星期三晚上7点29分
像这样:
$zfs加密YourPool/YourDataset
名称属性值源
YourPool/YourDataset加密aes-256-gcm -
第二次编辑:顺便说一下,是GCM。
像这样:
$zfs加密YourPool/YourDataset
名称属性值源
YourPool/YourDataset加密aes-256-gcm -
Malor的问题是当值是“on”时,是什么算法。根据本文,有两种不同的默认值,这取决于您使用的ZFS版本。基本上过去一年左右的任何东西,都在使用GCM。
@malor,对不起,我上面的链接是一个旧版本的手册页,对不起,根据文章,它是-GCM,因为>=0.8.4,当前ZoL版本为0.8.6。我会更新我的评论。
根据我的经验,你确实需要不想在没有AESNI的计算机上运行ZFS加密。他们对软件模式做了一些改进,但仍然非常缓慢。使用AESNI,它基本上以磁盘速度运行。没有的话,就是一团糟。
我最初是在一台老式i7-920上尝试加密的,这台i7-920很古老,但性能仍然相当好。那台硬件上的ZFS加密非常糟糕。在沉重的写负载下,系统实际上无法使用。换到4790K马上就修好了。
自从我的实验以来,软件改进已经被添加了,但我们最近在Ars论坛上有一个帖子试图使用没有使用硬件加速的ARM二进制文件,这对他们来说也是一场灾难。
编辑:如果你没有太多的卷,就像文章说的,你可以使用LUKS加密,它在任何硬件上都非常快。但是您可能需要编写脚本来解锁过程,除非您想在每个磁盘上输入一个密码。类似地,我还编写了加载和挂载ZFS键的脚本,因此您可能不会丢失任何东西。
它可能不太可靠,但AFAIK LUKS是一个非常薄的层,所以它的反应可能与直接将ZFS体积放在金属上相同。
根据我的经验,你确实需要不想在没有AESNI的计算机上运行ZFS加密。他们对软件模式做了一些改进,但仍然非常缓慢。使用AESNI,它基本上以磁盘速度运行。没有的话,就是一团糟。
我最初是在一台老式i7-920上尝试加密的,这台i7-920很古老,但性能仍然相当好。那台硬件上的ZFS加密非常糟糕。在沉重的写负载下,系统实际上无法使用。换到4790K马上就修好了。
自从我的实验以来,软件改进已经被添加了,但我们最近在Ars论坛上有一个帖子试图使用没有使用硬件加速的ARM二进制文件,这对他们来说也是一场灾难。
编辑:如果你没有太多的卷,就像文章说的,你可以使用LUKS加密,它在任何硬件上都非常快。但是您可能需要编写脚本来解锁过程,除非您想在每个磁盘上输入一个密码。类似地,我还编写了加载和挂载ZFS键的脚本,因此您可能不会丢失任何东西。
它可能不太可靠,但AFAIK LUKS是一个非常薄的层,所以它的反应可能与直接将ZFS体积放在金属上相同。
在ZFS和它的磁盘之间放置“任何东西”的想法,无论多么轻量级,都让我感到恐惧。
即使是在这个芯片短缺的时代,我觉得如果你要努力配置和部署加密的ZFS,那么换一个支持AES-NI的CPU(如果需要的话,还可以换一个新的MB)是非常容易的。如果没有别的原因,只要你有信心,它不会在你开始使用它的时候就死于衰老
正如本文中提到的,它将是aes-256-ccm或aes-256-gcm,这取决于创建数据集的OpenZFS版本。
是的,这很糟糕;是的,它应该显示字面值,而不仅仅是它最初被设置为一些未指定的“默认值”。我们在shift值方面也有同样的问题,如果在创建zpool时没有手动指定shift值,则该值仅显示为“0”。叹息。
编辑:ZFS加密将显示用于加密数据集或zvol的特定算法,即使在创建时没有手动指定它。但一定要使用zfs得到,而不是zpool得到……
最后编辑:吉姆·索尔特2021年6月23日星期三晚上8:31
名称属性值源
(卷)feature@encryption active local
...这不是我想要的
然后我做了大量的工作,试图找到要查询的正确字符串,假设它必须在feature@ wall后面的某个地方。什么都没找到。我在网上搜了一堆,没找到任何明确的信息。然后我问这里,然后
名称属性值源
(卷)/(文件集)加密aes-256-gcm -
瞧,这正是我要找的。我找错了地方,用了错误的语法。feature@encryption是zpools的一个东西,但显然它只是文件集的直接“加密”。
编辑:注意,我可能已经直接设置了算法,而不是使用'on'。我花了几天时间研究ZFS并预先构建文件系统创建行。
名称属性值源
(卷)feature@encryption active local
...这不是我想要的
然后我做了大量的工作,试图找到要查询的正确字符串,假设它必须在feature@ wall后面的某个地方。什么都没找到。我在网上搜了一堆,没找到任何明确的信息。然后我问这里,然后
名称属性值源
(卷)/(文件集)加密aes-256-gcm -
瞧,这正是我要找的。我找错了地方,用了错误的语法。feature@encryption是zpools的一个东西,但显然它只是文件集的直接“加密”。
啊哈,好吧。zpool get让你知道你的池支持加密,在这种情况下,这个特性是活跃的在那个泳池上……在某处。但它实际上只是检查你的池是否支持该功能,而不是关于你如何使用的特性。
' zfs get '返回特定数据集或zvol本身的zfs属性,这正是您在这里想要的(应用于您最初感兴趣的数据集或zvol)。
实际上,这看起来并不是换班惨败的又一次;在本文的示例中,我肯定没有手动设置算法,但我在自己的文章中看到了我自己的“zfs get encryption”,这表明您获得了实际的算法,而不仅仅是on。
也许下次我会RTFA…
当我写最著名的台词(评论2)去年,我只是开玩笑。
毫不奇怪,我没有因此获得编辑奖。
但是,这仍然可以为旧的zfs版本设置!对于我的Ubuntu 20.04 NAS,我最终提取了openzfs 2.0的debian包(但没有安装它!),并将相关文件从/usr/share/initramfs-tools复制到/etc/initramfs-tools,将我的密钥添加到/etc/dropbear-initramfs/,并重新构建initramfs。现在,我可以解锁我的NAS,而不必求助于将密钥文件放在u盘或类似的东西上。
一个附带的好处是,我目前有两个泳池;SSD启动池用于操作系统和应用程序,rust池用于大容量存储。我在同样加密的根池中放置了一个密钥文件,因此可以直接添加一个额外的调用来导入池,并在解锁根池后立即运行' zfs load-key -a '。
我很高兴我采用了这种方式,而不是运行2.0的后端口来获得解锁功能。我在主机上运行Docker,然后 https://github.com/openzfs/zfs/issues/11480 肯定是我在很长一段时间内看到的冲击生产系统的最令人心跳停止的文件系统问题之一。
名称属性值源
(卷)feature@encryption active local
...这不是我想要的
然后我做了大量的工作,试图找到要查询的正确字符串,假设它必须在feature@ wall后面的某个地方。什么都没找到。我在网上搜了一堆,没找到任何明确的信息。然后我问这里,然后
名称属性值源
(卷)/(文件集)加密aes-256-gcm -
瞧,这正是我要找的。我找错了地方,用了错误的语法。feature@encryption是zpools的一个东西,但显然它只是文件集的直接“加密”。
很高兴我能帮上忙!
此外,你可以获得所有属性及其设置的列表:
ZFS get all (volume)/(fileset)
即使有一个速度打击,只要它仍然足够快,流蓝光备份使用Plex,这对我来说是好的。
即使有一个速度打击,只要它仍然足够快,流蓝光备份使用Plex,这对我来说是好的。
如果你说的是带有AES-NI的CPU,那就没问题了。如果没有AES-NI…它可能不够强大。很明显,你会发现的。
哦,该死。答案一直都在那里。我仔细阅读了文章,但显然没有看到图片。
根据手册页(以及本文后面提到的change-key),这似乎是不正确的:
我猜一个用户(我想更多的个人笔记本电脑与Linux/*BSD与ZFS)可以有基本的主目录是不加密的,但所有的子目录都是加密数据集的一部分,然后,在第一次登录UI时,它提示密码来加载密钥。
在Linux上,可以编写pam模块来处理这个问题。
我已经开始了与开发人员讨论我甚至尝试自己实现,但我不是Linux内部/内核模块和汇编的专家,我很挣扎。
如果这里有人感兴趣,请加入讨论:欢迎帮助
提示:当加密的子数据集被sanoid/syncoid复制时,数据集在复制目标处失去了它们继承的加密参数(例如,变成“prompt”而不是keylocation的路径)。当使用原始发送时。这可以在解锁目标上的子节点和父节点并使用“zfs change-key -i…”后修复。
另外,对加密性能进行基准测试。
我根据Jim大约一年前的fio文章编写了一个bash脚本,其中尝试了不同的算法和记录大小组合,用于带有USB3 HDD的树莓派。我的结论是512 kB记录大小比1M记录大小执行得更好,CCM优于GCM(显然,在我的例子中,是YMMV)。
(编辑:当fio使用大块写入时,512kb记录大小比1mb记录大小执行得更好,尽管“传统观点”认为1mb记录大小在这种情况下应该更好。我不知道这是否与USB硬盘性能或树莓本身有关,但由于这一组合是我用于场外备份的方法,所以我不关心原因。)
最后编辑:NewCrow2021年6月24日(星期四)上午6:30
我意识到在LUKS上运行ZFS可以绕过这个问题(使用一些骗人的花招),但ZFS本身没有命令行选项来隐藏元数据,这似乎很奇怪。
我意识到在LUKS上运行ZFS可以绕过这个问题(使用一些骗人的花招),但ZFS本身没有命令行选项来隐藏元数据,这似乎很奇怪。
我被困在ZFS下运行GELI,因为它是从以前唯一的选项升级的,但即使这样也会在磁盘上放置一个头文件我希望ZFS/FreeBSD能够提供一种迁移方式,但这就是现实。泳池升级很快就要来了,到时我会修复的。
您所描述的法律难题的解决方案是知道谁控制您服务器上的哪些数据,以便您可以将它们泄露出去。理想情况下,你可以召集当地议员,说服他们这些狗屁法律都是狗屁,但这些天他们似乎只服从他们的TLASOUP主人。
即使有一个速度打击,只要它仍然足够快,流蓝光备份使用Plex,这对我来说是好的。
如果你说的是带有AES-NI的CPU,那就没问题了。如果没有AES-NI…它可能不够强大。很明显,你会发现的。
我那没有AES的老芹菜1610在这方面做得很好。没有带宽来转码,但它很容易比最高比特率的模糊撕裂快得多。
*只对你绝对可能丢失的数据进行加密。
*记住,你是会死的,如果你发生了可怕的事情,你加密的数据可能会永远丢失(尽管死亡,但还有许多其他事情会让你忘记)。
人们确实会忘记密码。
我不是在劝阻任何人加密他们的数据,我只是相信许多人不必要地使用它。
关于这一点:
我知道你的目标可能是让事情变得简单,但我实际上在自动化中使用提示符(没有人工参与)而不是关键文件,因为我发现它更方便,例如,在macOS上你可以这样做:
这让我可以将密码保存在macOS密钥链中,就像我将加密的非系统APFS卷、核心存储、磁盘映像等一样(对于任何想要做同样事情的人,请记住将/usr/bin/security添加到可以访问脚本密钥链条目的应用程序列表中,否则将不起作用)。
虽然如果处理得当,密钥文件可能是安全的,但提示符可以让你从任何你喜欢的地方提取密码,因此以这种方式自动化非常方便。
我是OpenZFS加密的忠实粉丝,它让事情变得简单多了,而且zfs能够发送加密的区块,这对于备份来说是非常棒的。
唯一缺少的功能是免费替换我的旧的(但仍然固执地在完美的工作秩序)Synology NAS,只支持BTRFS;幸运的是,它也做iSCSI,所以我仍然可以用ZFS发送给它,但这不是一个理想的方式。
除了使用本地zfs加密的所有优点之外,备份到远程zfs服务器的能力使所有数据在传输过程中保持加密,然后在静止时(不需要任何解密/加密)使我非常兴奋。
当然,传输也会被加密,但通过保持数据一路加密,提供了强有力的安全保证,并将极大地简化我的程序和文书工作!
是的,强大的安全性应该被记录和证明,对于一些要求严格的客户来说,有很多文书工作要做。
遵从性。
*只对你绝对可能丢失的数据进行加密。
*记住,你是会死的,如果你发生了可怕的事情,你加密的数据可能会永远丢失(尽管死亡,但还有许多其他事情会让你忘记)。
人们确实会忘记密码。
我不是在劝阻任何人加密他们的数据,我只是相信许多人不必要地使用它。
加密*一切*所以*当*硬件失败时,你可以毫无顾虑地折腾。
还要定期备份到离线资源....
ZFS快照大大简化了备份/恢复…
年代
遵从性。
ZFS只能使用最基本的内核功能,因为它不是GPL,而且内核开发人员对非GPL代码几乎关闭了他们所做的所有事情。
实际上,在Linux-ZFS系统....中有两个代码堆栈Linux端和ZFS端。这可能是ZFS严重违反正常Linux分层的部分原因;因为它不能使用Linux提供的功能,所以它实现了几乎所有的硬件。它查找并管理自己的磁盘,管理自己的压缩、加密和错误检测,进行自己的重建,并提供自己的挂载名称空间。用户级程序看不出太大的区别,它们仍然只是与磁盘上的文件对话,但当它们在ZFS数据集上时,它们与一个完整的单独的代码库交互。
随之而来的唯一真正值得注意的问题是,默认情况下,ZFS获取系统中一半的RAM用作缓存。在内存压力下,它可能会缓慢地将其释放回系统,这可能会导致严重的问题。我很确定你可以调低RAM分配,尽管我还没有费心去查找如何调低,因为我目前运行的唯一系统是一个专用服务器,无论如何都会使用一半的内存用于缓存。
因为另一个链接有更多的Googlejuice,我在包装锚标记之前没有更仔细地调查它(因为我记得上次看到它是Veracrypt的官方网站,在TrueCrypt被放弃后不久)。
固定了。谢谢你的提示!
创建文件/etc/modprobe.d/zfs.conf并设置选项ZFS zfs_arc_max=在字节。
是的,字节。不,它不尊重或不理解单位后缀。是的,那是血腥的巨大的拥有1TiB内存的服务器上的数字…
创建文件/etc/modprobe.d/zfs.conf并设置选项ZFS zfs_arc_max=在字节。
是的,字节。不,它不尊重或不理解单位后缀。是的,那是血腥的巨大的拥有1TiB内存的服务器上的数字…
*梦想*我们在工作中做了一些相当大的铁,但1T RAM仍然是我目前能接触到的最大玩具的4倍。
你必须登录或创建帐户置评。