Linux 容器的虚拟 TPM 代理驱动程序¶
本文档描述了 Linux 容器的虚拟可信平台模块 (vTPM) 代理设备驱动程序。
简介¶
这项工作的目标是为每个 Linux 容器提供 TPM 功能。这允许程序在容器中与 TPM 交互的方式与它们在物理系统上与 TPM 交互的方式相同。每个容器都有自己独特的、模拟的软件 TPM。
设计¶
为了使每个容器都可以使用模拟的软件 TPM,容器管理堆栈需要创建一个设备对,该设备对由客户端 TPM 字符设备 /dev/tpmX
(其中 X=0,1,2...)和“服务器端”文件描述符组成。前者通过创建一个具有适当主次编号的字符设备来移入容器,而文件描述符则传递给 TPM 模拟器。然后,容器内的软件可以使用字符设备发送 TPM 命令,而模拟器将通过文件描述符接收命令,并使用它来发送响应。
为了支持这一点,虚拟 TPM 代理驱动程序提供了一个设备 /dev/vtpmx
,该设备用于使用 ioctl 创建设备对。ioctl 将用于配置设备的标志作为输入。例如,这些标志指示 TPM 模拟器是否支持 TPM 1.2 或 TPM 2 功能。ioctl 的结果是“服务器端”的文件描述符以及创建的字符设备的主次编号。此外,还返回 TPM 字符设备的编号。例如,如果创建了 /dev/tpm10
,则返回编号 (dev_num
) 10。
创建设备后,驱动程序将立即尝试与 TPM 通信。驱动程序的所有命令都可以从 ioctl 返回的文件描述符中读取。这些命令应立即响应。
UAPI¶
-
enum vtpm_proxy_flags¶
代理 TPM 的标志
常量
VTPM_PROXY_FLAG_TPM2
代理 TPM 使用 TPM 2.0 协议
-
struct vtpm_proxy_new_dev¶
VTPM_PROXY_IOC_NEW_DEV
ioctl 的参数结构
定义:
struct vtpm_proxy_new_dev {
__u32 flags;
__u32 tpm_num;
__u32 fd;
__u32 major;
__u32 minor;
};
成员
flags
代理 TPM 的标志
tpm_num
TPM 设备的索引
fd
代理 TPM 使用的文件描述符
major
TPM 设备的主编号
minor
TPM 设备的次编号
-
long vtpmx_ioc_new_dev(struct file *file, unsigned int ioctl, unsigned long arg)¶
VTPM_PROXY_IOC_NEW_DEV
ioctl 的处理程序
参数
struct file *file
/dev/vtpmx
unsigned int ioctl
ioctl 编号
unsigned long arg
指向 struct vtpmx_proxy_new_dev 的指针
描述
创建一个匿名文件,该文件由充当 TPM 的进程用来与客户端进程通信。此函数还将添加一个新的 TPM 设备,通过该设备将数据代理到此充当 TPM 的进程。调用者将获得一个用于与客户端通信的文件描述符以及 TPM 设备的主次编号。