跳转至

1. 介绍

机密计算主要功能是对内存进行加密。依托特定的加密硬件,每个虚拟机可以生成自己的密钥对自己的内存进行加密,这样 host 不持有密钥的话也 无法访问 guest 被密钥加密的内存,确保了就算虚拟机发生了逃逸拿到了host的权限也无法访问其他的虚拟机.

2. 环境要求

要求 参考命令
海光CPU 2代及以上(72xx,73xx,74xx),1代不行(71xx) grep -i "model name" /proc/cpuinfo | sort | uniq
操作系统 确保自己使用的物理机OC 9.2 以上 cat /etc/os-release
内核 6.6.x 内核以上 uname -r
BIOS 设置 HYGON CBS -> Moksha Common Options 中设置 ASID Space Limit 为 1,设置 SMEE Control 为 Enabled N/A
BIOS 设置 Setup Utility -> Advanced -> HYGON CBS -> NBIO Common Options N/A

3. 证书安装

注意:证书必须安装,主板cmos断电可能会重置证书。

3.1. Hygon_Devkit安装

要先参考ftp安装方式安装devkit里面的hag软件。也可以通过如下方式安装hygon-devkit

sudo chmod a+w /opt
cd /opt/
git clone --depth 1 https://gitee.com/anolis/hygon-devkit.git
mv hygon-devkit hygon
cd /opt/hygon/common/install/ 
# install hag to /opt/hygon/bin folder
sudo ./install_hag.sh 
sudo cp /opt/hygon/bin/hag /usr/bin

3.2. 导入证书

3.2.1. 在线导入

如果能链接外网可以直接在线导入

sudo /opt/hygon/bin/hag general hgsc_import

3.2.2 离线导入

针对不能链接互联网的情况,可以选择离线导入,首先进入离线证书导入网站, 下载名字类似于 “hygon-hgsc-certchain-v1.0-NUFAG24060405.bin” 的证书,然后使用如下命令导入

/opt/hygon/bin/hag general hgsc_import -offline -in ./hygon-hgsc-certchain-v1.0-NUFAG24060405.bin

3.2.3 检查证书

证书导入后通过如下命令检测证书

sudo /opt/hygon/bin/hag  csv platform_status
img

3.3 csv虚拟机测试内存加密

目前oc官方源的软件已经合入了海光机密相关的patch,可以直接使用

3.3.1 安装依赖软件

# 安装依赖软件
sudo dnf install -y livirt qemu python-pip telnet
pip instsall qmp snowland-smx

sudo systemctl start libvirtd
sudo systemctl enable libvirtd

从sftp下载ovfm,并解压

tar -xvf ovmf.tar.gz
img

准备UEFI启动的qcow镜像

3.3.2. 启动一个普通虚拟机

qemu-system-x86_64 -name normal-vm --enable-kvm -cpu host \
 -m 2048 -hda ocvm.qcow2 \
 -drive if=pflash,format=raw,unit=0,file=/root/vm/ovmf/OVMF_CODE.fd,readonly=on \
 -drive if=pflash,format=raw,unit=1,file=/root/vm/ovmf/OVMF_VARS.fd \
 -qmp tcp:127.0.0.1:1111,server,nowait -vnc 0.0.0.0:0 \
 -nographic

可以通过qmp导出虚拟机的内存数据

# 首先进入telnet
telnet 127.0.0.1 1111
# 再输入如下命令
{ "execute" : "qmp_capabilities" }
{ "execute": "pmemsave", "arguments": {"val": 0, "size": 256, "filename": "normal.txt"} }
# 执行完后可以通过先输入 ctrl+B 再输入 quit退出
hexdump --no-squeezing normal.txt
可以看到内存没有被加密 img

3.3.3 启动一个CSV机密虚拟机

qemu-system-x86_64 -name csv-vm --enable-kvm -cpu host \
 -m 2048 -hda ts4-uefi-csv.qcow2 \
 -object sev-guest,id=sev0,policy=0x1,cbitpos=47,reduced-phys-bits=5 \
 -machine memory-encryption=sev0 \
 -drive if=pflash,format=raw,unit=0,file=ovmf/OVMF_CODE.fd,readonly=on \
 -drive if=pflash,format=raw,unit=1,file=ovmf/OVMF_VARS.fd \
 -qmp tcp:127.0.0.1:2222,server,nowait -vnc 0.0.0.0:1 \
 -nographic

通过telnet dump出内存数据

# 首先进入telnet
telnet 127.0.0.1 2222
{ "execute" : "qmp_capabilities" }
{ "execute": "pmemsave", "arguments": {"val": 0, "size": 256, "filename": "csv.txt"} }
# 执行完后可以通过先输入 ctrl+B 再输入 quit退出
hexdump --no-squeezing csv.txt

可以看到内存已经被加密 img