README.md

trustzone-awared-vm

介绍

项目(trustzone-awared-vm)旨在通过各种手段,使得REE侧的CA可以在虚拟化场景下使用TrustZone。

软件架构

本项目借助内核 vhost_vsock驱动的接发消息能力,构建TrustZone感知的机密虚拟机。构建vtzdriver,提供与tzdriver相同的接口供上层应用和库调用。在Host侧创建vsock服务端,在VM侧创建vsock客户端,连通VM与Host。vtz_proxy接受识别由vtzdriver转发的tzdriver调用,识别后调用tzdriver对应接口。调用结果由vtz_proxy、vsock、vtzdriver返回给上层应用。从而实现在VM中使用TEE的体验与本地Host上无差异。

使用说明

  1. 本项目不包含其它开源项目的代码,涉及的第三方开源组件均需要使用者自行获取。

参与贡献

特技

  1. 项目提供接口与原接口完全适配,用户无需修改应用
  2. 支持虚拟机使用switchless特性


环境搭建

本项目为鲲鹏多种型号服务器提供了host和vm环境部署脚本,详见utils/ccos-env-deploy。以下为手动部署的详细操作说明。

前置要求

手动部署之前,请确保满足以下条件:

必需文件准备

vtzb_proxy.conf 放置在 /var/vtzb/ 目录下

配置文件

vtzb_proxy.confvtz_proxy 的配置文件,可在其中定义了最大虚机数量等参数,详细信息如下:

  • max_vm_count:支持的最大虚机数量

  • numa_bindingsvtz_proxy 线程池绑核配置

端口

Host的vsock服务端占用Host 30000端口,保证可以与VM侧通信,部署环境请保证Host 30000端口未被使用。

Host 环境搭建

  1. 安装依赖

    yum install gcc patch make  kernel-devel-$(uname -r) ninja-build
    yum install glib2 glib2-devel pixman-devel
    yum install openssl-devel
    yum install libxml2-devel libvirt-devel
    yum install compat-openssl11-libs # 当内核版本大于等于6.6需安装
    
  2. vtzb_proxy编译

    git clone https://gitcode.com/openeuler/tee-gp-proxy.git
    git clone https://gitcode.com/openeuler/libboundscheck.git
    cp -rf libboundscheck tee-gp-proxy/trustzone-awared-vm/Host/vtzb_proxy
    
    1. 编译
      cd tee-gp-proxy/trustzone-awared-vm/Host/vtzb_proxy
      make
      sudo cp ./vtz_proxy /usr/bin/vtz_proxy
      
  3. vhost_vsock编译

    注:当系统内核使用4.19内核基线版本大于4.19.149时,vsock驱动代码需要根据基线做修改适配。具体可根据版本号参考https://elixir.bootlin.com/linux/v4.19.150/source/drivers/vhost/vsock对vsock对应版本驱动源码进行修改。 示例修改:在vhost_vsock_handle_tx_kick函数前声明如下vhost_transport结构,同时修改virtio_transport_recv_pkt接口传参,增加&vhost_transport参数。

    static struct virtio_transport vhost_transport;
    
    virtio_transport_recv_pkt(pkt);改为virtio_transport_recv_pkt(&vhost_transport, pkt);
    
    1. 根据实际内核版本4.19、5.10、6.6,进入对应vsock源码目录,执行编译后,将vhost_vsock.ko 复制到指定目录。
    cd tee-gp-proxy/trustzone-awared-vm/Host/vsock-$(uname -r | awk -F. '{printf "%s.%s\n", $1, $2}')
    make
    mkdir -p "/lib/modules/$(uname -r)/kernel/drivers/trustzone/"
    cp vhost_vsock.ko /lib/modules/$(uname -r)/kernel/drivers/trustzone
    
  4. tzdriverclient编译安装

    1. 进入itrustee_tzdriver的根目录,补丁文件路径按照实际路径修改。
    git am ../tee-gp-proxy/trustzone-awared-vm/Host/tzdriver-00*.patch
    
    1. 进入itrustee_client的根目录,补丁文件路径按照实际路径修改。
    git am ../tee-gp-proxy/trustzone-awared-vm/Host/client-0001-add-vm-uid-in-TC_NS_ClientContext.patch
    
    1. 920 机型请参考官方文档
    2. 920 新型号请参考官方文档
    3. tzdriver编译后,将tzdriver.ko 复制到指定目录
      cp tzdriver.ko /lib/modules/$(uname -r)/kernel/drivers/trustzone
      

