diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/13-\345\237\272\344\272\216\350\277\234\347\250\213\350\257\201\346\230\216\347\232\204CSV \350\231\232\346\213\237\346\234\272\347\243\201\347\233\230\345\212\240\345\257\206\346\265\213\350\257\225\350\277\207\347\250\213.md" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/13-\345\237\272\344\272\216\350\277\234\347\250\213\350\257\201\346\230\216\347\232\204CSV \350\231\232\346\213\237\346\234\272\347\243\201\347\233\230\345\212\240\345\257\206\346\265\213\350\257\225\350\277\207\347\250\213.md" index f411b5159f68a28759f836d398bff2108db28ebf..7985203f90dcf1911f345d65b895b4a56c98f408 100644 --- "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/13-\345\237\272\344\272\216\350\277\234\347\250\213\350\257\201\346\230\216\347\232\204CSV \350\231\232\346\213\237\346\234\272\347\243\201\347\233\230\345\212\240\345\257\206\346\265\213\350\257\225\350\277\207\347\250\213.md" +++ "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/3-\350\231\232\346\213\237\346\234\272/13-\345\237\272\344\272\216\350\277\234\347\250\213\350\257\201\346\230\216\347\232\204CSV \350\231\232\346\213\237\346\234\272\347\243\201\347\233\230\345\212\240\345\257\206\346\265\213\350\257\225\350\277\207\347\250\213.md" @@ -1,7 +1,9 @@ ## 功能描述 本文提供了基于远程证明的机密虚拟机磁盘加密方案测试过程。本加密方案仅支持CSV3虚拟机,并要求远程证明支持运行时度量(Runtime Attestation)功能。 -本测试需要两台机器,一台部署Trustee程序(KBS/RVPS服务),另一台部署加密虚拟机。 +本测试需要两台机器
+一台部署Trustee程序(KBS/RVPS服务)(称为机器一)
+另一台部署和运行加密虚拟机(称为机器二)。 具体技术原理细节请参考[7-基于远程证明的CSV 虚拟机磁盘加密技术介绍](https://openanolis.cn/sig/Hygon-Arch/doc/1451079294205149185?lang=zh)。 @@ -17,7 +19,7 @@ | --- | --- | --- | --- | | 机器一 | Host OS | Anolis OS 8.10 |机器硬件无要求,主机的ISO 安装镜像地址:,请测试者自行安装系统,此处略过。 | | 机器二 | Host OS | Anolis OS 8.10 | 机器硬件必须要能支持CSV3虚拟机启动,由于本测试过程中的虚拟机操作系统为AnolisOS-8.10-x86_64-ANCK.qcow2,因此建议主机系统也使用Anolis 8.10, | -| 机器二 | Guest OS | AnolisOS-8.10-x86_64-ANCK.qcow2 | 下面**资源准备**章节中提供了下载方法 | +| 机器二 | Guest OS | AnolisOS-8.10-x86_64-ANCK.qcow2 | 下面**准备资源**章节中提供了下载方法 | | 机器二 | 安全固件 | 版本不低于2337 | 通过sudo hag general check 查看firmware version 字段的值| @@ -86,25 +88,34 @@ sudo docker run -dit \ alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest sudo docker exec -it cryptpilot-disk bash + # 更新yum源,若制作者通过网络代理连接yum,请在/etc/yum.conf文件中添加代理 sed -i 's|http://mirrors.cloud.aliyuncs.com|https://mirrors.aliyun.com|g' /etc/yum.repos.d/*.repo sed -i 's|mirrors.cloud.aliyuncs.com|mirrors.aliyun.com|g' /etc/yum.repos.d/*.repo cd /mnt && rpm -ivh --force --nodeps --noscripts cryptpilot-0.2.6-1.an8.x86_64.rpm yum install -y tar -tar xvf e2fsprogs-1.47.3.tgz + # 容器中的e2fsprogs 版本较低需要对其进行升级 +tar xvf e2fsprogs-1.47.3.tgz mv e2fsprogs-1.47.3 /usr/local/bin/ echo 'export PATH=/usr/local/bin/e2fsprogs-1.47.3/sbin:$PATH' >> ~/.bashrc source ~/.bashrc # 检查下设置是否生效 fsck -v fsck 1.47.3 (8-Jul-2025) -# 制作加密镜像命令,"AAAaaa111" 为rootfs 的加密密码,要和trustee 中kbs/data/kbs-storage/default/ -# local-resources/rootfs_passwd 一致,AnolisOS-8.10-x86_64-ANCK-enc.qcow2 为加密后的镜像,脚本支持 -# 网络代理环境变量配置,如export proxy="http://proxy_ip:7890";export http_proxy=$proxy;export -# https_proxy=$proxy -cryptpilot-convert --in AnolisOS-8.10-x86_64-ANCK.qcow2 --out AnolisOS-8.10-x86_64-ANCK-enc.qcow2 --config-dir ./config_dir/ --rootfs-passphrase "AAAaaa111" --package cryptpilot-0.2.6-1.an8.x86_64.rpm --package confidential-data-hub-1.2.1-3.an8.x86_64.rpm --package attestation-agent-1.2.1-3.an8.x86_64.rpm -b 1024M +# 以下为制作加密镜像命令,"AAAaaa111" 为rootfs 的加密密码,要和trustee 中 +# kbs/data/kbs-storage/default/local-resources/rootfs_passwd 一致 +# AnolisOS-8.10-x86_64-ANCK-enc.qcow2 为加密后的镜像 +# 若您的容器网络需要代理才能连接公网,请先执行以下命令配置网络代理环境变量: +# export proxy="http://proxy_ip:7890";export http_proxy=$proxy;export https_proxy=$proxy + +cryptpilot-convert --in AnolisOS-8.10-x86_64-ANCK.qcow2 \ +--out AnolisOS-8.10-x86_64-ANCK-enc.qcow2 \ +--config-dir ./config_dir/ --rootfs-passphrase "AAAaaa111" \ +--package cryptpilot-0.2.6-1.an8.x86_64.rpm --package \ +confidential-data-hub-1.2.1-3.an8.x86_64.rpm \ +--package attestation-agent-1.2.1-3.an8.x86_64.rpm -b 1024M ``` 镜像制作成功类似如下输出 ``` @@ -128,25 +139,31 @@ git clone https://github.com/confidential-containers/trustee.git cd trustee && git reset --hard b6ebe8d8e15e11a19aa133a6a391b9c81a5b78d7 mkdir -p kbs/data/kbs-storage/default/local-resources/ mkdir -p kbs/data/attestation-service/token/ear/policies/opa/ + #设置数据分区密钥,后续kbs 服务从该地方获取数据分区密钥,数据分区是在加密磁盘做好后第一次启动通过kbs 获取密钥设置为加密卷 printf 'BBBbbb222' > kbs/data/kbs-storage/default/local-resources/data_passwd + #设置rootfs分区密钥,后续kbs服务从该地方获取rootfs分区密钥 printf 'AAAaaa111' > kbs/data/kbs-storage/default/local-resources/rootfs_passwd cp -f ~/test/hygon-devkit/csv/cryptpilot/docker-compose.yml ./ + # 配置as 的认证策略 cp -f ~/test/hygon-devkit/csv/cryptpilot/default_cpu.rego kbs/data/attestation-service/token/ear/policies/opa/ + # 配置kbs 的认证策略 cp -f ~/test/hygon-devkit/csv/cryptpilot/policy.rego kbs/config/docker-compose/ cp -f ~/test/hygon-devkit/csv/cryptpilot/kbs-config.toml kbs/config/docker-compose/ cp -f ~/test/hygon-devkit/csv/cryptpilot/as-config.json kbs/config/ + # KBS 管理接口(Admin API)的公私钥 openssl genpkey -algorithm ed25519 > kbs/config/private.key openssl pkey -in kbs/config/private.key -pubout -out kbs/config/public.pub -# Attestation-agent完成远程认证后,kbs向confidential-data-hub颁发token。Confidential-data-hub向kbs获取机 -# 密资源时需携带token,kbs需验证token的正确性。因而需要创建私钥和证书,算法为ECC,用于签名token。由于文档用于 -# 测试,因此创建的证书为自签名证书。产生的token_ec_private.key为私钥,token_ec_cert.crt为自签名证书 +# Attestation-agent完成远程认证后,kbs向confidential-data-hub颁发token。 +# Confidential-data-hub向kbs获取机密资源时需携带token,kbs需验证token的正确性。 +# 因而需要创建私钥和证书,算法为ECC,用于签名token。 +# 由于文档用于测试,因此创建的证书为自签名证书。产生的token_ec_private.key为私钥,token_ec_cert.crt为自签名证书 openssl ecparam -genkey -name secp256r1 -out kbs/data/attestation-service/token_ec_private.key openssl req -new -x509 -days 365 -key kbs/data/attestation-service/token_ec_private.key -out kbs/data/attestation-service/token_ec_cert.crt cp -f kbs/data/attestation-service/token_ec_cert.crt kbs/config/ @@ -164,23 +181,26 @@ f23aa7bcf16d ghcr.io/confidential-containers/staged-images/rvps:b6ebe8d8e15e11 cdf80dd33d3a 77c6ff15a2c8 "bash" 6 weeks ago Up 2 months ``` ### trustee参考值配置 +此过程共需要计算2个参考值:
+参考值1:根据输入的加密磁盘镜像,计算远程证明中的rtmr1~rtmr4字段,包含kernel、grub、shim、initrd、rootfs、内核参数cmdline、加密磁盘配置文件的哈希值。
+参考值2:根据输入的OVMF文件和虚拟机vcpu信息,计算远程证明中的rtmr0字段,包含OVMF的哈希值和虚拟机vcpu哈希值。
-- 拷贝运行CSV3虚拟机的OVMF,计算参考值需要使用 -该动作在需要在即将运行加密镜像虚拟机的主机上执行 +在即将运行加密镜像虚拟机的主机上(机器二)安装支持RTMR的OVMF文件,然后拷贝到机器一 ``` sudo yum makecache # 更新OVMF版本,OVMF需要更新到支持RTMR功能的版本 sudo yum install -y edk2-ovmf-20220126gitbb1bba3d77-13.0.1.an8.8 -# 将OVMF_CODE.cc.fd 拷贝到trustee 部署环境机器上,设置参考值需要使用它,kbs_ip 为trustee 部署环境机器的ip地址 +# 将OVMF_CODE.cc.fd 拷贝到trustee 部署环境机器上,设置参考值需要使用它,kbs_ip 为trustee 部署环境机器的ip地址 scp /usr/share/edk2/ovmf/OVMF_CODE.cc.fd user@kbs_ip:~/test/ ``` -- 设置参考值 -该动作在trustee 所在主机上执行 +#### 计算和设置参考值1 +该动作在trustee 所在主机上执行(机器一) ``` cd ~/test/ && sudo rpm -ivh --force --nodeps --noscripts cryptpilot-0.2.6-1.an8.x86_64.rpm -# 主机上执行获取参考值1,这部分参考值包含kernel、grub、shim、initrd、rootfs、内核参数cmdline + +# 执行以下命令获取参考值1 sudo cryptpilot fde show-reference-value --stage initrd --disk ~/test/AnolisOS-8.10-x86_64-ANCK-enc.qcow2 > ./reference-value.json provenance=$(cat ./reference-value.json | base64 --wrap=0) @@ -196,8 +216,11 @@ EOF # 向rvps 中写入参考值1 ,trustee 环境中执行,可以将register-request.json 中参考值调整验证参考值是否生效 sudo chmod +x ~/test/rvps-tool ~/test/rvps-tool register --path ./register-request.json +``` -# 获取参考值2,这部分参考值包含OVMF_CODE.cc.fd、虚拟机vcpu信息 +#### 计算和设置参考值2 +该动作在trustee 所在主机上执行(机器一) +``` wget https://gitee.com/hanliyang-kata-coco/deployment/raw/master/tools/measurement/csv-measure.py pip3 install gmssl @@ -208,7 +231,21 @@ measurement=$(python3 csv-measure.py \ --family 24 \ --model 4 \ --stepping 1 | base64 -d | xxd -p | tr -d '\n') +``` +**此处特别强调,虽然此计算命令在机器一执行,但由于其所计算的内容family/mode/stepping为虚拟机信息, +因此必须先在机器二上获取family/mode/stepping内容,再返回机器一完成计算**。 + +--ovmf指向ovmf路径 + +--smp后接qemu启动时指定的vcpu个数(-smp),没有指定默认为1 + +--family通过在机器二执行 lscpu | grep "^CPU family:" | awk -F':' '{print $2}'获取 +--model通过在机器二执行 lscpu | grep "^Model:" | awk -F':' '{print $2}'获取 + +--stepping通过在机器二执行 lscpu | grep "^Stepping:" | awk -F':' '{print $2}'获取 + +``` cat << EOF > ovmf-reference-value.json { "csv.measurement": [ @@ -231,26 +268,21 @@ EOF ``` -其中 ---ovmf指向ovmf路径 - ---smp后接qemu启动时指定的vcpu个数(-smp),没有指定默认为1 - ---family通过在运行CSV3虚拟机的host上执行lscpu | grep "^CPU family:" | awk -F':' '{print $2}'获取 - ---model通过在运行CSV3虚拟机的host上执行lscpu | grep "^Model:" | awk -F':' '{print $2}'获取 - ---stepping通过在运行CSV3虚拟机的host上执行lscpu | grep "^Stepping:" | awk -F':' '{print $2}'获取 - ### 启动加密镜像 这里主机系统为Anolis 8.10,独立于trustee 的另外一台机器,使用的是机器二。 ``` mkdir ~/work_dir/ -# 拷贝制作好的加密镜像到工作目录,kbs_ip 为制作加密盘机器的ip地址 -scp user@kbs_ip:~/test/AnolisOS-8.10-x86_64-ANCK-enc.qcow2 ~/work_dir/ -sudo qemu-system-x86_64 -name normal-vm --enable-kvm -cpu host -m 2048 -hda ~/work_dir/AnolisOS-8.10-x86_64-ANCK-enc.qcow2 -drive if=pflash,format=raw,unit=0,file=/usr/share/edk2/ovmf/OVMF_CODE.cc.fd,readonly=on -netdev bridge,br=virbr0,id=net0 -device virtio-net-pci,netdev=net0,romfile= -qmp tcp:127.0.0.1:1111,server,nowait -vnc 0.0.0.0:0 -nographic -object sev-guest,id=sev0,policy=0x45,cbitpos=47,reduced-phys-bits=5 -machine memory-encryption=sev0 +# 拷贝制作好的加密镜像到工作目录,kbs_ip 为制作加密盘机器的ip地址(机器一IP地址) +scp user@kbs_ip:~/test/AnolisOS-8.10-x86_64-ANCK-enc.qcow2 ~/work_dir/
+ +sudo qemu-system-x86_64 -name csv-vm --enable-kvm -cpu host -m 2048 \ +-hda ~/work_dir/AnolisOS-8.10-x86_64-ANCK-enc.qcow2 \ +-drive if=pflash,format=raw,unit=0,file=/usr/share/edk2/ovmf/OVMF_CODE.cc.fd,readonly=on \ +-netdev bridge,br=virbr0,id=net0 -device virtio-net-pci,netdev=net0,romfile= \ +-qmp tcp:127.0.0.1:1111,server,nowait -vnc 0.0.0.0:0 -nographic \ +-object sev-guest,id=sev0,policy=0x45,cbitpos=47,reduced-phys-bits=5 -machine memory-encryption=sev0 ``` 有下面类似字段加密分区解密成功: ```