diff --git a/sig/Hygon Arch/assets/CSV/cryptpilot-1.png b/sig/Hygon Arch/assets/CSV/cryptpilot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e61dc562aae8ce322b48cb7da09ccef7af824bba Binary files /dev/null and b/sig/Hygon Arch/assets/CSV/cryptpilot-1.png differ diff --git a/sig/Hygon Arch/assets/CSV/cryptpilot-2.png b/sig/Hygon Arch/assets/CSV/cryptpilot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5962172657cdcf642f699442d196fc2972cc8c5e Binary files /dev/null and b/sig/Hygon Arch/assets/CSV/cryptpilot-2.png differ diff --git a/sig/Hygon Arch/assets/CSV/cryptpilot-3.png b/sig/Hygon Arch/assets/CSV/cryptpilot-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c27ceac80d73f147d7e42764eb64b5687a0ed45a Binary files /dev/null and b/sig/Hygon Arch/assets/CSV/cryptpilot-3.png differ diff --git a/sig/Hygon Arch/assets/CSV/cryptpilot-4.png b/sig/Hygon Arch/assets/CSV/cryptpilot-4.png new file mode 100644 index 0000000000000000000000000000000000000000..f066150b4564e5d509437e6576e2ba8e1870b31c Binary files /dev/null and b/sig/Hygon Arch/assets/CSV/cryptpilot-4.png differ diff --git a/sig/Hygon Arch/assets/CSV/cryptpilot-5.png b/sig/Hygon Arch/assets/CSV/cryptpilot-5.png new file mode 100644 index 0000000000000000000000000000000000000000..a1465e3956837fdb03c8366c25380e9ef8680e15 Binary files /dev/null and b/sig/Hygon Arch/assets/CSV/cryptpilot-5.png differ diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/0603904B.png" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/0603904B.png" deleted file mode 100644 index b61c49a1cf7dd6dbd5441af14bc5180ea8f132ae..0000000000000000000000000000000000000000 Binary files "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/0603904B.png" and /dev/null differ diff --git "a/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/7-\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\212\200\346\234\257\344\273\213\347\273\215.md" "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/7-\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\212\200\346\234\257\344\273\213\347\273\215.md" new file mode 100644 index 0000000000000000000000000000000000000000..fc87dea3f5baecaedcf0c631624ccb0014a29994 --- /dev/null +++ "b/sig/Hygon Arch/content/2-CSV\346\265\213\350\257\225\346\226\207\346\241\243/10-\346\212\200\346\234\257\344\273\213\347\273\215/7-\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\212\200\346\234\257\344\273\213\347\273\215.md" @@ -0,0 +1,175 @@ +## 概要 +海光联合阿里推出了基于远程证明的 CSV 虚拟机磁盘加密技术,实现了系统的安全引导和离线数据保护,并赋予CSV虚拟机全生命周期(从运行到关机,从内存到存盘)数据加密、完整性保护和可度量的能力。 + + +## 原理介绍 + +### 整体架构 + +![](../../../assets/CSV/cryptpilot-1.png) + +机密系统盘通过CSV 运行时度量(RTMR)技术、 Linux内核的dm-verity、dm-integrity 和LUKS2技术实现,能够为机密实例的系统盘提供可度量、数据加密和完整性保护三种能力。 + +上图是支持磁盘加密的安全虚拟机的系统环境和启动流程。整个系统由两部分组成,左侧为CSV虚拟机运行环境,必须为支持海光CSV3功能的硬件和系统环境。右侧为远程认证和密钥管理服务环境(trustee),负责验证虚拟机远程证明报告并分发密钥,该环境可使用任意硬件。 +左侧图CSV虚拟机启动过程中,initrd是完成远程获取磁盘密钥并挂载加密磁盘的核心组件。本方案在initrd中装入 cryptpilot[1]/attestation-agent[3]/confidential-data-hub[3] 程序,其中attestation-agent负责获取TEE远程证明报告并发送给trustee,confidential-data-hub负责向trustee请求密钥,cryptpilot负责全流程管理、磁盘解密、根分区完整性校验、磁盘挂载。 + +远程认证和密钥管理服务使用CoCo社区的trustee组件[2] 部署在用户可信的环境中,CSV安全虚拟机启动后通过远程认证获取密钥解密磁盘挂载启动系统。 + +本技术方案中,CSV虚拟机使用的磁盘文件(.qcow2文件)固定为以下分区,用户可使用cryptpilot-convert工具将已有的磁盘文件转换为以下分区格式,转换过程在离线的环境中完成,过程安全,数据完好。 + +| 组件 | 描述 | +|----- |-------| +|/efi | EFI分区,明文| +|/boot | 启动分区,明文| +|/rootfs | 根文件系统逻辑卷,密文,有完整性保护| +|/rootfs_hash | 根文件系统哈希树逻辑卷,明文,用于rootfs完整性校验| +|/data | 数据分区逻辑卷,密文| + +本方案实现了保护/rootfs逻辑卷的机密性完整性,保护/data逻辑卷的机密性。 + +基于远程证明的CSV虚拟机磁盘加密技术有以下几个特点: + +#### 可度量 + +1、基于CSV RTMR技术(介绍参考[12-测试CSV3虚拟机RTMR动态度量功能](https://openanolis.cn/sig/Hygon-Arch/doc/1446113534086103049?lang=zh) )对系统的OVMF、shim、grub、kernel、cmdline 、initrd、rootfs 组件进行度量,系统启动时对各个组件进行hash 运算,将相应的度量值扩展到RTMR寄存器中,同时记录在eventlog中。RTMR寄存器存储在海光CPU中,用户可从远程证明报告中获取RTMR值和硬件签名。 CSV 虚拟机initrd +启动过程中的attestation-agent 组件获取远程报告和eventlog 一起发送到trustee 端,Attestation Service 对其进行验证,验证度量值与配置的基准值一致后释放解密密钥,CSV 虚拟机获取密钥解密磁盘启动。 + +2、基于dm-verity机制,用户在离线制作加密磁盘时,对rootfs卷构建完整的哈希树结构,并保存在/root_hash逻辑卷,该逻辑卷保存了逐层校验文件系统完整性所需的哈希树。当系统启动时,内核会验证rootfs卷每个数据块的哈希值与/rootfs_hash预存的根哈希值是否一致,任何未经授权的修改都会被实时检测并阻止系统启动,从而实现对根文件系统的可信度量和防篡改保障。而哈希树的根哈希(root_hash)值,扩展到RTMR寄存器,并配置到Trustee基准值文件中,保证了整棵哈希树的完整性。对/rootfs分区的任何修改(局部修改或完全替换),都会导致root_hash的变化,trustee发现并拒绝分发磁盘解密密钥。 + +#### 数据加密 + +通过 LUKS2 标准采用 AES 算法实现磁盘加密。加密过程使用分层密钥体系:系统随机生成的主密钥(Master Key)用于加密数据,而主密钥本身由另一个密钥加密密钥(KEK)保护。KEK 会在实例通过远程证明验证后由trustee下发。所有数据在由内存写入磁盘前自动加密,从磁盘读取时自动解密,确保数据在存储期间始终处于加密状态,同时满足密钥全生命周期的安全可控需求。 + +#### 完整性保护 + +对于数据区域基于dm-integrity 技术实现数据完整性保护,为块设备中的每个扇区维护一段“完整性元数据”,该元数据可包含校验值(如 CRC、HMAC),用于读写时校验数据完整性。 + +#### rootfs卷 + + rootfs卷存放了只读的根文件系统,在启动时该卷的内容会被度量,并基于内核的dm-verity机制验证rootfs卷的哈希树(启动前离线建立)。为了保持系统中业务程序的兼容性,在启动阶段,一个可写入的覆盖层将被覆盖在只读的根文件系统上,从而允许您在根文件系统上做临时性的写入修改。这些写入修改将不会破坏只读层,也不会影响只读根文件系统的度量。 + + 对该卷的加密是一个可选的操作,这取决于您的业务需求。如果您需要加密rootfs卷的数据,可以在创建机密系统盘的过程中配置加密选项。 + +#### data卷 + + 在系统启动过程中,该卷会被解密,并且在进入系统后,该卷会被挂载到/data位置上。任何data卷上写入的数据,都会被加密后落盘。由于加密密钥保存在远程的trustee端,攻击者使用任何手段无法获取密钥,无法读取虚拟机落盘数据。data 卷同时可配置 基于dm-integrity 的完整性保护特性。 + + +### 磁盘加密流程 +整个流程分两个阶段,加密磁盘制作阶段,加密磁盘使用阶段。 + +1. 加密磁盘制作 + +![](../../../assets/CSV/cryptpilot-2.png) + +1、准备需要加密的虚拟机镜像,准备加密配置文件,准备加密需要的组件,如 attestation-agent-1.2.1-3.an8.x86_64.rpm、confidential-data-hub-1.2.1-3.an8.x86_64.rpm、cryptpilot-0.2.6-1.an8.x86_64.rpm ,配置文件介绍请参考https://github.com/openanolis/cryptpilot/blob/master/dist/etc/fde.toml.template。 + +2、在拷贝的虚拟机镜像上进行操作,从而避免对原始镜像造成影响。 + +3、寻找efi、boot、rootfs分区并记录分区号、以及相应的扇区地址。 + +4、如果虚拟机没有 boot 分区,提取rootfs 分区中boot目录内容,内容写入到boot.img文件中,为构造boot分区做准备,如果有跳过该步骤。 + +5、rootfs 分区中安装cryptpilot、attestation-agent、confidential-data-hub 磁盘加密以及远程认证相关组件、拷贝磁盘加密配置文件、如果需要创建boot分区,将boot分区信息添加到/etc/fstab挂载配置项中、更新initrd。 + +6、rootfs 分区进行瘦身,内容提取到rootfs.img中,删除rootfs 分区。 + +7、如果需要创建boot分区,在原来rootfs 分区扇区位置创建boot分区并将boot.img写入boot分区,如果不需要则跳过该步骤。 + +8、创建system lvm 逻辑卷组,为后面创建逻辑分区做准备。 + +9、在system 卷组中创建rootfs 逻辑卷,并使用提供的密钥对其加密,将rootfs.img 内容写到加密卷中,使用veritysetup计算rootfs.img 的Merkle Tree 并写入到rootfs_hash.img 文件中,创建rootfs_hash 卷并将rootfs_hash.img 内容写入到rootfs_hash 卷中,将Merkle Tree 的roothash 写入到boot分区的cryptpilot/metadata.toml文件中,为后续使用dm-verity机制构建rootfs只读文件系统做准备。通过本步骤,原虚拟机镜像被加密并提供了完整性保护。 + +10、加密镜像制作完毕。 + +磁盘制作完毕后,将由以下分区组成: +- /efi:EFI 分区(明文) +- /boot:启动分区(明文) +- 物理卷(后续在 LVM 中创建逻辑卷):rootfs(密文,带完整性保护)、rootfs_hash(明文,存放哈希树)、data(密文) + +2. 启动加密磁盘 + +![](../../../assets/CSV/cryptpilot-3.png) + +1、先进行度量启动,海光安全固件对OVMF进行度量,OVMF 对shim 度量,shim 对grub 进行度量,grub 对kernel、cmdline、initrd 进行度量,initrd 对rootfs进行度量。 + +2、initrd 中启动cryptpilot 服务的initrd-fde-before-sysroot 阶段 ,启动attestation-agent 、confidential-data-hub服务,attestation-agent 获取远程认证报告,将报告发送到trustee 端,Attestation Service 对证书内容、证书链、度量参考值进行验证。 + +3、验证通过后confidential-data-hub获取密钥解密rootfs分区,并对分区进行dm-verity 处理。 + +4、获取密钥解密data 分区(第一次启动会创建data分区,并设置data 为加密卷),data 分区同时具有完整性保护特性,该特性可选,退出cryptpilot 服务的initrd-fde-before-sysroot 阶段。 + +5、挂载rootfs 为/sysroot 。 + +6、启动cryptpilot 服务进入initrd-fde-after-sysroot 阶段,挂载 data分区,设置sysroot为overlay 的只读层,overlay上层为内存tmpfs 或者为disk ,disk 内容放在data 分区中。 + +### 启动后镜像完整视图 + +``` +[root@localhost ~]# lsblk +NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +fd0 2:0 1 4K 0 disk +sda 8:0 0 20G 0 disk +├─sda1 8:1 0 2M 0 part +├─sda2 8:2 0 200M 0 part /boot/efi +├─sda3 8:3 0 1G 0 part /boot +└─sda4 8:4 0 18.8G 0 part + ├─system-rootfs 252:0 0 8.4G 0 lvm + │ └─rootfs_decrypted 252:3 0 8.4G 0 crypt + │ └─rootfs 252:4 0 8.4G 1 crypt / + ├─system-rootfs_hash 252:1 0 68M 0 lvm + │ └─rootfs 252:4 0 8.4G 1 crypt / + └─system-data 252:2 0 10.3G 0 lvm + └─data_dif 252:5 0 9.7G 0 crypt + └─data 252:6 0 9.7G 0 crypt /data +``` +system-rootfs:加密的rootfs 分区。 + +rootfs_decrypted: system-rootfs解密后的映射。 + +rootfs: rootfs_decrypted通过dm-verity 处理过的映射,挂载到根目录。 + +system-rootfs_hash: 专门用来存储 rootfs 的 Merkle Tree 哈希数据。dm-verity 在校验 rootfs 时会用到这个卷中的 hash tree,并将其与预置的 roothash 进行比对。 + +system-data: 加密的数据分区。 + +data_dif: system-data 通过dm-integrity 完整性保护处理后的映射。 + +data: 最终解密后的映射,用于挂载到/data 目录。 + + +## 安全性分析 + +本方案中最关键的安全数据为磁盘解密的密钥。只要解密密钥安全,虚拟机用户以外的攻击者就无法读取虚拟机用户存盘的数据。虚拟机启动和运行阶段,唯一可获取密钥的阶段是在initrd启动过程,本小节讨论了本方案中initrd阶段如何保证密钥的安全性。 + +攻击手段一:攻击者离线挂载磁盘的/boot分区,替换initrd文件 + +如前文所述,虚拟机磁盘文件的/boot分区为明文,initrd保存于/boot分区,攻击者是否可篡改initrd文件,替换其中的attestation-agent或cryptpilot程序,增加保存密钥或打印密钥的过程,用于离线解密磁盘? + +在本方案中,trustee侧释放密钥的前提是请求方提供远程证明报告,且RTMR/eventlog中的度量值与配置的基准值一致。攻击者对initrd的任何改变都将引起RTMR/eventlog度量值的变化,trustee在验证远程证明报告后,将报告中的度量值与基准值对比后将发现数据不符,拒绝发送密钥。因此攻击者离线修改initrd的方法无法获取磁盘密钥。 + +攻击手段二:攻击者是否可在虚拟机启动后,伪造http请求,请求trustee再次发送密钥? + +![](../../../assets/CSV/cryptpilot-5.png) + +上图为initrd中的attestation-agent/confidential-data-hub请求trustee发送密钥的流程图,从图中可看出,虚拟机必须先提供远程证明报告,trustee验证报告正确后,才发送token。虚拟机必须携带token才能请求密钥,trustee验证token的签名为真实后,用TEE提供的临时公钥加密磁盘密钥,并发出。 + +攻击者任意发出http request请求密钥,如果没有token,只能得到trustee要求远程证明的回应。而token中包含了TEE远程证明的内容和trustee签名,攻击者无法伪造签名,因而无法制造出有效的http request。 + +进一步的假设攻击者通过某种手段获取到了有效的token,并制造出有效的http request,请求密钥。trustee认为是真实的请求者,用临时公钥加密磁盘解密密钥,并回应。由于临时公钥对应的临时私钥仅TEE虚拟机拥有,攻击者无法解密磁盘密钥,无法读取虚拟机磁盘中的密文内容。 + +总结来说,Trustee必须鉴别密钥请求方为真实的、度量值匹配的TEE虚拟机,并使用TEE虚拟机提供的临时公钥保护磁盘密钥。除TEE虚拟机以外,攻击者无法同时提供远程证明报告和临时私钥,因此无法获取磁盘解密密钥。 + +## 相关参考链接 + +部署测试文档请查考[13-基于远程证明的CSV 虚拟机磁盘加密测试过程]() + +[1] https://github.com/openanolis/cryptpilot + +[2] https://github.com/confidential-containers/trustee + +[3] https://github.com/confidential-containers/guest-components + + + + 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" new file mode 100644 index 0000000000000000000000000000000000000000..267c64603fc6e3ad4890db9f7c39262e861c2370 --- /dev/null +++ "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" @@ -0,0 +1,282 @@ + +## 功能描述 +本文提供了基于远程证明的机密虚拟机磁盘加密方案测试过程。本加密方案仅支持CSV3虚拟机,并要求远程证明支持运行时度量(Runtime Attestation)功能。 +本测试需要两台机器,一台部署Trustee程序(KBS/RVPS服务),另一台部署加密虚拟机。 + +具体技术原理细节请参考[7-基于远程证明的CSV 虚拟机磁盘加密技术介绍]()。 + +## 使用流程 + +机密系统盘的制作和使用流程大致如下图所示: + +![](../../../assets/CSV/cryptpilot-4.png) + +演示使用的主机、虚拟机环境如下表所示: + +| 机器 | 软件组件 | 软件版本 | 说明 | +| --- | --- | --- | --- | +| 机器一 | 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 | 下面**资源准备**章节中提供了下载方法 | +| 机器二 | 安全固件 | 版本不低于2337 | 通过sudo hag general check 查看firmware version 字段的值| + + +## 对磁盘进行加密 + +使用机器一制作磁盘,机器硬件不限制,假设测试者已经准备好Anolis 8.10主机环境,下面开始制作加密虚拟机磁盘。 + +### 准备资源 +``` +mkdir -p ~/test/ +cd ~/test/ +git clone --depth 1 https://gitee.com/anolis/hygon-devkit.git + +# 准备虚拟机镜像,目前只提供了这个虚拟机,客户有需要可以进行适配,虚拟机的默认账号root,密码为root +~/test/hygon-devkit/tools/sftp download /hygon-devkit/4.0/2025-01-01/csv/AnolisOS-8.10-x86_64-ANCK.qcow2 ~/test/AnolisOS-8.10-x86_64-ANCK.qcow2 + +~/test/hygon-devkit/tools/sftp download /hygon-devkit/4.0/2025-01-01/csv/cryptpilot/attestation-agent-1.2.1-3.an8.x86_64.rpm ~/test/attestation-agent-1.2.1-3.an8.x86_64.rpm + +~/test/hygon-devkit/tools/sftp download /hygon-devkit/4.0/2025-01-01/csv/cryptpilot/confidential-data-hub-1.2.1-3.an8.x86_64.rpm ~/test/confidential-data-hub-1.2.1-3.an8.x86_64.rpm + +~/test/hygon-devkit/tools/sftp download /hygon-devkit/4.0/2025-01-01/csv/cryptpilot/cryptpilot-0.2.6-1.an8.x86_64.rpm ~/test/cryptpilot-0.2.6-1.an8.x86_64.rpm + +~/test/hygon-devkit/tools/sftp download /hygon-devkit/4.0/2025-01-01/csv/cryptpilot/e2fsprogs-1.47.3.tgz ~/test/e2fsprogs-1.47.3.tgz + +~/test/hygon-devkit/tools/sftp download /hygon-devkit/4.0/2025-01-01/csv/cryptpilot/rvps-tool ~/test/rvps-tool +``` +### 准备加密磁盘配置文件 +``` +mkdir -p ~/test/config_dir +# kbs_ip 为下面构建trustee kbs 服务的主机ip 地址,客户根据自己情况进行填写 +# kbs:///default/local-resources/rootfs_passwd 中为rootf分区的解密密钥 +# kbs:///default/local-resources/data_passwd 中为data分区的解密密钥 +cat > ~/test/config_dir/fde.toml << 'EOF' +[rootfs] +rw_overlay = "disk" +[rootfs.encrypt.kbs] +kbs_url = "http://kbs_ip:8080" +key_uri = "kbs:///default/local-resources/rootfs_passwd" + +[data] +integrity = true +[data.encrypt.kbs] +kbs_url = "http://kbs_ip:8080" +key_uri = "kbs:///default/local-resources/data_passwd" +EOF +``` +配置文件介绍请参考https://github.com/openanolis/cryptpilot/blob/master/dist/etc/fde.toml.template + +### 制作加密磁盘 + +准备容器镜像,在容器环境中制作加密虚拟机磁盘镜像 + +``` +sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest +sudo docker run -dit \ + --name cryptpilot-disk \ + --network host \ + --privileged \ + --ipc=host \ + -v /run/udev/control:/run/udev/control \ + -v /dev:/dev \ + -v /lib/modules:/lib/modules:ro \ + -v /usr/include/linux:/usr/include/linux:ro \ + -v /usr/include/asm:/usr/include/asm:ro \ + -v ~/test:/mnt \ + 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 版本较低需要对其进行升级 +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 +``` +镜像制作成功类似如下输出 +``` +-------------------------------- +Everything done, the new disk image is ready to use: AnolisOS-8.10-x86_64-ANCK-enc.qcow2 + +You can calculate reference value of the disk with: + + cryptpilot fde show-reference-value --disk AnolisOS-8.10-x86_64-ANCK-enc.qcow2 + +``` +## 准备trustee 环境 + +trustee 可以部署在任意用户可信的环境中,这里选择和制作加密磁盘共用一台主机,使用的是机器一。 + +### 配置Trustee +``` +# 主机上重新开一个窗口执行 +cd ~/test/ +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为自签名证书 +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/ + +sudo docker compose up -d +``` +等待服务启动成功,docker ps 查看容器服务是否启动成功,类似如下 +``` +higon@anolis trustee]$ sudo docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +5d791ab1ddc6 ghcr.io/confidential-containers/coco-keyprovider:latest "coco_keyprovider --…" 44 minutes ago Up 44 minutes 0.0.0.0:50000->50000/tcp, [::]:50000->50000/tcp trustee-keyprovider-1 +055cc3a66e16 ghcr.io/confidential-containers/staged-images/kbs-grpc-as:b6ebe8d8e15e11a19aa133a6a391b9c81a5b78d7 "/usr/local/bin/kbs …" 44 minutes ago Up 44 minutes 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp trustee-kbs-1 +b528695a6605 ghcr.io/confidential-containers/staged-images/coco-as-grpc:b6ebe8d8e15e11a19aa133a6a391b9c81a5b78d7 "grpc-as --socket 0.…" 44 minutes ago Up 44 minutes 0.0.0.0:50004->50004/tcp, [::]:50004->50004/tcp trustee-as-1 +f23aa7bcf16d ghcr.io/confidential-containers/staged-images/rvps:b6ebe8d8e15e11a19aa133a6a391b9c81a5b78d7 "rvps --address 0.0.…" 44 minutes ago Up 44 minutes 0.0.0.0:50003->50003/tcp, [::]:50003->50003/tcp trustee-rvps-1 +cdf80dd33d3a 77c6ff15a2c8 "bash" 6 weeks ago Up 2 months +``` +### trustee参考值配置 + +- 拷贝运行CSV3虚拟机的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地址 +scp /usr/share/edk2/ovmf/OVMF_CODE.cc.fd user@kbs_ip:~/test/ +``` +- 设置参考值 +该动作在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 +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) +cat << EOF > ./register-request.json + +{ +"version" : "0.1.0", +"type": "sample", +"payload": "$provenance" +} +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信息 +wget https://gitee.com/hanliyang-kata-coco/deployment/raw/master/tools/measurement/csv-measure.py +pip3 install gmssl + +measurement=$(python3 csv-measure.py \ + --ovmf OVMF_CODE.cc.fd \ + --csv3 \ + --smp 1 \ + --family 24 \ + --model 4 \ + --stepping 1 | base64 -d | xxd -p | tr -d '\n') + +cat << EOF > ovmf-reference-value.json +{ + "csv.measurement": [ + "${measurement}" + ] +} +EOF + +provenance=$(cat ./ovmf-reference-value.json | base64 --wrap=0) +cat << EOF > ./register-request.json +{ + "version" : "0.1.0", + "type": "sample", + "payload": "$provenance" +} +EOF + +# 向rvps 中写入参考值2 +~/test/rvps-tool register --path ./register-request.json + +``` + +其中 +--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 +``` +有下面类似字段加密分区解密成功: +``` +[ 14.804672] attestation-agent[225]: [2025-09-03T08:03:00Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): Get evidence successfully! +[ 16.374274] cryptpilot[601]: 2025-09-03T08:03:01.826748Z INFO cryptpilot::provider::kbs: The passphrase has been fetched from KBS +[ 16.380438] cryptpilot[601]: 2025-09-03T08:03:01.833223Z INFO cryptpilot::cmd::boot_service: Setting up dm-crypt for rootfs volume +[ 25.730926] cryptpilot[601]: 2025-09-03T08:03:11.183488Z INFO cryptpilot::cmd::boot_service: Setting up dm-verity for rootfs volume +[ 25.842117] cryptpilot[601]: 2025-09-03T08:03:11.293776Z INFO cryptpilot::cmd::boot_service: [ 4/4 ] Setting up data volume +[ 25.992673] cryptpilot[601]: 2025-09-03T08:03:11.293807Z INFO cryptpilot::cmd::boot_service: Fetching passphrase for data volume +[ OK ] Found device /dev/mapper/rootfs. +[ OK ] Started dracut initqueue hook. +[ OK ] Reached target Remote File Systems (Pre). +[ OK ] Reached target Remote File Systems. + Starting dracut pre-mount hook... +[ 26.194713] secure call: invalid address +[ 26.183639] attestation-agent[225]: [2025-09-03T08:03:11Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): get tee type ... +[ 26.184560] attestation-agent[225]: [2025-09-03T08:03:11Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): get tee type succeeded. +[ 26.184880] attestation-agent[225]: [2025-09-03T08:03:11Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): get evidence ... +[ 26.184926] attestation-agent[225]: [2025-09-03T08:03:11Z INFO attestation_agent] No additional attesters configured, returning empty evidence. +[ 26.184954] attestation-agent[225]: [2025-09-03T08:03:11Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): Get evidence successfully! +[ 26.187830] attestation-agent[225]: [2025-09-03T08:03:11Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): get evidence ... +[ OK ] Started dracut pre-mount hook. +[ 26.228054] attestation-agent[225]: [2025-09-03T08:03:11Z DEBUG ttrpc_aa::ttrpc_dep::server] AA (ttrpc): Get evidence successfully! +[ 27.488771] cryptpilot[601]: 2025-09-03T08:03:12.940958Z INFO cryptpilot::provider::kbs: The passphrase has been fetched from KBS +[ 32.364125] cryptpilot[601]: 2025-09-03T08:03:17.816647Z INFO cryptpilot::cmd::boot_service: Both rootfs volume and data volume are ready +[ 32.511956] cryptpilot[601]: 2025-09-03T08:03:17.964740Z INFO cryptpilot::cmd::boot_service: Everything have been completed, exit now + +``` +