如何为不同的用户使用不同的加密获得可用的全盘加密

stu*_*ent 5 security encryption dm-crypt ecryptfs

我想在我的笔记本电脑上进行完整的系统加密。但是我有两个用户,一个是家庭用户,一个是工作用户,并且希望对两者进行单独的加密。当然,我可以使用 dm-crypt 进行全盘加密,并使用带有 ecryptfs 的第二个加密层来加密主目录。但是,出于性能原因,这似乎不是一个好主意。那么我如何设置一个系统,以便:

  • 整个硬盘都是加密的
  • 当用户 1 登录而用户 2 未登录时,用户 2 的数据为用户 1 加密,反之亦然
  • 我需要在启动时输入一个密码来解密系统(就像在通常的 LVM/dm-crypt 设置中一样),并且只需要输入第二个密码来登录用户 x 并解密他的分区
  • 性能类似于简单的全盘加密
  • 该解决方案应该与 ssd 一起工作,即它应该支持 TRIM

如果这很重要,我想使用 ubuntu 作为发行版。

pet*_*rph 5

  1. 不要加密整个硬盘驱动器(如在 中/dev/sda,按分区(或更准确地说,按文件系统 - 见下文)进行加密。

  2. 在家里为两个用户安装单独的文件系统。我有意避免编写单独的分区,因为虽然这是通常的做事方式,但它在某些方面受到限制。拥有一个大型主分区可能更方便,该分区包含包含加密文件系统并根据需要挂载的大文件。优点是更容易调整用户家的大小,同时将他们分开。

  3. 通过 PAM 可以在登录时自动挂载。请注意,您不希望对登录和实际数据加密使用相同的密码。相反,您要么使用 LUKS,要么通过将加密密钥存储在一个文件中来模仿它,该文件本身用登录密码加密。这可确保更改登录密码不会影响加密数据,而只会影响加密密钥,因此您不必负责重新加密整个用户家)。

一般说明:

  • 分区使用gdiskgptfdisk有时也称为)parted或任何其他适当的程序,阅读手册页了解详细信息(分区有点超出本 QA 的范围)

  • 基于加密文件的文件系统——我对LUKS的设计有一些异议,所以我一般cryptsetup在“plain”模式下使用,在某些方面模仿了LUKS。如果您选择 LUKS,那么您可以将步骤减少到cryptsetup(使用适当修改的选项)

    1. 准备加密密钥和密码。这是一个有趣的部分 - 对于加密数据,您需要足够随机的东西(8 个字母的密码确实不够),对于密码,您可以轻松更改(无需重新加密整个文件系统)并且相当容易记住并输入。这些要求相互矛盾。因此,我们将使用与 LUKS 相同的技巧(并且实际上可以将其视为某种意义上的混合密码系统的变体)。该加密密钥可以或多或少随机-无论是从使用一些非常随机的数据(例如/dev/random),或者一个相当长的哈希,比如 SHA-2 或 SHA-3(第一个是由 NSA 设计的,如果你想知道是否根据最近的事件使用它)一个相当长的密码短语。

      在第一种情况下(并且在真正随机数据的情况下)相当长意味着长度应该大约为所用密码的所选密钥长度加上初始化向量的长度。在第二种情况下,这意味着应该很难对其进行暴力破解。使用散列的优势在于,如果密钥损坏或丢失,可以恢复密钥(当然,前提是您记得经过散列的初始密码)。然后将此密钥加密并存储在文件中。在您的情况下,加密密钥的密码与登录密码相同。

      # set up the encrypted encryption key
      printf "Reasonably long and complicated passphrase" \
          | openssl dgst -sha512 -binary \
          | openssl enc -bf > /path/to/key.enc
      
      Run Code Online (Sandbox Code Playgroud)

      openssl dgst -sha512 -binary从其标准输入生成 SHA-512 散列的二进制形式,openssl enc -bf使用Blowfish对其进行加密- 随意选择您喜欢的散列和密码(Twofish 或 Rijndael 都经过充分尝试,但内核中可用的其他密码应该没问题也)。

      将密钥保存在加密设备之外的缺点是除了加密数据本身之外还需要其他东西 - LUKS 将密钥存储在其标头中,因此它是独立的。另一方面,您必须使用一组特定的工具。虽然它的设计并非粗心大意,并且存在于大多数安装中,但您需要使用特殊工具来访问它。

      另一方面,使用单独的文件,您可以自由选择任何存储密钥的方法。您甚至可以将它放在可移动媒体上,在登录前插入并在文件系统安装后将其删除(您甚至可以在将媒体附加到计算机的情况下挂钩自动登录)。当然,所有这一切都应该经过深思熟虑,因为安全格言“不要发明自己的加密”适用(例如,请参阅Security SE 上的这篇文章)——这实际上可能是使用 LUKS 的一个论点。备份密钥显然很容易。

    2. 创建一个将保存文件系统的空文件

      dd if=/dev/zero of=/path/to/backing_file.enc bs=1M count=X
      
      Run Code Online (Sandbox Code Playgroud)
    3. 创建加密设备

      openssl enc -bf -d -in /path/to/key.enc 2>/dev/null \
          | cryptsetup create \
                  -c twofish-cbc-essiv:sha256 \
                  -s 256 \
                  -h plain \
                  encryptedfs /path/to/backing_file.enc
      
      Run Code Online (Sandbox Code Playgroud)

      openssl enc -bf -d在 stdin 上询问密码并尝试解密加密密钥。cryptsetup create ... encryptedfs /path/to/backing_file.enc创建的加密 DM 设备调用encryptedfs由先前创建的文件支持。重要的选项它-c用于选择加密密码其运作模式

    4. 用零填充设备 - 这有效地将“随机垃圾”放入后备文件并使其不那么明显,文件的内容可能是什么(否则,您可以通过扫描未归零的块来判断已写入的内容从第 2 步)。

      dd if=/dev/zero of=/dev/mapper/encryptedfs bs=1M
      
      Run Code Online (Sandbox Code Playgroud)
    5. 创建文件系统

      mkfs.[favourite_filesystem] [tuning options] /dev/mapper/encryptedfs
      
      Run Code Online (Sandbox Code Playgroud)
    6. /etc/fstab如果您想自己做所有事情,或者/etc/crypttab如果您想与系统工具进行某种集成,请输入相应的行。

  • 为了在登录/注销时自动(取消)挂载,我会向您推荐 pam_mount 文档


bin*_*lse 2

我可以想到两种有价值的方法来实现这样一个系统,而无需对您的家庭进行两次加密。

  • 单独的主分区:创建一个单独的分区并安装到/home. 然后每个用户通过 加密其家庭encfs
  • 每个用户的单独主分区:每个用户的主目录都有一个单独的分区,该分区本身使用dm-crypt. /home/user当他登录时,该分区就会被安装。

当然,加上加密/;-)

在这两种情况下,如果您使用相同的密码进行登录和加密,则可以在登录过程中自动安装家庭。(可以在例如中进行配置/etc/security/pam_mount.conf.xml,有很多方法)虽然第一种方法不会加密用户文件夹的名称,但使用第二种方法实际上所有内容都会被加密。所以我更喜欢(并且实际使用)方法二;-)