![ecryptfs、加密密钥和TPM 的实际用途:如何将现有用户密钥转换为加密密钥?](https://linux22.com/image/988798/ecryptfs%E3%80%81%E5%8A%A0%E5%AF%86%E5%AF%86%E9%92%A5%E5%92%8CTPM%20%E7%9A%84%E5%AE%9E%E9%99%85%E7%94%A8%E9%80%94%EF%BC%9A%E5%A6%82%E4%BD%95%E5%B0%86%E7%8E%B0%E6%9C%89%E7%94%A8%E6%88%B7%E5%AF%86%E9%92%A5%E8%BD%AC%E6%8D%A2%E4%B8%BA%E5%8A%A0%E5%AF%86%E5%AF%86%E9%92%A5%EF%BC%9F.png)
这个问题的简短版本是: 如何将存储 ecryptfs 身份验证令牌/FEFEK 的内核密钥环上的用户密钥转换为密钥环上的加密密钥? (即如何添加具有用户指定的纯文本数据的加密密钥,而不是随机生成的密钥 - 例如现有 ecryptfs 文件系统的预先存在的挂载密码。)请继续阅读以了解原因...
我正在尝试弄清楚如何实际使用带有 TPM 的 ecryptfs,而我找到的信息通常已过时/过时。我所找到的只是几年前的博客文章或 IBM 白皮书,它们似乎使用了不再存在的功能/未维护的功能(已删除的 TSPI 模块和似乎未维护且不再存在于我的包管理器中的 OpenSSL TPM 库)。我了解到,现在执行此操作的正确方法涉及受信任和加密的内核密钥,如下所示:
- https://www.kernel.org/doc/Documentation/security/keys-ecryptfs.txt
- https://www.kernel.org/doc/Documentation/security/keys-trusted-encrypted.txt
上述文档中概述的策略表明,这个想法是制作一个新的受信任密钥,用 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
或挂载助手)添加到密钥环的常规用户密钥相同。也就是说,用户密钥的有效负载和加密密钥基本上是相同的,只是内核不允许用户空间以未加密的格式读取加密密钥。对吗?
所以我想我想要做的是这样的——我走在正确的轨道上吗?
- 使用
ecryptfs-add-passphrase
向密钥环添加挂载密码。(它可以是现有 ecryptfs 文件系统的挂载密码)。现在我在密钥环上有一个用户密钥,用于存储 ecryptfs 身份验证令牌。挂载密码可能很复杂,并存储在离线安全位置,可能受保护ecryptfs-wrap-passphrase
,并且仅用于数据恢复场景(例如,如果 TPM 失效)。 - 按照上述内核文档,在密钥环中创建一个新的可信密钥。
- 将步骤 1 中存储身份验证令牌的现有用户密钥转换
ecrypt-add-passphrase
为密钥环上的加密密钥,并使用可信密钥作为主密钥。(这就是我陷入困境的地方。) - 从密钥环中删除用户密钥,因为我们不再需要它。
- 使用
keyctl pipe
将加密密钥保存到磁盘上的文件中以供稍后安装。
日常的安装过程如下:
- 将可信密钥加载到密钥环中并解封。
- 将上述步骤#5 中的加密密钥 blob 加载到密钥环中的加密密钥中,使用可信密钥作为主密钥。
- 使用上一步中的加密密钥进行挂载。
如果 TPM 被毁坏或丢失:
- 用于
ecryptfs-add-passphrase
将备份中的挂载密码添加到存储在用户密钥中的身份验证令牌中。 - 使用此用户密钥进行安装。
我的关键问题是:如何将存储身份验证令牌的用户密钥转换为加密密钥,如上述设置过程中的步骤 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"
)
如果上述情况不可能,那么我的策略中缺少什么?感觉我在这里缺少了一些明显的信息。