容器部署支持

使能机密容器,需要先将TEE OS升级为机密OS,升级方式可参考升级TEE OS(可选)。升级完毕后可参考如下步骤完成容器化部署。

  1. 在服务器上安装Docker应用。

    1
    yum install docker
    

  2. 准备CA/TA应用。

    可参考搭建TA和CA应用开发环境完成自己的CA/TA应用开发,本演示demo以itrustee_sdk中提供的helloworld为例。
    1. 获取源码,从gitee官网下载itrustee_sdk,libboundscheck,并将libboundscheck移动到“thirdparty/open_source/”
      1
      2
      3
      git clone https://gitee.com/openeuler/itrustee_sdk.git
      git clone https://gitee.com/openeuler/libboundscheck.git
      mv libboundscheck itrustee_sdk/thirdparty/open_source/
      
    2. 准备TA应用编译资源。
      可参考调测环境TA应用开发者证书申请获取config和private_key.pem文件,并将这个两个文件分别移动到“signed_config/”“TA_cert/”
      1
      2
      3
      4
      5
      cd itrutee_sdk/build/signtools/
      mkdir signed_config
      mkdir TA_cert
      cp /path/to/config ./signed_config/    
      cp /path/to/private_key.pem ./TA_cert/ 
      
    3. 编译helloworld demo的CA应用。
      1. 打开“ca_demo.c”文件。
        1
        2
        cd ../../test/CA/helloworld/
        vim ca_demo.c
        
      2. “i”键进入编辑模式,参照下图修改TA应用的UUID,增加TA路径。

      3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
      4. 生成demo_hello应用(CA)。
        1
        make
        
    4. 编译helloworld demo的TA应用。
      1. 打开“manifest.txt”文件。
        1
        2
        cd ../../TA/helloworld/
        vim manifest.txt
        
      2. “i”键进入编辑模式,根据申请config时“configs.xml”中的配置,修改“manifest.txt”中对应的变量。

      3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。
      4. 生成<UUID>.sec文件(TA)。
        1
        make
        

  3. 下载并导入openEuler镜像。

    1
    2
    wget https://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP1/docker_img/aarch64/openEuler-docker.aarch64.tar.xz
    docker load -i openEuler-docker.aarch64.tar.xz
    

  4. 将CA/TA及其运行的依赖文件拷贝到一个目录下,用于构建镜像。

    1
    2
    3
    4
    5
    6
    7
    mkdir build && cd build
    cp ../itrustee_sdk/test/CA/helloworld/demo_hello ./
    cp ../itrustee_sdk/test/TA/helloworld/*.sec ./
    cp /usr/lib64/libboundscheck.so ./
    cp /usr/lib64/libteec.so ./
    cp /usr/bin/tlogcat ./
    cp /usr/bin/agentd ./
    

    镜像构建目录下的文件如下。

    • 应用的依赖文件可通过ldd命令查看,例如查看agentd的依赖:
      1
      ldd agentd
      

      openEuler基础镜像已经包含除libboundscheck.so和libteec.so外的so库,因此只拷贝了这两个so库到镜像中,其他操作系统镜像根据实际情况拷贝缺失的库。

    • 拷贝到容器里的ree-patch组件版本需与主机侧的版本保持一致,否则将导致容器内TEE OS功能不可用。

  5. 创建Dockerfile文件。

    1. 新建文件。
      1
      vim Dockerfile
      
    2. “i”键进入编辑模式,新增如下内容。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      FROM openeuler-22.03-lts-sp1
      
      RUN mkdir -p /vendor/bin && mkdir -p /data
      
      COPY *.so /usr/lib64/
      COPY tlogcat agentd /usr/bin/
      COPY *.sec /data/
      COPY demo_hello /vendor/bin/
      
      RUN chmod +x /vendor/bin/demo_hello
      
      CMD /usr/bin/agentd & /vendor/bin/demo_hello
      
    3. “Esc”键退出编辑模式,输入:wq!并按“Enter”键保存退出文件。

  6. 执行如下命令完成镜像的构建。

    1
    docker build -t demo_hello .
    

  7. 根据镜像启动容器,并获取容器运行日志。

    1
    2
    docker run -it --mount type=bind,source=/var/itrustee/teecd,target=/var/itrustee/teecd,readonly --device /dev/teelog:/dev/teelog:wr --device /dev/tc_ns_cvm:/dev/tc_ns_cvm:wr -d demo_hello
    docker logs -f <container_id>
    

  • 当容器中涉及TA2TA、安全存储特性使用时,必须先启动容器内的agentd,再执行CA应用。
  • 若容器启动失败,可按如下步骤排查:
    1. 确定主机上teecd和tzdriver都已加载。
    2. 确定主机上/var/itrustee/teecd/teecd.sock、/dev/teelog、/dev/tc_ns_cvm文件存在。
    3. 确定镜像构建时,libteec.so和tlogcat与主机上的一致。
    4. 确定容器启动时,挂载的文件和步骤步骤7一样。
    5. 若容器内涉及TA2TA的动态加载或安全存储,容器内还需启动agentd守护进程。