---
title: 机密容器支持
description: "使能机密容器，需要先将TEE OS升级为机密OS，升级方式可参考机密OS升级。升级完毕后可参考如下步骤完成容器化部署。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2300/history/kunpengtrustzone_20_0035.html
sourcePath: /source/zh/kunpengboostkithistory/2300/history/kunpengtrustzone_20_0035.html
indexId: c9cfa89ea0615d562cf9119b66394f416985ee2a8b5434320ea0de21ba20491576
---
# 机密容器支持

#### 容器部署支持

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


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

```
yum install docker
```


2. 准备CA/TA应用。
  可参考搭建TA和CA应用开发环境
  完成自己的CA/TA应用开发，本演示demo以itrustee_sdk中提供的helloworld为例。
  a. 获取源码，从gitee官网下载itrustee_sdk，libboundscheck，并将libboundscheck移动到“thirdparty/open_source/”。

```
git clone https://gitee.com/openeuler/itrustee_sdk.git
git clone https://gitee.com/openeuler/libboundscheck.git
mv libboundscheck itrustee_sdk/thirdparty/open_source/
```


  b. 准备TA应用编译资源。
    可参考调测环境TA应用开发者证书申请
    获取config和private_key.pem文件，并将这个两个文件分别移动到“signed_config/”
    和“TA_cert/”
    。

```
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/
```


  c. 编译helloworld demo的CA应用。

    1. 打开“ca_demo.c”文件。

```
cd ../../test/CA/helloworld/
vim ca_demo.c
```


    2. 按“i”键进入编辑模式，参照下图修改TA应用的UUID，增加TA路径。
    3. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
    4. 生成demo_hello应用（CA）。

```
make
```


  d. 编译helloworld demo的TA应用。

    1. 打开“manifest.txt”文件。

```
cd ../../TA/helloworld/
vim manifest.txt
```


    2. 按“i”键进入编辑模式，根据申请config时“configs.xml”中的配置，修改“manifest.txt”中对应的变量。
    3. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
    4. 生成<UUID>.sec文件（TA）。

```
make
```


3. 下载并导入openEuler镜像。

```
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及其运行的依赖文件拷贝到一个目录下，用于构建镜像。

```
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的依赖： ldd agentd openEuler基础镜像已经包含除libboundscheck.so和libteec.so外的so库，因此只拷贝了这两个so库到镜像中，其他操作系统镜像根据实际情况拷贝缺失的库。 拷贝到容器里的ree-patch组件版本需与主机侧的版本保持一致，否则将导致容器内TEE OS功能不可用。

5. 创建Dockerfile文件。

  a. 新建文件。

```
vim Dockerfile
```


  b. 按“i”键进入编辑模式，新增如下内容。

```
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
```


  c. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
6. 执行如下命令完成镜像的构建。

```
docker build -t demo_hello .
```


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

