查看设备 TPM 硬件

方法一:

$ [[ -d $(ls -d /sys/kernel/security/tpm* 2>/dev/null | head -1) ]] && echo "TPM available" || echo "TPM missing"

方法二:

所有 TPM 设备都必须有 /dev/tpm0,因此另一种方法是检查 /dev/tpm0 或 /dev/tpmrm0

/dev/tpmrm0 仅适用于 TPM 2.0,但它是在 v4.12-rc1 中添加的。如果有第二个版本,则以下命令将显示相应的消息:

$ [ -c /dev/tpmrm0 ] && echo "TPM 2.0"

如果版本是 1.2 或 2.0,此命令将打印一条消息:

$ [ -c /dev/tpm0 ] && echo "TPM 1.2 or 2.0"

如果前面的命令显示缺少 TPM,并不一定意味着 TPM 根本就没有——它可能只是被禁用了。转到 BIOS 并查找名称中带有 TPM 的设置。如果找到它们,请打开它们。

如果有 TPM,需要安装适用于 Linux 的 TPM 软件。在 Linux 上,安装 TrouSerS 软件包以使用 TPM。它带有 tcsd 实用程序。

验证是否已加载 TPM 模块:

$ lsmod | grep tpm

安装 TPM 套件

本实验使用TPM模拟器搭建的实验环境进行实验,模拟器为IBM推出的TPM2.0模拟器。软件栈采用Intel推出的TSS相关组件。安装顺序如下:

  1. IBM TPM Emulator 2.0(视情况选择)
  2. Intel tpm2-tss 4.1.3
  3. Intel tpm2-abrmd 3.0.0
  4. Intel tpm2-tools 3.X

TPM Emulator 2.0

如果没有 TPM 硬件芯片,需要先安装 TPM 模拟器;如果有硬件的话则可以跳过这步,直接安装 TPM2-TSS。

$ sudo apt install -y lcov pandoc autoconf-archive liburiparser-dev libdbus-1-dev libglib2.0-dev dbus-x11 libssl-dev autoconf automake libtool pkg-config gcc libcurl4-gnutls-dev libgcrypt20-dev libcmocka-dev uthash-dev
# 或
$ yum install -y lcov pandoc autoconf-archive liburiparser-devel libdbus-1-devel libglib2.0-devel dbus-x11 libssl-devel autoconf automake libtool pkg-config gcc libcurl4-gnutls-devel libgcrypt20-devel libcmocka-devel uthash-devel

$ mkdir ibmtpm && cd ibmtpm
$ wget https://jaist.dl.sourceforge.net/project/ibmswtpm2/ibmtpm1332.tar.gz && tar xzf ibmtpm1332.tar.gz && cd src/ && make
$ sudo cp tpm_server /usr/local/bin

# 增加tpm-server.service文件
$ sudo vim /lib/systemd/system/tpm-server.service

# 写入如下内容:
[Unit]
Description=TPM2.0 Simulator Server Daemon
Before=tpm2-abrmd.service
 
[Service]
ExecStart=/usr/local/bin/tpm_server 
Restart=always
 
[Install]
WantedBy=multi-user.target

# 重新加载服务的配置文件
$ systemctl daemon-reload
# 启动tpm服务
$ systemctl start tpm-server.service
# 测试TPM配置情况
$ systemctl status tpm-server.service

Tpm2-tss

TSS(TCG Software Stack,TCG软件栈)又称为可信软件栈,他是可信计算平台上TPM的支撑软件。TSS的主要作用是为操作系统和应用软件提供使用TPM的接口。TSS的结构可分为内核层、系统服务层和用户程序层。

# 需要安装 cmocka
$ yum install -y libcmocka-devel uthash-devel json-c-devel libcurl-devel
# 或
$ apt-get install -y libcmocka-dev uthash-dev libjson-c-dev texinfo fig2dev gettext

# 安装 libgpg-error
$ git clone https://github.com/gpg/libgpg-error.git
$ cd libgpg-error/ && ./autogen.sh && ./configure --enable-maintainer-mode && make && make install

# 安装 libgcrypto
$ git clone https://github.com/gpg/libgcrypt.git && cd libgcrypt
$ ./autogen.sh && ./configure --enable-maintainer-mode && make -j8
# centos的上一步可能在编译生成doc时出错,显示:/bin/sh: fig2dev:未找到命令。但此时动态库和二进制程序已经编译完成了,可以不管这个doc,直接安装
$ make install

# 安装 tss
$ sudo useradd --system --user-group tss
$ git clone https://github.com/tpm2-software/tpm2-tss.git && cd tpm2-tss/ && git checkout 4.1.3
$ ./bootstrap && ./configure --enable-unit # 如果是模拟器,带上这个选项 --enable-integration
$ make check -j8
$ sudo make install
$ sudo ldconfig

tpm2_abrmd

tpm2_abrmd是实现 TPM2 权限和资源管理的系统后台进程。客户端和该进程的通信是通过 DBus 和 Unix 的管道实现的。DBus用于发现、会话管理等API调用;管道则用来发送和接收客户端与TPM的命令和响应。

$ git clone https://github.com/tpm2-software/tpm2-abrmd.git
$ export GDBUS_CODEGEN=/usr/bin/gdbus-codegen
$ ./configure --with-dbuspolicydir=/etc/dbus-1/system.d --with-systemdsystemunitdir=/lib/systemd/system
$ sudo make install -j8
$ sudo cp /usr/local/share/dbus-1/system-services/com.intel.tss2.Tabrmd.service /usr/share/dbus-1/system-services/
$ sudo pkill -HUP dbus-daemon

# 修改tpm2-abrmd.service服务配置。在启动服务时加载tss动态库并将服务启动到本地2321端口。如果是使用模拟器,则将“ExecStart=/usr/local/sbin/tpm2-abrmd”修改为“ExecStart=/usr/local/sbin/tpm2-abrmd --tcti=“libtss2-tcti-mssim.so.0:host=127.0.0.1,port=2321””;如果使用的是硬件TPM,则不用加这个配置。
$ vim /lib/systemd/system/tpm2-abrmd.service

# 添加如下内容
[Unit]
Description=TPM2 Access Broker and Resource Management Daemon
# These settings are needed when using the device TCTI. If the
# TCP mssim is used then the settings should be commented out.
# After=dev-tpm0.device
# Requires=dev-tpm0.device

[Service]
Type=dbus
BusName=com.intel.tss2.Tabrmd
StandardOutput=syslog
ExecStart=/usr/local/sbin/tpm2-abrmd (根据是否使用模拟器来选择添加:--tcti="libtss2-tcti-mssim.so.0:host=127.0.0.1,port=2321")
User=tss

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload
$ systemctl start tpm2-abrmd.service
$ systemctl status tpm2-abrmd.service

tpm2_tools

Tpm2-tools为tpm调用其进行可信计算的命令行工具。

$ git clone -b 5.7-rc1 https://github.com/tpm2-software/tpm2-tools.git && cd tpm2-tools
$ ./bootstrap && ./configure --prefix=/usr && make -j8 && sudo make install

测试 tpm2-tools

$ tpm2_getrandom 4

参考资料