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 设备的主次编号。