我想知道如何使用gcp屏蔽的VM实例的签名密钥和加密密钥?我正在考虑使用加密密钥(ekPub)来加密任意blob的数据,并确保只有关联的gcp实例才能解密它。但我不确定如何要求vTPM解密加密的数据?
屏蔽虚拟机和机密计算是谷歌云上的两个不同功能。
启动时屏蔽虚拟机检查是否有任何组件被篡改,并可能导致数据泄露(通过恶意软件/后门)
机密计算在启动时自动创建加密密钥。这个密钥用于对内存中的所有数据进行加密。数据只能在CPU内部进行解密,同时进行处理。
当数据写入磁盘时,数据从加密存储器中获取,在CPU中解密,并以纯文本写入磁盘,磁盘会自动加密(但通过另一个过程,而不是CPU)
你没事可做,这是自动的!
背景和定义
认可密钥(EK)是TPM2.0上用于证明的密钥。EK通常附带由制造商签署的证书(注意,在GCE实例中不可用),声明TPM是真正的TPM[1]。然而,TCG对使用一个签名密钥进行认证存在隐私问题。因此,他们决定将背书密钥作为加密密钥。ActivateCredential流[2]通常用于信任新的签名密钥。这通过允许使用隐私CA来创建AK证书来认可EK和AK在同一TPM上,从而避开了隐私问题。GCE默认创建一个AK,允许用户通过使用get-shhielded-identity API来避免此过程。
解密
有几种方法可以使用背书密钥对数据进行加密。
由于EK是受限的[3],你必须跳过一些关卡才能轻松使用它。这里的受限意味着密钥不能用于一般解密。相反,它们用于存储/包装TPM对象。存储密钥通常是受限制的解密密钥。
以下是解决这个问题的一些方法:
1。使用TPM2_Import和TPM2_Unseal(TPM规范[3]的第3部分)
TPM2_Import让TPM使用存储密钥解密外部blob(公共和私有)。然后,用户可以在存储密钥下加载该对象并使用。TPM2_Unseal返回密封blob中的机密。流程大致如下:
- 远程实体创建一个包含私有部分和相应公共部分的blob。私有部分包含要解密的原始秘密
- 远程实体使用EK来包装已知KDF的种子,该已知KDF导出对称和HMAC密钥
- 使用种子和KDF派生的密钥来加密私有部分。这就是";重复";斑点
- 将重复的、公开的和加密的种子发送到VM
- TPM2_Import on duplicate,public,and encrypted seed with handle for the EK
- TPM2_Load on public and outPrivate(解密的private)from TPM2_Import
- TPM2_Unseal在对象句柄上,secret将在outData中
这一切都是在中为您完成的https://github.com/google/go-tpm-tools.您所需要的只是传入PEM,对其进行解码,并将其解析为公钥。然后可以使用server.CreateImportBlob
。将输出blob发送到VM。在客户端,使用EndorsementKeyRSA
(或EndorsementKeyECC
)创建go-tpm工具密钥。将key.Import
与blob一起使用。
具体请参见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