基于pre-attestation使用机密容器
本文主要为您介绍如何在kata环境中基于海光安全加密虚拟化功能CSV(China Secure Virtualization)技术,通过pre-attestaion 认证方式,启动一个租户的加密容器镜像。
前提条件
请参考《基于runtime-attestation使用机密容器》指南的前提条件一节,完成对系统环境的检查和配置。
背景信息
①②③:containerd 调用 kata-runtime创建CSV VM,kata-runtime调用 image-rs 下载加密镜像;
④⑤:kata-runtime 获取 CSV VM 的 launch_measurement发送给 gop-server;
⑥⑦:gop-server 调 用 hag 对 launch_measurement 计算和校验; 验证 gop-server 调用 hag 对 key 进行加密、形成 secret 和 secret_header,发送给 kata-runtime
⑧:kata-runtime 调用 qemu 向 CSV VM 注入 secret;CSV VM 利用固件解密 secret 获取 key 存入指定位置;
⑨:CSV VM 中的 attestation-agent 获取 key,image-rs 使用 key 解密镜像;
⑩:启动镜像运行 workload
步骤一:配置权限
请参考《基于runtime-attestation使用机密容器》指南的步骤一,完成配置权限。
步骤二:安装kata 环境
Kata Containers是一个开源的、致力于用轻量级虚拟机构建一个安全的容器运行时的实现,这些虚拟机在感觉和执行上与容器类似,但使用硬件虚拟化技术作为第二层防御,提供了更强的工作负载隔离。
关于项目的更多信息,请参见kata-container。
1. 安装kata-containers
请执行以下命令,安装kata-containers。
yum-config-manager --add-repo https://mirrors.openanolis.org/inclavare-containers/anolis8.4 && \
rpm --import https://mirrors.openanolis.org/inclavare-containers/anolis8.4/RPM-GPG-KEY-rpm-sign && \
yum install -y kata-static
2. 安装qemu
pre-attestation过程中,CSV VM的measurement计算需要qemu支持kernel-hashes,在qemu 6.2.0之后开始支持kernel-hashes标志,此处提供的qemu是基于6.2.0版本构建。
yum install -y qemu-system-x86_64
3. 安装guest kernel,initrd,OVMF
ccv0-guest中包含kata运行CSV VM所需的guest kernel、initrd、OVMF、cmdline等文件。 其中:
guest的rootfs和kernel,需使用efi_secret的内核模块以支持向文件系统中注入secret,加入AA并修改AA设置,自行构建请参考guest Rootfs and Kernel ;
这里提供的OVMF是基于f0f3f5aae7c4d346ea5e24970936d80dc5b60657 进行构建的,也可以使用edk2-stable202108后的版本自行构建,以支持CSV.
yum -y install ccv0-guest
cmdline中记录了CSV VM启动时所需的参数信息,需根据实际使用情况进行修改。可参考以下命令:
cat <<EOF | sudo tee /opt/csv/ccv0-guest/cmdline
tsc=reliable no_timer_check rcupdate.rcu_expedited=1 i8042.direct=1 i8042.dumbkbd=1 i8042.nopnp=1 i8042.noaux=1 noreplace-smp reboot=k console=hvc0 console=hvc1 cryptomgr.notests net.ifnames=0 pci=lastbus=0 quiet panic=1 nr_cpus=`cat /proc/cpuinfo| grep processor | wc -l` scsi_mod.scan=none agent.config_file=/etc/agent-config.toml
EOF
4. 安装kata-runtime
pre-attestation使用的kata-runtime,需要基于confidential-containers 项目的 kata-containers-CCv0 的CCv0分支,并加入CCv0: SEV prelaunch attestation by jimcadden · Pull Request #3025 · kata-containers/kata-containers · GitHub上的pre-attestation 的支持patch f682220d 和 d2c3f372; 同时也需要使用修改后的CPUID 以支持Hygon CPU。
yum -y install kata-runtime
5. 配置kata-runtime
执行以下命令,配置kata 运行时。
这里修改了kata-runtime默认配置中的qemu、guest kernel && initrd && OVMF路径;
使能confidential-guest选项并加入guest_attestation_proxy、guest_attestation_keyset、attestation-agent-config等配置;
将默认内存大小由2048调整为8000;
将共享文件系统由"virtio-fs"调整为"virtio-9p"。
mkdir -p /etc/kata-containers/ && \
cp /opt/kata/share/defaults/kata-containers/configuration.toml /etc/kata-containers/ && \
cd /etc/kata-containers/ && \
sed -i 's/opt\/kata\/bin\/qemu-system-x86_64/opt\/qemu\/bin\/qemu-system-x86_64/' configuration.toml && \
sed -i 's/kata\/share\/kata-containers\/vmlinux.container/csv\/ccv0-guest\/vmlinuz-5.15.0-rc5+/' configuration.toml && \
sed -i 's/image = \"\/opt\/kata\/share\/kata-containers\/kata-containers/initrd = \"\/opt\/csv\/ccv0-guest\/initrd.pre/' configuration.toml && \
sed -i 's/\# confidential_guest/confidential_guest/' configuration.toml && \
sed -i '/confidential_guest/a\guest_attestation = true\nguest_attestation_proxy = \"localhost:50051\"\nguest_attestation_keyset = \"KEYSET-1\"' configuration.toml && \
sed -i 's/kernel_params = \"\"/kernel_params = \"agent.config_file=\/etc\/agent-config.toml\"/' configuration.toml && \
sed -i 's/firmware = \"\"/firmware = \"\/opt\/csv\/ccv0-guest\/OVMF.fd\"/' configuration.toml && \
sed -i 's/default_memory = 2048/default_memory = 8000/' configuration.toml && \
sed -i 's/shared_fs = \"virtio-fs\"/shared_fs = \"virtio-9p\"/' configuration.toml && \
sed -i 's/\#service_offload/service_offload/' configuration.toml
步骤三:安装containerd
请参考《基于runtime-attestation使用机密容器》指南的步骤三来安装containerd。
步骤四:搭建运行环境
请参考kubernetes官方指南安装Kubernetes cluster。搭建kubenetes运行环境。
步骤五:安装并启动GOP KBS
GOP(guest owner proxy)用于验证CSV VM的启动,并有条件地提供一个secret,是一项非常复杂的操作。该工具设计用于在可信环境中运行,提供验证和sercret注入服务。
1. 请执行以下命令,安装GOP KBS
yum install -y gop
初始化:
cd /opt/csv/guest-owner-proxy
./make_grpc.sh
2. 安装hag
hag是海光提供的工具,主要用于建立和管理服务器的csv证书链,确保csv虚拟机在安全可靠的环境下执行,不受主机干扰。
yum install -y hag
3. 使用hag生成证书链
rm -rf /opt/csv/*cert /opt/csv/*txt /opt/csv/*bin /tmp/csv-guest-owner-proxy/ && \
cd /opt/csv && \
hag --pdh_cert_export
4. 修改脚本适配本机环境
将keysets.json中的min-api-major、min-api-minor、allowed-build-ids分别改为hag --platform_status显示的api_major、api_minor、build_id
将gop-client.py中hw_api_major、hw_api_minor、hw_build_id分别改为hag --platform_status显示的api_major、api_minor、build_id
将gop-server.py中的build_id值改为与gop-client.py中hw_build_id相同
5. 启动GOP server
cd /opt/csv/guest-owner-proxy/ && \
./make_grpc.sh && \
./gop-server.py
步骤六:制作加密镜像
1. 制作加密镜像
请参考指南制作加密镜像。 在本例中可以使用 docker.io/haosanzi/busybox-v1:encrypted 作为镜像进行测试。
2. 将加密key保存到GOP的keys.json文件中
GOP的keys.json文件路径:/opt/csv/guest-owner-proxy/keys.json
。
步骤七:部署加密镜像
1. 创建RuntimeClass对象kata
用户可以使用RuntimeClass为pod指定不同的运行时,这里使用kata作为验证时使用的运行时。
在集群中执行以下命令,创建RuntimeClass对象kata。
cat <<-EOF | kubectl apply -f -
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: kata
handler: kata
EOF
2. 部署pod
如果 pod 的 runtimeClassName 设置为 kata,CRI 插件会使用 Kata Containers 运行时运行 pod。
执行以下命令,部署名称为busybox的pod。
cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: nginx-sandbox
spec:
runtimeClassName: kata
containers:
- image: docker.io/haosanzi/busybox-v1:encrypted
command:
- top
imagePullPolicy: IfNotPresent
name: alphine-haosanzi
restartPolicy: Never
EOF
3. 测试加密镜像是否部署成功
执行以下命令,查看加密镜像是否部署成功:
kubectl get pods
从上述输出信息可知已部署成功。
NAME READY STATUS RESTARTS AGE
nginx-sandbox 1/1 Running 0 50s