• Ars论坛更新现在在这里!

    如果你发现了一个bug,有一个建议,或者需要一些关于我们介绍的新功能的帮助,请查看下面的帖子。
    请注意,当我们完成升级时,搜索将无法工作。

    线程视图
  • 登录有问题吗?

    一些密码与我们的新论坛软件不兼容。如果登录有问题,试着重新设置密码。

    重置密码

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

D

Drizzt321

军团军
25148年
Subscriptor + +
    嗯…有没有办法同步/使用登录密码/密码短语自动挂载/加载它作为密钥?比如,如果我使用用户加密的主目录,它是用用户密码加密的,它能在用户第一次登录时自动挂载/卸载吗,然后在用户最后一次注销时?虽然像屏幕这样的东西让它变得更复杂,但系统需要确保在卸载密钥之前没有任何用户进程接触加密的数据集。人力资源管理。听起来这是一件很难做好的事情。

    我猜一个用户(我想更多的个人笔记本电脑与Linux/*BSD与ZFS)可以有基本的主目录是不加密的,但所有的子目录都是加密数据集的一部分,然后,在第一次登录UI时,它提示密码来加载密钥。
    Upvote
    68/-2
    D

    Drizzt321

    军团军
    25148年
    Subscriptor + +
      是否有一种简单的方法来确定实际使用的加密算法?我看到的唯一相关功能是“加密”,在我的例子中是“开启”。我很好奇实际使用的算法是什么(无论是CCM还是GCM),但我看不出有任何方法来问这个问题?

      https://zfsonlinux.org/manpages/0.8.6/man8/zfs.8.html

      代码:
      encryption = off | on | aes-128-ccm | aes-192-ccm | aes-256-ccm | aes-128-gcm | aes-192-gcm | aes-256-gcm控制此数据集使用的加密密码套件(分组密码、密钥长度和模式)。要求在池上启用加密特性。要求在数据集创建时设置键格式。在创建数据集时选择encryption = on表示将选择默认的加密套件,目前为aes-256-gcm。为了提供一致的数据保护,必须在创建数据集时指定加密,之后不能更改加密。有关加密的详细信息和注意事项,请参阅加密部分。

      编辑:更新链接到最新的manpage版本,我链接到一个过时的旧版本。
      Upvote
      68/-2
      是否有一种简单的方法来确定实际使用的加密算法?我看到的唯一相关功能是“加密”,在我的例子中是“开启”。我很好奇实际使用的算法是什么(无论是CCM还是GCM),但我看不出有任何方法来问这个问题?
      像这样:
      $zfs加密YourPool/YourDataset
      名称属性值源
      YourPool/YourDataset加密aes-256-gcm -
      Upvote
      1616/0
      D

      Drizzt321

      军团军
      25148年
      Subscriptor + +
        是否有一种简单的方法来确定实际使用的加密算法?我看到的唯一相关功能是“加密”,在我的例子中是“开启”。我很好奇实际使用的算法是什么(无论是CCM还是GCM),但我看不出有任何方法来问这个问题?
        像这样:
        $zfs加密YourPool/YourDataset
        名称属性值源
        YourPool/YourDataset加密aes-256-gcm -

        Malor的问题是当值是“on”时,是什么算法。根据本文,有两种不同的默认值,这取决于您使用的ZFS版本。基本上过去一年左右的任何东西,都在使用GCM。

        @malor,对不起,我上面的链接是一个旧版本的手册页,对不起,根据文章,它是-GCM,因为>=0.8.4,当前ZoL版本为0.8.6。我会更新我的评论。
        Upvote
        3.5/-2
        malor

        malor

        军团军
        10811年
        Subscriptor
          写得很好;我假设性能在任何实现AES-NI(或等价)的CPU上都是优秀的,但你知道在像J1800这样的东西上有多大的性能打击吗?我知道它们很旧,但仍然有很多它们在嵌入式/工业/无风扇的底盘上运行。

          根据我的经验,你确实需要想在没有AESNI的计算机上运行ZFS加密。他们对软件模式做了一些改进,但仍然非常缓慢。使用AESNI,它基本上以磁盘速度运行。没有的话,就是一团糟。

          我最初是在一台老式i7-920上尝试加密的,这台i7-920很古老,但性能仍然相当好。那台硬件上的ZFS加密非常糟糕。在沉重的写负载下,系统实际上无法使用。换到4790K马上就修好了。

          自从我的实验以来,软件改进已经被添加了,但我们最近在Ars论坛上有一个帖子试图使用没有使用硬件加速的ARM二进制文件,这对他们来说也是一场灾难。

          编辑:如果你没有太多的卷,就像文章说的,你可以使用LUKS加密,它在任何硬件上都非常快。但是您可能需要编写脚本来解锁过程,除非您想在每个磁盘上输入一个密码。类似地,我还编写了加载和挂载ZFS键的脚本,因此您可能不会丢失任何东西。

          它可能不太可靠,但AFAIK LUKS是一个非常薄的层,所以它的反应可能与直接将ZFS体积放在金属上相同。
          Upvote
          2222/0

          MMarsh

          军事法庭
          2963年
          Subscriptor
            写得很好;我假设性能在任何实现AES-NI(或等价)的CPU上都是优秀的,但你知道在像J1800这样的东西上有多大的性能打击吗?我知道它们很旧,但仍然有很多它们在嵌入式/工业/无风扇的底盘上运行。

            根据我的经验,你确实需要想在没有AESNI的计算机上运行ZFS加密。他们对软件模式做了一些改进,但仍然非常缓慢。使用AESNI,它基本上以磁盘速度运行。没有的话,就是一团糟。

            我最初是在一台老式i7-920上尝试加密的,这台i7-920很古老,但性能仍然相当好。那台硬件上的ZFS加密非常糟糕。在沉重的写负载下,系统实际上无法使用。换到4790K马上就修好了。

            自从我的实验以来,软件改进已经被添加了,但我们最近在Ars论坛上有一个帖子试图使用没有使用硬件加速的ARM二进制文件,这对他们来说也是一场灾难。

            编辑:如果你没有太多的卷,就像文章说的,你可以使用LUKS加密,它在任何硬件上都非常快。但是您可能需要编写脚本来解锁过程,除非您想在每个磁盘上输入一个密码。类似地,我还编写了加载和挂载ZFS键的脚本,因此您可能不会丢失任何东西。

            它可能不太可靠,但AFAIK LUKS是一个非常薄的层,所以它的反应可能与直接将ZFS体积放在金属上相同。
            在ZFS和它的磁盘之间放置“任何东西”的想法,无论多么轻量级,都让我感到恐惧。
            即使是在这个芯片短缺的时代,我觉得如果你要努力配置和部署加密的ZFS,那么换一个支持AES-NI的CPU(如果需要的话,还可以换一个新的MB)是非常容易的。如果没有别的原因,只要你有信心,它不会在你开始使用它的时候就死于衰老;)
            Upvote
            1718/-1
            吉姆·索尔特

            吉姆·索尔特

            军团军
            14872年
            Subscriptor + +
              是否有一种简单的方法来确定实际使用的加密算法?我看到的唯一相关功能是“加密”,在我的例子中是“开启”。我很好奇实际使用的算法是什么(无论是CCM还是GCM),但我看不出有任何方法来问这个问题?

              正如本文中提到的,它将是aes-256-ccm或aes-256-gcm,这取决于创建数据集的OpenZFS版本。

              是的,这很糟糕;是的,它应该显示字面值,而不仅仅是它最初被设置为一些未指定的“默认值”。我们在shift值方面也有同样的问题,如果在创建zpool时没有手动指定shift值,则该值仅显示为“0”。叹息。


              编辑:ZFS加密将显示用于加密数据集或zvol的特定算法,即使在创建时没有手动指定它。但一定要使用zfs得到,而不是zpool得到……
              Upvote
              88/0
              malor

              malor

              军团军
              10811年
              Subscriptor
                实际的问题是,我试图读取池上的加密,而不是根文件系统:

                代码:
                zpool get feature@encryption(卷)NAME PROPERTY VALUE SOURCE(卷)feature@encryption active local

                ...这不是我想要的

                然后我做了大量的工作,试图找到要查询的正确字符串,假设它必须在feature@ wall后面的某个地方。什么都没找到。我在网上搜了一堆,没找到任何明确的信息。然后我问这里,然后

                代码:
                zfs get encryption (volume)/(fileset) NAME PROPERTY VALUE SOURCE (volume)/(fileset) encryption aes-256-gcm -

                瞧,这正是我要找的。我找错了地方,用了错误的语法。feature@encryption是zpools的一个东西,但显然它只是文件集的直接“加密”。

                编辑:注意,我可能已经直接设置了算法,而不是使用'on'。我花了几天时间研究ZFS并预先构建文件系统创建行。
                Upvote
                55/0
                吉姆·索尔特

                吉姆·索尔特

                军团军
                14872年
                Subscriptor + +
                  实际的问题是,我试图读取池上的加密,而不是根文件系统:

                  代码:
                  zpool get feature@encryption(卷)NAME PROPERTY VALUE SOURCE(卷)feature@encryption active local

                  ...这不是我想要的

                  然后我做了大量的工作,试图找到要查询的正确字符串,假设它必须在feature@ wall后面的某个地方。什么都没找到。我在网上搜了一堆,没找到任何明确的信息。然后我问这里,然后

                  代码:
                  zfs get encryption (volume)/(fileset) NAME PROPERTY VALUE SOURCE (volume)/(fileset) encryption aes-256-gcm -

                  瞧,这正是我要找的。我找错了地方,用了错误的语法。feature@encryption是zpools的一个东西,但显然它只是文件集的直接“加密”。

                  啊哈,好吧。zpool get让你知道你的池支持加密,在这种情况下,这个特性是活跃的在那个泳池上……在某处。但它实际上只是检查你的池是否支持该功能,而不是关于你如何使用的特性。

                  ' zfs get '返回特定数据集或zvol本身的zfs属性,这正是您在这里想要的(应用于您最初感兴趣的数据集或zvol)。

                  编辑:注意,我可能已经直接设置了算法,而不是使用'on'。我花了几天时间研究ZFS并预先构建文件系统创建行。

                  实际上,这看起来并不是换班惨败的又一次;在本文的示例中,我肯定没有手动设置算法,但我在自己的文章中看到了我自己的“zfs get encryption”,这表明您获得了实际的算法,而不仅仅是on。

                  也许下次我会RTFA…
                  Upvote
                  1616/0
                  D

                  deviantintegral

                  打拳大师,正在训练中
                  50
                  Subscriptor + +
                    需要注意的一件事是,不幸的是,在引导期间远程SSH解锁zfs数据集只在openzfs的2.0或更高版本中。原始PR在:https://github.com/openzfs/zfs/pull/10027

                    但是,这仍然可以为旧的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肯定是我在很长一段时间内看到的冲击生产系统的最令人心跳停止的文件系统问题之一。
                    Upvote
                    67/-1
                    实际的问题是,我试图读取池上的加密,而不是根文件系统:

                    代码:
                    zpool get feature@encryption(卷)NAME PROPERTY VALUE SOURCE(卷)feature@encryption active local

                    ...这不是我想要的

                    然后我做了大量的工作,试图找到要查询的正确字符串,假设它必须在feature@ wall后面的某个地方。什么都没找到。我在网上搜了一堆,没找到任何明确的信息。然后我问这里,然后

                    代码:
                    zfs get encryption (volume)/(fileset) NAME PROPERTY VALUE SOURCE (volume)/(fileset) encryption aes-256-gcm -

                    瞧,这正是我要找的。我找错了地方,用了错误的语法。feature@encryption是zpools的一个东西,但显然它只是文件集的直接“加密”。
                    很高兴我能帮上忙!:)

                    此外,你可以获得所有属性及其设置的列表:
                    ZFS get all (volume)/(fileset)
                    Upvote
                    22/0
                    D

                    Drizzt321

                    军团军
                    25148年
                    Subscriptor + +
                      我的硬盘明天会来扩充我的TrueNAS盒子。看来这次我要去加密硬盘了。

                      即使有一个速度打击,只要它仍然足够快,流蓝光备份使用Plex,这对我来说是好的。

                      如果你说的是带有AES-NI的CPU,那就没问题了。如果没有AES-NI…它可能不够强大。很明显,你会发现的。
                      Upvote
                      00/0

                      sPOiDar

                      明智的,年长的Ars老兵
                      165
                        不幸的是,一旦创建了数据集或zvol,您就不能轻松地从交互式提示切换到密钥文件

                        根据手册页(以及本文后面提到的change-key),这似乎是不正确的:

                        Man zfs":2ak3px67说:
                        尽管在数据集创建后不能更改加密套件,但密钥位置可以使用zfs set或zfs change-key。
                        Upvote
                        55/0

                        sPOiDar

                        明智的,年长的Ars老兵
                        165
                          嗯…有没有办法同步/使用登录密码/密码短语自动挂载/加载它作为密钥?比如,如果我使用用户加密的主目录,它是用用户密码加密的,它能在用户第一次登录时自动挂载/卸载吗,然后在用户最后一次注销时?虽然像屏幕这样的东西让它变得更复杂,但系统需要确保在卸载密钥之前没有任何用户进程接触加密的数据集。人力资源管理。听起来这是一件很难做好的事情。

                          我猜一个用户(我想更多的个人笔记本电脑与Linux/*BSD与ZFS)可以有基本的主目录是不加密的,但所有的子目录都是加密数据集的一部分,然后,在第一次登录UI时,它提示密码来加载密钥。
                          在Linux上,可以编写pam模块来处理这个问题。
                          Upvote
                          01/-1
                          K

                          kaworu1986

                          Ars禁卫队的
                          592
                            我是对ZFS加密在ARM上的性能感到失望的论坛海报:原来这是因为OpenZFS从一开始就不支持ARM上的硬件加密。

                            我已经开始了与开发人员讨论我甚至尝试自己实现,但我不是Linux内部/内核模块和汇编的专家,我很挣扎。

                            如果这里有人感兴趣,请加入讨论:欢迎帮助:)
                            Upvote
                            1313/0
                            N

                            NewCrow

                            Ars禁卫队的
                            514
                              很好的介绍。

                              提示:当加密的子数据集被sanoid/syncoid复制时,数据集在复制目标处失去了它们继承的加密参数(例如,变成“prompt”而不是keylocation的路径)。当使用原始发送时。这可以在解锁目标上的子节点和父节点并使用“zfs change-key -i…”后修复。

                              另外,对加密性能进行基准测试。
                              我根据Jim大约一年前的fio文章编写了一个bash脚本,其中尝试了不同的算法和记录大小组合,用于带有USB3 HDD的树莓派。我的结论是512 kB记录大小比1M记录大小执行得更好,CCM优于GCM(显然,在我的例子中,是YMMV)。

                              (编辑:当fio使用大块写入时,512kb记录大小比1mb记录大小执行得更好,尽管“传统观点”认为1mb记录大小在这种情况下应该更好。我不知道这是否与USB硬盘性能或树莓本身有关,但由于这一组合是我用于场外备份的方法,所以我不关心原因。)
                              Upvote
                              44/0
                              l

                              Landak

                              Ars百夫长
                              213
                              Subscriptor + +
                                我希望ZFS能够开发可否认加密。在许多国家,例如英国,拥有加密数据,但在要求政府时无法解密是一种违法行为可判处二年或五年监禁的罪行.这是完全合理的假设,例如,在共享的ZFS服务器上,某人可能没有给定zvol的加密密钥,但ZFS元数据的存在足以证明它的存在。

                                我意识到在LUKS上运行ZFS可以绕过这个问题(使用一些骗人的花招),但ZFS本身没有命令行选项来隐藏元数据,这似乎很奇怪。
                                Upvote
                                99/0

                                sir_trackmenot

                                Ars Scholae Palatinae
                                614
                                  我希望ZFS能够开发可否认加密。在许多国家,例如英国,拥有加密数据,但在要求政府时无法解密是一种违法行为可判处二年或五年监禁的罪行.这是完全合理的假设,例如,在共享的ZFS服务器上,某人可能没有给定zvol的加密密钥,但ZFS元数据的存在足以证明它的存在。

                                  我意识到在LUKS上运行ZFS可以绕过这个问题(使用一些骗人的花招),但ZFS本身没有命令行选项来隐藏元数据,这似乎很奇怪。

                                  我被困在ZFS下运行GELI,因为它是从以前唯一的选项升级的,但即使这样也会在磁盘上放置一个头文件:(我希望ZFS/FreeBSD能够提供一种迁移方式,但这就是现实。泳池升级很快就要来了,到时我会修复的。

                                  您所描述的法律难题的解决方案是知道谁控制您服务器上的哪些数据,以便您可以将它们泄露出去。理想情况下,你可以召集当地议员,说服他们这些狗屁法律都是狗屁,但这些天他们似乎只服从他们的TLASOUP主人。
                                  Upvote
                                  66/0

                                  sir_trackmenot

                                  Ars Scholae Palatinae
                                  614
                                    我的硬盘明天会来扩充我的TrueNAS盒子。看来这次我要去加密硬盘了。

                                    即使有一个速度打击,只要它仍然足够快,流蓝光备份使用Plex,这对我来说是好的。

                                    如果你说的是带有AES-NI的CPU,那就没问题了。如果没有AES-NI…它可能不够强大。很明显,你会发现的。

                                    我那没有AES的老芹菜1610在这方面做得很好。没有带宽来转码,但它很容易比最高比特率的模糊撕裂快得多。
                                    Upvote
                                    01/-1
                                    友情提醒:

                                    *只对你绝对可能丢失的数据进行加密。
                                    *记住,你是会死的,如果你发生了可怕的事情,你加密的数据可能会永远丢失(尽管死亡,但还有许多其他事情会让你忘记)。
                                    人们确实会忘记密码。

                                    我不是在劝阻任何人加密他们的数据,我只是相信许多人不必要地使用它。
                                    Upvote
                                    212/-10
                                    好文章!

                                    关于这一点:
                                    使用提示符,每次都需要人工手动解锁加密的卷。
                                    我知道你的目标可能是让事情变得简单,但我实际上在自动化中使用提示符(没有人工参与)而不是关键文件,因为我发现它更方便,例如,在macOS上你可以这样做:

                                    代码:
                                    Security find-generic-password -a "${dataset}" -w | ZFS load-key "${dataset}"

                                    这让我可以将密码保存在macOS密钥链中,就像我将加密的非系统APFS卷、核心存储、磁盘映像等一样(对于任何想要做同样事情的人,请记住将/usr/bin/security添加到可以访问脚本密钥链条目的应用程序列表中,否则将不起作用)。

                                    虽然如果处理得当,密钥文件可能是安全的,但提示符可以让你从任何你喜欢的地方提取密码,因此以这种方式自动化非常方便。

                                    我是OpenZFS加密的忠实粉丝,它让事情变得简单多了,而且zfs能够发送加密的区块,这对于备份来说是非常棒的。

                                    唯一缺少的功能是免费替换我的旧的(但仍然固执地在完美的工作秩序)Synology NAS,只支持BTRFS;幸运的是,它也做iSCSI,所以我仍然可以用ZFS发送给它,但这不是一个理想的方式。
                                    Upvote
                                    44/0

                                    iAPX

                                    Ars Scholae Palatinae
                                    1008年
                                      非常好的文章。

                                      除了使用本地zfs加密的所有优点之外,备份到远程zfs服务器的能力使所有数据在传输过程中保持加密,然后在静止时(不需要任何解密/加密)使我非常兴奋。

                                      当然,传输也会被加密,但通过保持数据一路加密,提供了强有力的安全保证,并将极大地简化我的程序和文书工作!
                                      是的,强大的安全性应该被记录和证明,对于一些要求严格的客户来说,有很多文书工作要做。
                                      Upvote
                                      1010/0
                                      E

                                      entropy_wins

                                      Ars Scholae Palatinae
                                      982
                                      Subscriptor + +
                                        友情提醒:

                                        *只对你绝对可能丢失的数据进行加密。
                                        *记住,你是会死的,如果你发生了可怕的事情,你加密的数据可能会永远丢失(尽管死亡,但还有许多其他事情会让你忘记)。
                                        人们确实会忘记密码。

                                        我不是在劝阻任何人加密他们的数据,我只是相信许多人不必要地使用它。

                                        加密*一切*所以*当*硬件失败时,你可以毫无顾虑地折腾。

                                        还要定期备份到离线资源....

                                        ZFS快照大大简化了备份/恢复…

                                        年代
                                        Upvote
                                        48/4
                                        malor

                                        malor

                                        军团军
                                        10811年
                                        Subscriptor
                                          有人知道zfs是使用它自己的AES实现,还是使用内核现有的AES实现吗?因为
                                          遵从性。

                                          ZFS只能使用最基本的内核功能,因为它不是GPL,而且内核开发人员对非GPL代码几乎关闭了他们所做的所有事情。

                                          实际上,在Linux-ZFS系统....中有两个代码堆栈Linux端和ZFS端。这可能是ZFS严重违反正常Linux分层的部分原因;因为它不能使用Linux提供的功能,所以它实现了几乎所有的硬件。它查找并管理自己的磁盘,管理自己的压缩、加密和错误检测,进行自己的重建,并提供自己的挂载名称空间。用户级程序看不出太大的区别,它们仍然只是与磁盘上的文件对话,但当它们在ZFS数据集上时,它们与一个完整的单独的代码库交互。

                                          随之而来的唯一真正值得注意的问题是,默认情况下,ZFS获取系统中一半的RAM用作缓存。在内存压力下,它可能会缓慢地将其释放回系统,这可能会导致严重的问题。我很确定你可以调低RAM分配,尽管我还没有费心去查找如何调低,因为我目前运行的唯一系统是一个专用服务器,无论如何都会使用一半的内存用于缓存。
                                          Upvote
                                          910/-1
                                          吉姆·索尔特

                                          吉姆·索尔特

                                          军团军
                                          14872年
                                          Subscriptor + +
                                            文章中的Veracrypt链接相当古老——该网站在2017年进入存档模式,并将在6天内关闭。真奇怪,这事怎么会偷偷出现在文章里。https://veracrypt.fr/是准确的链接。

                                            因为另一个链接有更多的Googlejuice,我在包装锚标记之前没有更仔细地调查它(因为我记得上次看到它是Veracrypt的官方网站,在TrueCrypt被放弃后不久)。

                                            固定了。谢谢你的提示!
                                            Upvote
                                            13./-2
                                            吉姆·索尔特

                                            吉姆·索尔特

                                            军团军
                                            14872年
                                            Subscriptor + +
                                              我非常确定您可以降低RAM分配,尽管我还没有费心去查找如何降低RAM分配

                                              创建文件/etc/modprobe.d/zfs.conf并设置选项ZFS zfs_arc_max=在字节。

                                              是的,字节。不,它不尊重或不理解单位后缀。是的,那是血腥的巨大的拥有1TiB内存的服务器上的数字…
                                              Upvote
                                              89/-1

                                              sir_trackmenot

                                              Ars Scholae Palatinae
                                              614
                                                我非常确定您可以降低RAM分配,尽管我还没有费心去查找如何降低RAM分配

                                                创建文件/etc/modprobe.d/zfs.conf并设置选项ZFS zfs_arc_max=在字节。

                                                是的,字节。不,它不尊重或不理解单位后缀。是的,那是血腥的巨大的拥有1TiB内存的服务器上的数字…

                                                *梦想*我们在工作中做了一些相当大的铁,但1T RAM仍然是我目前能接触到的最大玩具的4倍。
                                                Upvote
                                                11/0