问题描述
我想知道如何使用受 gcp 保护的 VM 实例的签名密钥和加密密钥?我正在考虑使用加密密钥 (ekPub) 来加密任意数据块,并确保只有关联的 gcp 实例才能解密它。但我不知道如何要求 vTPM 解密加密数据?
解决方法
Shielded VM 和 Confidential 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 中的秘密。 流程大致如下:
- 远程实体创建一个 blob,其中包含一个私有部分和一个相应的公共部分。私有部分包含要解密的原始秘密。
- 远程实体使用 EK 为派生对称和 HMAC 密钥的已知 KDF 包装种子。
- 使用种子和 KDF 派生密钥来加密私有部分。这是“重复”的 blob。
- 向虚拟机发送重复的、公开的和加密的种子。
- TPM2_Import 对重复的、公开的和加密的种子进行处理,并带有 EK 的句柄。
- TPM2_Load 在 public 和 outPrivate(解密的私有)上来自 TPM2_Import。
- 对象句柄上的 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#CreateImportBlob和https://pkg.go.dev/github.com/google/go-tpm-tools/tpm2tools#Key.Import
注意包 tpm2tools
最近更名为客户端,但这还不是公开版本。
2.使用 TPM2_ActivateCredential(TPM 规范,第 3 部分)
ActivateCredential 允许您验证一个密钥是否与另一个密钥共存。同样,虽然这通常用于证明,但您可以使用它来创建用于一般解密的非对称密钥对。
- 在这种情况下,VM 将在 TPM 上生成不受限制的解密密钥。
- 服务器然后使用已知的 EK 模板和解密密钥生成 ActivateCredential 质询。
- 如果解密密钥的属性匹配,TPM 可以获取质询密钥并将其返回给服务器。
- 服务器在收到成功的响应后,可以依赖质询中生成的相应公钥并将数据加密到 VM。
你可能注意到的一件事是,如果你只想解密几次,你可以使用挑战密钥作为明文。
您需要使用 https://pkg.go.dev/github.com/google/go-tpm/tpm2/credactivation 和 https://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