可信平台模块 (TPM) 是一种使用加密密钥保护硬件的加密协处理器。对于使用 TPM 开发安全功能的开发人员来说,软件 TPM 模拟器是一个便捷的解决方案。与硬件 TPM 设备相比,模拟器可以访问它的客体数量没有限制。此外,在 TPM 版本 1.2 和 2.0 之间切换也很简单。QEMU 支持包含在 swtpm 包中的软件 TPM 模拟器。
在安装和使用软件 TPM 模拟器之前,需要安装 libvirt 虚拟化环境。请参阅 第 6.2 节,“安装虚拟化组件” 并安装提供的虚拟化解决方案之一。
swtpm 提供三种类型的接口:socket、chardev 和 cuse。此过程重点介绍 socket 接口。
在 VM 目录中创建一个名为 mytpm0 的目录,以存储 TPM 状态,例如 /var/lib/libvirt/qemu/sle15sp3
>sudomkdir /var/lib/libvirt/qemu/sle15sp3/mytpm0
启动 swtmp。它会创建一个 QEMU 可以使用的套接字文件,例如 /var/lib/libvirt/qemu/sle15sp3
>sudoswtpm socket --tpmstate dir=/var/lib/libvirt/qemu/sle15sp3/mytpm0 \ --ctrl type=unixio,path=/var/lib/libvirt/qemu/sle15sp3/mytpm0/swtpm-sock \ --log level=20
默认情况下,swtpm 会启动 TPM 版本 1.2 模拟器,并将状态存储在 tpm-00.permall 目录中。要创建 TPM 2.0 实例,请运行
>sudoswtpm socket --tpm2 --tpmstate dir=/var/lib/libvirt/qemu/sle15sp3/mytpm0 \ --ctrl type=unixio,path=/var/lib/libvirt/qemu/sle15sp3/mytpm0/swtpm-sock \ --log level=20
TPM 2.0 状态存储在 tpm2-00.permall 目录中。
将以下命令行参数添加到 qemu-system-ARCH 命令
> qemu-system-x86_64 \
[...]
-chardev socket,id=chrtpm,path=/var/lib/libvirt/qemu/sle15sp3/mytpm0/swtpm-sock \
-tpmdev emulator,id=tpm0,chardev=chrtpm \
-device tpm-tis,tpmdev=tpm0通过运行以下命令来验证客户机中是否可用 TPM 设备
> tpm_version
TPM 1.2 Version Info:
Chip Version: 1.2.18.158
Spec Level: 2
Errata Revision: 3
TPM Vendor ID: IBM
TPM Version: 01010000
Manufacturer Info: 49424d00要使用 swtpm 与 libvirt,请将以下 TPM 设备添加到客户机 XML 规范
<devices> <tpm model='tpm-tis'> <backend type='emulator' version='2.0'/> </tpm> </devices>
libvirt 会自动为客户机启动 swtpm。无需提前手动启动它。相应的 permall 文件在 /var/lib/libvirt/swtpm/VM_UUID 中创建。
如果客户机使用开放虚拟化机固件 (OVMF),它会使用 TPM 测量组件。您可以在 /sys/kernel/security/tpm0/binary_bios_measurements 中找到事件日志。
维基百科在页面 https://en.wikipedia.org/wiki/Trusted_Platform_Module 上提供了对 TPM 的全面描述。
在 openSUSE Leap 上配置特定的虚拟化环境在 第 6 章,安装虚拟化组件 中有描述。
有关 swtpm 使用的详细信息,请参阅其手册页 (man 8 swtpm)。
关于 libvirt TPM 规范的详细信息位于 https://libvirt.org/formatdomain.html#elementsTpm
关于使用 OVMF 启用 UEFI 固件的描述位于 第 6.3 节,“安装 UEFI 支持”。