Vmware Fusion TPM安装过程
安装环境
- 虚拟机软件:Vmware Fusion版本–11.5.6
- 系统镜像:Ubuntu-20.04.1-desktop-amd64
安装过程
首先需要准备一个虚拟机,这里省略虚拟机的安装过程。安装好后进入虚拟机设置界面。
这里特别说明,Vmware安装TPM芯片必须要使用UEFI作为启动固件,而不能使用传统的BIOS固件。所以选择高级(Advanced) - 固件类型(Firmware type) - UEFI。
然后再将TPM芯片所需的磁盘加密启用。选择“Encryption & Restrictions”,选中启用加密,接着输入加密所需的口令,最后等待加密完成。
此时已经完成了TPM安装所需的前置条件,可以在添加设备中选择添加TPM(Trusted Platform Module)芯片。即可看到,目前TPM芯片已经成功添加到虚拟机中,启动虚拟机可使用。
开机测试
首先使用命令dmesg | grep -i tpm
,查看当前虚拟机内使用的TPM版本。可以看到我的虚拟机使用的TPM芯片版本是2.0。因此使用诸如trousers、tpm-tools之类的工具会发生错误,这些工具仅支持TPM 1.2。
Intel 实现
对于TPM2.0则需要安装其支持的一些工具。tpm2-software项目共包含四个项目:
- tpm2-tools:为用户提供使用TPM资源的相关命令
- tpm2-tss:这一个项目TPM 协议栈部分,一共分为两层,一为上层开发者提供和封装统一的调用接口,二为上层提供了访问底层硬件资源接口
- tpm2-abrmd:tm2-abrmd是一个后台进程,主要做TPM硬件资源管理.比如:当我们上层应用加载key的时候,不需要关心,TPM中是否还有空闲的key slot,因为tpm2-abrmd后台进程会帮助我们做,如果TPM中key slot不够用,那么就会把不用key交换出来,然后供当前访问的进程使用
- tpm2-tss-engine:这个是一个加密相关的engine,需要配合openssl使用
各组件相关关系如下:
注意:tss2和tpm2-tools无关。
tss2是ibm实现,其软件仓库为https://sourceforge.net/projects/ibmtpm20tss/。
而tpm2-tools是intel实现,其软件仓库为https://github.com/tpm2-software/tpm2-tools。
tpm2-tools所对应的tpm2-tss的软件仓库为https://gitub.com/tpm2-software/tpm2-tss。
tpm2-tools相关命令如下:
tss2不仅包含TCG软件栈,也包含相关的工具如下:
注:如果不像完整软件栈,仅想体验用户态工具tpm2-tools的一些功能,那么在Ubuntu中直接使用
apt install tpm2-tools
安装即可使用。
首先安装tpm2-tss。具体安装步骤参见https://github.com/tpm2-software/tpm2-tss/blob/master/INSTALL.md。
然后安装tpm2-tss-engine(openssl相关的引擎)。具体安装步骤参见https://github.com/tpm2-software/tpm2-tss-engine/blob/master/INSTALL.md。
使用命令
openssl engine -t -c tpm2tss
确认安装。然后测试产生16进制随机数
接着安装tpm2-abrmd。具体安装步骤见https://github.com/tpm2-software/tpm2-abrmd/blob/master/INSTALL.md,以及博客https://blog.csdn.net/jianming21/article/details/108035041#tpm2abmrd_120。
如果出现如下错误提示,需要安装glib依赖
apt install libglib2.0-dev
。1
2
3configure: error: Package requirements (gio-unix-2.0) were not met:
No package 'gio-unix-2.0' found另外,为了保证服务正确启动,向configure提供以下参数。tpm2-abrmd.service默认会安装在/usr/local/lib/systemd/system。
1
./configure --with-dbuspolicydir=/etc/dbus-1/system.d --with-systemdsystemunitdir=/lib/systemd/system
最后是tpm2-tools的安装。具体步骤见https://github.com/tpm2-software/tpm2-tools/blob/master/doc/INSTALL.md。
至此TPM芯片以及相关工具的安装已经完成,下文将简述一些tpm2-tools的功能测试。如果需要进一步了解TPM2.0的远程证明,参考官方教程Remote Attestation With Tpm2 Tools。
pcrread测试
工具安装完成后,使用tpm2_pcrread sha1:0,1,2+sha256:0,1,2
命令来查看0、1、2号PCR在sha1和sha256下的值。
seal测试
1.
1 | tpm2_createprimary -c primary.ctx |
用该命令来创建一个主对象保存到文件primary.ctx中,该主对象的默认层级为TPM_RH_OWNER
。
2.
1 | tpm2_pcrread -o pcr.bin sha256:0,1,2,3 |
读取sha256 bank下的0-3四个PCR寄存器的值,并保存到pcr.bin文件中。
3.
1 | tpm2_createpolicy --policy-pcr -l sha256:0,1,2,3 -f pcr.bin -L pcr.policy |
基于跨多个bank的多PCR索引值,创建简单的断言授权策略。
4.
1 | echo 'secret' | tpm2_create -C primary.ctx -L pcr.policy -i- -u seal.pub -r seal.priv -c seal.ctx |
使用tpm2_create创建一个key或sealing的子对象。此外,sealing对象允许seal最大128字节的用户数据到tpm。这条命令的作用就是利用echo
将用户数据输出到stdin
,然后通过tpm2_create的-i
参数指定seal的输入为-
(代表stdin
)。
此时可能会出现如下错误。这个错误发生的原因是,某些TPM不支持CreateLoaded命令。在tpm2-tools中实现的tpm2_create
命令中-c
参数调用CreateLoaded
,因此出现了问题。该问题的相关信息可以参考tpm2_unseal #2181。
1 | WARNING:esys:src/tss2-esys/api/Esys_CreateLoaded.c:359:Esys_CreateLoaded_Finish() Received TPM Error |
可以使用tpm2_getcap commands | grep TPM2\_CC\_Create
命令来检查TPM是否支持。(注:getcap命令所查询的是TPM芯片所支持的命令,而非Linux终端中使用的用户命令)
如上图输出所示,本机的TPM支持的Create相关的命令仅有TPM2_CC_CreatePrimary
和TPM2_CC_Create
。
处理方式:使用create和load两个命令来模拟createloaded命令。借助create创建公私钥,再用load加载并输出子对象的上下文。
1 | echo 'secret' | tpm2_create -C primary.ctx -L pcr.policy -i- -u seal.pub -r seal.priv |
5.
1 | tpm2_unseal -c seal.ctx -p pcr:sha256:0,1,2,3 |
调用该命令解封数据,得到了之前seal的用户数据“secret”。
如果使用了错误或者发生了变化的PCR寄存器,则会出现如下错误:
重启计算机,再次执行步骤5,确认seal的数据是否丢失。
这里发生了错误。该seal-unseal重启后产生的问题,在网上有较多的讨论,可以参见参考资料[10]。
1
2
3
4
5WARNING:esys:src/tss2-esys/api/Esys_ContextLoad.c:279:Esys_ContextLoad_Finish() Received TPM Error
ERROR:esys:src/tss2-esys/api/Esys_ContextLoad.c:93:Esys_ContextLoad() Esys Finish ErrorCode (0x000001df)
ERROR: Esys_ContextLoad(0x1DF) - tpm:parameter(1):integrity check failed
ERROR: Invalid item handle authorization
ERROR: Unable to run tpm2_unseal处理方式:使用createprimary创建的primary对象是临时的,因此在unseal之前需要重建primary对象,并将其加载到TPM芯片中。之后再调用unseal成功获取了的用户数据。
1
2
3tpm2_createprimary -c primary.ctx
tpm2_load -C primary.ctx -u seal.pub -r seal.priv -c seal.ctx
tpm2_unseal -c seal.ctx -p pcr:sha256:0,1,2,3
IBM 实现(可选)
IBM实现是基于软件TPM的,它共包含三个部分:ibmswtpm2、ibmtpm20tss和ibmtpm20acs。此外它还需要安装一个Openssl的引擎openssl_tpm2_engine。
ibmtpm20tss需要ibmswtpm2的存在,其tss提供的工具均需要通过一个2321端口(ibm软件TPM守护进程的默认端口)来访问信息。
(未测试)
参考资料
[1] TPM2 Linux社区教程
[2] Create a Virtual Trusted Platform Module Device
[4] tpm2.0-tools命令查询
[5] https://www.mankier.com/1/tpm2_unseal
[6] https://www.mankier.com/1/tpm2_createprimary
[7] https://www.mankier.com/1/tpm2_createpolicy
[8] https://www.mankier.com/1/tpm2_load
[9] https://github.com/tpm2-software/tpm2-tools/issues/2181
[10] https://github.com/tpm2-software/tpm2-tools/issues/1884
[11] tpm2-tools seal-unseal data after reboot
[12] tss2 vs tpm2-tss
[13] TPM模拟器和TPM2-TSS安装
[14] tpm模拟器与新版tpm2-tss\abrmd\tools安装
[15] TPM 协议栈和工具介绍
Vmware Fusion TPM安装过程