qemu与虚机配置

  1. 获取qemu v6.2.0源码
    git clone -b v6.2.0 https://git.qemu.org/git/qemu.git
    
  2. 编译qemu
    cd qemu
    mkdir build
    cd build
    ../configure --target-list=aarch64-softmmu --disable-werror
    make -j
    

    注*:关于./configure这一步

    1.若出现GCC将warning视为error的报错,可通过 --disable-werror解决

    2.若提示gcc版本过低, 请升级gcc版本后再编译

  3. 虚拟机镜像
    1. openEuler22.03-LTS-SP4下载地址
    2. kylin-v10 qcow2镜像制作方法
  4. 虚机配置请参考虚机配置
  5. 定义并启动虚拟机
    1. 安装依赖:
      yum -y install edk2-aarch64.noarch libvirt
      
    2. 启动虚机
      systemctl start/restart libvirtd.service
      setenforce 0
      virsh define vm-libvirt.xml
      virsh start nvm-ta-1
      /* 若新安装,用VNC登录安装,注意打开端口防火墙 */
      iptables -I INPUT -p tcp –dport 5901 -j ACCEPT
      

VM环境搭建

  1. 安装依赖
    yum install make kernel-devel-$(uname -r) git gcc openssl-devel 
    yum install compat-openssl11-libs  # 当内核版本大于等于6.6需安装
    
  2. 下载tee-gp-proxy仓库,其中包含vtzdrivervirtio(5.10内核)源码。
    git clone https://gitcode.com/openeuler/tee-gp-proxy.git
    git clone https://gitcode.com/openeuler/libboundscheck.git
    cp -rf libboundscheck tee-gp-proxy/trustzone-awared-vm/VM/vtzdriver
    
  3. itrustee_client编译安装
    1. 进入itrustee_client的根目录,补丁文件路径按照实际路径修改。
      1. git am ../tee-gp-proxy/trustzone-awared-vm/Host/client-00*.patch
    2. 920 机型请参考官方文档
    3. 920 新型号请参考官方文档
  4. 编译vtzdriver并加载vtzfdriver.ko
    cd tee-gp-proxy/trustzone-awared-vm/VM/vtzdriver
    make
    mkdir -p /lib/modules/$(uname -r)/kernel/drivers/trustzone
    cp vtzfdriver.ko /lib/modules/$(uname -r)/kernel/drivers/trustzone
    insmod /lib/modules/$(uname -r)/kernel/drivers/trustzone/vtzfdriver.ko
    

    如果是麒麟系统,需要在Makefile中 删除 -fstack-protector-strong

    若kernel路径不正确,请自行修改Makefile中的KERN_DIR

开始运行

首先要确认HostVM中已搭建好ccos环境,然后每次重启后需执行以下命令:

Host中需要按顺序执行以下命令,请确保vsock相关命令先执行,且需在虚机启动前执行

modprobe vmw_vsock_virtio_transport_common && modprobe vhost
insmod /lib/modules/$(uname -r)/kernel/drivers/trustzone/vhost_vsock.ko
insmod /lib/modules/$(uname -r)/kernel/drivers/trustzone/tzdriver.ko
nohup /usr/bin/teecd &
nohup /usr/bin/vtz_proxy &

VM中需要执行以下命令

  1. 加载vtzfdriver.koteecd
insmod /lib/modules/$(uname -r)/kernel/drivers/trustzone/vtzfdriver.ko
nohup /usr/bin/teecd &

故障恢复

  1. vtz_proxy 优雅退出:
    1. 需要再次拉起vtz_proxy,然后在所有VM内手动终止正在执行的CA进程,并进行如下操作:
    kill -9 $(pgrep teecd)
    rmmod vtzfdriver.ko 
    insmod vtzfdriver.ko
    nohup /usr/bin/teecd &
    
    1. 最后再重新拉起CA进程。
  2. vtz_proxy 强制退出:
    1. 需要再次拉起vtz_proxy 进程,重启所有VM,并重新初始化环境。