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

这个问题的简短版本是: 如何将存储ecryptfs身份validation令牌/ FEFEK的内核密钥环上的用户密钥转换为密钥环上的加密密钥? (即如何使用用户指定的明文数据添加加密密钥,而不是随机生成的密钥 – 例如现有ecryptfs文件系统的预先存在的安装密码。)继续阅读为什么……

我试图弄清楚如何实际使用带有TPM的ecryptfs,我发现的信息通常是过时/过时的。 我发现的所有内容都是几年前的博客文章或IBM白皮书,似乎使用了不再存在的function/未维护的function(删除的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或mount helper)。 也就是说,用户密钥和加密密钥的有效负载基本上是同一个,除了内核不允许用户空间以未加密的格式读取加密密钥。 对?

所以我想我想做的就是这个 – 我在这里走在正确的轨道上吗?

  1. 使用ecryptfs-add-passphraseecryptfs-add-passphrase添加安装密码。 (它可能是现有ecryptfs文件系统的安装密码)。 现在我在密钥环上有一个用户密钥,用于存储ecryptfs身份validation令牌。 安装密码短语可能很复杂并存储在离线安全位置,可能受ecryptfs-wrap-passphrase保护,并且仅用于数据恢复方案(例如,如果TPM冒烟)。
  2. 根据上面的内核文档,在密钥环中创建一个新的可信密钥。
  3. 使用可信密钥作为主密钥,将存储认证令牌的现有用户密钥从步骤#1中的ecrypt-add-passphrase转换为密钥环上的加密密钥。 ( 这是我被困住的地方。
  4. 从密钥环中删除用户密钥,因为我们不再需要它。
  5. 使用keyctl pipe将加密密钥保存到磁盘上的文件中以便以后安装。

普通的日常安装工作方式如下:

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

如果TPM被销毁或丢失:

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

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

 keyctl add encrypted name "load hex_blob" ring 

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

 keyctl add encrypted name "load ecryptfs trusted:masterkey `keyctl print `" @u 

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

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