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
```
有下面类似字段加密分区解密成功:
```