IBM Attestation Client Server测试

这里仅考虑了vTPM 2.0和 TPM 2.0 Emulator的两种情况。尽管编译时说明了1.2的处理,但是配置部分并未说明,详情可以见参考资料的README。

测试环境

  • Ubuntu 18.04.5

    在Vmware Fusion版本下安装的虚拟机,添加了vTPM芯片。

  • ibmswtpm2

    如果需要

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    mkdir /opt/ibmtpm1637
    cp ibmtpm1637.tar.gz /opt/ibmtpm1637
    cd /opt/ibmtpm1637

    tar -zxvf ibmtpm1637.tar.gz

    cd src
    make

    cd /opt
    ln -s ibmtpm1637 ibmtpm
  • ibmtpm20tss

    TPM TSS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    mkdir /opt/ibmtss160/
    cp ibmtss1.6.0.tar.gz /opt/ibmtss160/
    cd /opt/ibmtss160/

    tar -zxvf ibmtss1.6.0.tar.gz

    # 仅支持TPM 2.0
    cd utils
    make -f makefiletpm20

    # Or 同时支持TPM 2.0和TPM 1.2
    cd utils
    make -f makefiletpmc
    cd utils12
    make -f makefiletpmc

    # 如果拥有物理TPM则进行以下设置
    export TPM_INTERFACE_TYPE=dev

    # or 如果没有物理TPM则使用以下设置
    export TPM_INTERFACE_TYPE=socsim

    ln -s /opt/ibmtss160 /opt/ibmtss
  • ibmtpm20acs

    IBM TPM Attestation Client Server

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mkdir /opt/ibmacs1658
    cp ibmacs1658.tar.gz /opt/ibmacs1658
    cd /opt/ibmacs1658
    tar -zxvf ibmacs1658.tar.gz
    cd acs

    apt update

    # 服务端
    apt install libjson-c3 libjson-c-dev apache2 php php-dev php-mysql mysql-server libmysqlclient-dev libssl-dev

    ## 创建数据库
    mysql
    # mysql> create database tpm2;
    # mysql> CREATE USER 'tpm2ACS'@'localhost' IDENTIFIED BY '123456';
    # mysql> GRANT ALL ON tpm2.* to 'tpm2ACS'@'localhost';
    mysql -D tpm2 < dbinit.sql

    # 客户端
    apt install libjson-c3 libjson-c-dev libssl-dev

    # 设置环境变量
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/ibmtss/utils:/opt/ibmtss/utils12
    export PATH=$PATH:/opt/ibmtss/utils:/opt/ibmtss/utils12

    ln -s /opt/ibmacs1658/acs /opt/ibmacs

Attestation Demo

因为实验涉及多个终端通信,请确保每个终端都配置好了上述的环境变量,尤其是PATHLD_LIBRARY_PATH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# make会将网页相关的内容拷贝到该目录下
mkdir /var/www/html/acs
chown root /var/www/html/acs
chgrp root /var/www/html/acs
chmod 777 /var/www/html/acs

# 编译ACS
ln -s /usr/include/json-c /usr/include/json

## For TPM 2.0 client and server
export CPATH=/opt/ibmtss/utils
export LIBRARY_PATH=/opt/ibmtss/utils
make

## Or For TPM 1.2 client (requires TPM 1.2 / TPM 2.0 server)
export CPATH=/opt/ibmtss/utils:/opt/ibmtss/utils12
export LIBRARY_PATH=/opt/ibmtss/utils:/opt/ibmtss/utils12
make -f makefiletpm12

## Or For TPM 1.2 and TPM 2.0 client and TPM 1.2 / TPM 2.0 server
export CPATH=/opt/ibmtss/utils:/opt/ibmtss/utils12
export LIBRARY_PATH=/opt/ibmtss/utils:/opt/ibmtss/utils12
make -f makefiletpmc

然后访问localhost:80/acs即可。

