IBM Attestation Client Server测试
这里仅考虑了vTPM 2.0和 TPM 2.0 Emulator的两种情况。尽管编译时说明了1.2的处理,但是配置部分并未说明,详情可以见参考资料的README。
测试环境
Ubuntu 18.04.5
在Vmware Fusion版本下安装的虚拟机,添加了vTPM芯片。
-
如果需要
1
2
3
4
5
6
7
8
9
10
11mkdir /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 -
TPM TSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23mkdir /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 -
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
26mkdir /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
因为实验涉及多个终端通信,请确保每个终端都配置好了上述的环境变量,尤其是PATH和LD_LIBRARY_PATH
1 | # make会将网页相关的内容拷贝到该目录下 |
然后访问localhost:80/acs
即可。
这个时候可能会出现一些关于MySQL的错误,这是由于MySQL的一些环境变量没有设置好导致的。在启动服务部分有相关的环境变量设置。
相关配置
准备EK
- 对于TPM模拟器,相关的CA证书,在软件安装的时候已经被创建了,不需要手动创建。如果想要修改相关证书,可以参照ibmacs的README.txt文件。
此处仅需要为软件TPM创建EK证书。
1 | # 终端1 |
- 对于硬件TPM,则在其NV区域已经内置了EK证书。如果想要将其提取出来可以参照下列步骤:
读取NV存储区内的EK证书信息,并将其保存到文件。
1 | # 创建RSA证书文件 |
上述命令的部分步骤解释及执行效果如下:
- 从NV存储区读取出vTPM内置的EK证书
1 | # 句柄地址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 | # 如果服务器和客户端位于同一台机器 |
编辑文件/opt/ibmtss/utils/certificates/rootcerts.txt
。该文件是记录了CA根证书列表,server会根据这个列表来判断客户的TPM是否可信。
1 | # 使用vim进行全局替换 |
设置ACS端口
1 | export ACS_PORT=2323 |
设置MySQL环境变量
但这种方式可能失效,如果还是不起作用,可以vim /var/www/html/acs/dbconnect.php
,修改$connect = new mysqli("localhost", "tpm2ACS", "123456", "tpm2");
。
1 | # ACS_SQL_HOST - defaults to localhost |
启动服务
1 | cd /opt/ibmacs |
设置客户端
向证实服务器安装客户端的证实密钥证书。
1 | cd /opt/ibmacs |
图上的机器“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 | # tpm2bios.log是一个的事件日志 |
因为没有对IMA证书进行配置,因此这里出现了签名验证不通过的情况。
失败的远程服务器的错误原因为,Quote信息和度量日志不匹配。
ACS Web
这里展示一些从ACS Web能够获取的信息。
点击Report,可以获取到quote和签名信息。
点击BIOS Events,可以获取到度量日志。
点击IMA Events,可以获取到IMA度量日志。
客户端的最小化安装
客户端仅有两个命令clientenroll和client。clientenroll用于向服务器注册,而client用于发起证实请求。
最小化安装TSS。
1 | # 如果要安装在硬件TPM上 |
最小化安装客户端
1 | cd /opt/ibmacs |
相关资料
[1] IBM ACS README
[2] AttestProv
[3] IMA Log Format
IBM Attestation Client Server测试
https://rlyown.github.io/2021/02/28/IBM-Attestation-Client-Server测试/