ecryptfs、加密密钥和TPM 的实际用途:如何将现有用户密钥转换为加密密钥?

ecryptfs、加密密钥和TPM 的实际用途:如何将现有用户密钥转换为加密密钥?

这个问题的简短版本是: 如何将存储 ecryptfs 身份验证令牌/FEFEK 的内核密钥环上的用户密钥转换为密钥环上的加密密钥? (即如何添加具有用户指定的纯文本数据的加密密钥,而不是随机生成的密钥 - 例如现有 ecryptfs 文件系统的预先存在的挂载密码。)请继续阅读以了解原因...

我正在尝试弄清楚如何实际使用带有 TPM 的 ecryptfs,而我找到的信息通常已过时/过时。我所找到的只是几年前的博客文章或 IBM 白皮书,它们似乎使用了不再存在的功能/未维护的功能(已删除的 TSPI 模块和似乎未维护且不再存在于我的包管理器中的 OpenSSL TPM 库)。我了解到,现在执行此操作的正确方法涉及受信任和加密的内核密钥,如下所示:

上述文档中概述的策略表明,这个想法是制作一个新的受信任密钥,用 TPM 密封,然后使用它以 ecryptfs 格式制作一个新的加密密钥,并将受信任密钥指定为主密钥。这很容易理解,并且符合我的要求,除了...

问题是,如果 TPM 坏了,我需要恢复我的数据(例如,计算机坏了,需要从加密备份中恢复)。我想要做的是,如果 TPM 不可用,则使用密码来解密数据,仅在特殊情况下使用。或者,用户可能有一个预先存在的 ecryptfs 文件系统,并且已经选择了安装密码/FEFEK - 即,您不想为了使用 TPM 而重新加密所有文件。这似乎是一个显而易见的需求,但我很难弄清楚“如何做”。

从上述文档中:

The data structure defined by eCryptfs to contain information required for the
FEK decryption is called authentication token and, currently, can be stored in a
kernel key of the 'user' type, inserted in the user's session specific keyring
by the userspace utility 'mount.ecryptfs' shipped with the package
'ecryptfs-utils'.

Encrypted keys of the newly introduced [ecryptfs encrypted] format store an
authentication token in its payload with a FEFEK randomly generated by the
kernel and protected by the parent master key.  [What if I want to use an
existing FEFEK?]

好的,所以在我看来,内核存储加密密钥的格式与 ecryptfs 用户空间工具(例如ecryptfs-add-passphrase或挂载助手)添加到密钥环的常规用户密钥相同。也就是说,用户密钥的有效负载和加密密钥基本上是相同的,只是内核不允许用户空间以未加密的格式读取加密密钥。对吗?

所以我想我想要做的是这样的——我走在正确的轨道上吗?

  1. 使用ecryptfs-add-passphrase向密钥环添加挂载密码。(它可以是现有 ecryptfs 文件系统的挂载密码)。现在我在密钥环上有一个用户密钥,用于存储 ecryptfs 身份验证令牌。挂载密码可能很复杂,并存储在离线安全位置,可能受保护ecryptfs-wrap-passphrase,并且仅用于数据恢复场景(例如,如果 TPM 失效)。
  2. 按照上述内核文档,在密钥环中创建一个新的可信密钥。
  3. 将步骤 1 中存储身份验证令牌的现有用户密钥转换 ecrypt-add-passphrase为密钥环上的加密密钥,并使用可信密钥作为主密钥。(这就是我陷入困境的地方。
  4. 从密钥环中删除用户密钥,因为我们不再需要它。
  5. 使用keyctl pipe将加密密钥保存到磁盘上的文件中以供稍后安装。

日常的安装过程如下:

  1. 将可信密钥加载到密钥环中并解封。
  2. 将上述步骤#5 中的加密密钥 blob 加载到密钥环中的加密密钥中,使用可信密钥作为主密钥。
  3. 使用上一步中的加密密钥进行挂载。

如果 TPM 被毁坏或丢失:

  1. 用于ecryptfs-add-passphrase将备份中的挂载密码添加到存储在用户密钥中的身份验证令牌中。
  2. 使用此用户密钥进行安装。

我的关键问题是:如何将存储身份验证令牌的用户密钥转换为加密密钥,如上述设置过程中的步骤 3 所示?例如,内核文档说明了如何解密先前使用 keyctl pipe 导出的现有加密密钥:

keyctl add encrypted name "load hex_blob" ring

但我想做这样的事情,从一些预先存在的明文中创建一个新的加密密钥:

keyctl add encrypted name "load ecryptfs trusted:masterkey `keyctl print <id of user key holding plaintext authentication token / FEFEK / mounting passphrase>`" @u

(这与生成的随机新密钥相反 add encrypted name "new ecryptfs"

如果上述情况不可能,那么我的策略中缺少什么?感觉我在这里缺少了一些明显的信息。

相关内容