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
既然我们都装上了必要的钥匙而且挂载数据集后,我们可以再次看到加密数据。
读者评论
编辑我的猜测,PBKDF2方法
最后编辑:ChristianSilver2021年6月24日星期四上午10:51
即使是在这个芯片短缺的时代,我觉得如果你要努力配置和部署加密的ZFS,那么换一个支持AES-NI的CPU(如果需要的话,还可以换一个新的MB)是非常容易的。如果没有别的原因,只要你有信心,它不会在你开始使用它的时候就死于衰老
我在可移动存储设备上使用zfs下面的LUKS。我不需要加密服务器上的所有卷,也不需要担心丢失RSD。
*只对你绝对可能丢失的数据进行加密。
*记住,你是会死的,如果你发生了可怕的事情,你加密的数据可能会永远丢失(尽管死亡,但还有许多其他事情会让你忘记)。
人们确实会忘记密码。
我不是在劝阻任何人加密他们的数据,我只是相信许多人不必要地使用它。
加密*一切*所以*当*硬件失败时,你可以毫无顾虑地折腾。
我来告诉你这个。您永远不知道什么时候磁盘会完全失效,无法进行经济修复。你愿意冒着被一些无道德的罪犯从废物中回收并获取有价值数据的风险吗?
你永远不知道什么时候它会被偷。你想冒这个风险,小偷只是为了抓住机会,还是他们专门寻找数据来收获?
这只是一个趣闻。在昏暗的黑暗时代,我把一个磁盘RMA到制造商,因为坏块报告腐败开箱。他们给我寄来了一件翻新的衣服。上面还有别人的数据。甚至没有被零擦除。从那以后我加密了所有的存储设备。
但通过他们提供的服务和更新的博客,我得到了一些叶菊的共鸣。
但通过他们提供的服务和更新的博客,我得到了一些叶菊的共鸣。
您应该能够将zfs发送到任何支持SSH并可以存储文件的设备上。
Rsync.net(无耻的插件,因为他们使用ZFS,以简单的Unix方式做事,只是捐赠存储给任何确认的Debian开发人员。没有其他从属关系)将为你的工作。
不确定为什么文章声称key location属性很难改变,因为它不是。特别是在后面描述如何更改它的时候。
在Ubuntu上,我推荐' /lib/systemd/system-generators/zfs-mount-generator ',它似乎可以处理加密的引导根目录和加密的普通数据集,包括文件和提示键位置:
https://manpages.ubuntu.com/manpages/hi…tor.8.html
但通过他们提供的服务和更新的博客,我得到了一些叶菊的共鸣。
您应该能够将zfs发送到任何支持SSH并可以存储文件的设备上。
Rsync.net(无耻的插件,因为他们使用ZFS,以简单的Unix方式做事,只是捐赠存储给任何确认的Debian开发人员。没有其他从属关系)将为你的工作。
自从几年前rsync.net开始支持ZFS以来,我一直在断断续续地关注rsync.net,但我的问题是定价超出了我的家庭实验室预算。虽然从一开始就大幅下降了(每GB 6美分!),但这仍然大致相当于每个月以相同的存储容量购买一个新驱动器。
关于这一点:
我知道你的目标可能是让事情变得简单,但我实际上在自动化中使用提示符(没有人工参与)而不是关键文件,因为我发现它更方便,例如,在macOS上你可以这样做:
这让我可以将密码保存在macOS密钥链中,就像我将加密的非系统APFS卷、核心存储、磁盘映像等一样(对于任何想要做同样事情的人,请记住将/usr/bin/security添加到可以访问脚本密钥链条目的应用程序列表中,否则将不起作用)。
虽然如果处理得当,密钥文件可能是安全的,但提示符可以让你从任何你喜欢的地方提取密码,因此以这种方式自动化非常方便。
我是OpenZFS加密的忠实粉丝,它让事情变得简单多了,而且zfs能够发送加密的区块,这对于备份来说是非常棒的。
唯一缺少的功能是免费替换我的旧的(但仍然固执地在完美的工作秩序)Synology NAS,只支持BTRFS;幸运的是,它也做iSCSI,所以我仍然可以用ZFS发送给它,但这不是一个理想的方式。
是的,当加载钥匙通过ZetaWatch,我总是覆盖键的位置,以提示,这是最不疯狂的方式发送键从我的程序到zfs库。这也是最安全的方法。不过还是很疯狂
遵从性。
ZFS只能使用最基本的内核功能,因为它不是GPL,而且内核开发人员对非GPL代码几乎关闭了他们所做的所有事情。
实际上,在Linux-ZFS系统....中有两个代码堆栈Linux端和ZFS端。这可能是ZFS严重违反正常Linux分层的部分原因;因为它不能使用Linux提供的功能,所以它实现了几乎所有的硬件。它查找并管理自己的磁盘,管理自己的压缩、加密和错误检测,进行自己的重建,并提供自己的挂载名称空间。用户级程序看不出太大的区别,它们仍然只是与磁盘上的文件对话,但当它们在ZFS数据集上时,它们与一个完整的单独的代码库交互。
随之而来的唯一真正值得注意的问题是,默认情况下,ZFS获取系统中一半的RAM用作缓存。在内存压力下,它可能会缓慢地将其释放回系统,这可能会导致严重的问题。我很确定你可以调低RAM分配,尽管我还没有费心去查找如何调低,因为我目前运行的唯一系统是一个专用服务器,无论如何都会使用一半的内存用于缓存。
是的,不幸的是。在我看来,为什么bsd在服务器上比ZoL更好。完全的内核支持,因此如果内核支持平台上的加密(通常会),那么ZFS可以使用加速。此外,由于它们都在ZoL代码库上进行了标准化(更高级),并且所有东西都迁移到OpenZFS(我认为,包括官方ZoL),每个人都将朝着拥有相同的特性等方向共同努力。
但通过他们提供的服务和更新的博客,我得到了一些叶菊的共鸣。
您应该能够将zfs发送到任何支持SSH并可以存储文件的设备上。
Rsync.net(无耻的插件,因为他们使用ZFS,以简单的Unix方式做事,只是捐赠存储给任何确认的Debian开发人员。没有其他从属关系)将为你的工作。
自从几年前rsync.net开始支持ZFS以来,我一直在断断续续地关注rsync.net,但我的问题是定价超出了我的家庭实验室预算。虽然从一开始就大幅下降了(每GB 6美分!),但这仍然大致相当于每个月以相同的存储容量购买一个新驱动器。
是的,这些服务的费用总是让我放弃在家使用;zfs.rentseems more affordable if you're happy to send disk(s) in to them, but I dunno if I'd use them personally.
我认为对于家庭用户类型的设置,最好的方法是与远程的朋友或家人进行容量交换;也就是说,你们每个人都给对方一个用户帐户和合适的NAS上的一些空间,然后(加密的)zfs发送给对方。理想情况下,他们已经有一个NAS,如果需要的话,你可以给他们一些钱来升级容量。
它应该远到足以作为一个异地备份,但不需要让公司(及其定价)参与。
最后编辑:Haravikk2021年6月25日星期五下午3:15
但是,如果密钥丢失或损坏,您的所有数据也将丢失。
就我个人而言,我希望有多个备份。我不相信有关键数据的u盘。
可以在加密的根池中使用密码短语密钥位置,在其他数据池中使用加密根池上的文件位置。解锁根池可以访问数据池。或者您可以将密钥文件存储在u盘上,当系统未启动时将其删除。这样你就可以安心加密了。(当系统使用未解锁的数据集运行时,密钥显然在内存中)或者您只是加密,这样就可以不担心地处理损坏的磁盘,那么密钥位置就不太重要了,因为您不关心本地对手。
密钥将存储在另一个加密的文件系统上。这不是特定于zfs的。对于其他形式的磁盘加密也经常这样做。
如果有人在挂载数据集时拥有物理访问权限,那么使用什么密钥类型并不重要,你已经被绑定了。静止时加密可以保护你不被别人拿走硬盘。使用zfs,您还可以将数据集(可能是快照)发送到不受信任的目的地,并且知道它们无法解密它。
这是个小问题。您没有将解密密钥存储在文件中。该文件就像解锁解密密钥的密码。
但是,如果密钥丢失或损坏,您的所有数据也将丢失。
就我个人而言,我希望有多个备份。我不相信有关键数据的u盘。
或者您可以使用像YubiKey这样的硬件令牌来存储密钥,然后脚本加载该密钥,然后删除令牌。在重新启动或卸载你不能看到任何数据现在。然而……确保你将该密钥备份到至少一个其他YubiKey或u盘或其他地方的东西上,然后确保你在外部安全的地方有一份副本。
但通过他们提供的服务和更新的博客,我得到了一些叶菊的共鸣。
您应该能够将zfs发送到任何支持SSH并可以存储文件的设备上。
Rsync.net(无耻的插件,因为他们使用ZFS,以简单的Unix方式做事,只是捐赠存储给任何确认的Debian开发人员。没有其他从属关系)将为你的工作。
自从几年前rsync.net开始支持ZFS以来,我一直在断断续续地关注rsync.net,但我的问题是定价超出了我的家庭实验室预算。虽然从一开始就大幅下降了(每GB 6美分!),但这仍然大致相当于每个月以相同的存储容量购买一个新驱动器。
我同意定价昂贵,但这似乎是一种一分钱一分货的情况。他们确实保证了他们的工程支持水平,而大多数其他供应商没有。
我意识到在LUKS上运行ZFS可以绕过这个问题(使用一些骗人的花招),但ZFS本身没有命令行选项来隐藏元数据,这似乎很奇怪。
我被困在ZFS下运行GELI,因为它是从以前唯一的选项升级的,但即使这样也会在磁盘上放置一个头文件我希望ZFS/FreeBSD能够提供一种迁移方式,但这就是现实。泳池升级很快就要来了,到时我会修复的。
你可以取消这些磁盘的geli,但你要恢复每个磁盘。其思想是将磁盘标记为失败,停止该磁盘上的GELI,然后用原始设备替换该磁盘。ZFS将重新转换到原始磁盘。这与更换磁盘的过程几乎相同,除了你不实际更换它,并且在更换它时不重新加密它。不要忘记在运行过程中逐步删除GELI配置。我做的正好相反;使用此技术重新构建最初未加密的数组。
ZFS下的GELI或LUKS并不是最糟糕的事情。ZFS仍然会使用校验和检测它的块是否被损坏。因此,即使GELI/LUKs本身没有校验和,ZFS仍然会修复该层中损坏的块,就像磁盘损坏它们一样。
遵从性。
ZFS只能使用最基本的内核功能,因为它不是GPL,而且内核开发人员对非GPL代码几乎关闭了他们所做的所有事情。
实际上,在Linux-ZFS系统....中有两个代码堆栈Linux端和ZFS端。这可能是ZFS严重违反正常Linux分层的部分原因;因为它不能使用Linux提供的功能,所以它实现了几乎所有的硬件。它查找并管理自己的磁盘,管理自己的压缩、加密和错误检测,进行自己的重建,并提供自己的挂载名称空间。用户级程序看不出太大的区别,它们仍然只是与磁盘上的文件对话,但当它们在ZFS数据集上时,它们与一个完整的单独的代码库交互。
ZFS不管理它的磁盘和卷,因为它不能使用内核的抽象,它这样做是因为它不喜欢内核抽象。
Linux有几个抽象层。FreeBSD和Solaris提供了类似但不完全相同的抽象层。一个快速且肮脏的列表,主要按照抽象级别的顺序:原始块设备、加密块设备、逻辑块设备(lvm、mdadm)、分区和文件系统。逻辑块设备可以构建在原始或加密的块设备之上,分区构建在某些块设备之上,文件系统构建在分区之上。
ZFS不想要任何与此相关的东西——它想要管理原始块设备。它不想处理抽象层。这就是为什么它可以创建不占用磁盘固定部分的文件系统。通过将加密、卷管理器和文件系统混合在一个层中,它们比分区中的文件系统更具灵活性。
受虐狂特别受虐的人可以使用luk加密一些磁盘,将这些磁盘mdadm到RAID5中,将其lvm到卷组中,然后在该卷组上构建ZFS。我不是那种人。
我意识到在LUKS上运行ZFS可以绕过这个问题(使用一些骗人的花招),但ZFS本身没有命令行选项来隐藏元数据,这似乎很奇怪。
我被困在ZFS下运行GELI,因为它是从以前唯一的选项升级的,但即使这样也会在磁盘上放置一个头文件我希望ZFS/FreeBSD能够提供一种迁移方式,但这就是现实。泳池升级很快就要来了,到时我会修复的。
你可以取消这些磁盘的geli,但你要恢复每个磁盘。其思想是将磁盘标记为失败,停止该磁盘上的GELI,然后用原始设备替换该磁盘。ZFS将重新转换到原始磁盘。这与更换磁盘的过程几乎相同,除了你不实际更换它,并且在更换它时不重新加密它。不要忘记在运行过程中逐步删除GELI配置。我做的正好相反;使用此技术重新构建最初未加密的数组。
ZFS下的GELI或LUKS并不是最糟糕的事情。ZFS仍然会使用校验和检测它的块是否被损坏。因此,即使GELI/LUKs本身没有校验和,ZFS仍然会修复该层中损坏的块,就像磁盘损坏它们一样。
谢谢。我会调查的。我真的不希望磁盘上有未加密的数据,但也许我可以设法为GELI之上的所有内容获得ZFS本机加密,然后再进行resliver。
但我只是订购了64T的磁盘和一个新的HBA +机箱来驱动它们。
你必须登录或创建帐户置评。