这个时候可能会出现一些关于MySQL的错误,这是由于MySQL的一些环境变量没有设置好导致的。在启动服务部分有相关的环境变量设置。

相关配置

准备EK

  • 对于TPM模拟器,相关的CA证书,在软件安装的时候已经被创建了,不需要手动创建。如果想要修改相关证书,可以参照ibmacs的README.txt文件。

此处仅需要为软件TPM创建EK证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 终端1
cd /opt/ibmtpm/src
./tpm_server

# 终端2
cd /opt/ibmtss/utils
./powerup
./startup

## 由于这些证书是写在NV中的,因此可以事先将原来的NV备份
cp /opt/ibmtpm/src/NVChip /opt/ibmtpm/src/NVChip.bak

## 将RSA EK证书写入到NV中
createekcert -rsa 2048 -cakey cakey.pem -capwd rrrr -v

## 将ECC EK证书写入到NV中
createekcert -ecc nistp256 -cakey cakeyecc.pem -capwd rrrr -caalg ec -v
  • 对于硬件TPM,则在其NV区域已经内置了EK证书。如果想要将其提取出来可以参照下列步骤:

读取NV存储区内的EK证书信息,并将其保存到文件。

1
2
3
4
5
# 创建RSA证书文件
nvread -ha 01c00002 | awk 'NR==1 {next} {print}' | xxd -r -ps | base64 | sed -e '1i -----BEGIN CERTIFICATE-----' -e '$a -----END CERTIFICATE-----' > VMW_EK_CACERT.pem

# 同理创建ECC证书文件
nvread -ha 01c0000a | awk 'NR==1 {next} {print}' | xxd -r -ps | base64 | sed -e '1i -----BEGIN CERTIFICATE-----' -e '$a -----END CERTIFICATE-----' > VMW_EKECC_CACERT.pem

上述命令的部分步骤解释及执行效果如下:

  • 从NV存储区读取出vTPM内置的EK证书
1
2
# 句柄地址01c00002
nvread -ha 01c00002
  • 读取的结果是打印字符,因此需要将其转化为pem的格式。awk命令用于删除第一行的“nvread: data length 1090”;xxd则用于将16进制字符串转化为二进制文件;base64则是对二进制数据进行编码。
1
nvread -ha 01c00002 | awk 'NR==1 {next} {print}' | xxd -r -ps | base64
  • 尝试再为其添加开始和结束标签。用sed为其开头和结尾添加信息。
1
nvread -ha 01c00002 | awk 'NR==1 {next} {print}' | xxd -r -ps | base64 | sed -e '1i -----BEGIN CERTIFICATE-----' -e '$a -----END CERTIFICATE-----'

如果硬件TPM的EK证书提取失败,可能需要考虑

启动服务

服务器使用TPM作为加密协处理器。它必须指向不同的(通常是软件)TPM和TSS数据目录。

1
2
3
4
5
6
7
8
9
10
# 如果服务器和客户端位于同一台机器
mkdir ~/tpm2

export TPM_DATA_DIR=~/tpm2

# 如果运行在不同的机器,则直接启动TPM Emulator即可
# vTPM不需要这些步骤
/opt/ibmtpm/src/tpm_server
/opt/ibmtss/utils/powerup
/opt/ibmtss/utils/startup

编辑文件/opt/ibmtss/utils/certificates/rootcerts.txt。该文件是记录了CA根证书列表,server会根据这个列表来判断客户的TPM是否可信。

1
2
# 使用vim进行全局替换
# :%s/\/gsa\/yktgsa\/home\/k\/g\/kgold\/tpm2/\/opt\/ibmtss/g

设置ACS端口

1
export ACS_PORT=2323

设置MySQL环境变量

但这种方式可能失效,如果还是不起作用,可以vim /var/www/html/acs/dbconnect.php,修改$connect = new mysqli("localhost", "tpm2ACS", "123456", "tpm2");