```
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应用。
- 若在容器内使能高级语言，需将tee_teleport工具拷贝到容器内，tee_teleport的使用方式和主机上部署和运行高级语言一致。
- 若使用高级语言，容器内不支持Java虚拟机和Python解释器安装，两者只能在主机上进行安装部署。


#### K8s TEE设备插件支持

为了使能K8s对TEE资源的感知和管理，TrustZone提供了TEE设备插件，以便K8s能够将CA/TA容器调度到合适的节点上。

- 插件仅上报TEE侧的内存资源。并通过虚拟设备数量的方式实现多PoD对TEE内存的共享。
- 插件运行需要TEE环境为机密OS，TEE OS升级为机密OS的方式可参考  机密OS升级
。
- 支持最小内存分配精度和健康检查周期可配，最小分配精度默认512KB，可配范围需>=512（单位KB），健康检查周期默认60s，配置0表示不进行健康检查。两者可在启动插件时通过参数“-precision xx”和“-internal xx”配置。
- 对于每个TA容器，用户可根据配置的最小分配精度和TA资源配置文件“configs.xml”中的堆内存设置合适的值。设置大了会导致内存浪费，设置小了会导致TA应用因内存不足而异常退出。
- 申请插件的TA开发者证书时，建议将TA应用设为常驻TA，即将instanceKeepAlive设为true。
- 编译TA应用需要在Arm服务器上执行。
- openEuler系统上K8s环境搭建可参考《  Kubernetes 1.18.20 部署指南(https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/Kubernetes/kunpengk8s_04_0004.html)
》中“配置部署环境”相关内容。


1. 安装编译环境，其中go的版本需要大于等于1.15。

```
yum install make gcc
wget https://go.dev/dl/go1.15.15.linux-arm64.tar.gz
tar xzvf go1.15.15.linux-arm64.tar.gz
export PATH=$PWD/go/bin/:$PATH
go version
```


2. 获取设备插件源码，以及itrustee_sdk用于编译插件TA部分。itrustee_sdk与kunpengsecl在同一层目录下。

```
git clone -b tee-device-plugin https://gitee.com/openeuler/kunpengsecl.git
git clone https://gitee.com/openeuler/itrustee_sdk.git
```


3. 配置TA编译资源。

  a. 参考    调测环境TA应用开发者证书申请
获取TA证书（config和private_key.pem），并放到“kunpengsecl/tee-device-plugin/cmd/TA”对应目录下。

```
mkdir -p kunpengsecl/tee-device-plugin/cmd/TA/TA_cert
mkdir -p kunpengsecl/tee-device-plugin/cmd/TA/signed_config
```


    拷贝后的目录结构如下：

  b. 修改“manifest.txt”

    1. 打开“manifest.txt”文件。

```
vim kunpengsecl/tee-device-plugin/cmd/TA/manifest.txt
```


    2. 按“i”键进入编辑模式，根据申请TA证书时configs.xml的配置修改里面对应的值，可参考      配置manifest.txt文件
。
    3. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
  c. 修改CA代码。

    1. 打开“tee_mem_ca.c”文件。

```
vim kunpengsecl/tee-device-plugin/cmd/CA/libteememca/tee_mem_ca.c
```


    2. 按“i”键进入编辑模式，将CA应用的UUID修改为实际值。
    3. 按“Esc”键退出编辑模式，输入:wq!并按“Enter”键保存退出文件。
4. 编译设备插件。

```
cd kunpengsecl/tee-device-plugin
make
```


  编译完成后，将在“pkg”目录下生成如下文件。

  若直接在宿主机上部署插件，可通过如下命令部署和启动。 cp pkg/libteememca.so /usr/lib64/ cp pkg/tee-device-plugin /vendor/bin cp pkg/*.sec /data/ /vendor/bin/tee-device-plugin

5. 基于设备插件应用构建Docker镜像。

  a. 拷贝设备插件应用和依赖到“docker”目录，依赖文件可从支持TrustZone的服务器上获取。
    应该从和基础镜像一致的系统上拷贝，以免系统差异导致应用或库无法使用。

```
cp pkg/* docker/
cp /usr/bin/tlogcat docker/
cp /usr/lib64/libteec.so docker/
cp /usr/lib64/libboundscheck.so docker/
```


  b. 构建镜像。

```
cd docker
docker build -t tee-device-plugin .
```


6. 将镜像上传到镜像仓库，以便部署时计算节点可从仓库拉取到镜像，用户可将仓库名改为自己的私有仓库。

```
docker tag tee-device-plugin:latest <repository>/tee-device-plugin:latest
docker push <repository>/tee-device-plugin:latest
```


7. 为支持TrustZone的服务器打上标签，以便以Daemonset模式部署的插件可以自动部署到对应节点上。

```
kubectl label nodes <node-name> teetype=trustzone
```


8. 以DaemonSet模式部署插件。

  a. 根据实际修改镜像仓库名。

```
cd ../deploy
vim tee-device-plugin.yml
```


  b. 部署插件。

```
kubectl create -f tee-device-plugin.yml
kubectl get pods -A -o wide
```


    至此，插件已成功部署至支持TrustZone的计算节点。

9. 构建CA/TA应用镜像，并创建PoD配置文件。可参考容器部署支持完成镜像构建，并上传到镜像仓库，参考test-pod.yml编写yml配置文件。

```
vim test-pod.yml
```


10. 部署PoD应用。部署成功后，可以看到PoD被部署到对应的节点，并占用配置的资源数量。

```
kubectl create -f test-pod.yml
kubectl describe node <node-name>
```

```
kubectl get pods -A -o wide
```


11. 查看插件和TA应用的日志。

  a. 查看插件日志。

```
kubectl logs -f k8s-tee-device-plugin-ds-
<xxxxx>
-n kube-system
```


    其中xxxxx为随机字符串，可根据插件PoD的实际name进行修改。

  b. 查看TA应用日志。

```
kubectl logs -f test-pod-ta
```


若容器启动失败，可按如下步骤排查：

1. 确定主机上teecd和tzdriver都已加载。
2. 确定主机上/var/itrustee/teecd/teecd.sock、/dev/teelog、/dev/tc_ns_cvm文件存在。
3. 确定镜像构建时，libteec.so和tlogcat与主机上的一致。
4. 确定容器启动时，挂载的文件和  7
一样。
5. 若容器内涉及TA2TA的动态加载或安全存储，容器内还需启动agentd守护进程。
