微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 GCP Shielded VM 的加密和签名密钥 1.使用 TPM2_Import 和 TPM2_UnsealTPM 规范的第 3 部分 [3]2.使用 TPM2_ActivateCredentialTPM 规范,第 3 部分

如何解决如何使用 GCP Shielded VM 的加密和签名密钥 1.使用 TPM2_Import 和 TPM2_UnsealTPM 规范的第 3 部分 [3]2.使用 TPM2_ActivateCredentialTPM 规范,第 3 部分

我想知道如何使用受 gcp 保护的 VM 实例的签名密钥和加密密钥?我正在考虑使用加密密钥 (ekPub) 来加密任意数据块,并确保只有关联的 gcp 实例才能解密它。但我不知道如何要求 vTPM 解密加密数据?

解决方法

Shielded VMConfidential computing 是 Google Cloud 上的两种不同功能。

在启动时检查受保护的 VM 是否有任何组件被篡改并可能导致数据泄漏(通过恶意软件/后门)

机密计算会在启动时自动创建加密密钥。此密钥用于加密内存中的所有数据。数据只在CPU内部解密,同时处理。

当数据写入磁盘时,数据从加密内存中获取,在 CPU 中解密并以纯文本写入磁盘,磁盘会自动加密(但由另一个进程,而不是由 CPU)

你无事可做,它是自动的!

,

背景和定义

背书密钥 (EK) 是 TPM2.0 上用于证明的密钥。 EK 通常带有制造商签名的证书(注意,在 GCE 实例上不可用),说明 TPM 是真正的 TPM[1]。但是,TCG 对使用一个签名密钥进行证明存在隐私问题。因此,他们决定将背书密钥设为加密密钥。 ActivateCredential 流 [2] 通常用于信任新的签名密钥。这通过允许使用隐私 CA 创建 AK 证书来支持 EK 和 AK 在同一 TPM 上,从而避免了隐私问题。 GCE 默认创建一个 AK,允许用户通过使用 get-shielded-identity API 来避免这个过程。

解密

有几种方法可以使用背书密钥加密数据。

由于EK受到限制[3],您必须跳过一些箍才能轻松使用它。此处受限意味着该密钥不能用于一般解密。相反,它们用于存储/包装 TPM 对象。存储密钥通常是受限制的解密密钥。

这里有一些方法可以解决这个问题:

1.使用 TPM2_Import 和 TPM2_Unseal(TPM 规范的第 3 部分 [3])

TPM2_Import 让 TPM 使用存储密钥解密外部 blob(公共和私有)。然后,用户可以在存储密钥下加载该对象并使用。 TPM2_Unseal 返回密封 blob 中的秘密。 流程大致如下:

  1. 远程实体创建一个 blob,其中包含一个私有部分和一个相应的公共部分。私有部分包含要解密的原始秘密。
  2. 远程实体使用 EK 为派生对称和 HMAC 密钥的已知 KDF 包装种子。
  3. 使用种子和 KDF 派生密钥来加密私有部分。这是“重复”的 blob。
  4. 向虚拟机发送重复的、公开的和加密的种子。
  5. TPM2_Import 对重复的、公开的和加密的种子进行处理,并带有 EK 的句柄。
  6. TPM2_Load 在 public 和 outPrivate(解密的私有)上来自 TPM2_Import。
  7. 对象句柄上的 TPM2_Unseal,秘密将在 outData 中。

这一切都在 https://github.com/google/go-tpm-tools 中为您完成。您只需要传入 PEM,对其进行解码,然后将其解析为公钥。 然后你可以使用server.CreateImportBlob。 将输出 blob 发送到 VM。 在客户端,使用 EndorsementKeyRSA(或 EndorsementKeyECC)创建 go-tpm-tools 密钥。 对 blob 使用 key.Import

具体参见https://pkg.go.dev/github.com/google/go-tpm-tools/server#CreateImportBlobhttps://pkg.go.dev/github.com/google/go-tpm-tools/tpm2tools#Key.Import

注意包 tpm2tools 最近更名为客户端,但这还不是公开版本。

2.使用 TPM2_ActivateCredential(TPM 规范,第 3 部分)

ActivateCredential 允许您验证一个密钥是否与另一个密钥共存。同样,虽然这通常用于证明,但您可以使用它来创建用于一般解密的非对称密钥对。

  1. 在这种情况下,VM 将在 TPM 上生成不受限制的解密密钥。
  2. 服务器然后使用已知的 EK 模板和解密密钥生成 ActivateCredential 质询。
  3. 如果解密密钥的属性匹配,TPM 可以获取质询密钥并将其返回给服务器。
  4. 服务器在收到成功的响应后,可以依赖质询中生成的相应公钥并将数据加密到 VM。

你可能注意到的一件事是,如果你只想解密几次,你可以使用挑战密钥作为明文。

您需要使用 https://pkg.go.dev/github.com/google/go-tpm/tpm2/credactivationhttps://pkg.go.dev/github.com/google/go-tpm/tpm2#ActivateCredential,因为我目前不知道支持开箱即用的工具。

参考资料

[1] EK 规范:https://trustedcomputinggroup.org/resource/tcg-ek-credential-profile-for-tpm-family-2-0/

[2] 凭证激活:https://github.com/google/go-attestation/blob/master/docs/credential-activation.md

[3] TPM 规范:https://trustedcomputinggroup.org/resource/tpm-library-specification

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。