1
2
3
4
5
6
7
# ACS_SQL_HOST - defaults to localhost
# ACS_SQL_PORT - defaults to 0, MySQL will use its default
# ACS_SQL_USERID - defaults to current user
# ACS_SQL_PASSWORD - defaults to empty
# ACS_SQL_DATABASE - defaults to tpm2
export ACS_SQL_USERID=tpm2ACS
export ACS_SQL_PASSWORD=123456

启动服务

1
2
3
cd /opt/ibmacs

./server -v -root /opt/ibmtss/utils/certificates/rootcerts.txt -imacert imakey.der >| serverenroll.log4j

设置客户端

向证实服务器安装客户端的证实密钥证书。

1
2
3
4
5
6
7
8
9
cd /opt/ibmacs

# 如果指定了ACS_DIR,那么客户端会在此处存放AK的公私钥

# 本地
./clientenroll -alg rsa -v -ho localhost -co akcert.pem >| clientenroll.log4j

# 远程
./clientenroll -alg ec -v -ho server_name -ma client_name -co akeccert.pem >| clientenroll.log4j

图上的机器“chaos”代表的是,客户端和服务器位于同一设备;而“192.168.44.151”代表的是客户端和服务器位于不同设备。

注册过程可能会出现错误。

原因如下,说明该vTPM的Root CA证书不在服务器的合法TPM厂商列表中。

The server validates the EK certificate against its list of TPM vendor root certificates.

If the certificate is valid, the server trusts that the certificate came from an authentic TPM, but not that it came from the client’s TPM.

处理方法如下:找到给TPM EK证书的CA证书,然后导入到合法TPM厂商列表中。

启动证实

  • 如果使用的是TPM模拟器,那么在其内的PCR寄存器是不会记录启动数据的,因此需要人为的将一些日志信息Extend到PCR中。同样IMA的信息也是需要人为Extend到PCR中。

  • 但如果使用的是硬件TPM,那么可以忽略。此外,在/sys/kernel/security/tpm0/binary_bios_measurements可以获取TPM的BIOS度量日志;在/sys/kernel/security/ima/binary_runtime_measurements可以获取IMA的运行时度量日志。

1
2
3
4
5
6
7
8
9
10
11
12
# tpm2bios.log是一个的事件日志
/opt/ibmtss/utils/eventextend -if tpm2bios.log -tpm -v >| b.log4j

# imasig.log是一个IMA日志
/opt/ibmtss/utils/imaextend -if imasig.log -le -v >| i.log4j

# 发起一个证实
## 本地
./client -alg rsa -ifb tpm2bios.log -ifi imasig.log -ho localhost -v >| client.log4j

## 远程
./client -alg ec -ifb tpm2bios.log -ifi imasig.log -ho server_name -v -ma client_name >| client.log4j

因为没有对IMA证书进行配置,因此这里出现了签名验证不通过的情况。

失败的远程服务器的错误原因为,Quote信息和度量日志不匹配。

ACS Web

这里展示一些从ACS Web能够获取的信息。

点击Report,可以获取到quote和签名信息。

点击BIOS Events,可以获取到度量日志。

点击IMA Events,可以获取到IMA度量日志。

客户端的最小化安装

客户端仅有两个命令clientenroll和client。clientenroll用于向服务器注册,而client用于发起证实请求。

最小化安装TSS。

1
2
3
4
5
6
7
# 如果要安装在硬件TPM上
cd /opt/ibmtss/utils

# 在CCFLAGS处添加-DTPM_NOSOCKET
vim makefile.min

make -f makefile.min

最小化安装客户端

1
2
3
4
5
6
cd /opt/ibmacs
make client
make clientenroll

# 如果要最小化安装服务端
# make server

相关资料

[1] IBM ACS README

[2] AttestProv

[3] IMA Log Format

Author

Chaos Chen

Posted on

2021-02-28

Updated on

2023-06-30

Licensed under

Commentaires