diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP1.png b/content/zh/docs/Virtualization/figures/CertEnrollP1.png
new file mode 100644
index 0000000000000000000000000000000000000000..536e0618a3ab5b70937292205242a08237e34712
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP1.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP2.png b/content/zh/docs/Virtualization/figures/CertEnrollP2.png
new file mode 100644
index 0000000000000000000000000000000000000000..0557c8782960188dbe9d84a1d0e66c9b45d2b303
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP2.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP3.png b/content/zh/docs/Virtualization/figures/CertEnrollP3.png
new file mode 100644
index 0000000000000000000000000000000000000000..326fcf1e8d5e3c795ebcde286d8e0fef14bec7d1
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP3.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP4.png b/content/zh/docs/Virtualization/figures/CertEnrollP4.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc77c038e1e3a5ec30d7ba4f805ca937792e9327
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP4.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP5.png b/content/zh/docs/Virtualization/figures/CertEnrollP5.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f22b3cbd84f7c93f74898a926bc3e32f231667f
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP5.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP6.png b/content/zh/docs/Virtualization/figures/CertEnrollP6.png
new file mode 100644
index 0000000000000000000000000000000000000000..08235013ca71f1ec51e9af2f143629d1a6132fe9
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP6.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP7.png b/content/zh/docs/Virtualization/figures/CertEnrollP7.png
new file mode 100644
index 0000000000000000000000000000000000000000..f934521d59dd4a75449fcb2ca8abc54045b9102b
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP7.png differ
diff --git a/content/zh/docs/Virtualization/figures/CertEnrollP8.png b/content/zh/docs/Virtualization/figures/CertEnrollP8.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a8158e3378bf25dee05b892cc60f424542455d7
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/CertEnrollP8.png differ
diff --git a/content/zh/docs/Virtualization/figures/OSBootFlow.png b/content/zh/docs/Virtualization/figures/OSBootFlow.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9c03c86df145636015efaeab4dc076f62754cd9
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/OSBootFlow.png differ
diff --git a/content/zh/docs/Virtualization/figures/SecureBootFlow.png b/content/zh/docs/Virtualization/figures/SecureBootFlow.png
new file mode 100644
index 0000000000000000000000000000000000000000..e76a800931ed6da2af3515d3d9d44388e3d11c01
Binary files /dev/null and b/content/zh/docs/Virtualization/figures/SecureBootFlow.png differ
diff --git "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md" "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md"
index 0cc5312a72d3b9d1ca0f2aa9034454eaf726e821..617fbec58964f96f5feb5b7bf829e611bd4d06fa 100644
--- "a/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md"
+++ "b/content/zh/docs/Virtualization/\347\256\241\347\220\206\350\231\232\346\213\237\346\234\272.md"
@@ -10,6 +10,9 @@
- [登录虚拟机](#登录虚拟机)
- [使用VNC密码登录](#使用VNC密码登录)
- [配置VNC TLS登录](#配置VNC-TLS登录)
+ - [虚拟机安全启动](#虚拟机安全启动)
+ - [总体介绍](#总体介绍)
+ - [安全启动实践](#安全启动实践)
## 虚拟机生命周期
@@ -647,4 +650,143 @@ VNC开启TLS加密认证模式的操作步骤如下:
>- VNC客户端证书的配置请参见各客户端对应的使用说明,由用户自行配置。
>- 登录虚拟机的方式请参见“使用VNC密码登录”。
+## 虚拟机安全启动
+
+### 总体介绍
+
+#### 概述
+
+安全启动(Secure Boot)就是利用公私钥对启动部件进行签名和验证。启动过程中,前一个部件验证后一个部件的数字签名,验证通过后,运行后一个部件,验证不通过则启动失败。安全启动的作用是检测设备启动阶段固件(Fireware)以及软件是否被篡改,防止恶意软件侵入和修改。通过安全启动可以保证系统启动过程中各个部件的完整性,防止没有经过认证的部件被加载运行,从而防止对系统及用户数据产生安全威胁。安全启动是在UEFI启动方式上实现的,Legacy启动方式不支持安全启动。根据UEFI规定,主板出厂的时候可以内置一些可靠的公钥。任何想要在这块主板上加载的操作系统或者硬件驱动程序,都必须通过这些公钥的认证。物理机上的安全启动由物理BIOS完成,虚拟机的安全启动通过软件模拟。虚拟机安全启动流程与host安全启动流程一致,都遵循开源UEFI规范。虚拟化平台上的UEFI由edk组件提供,虚拟机启动时qemu将UEFI镜像映射到内存中,为虚拟机模拟固件启动流程,安全启动正是虚拟机启动过程中edk提供的一个安全保护能力,用来保护虚拟机OS内核不被篡改。安全启动验签顺序:UEFI BIOS->shim->grub->vmlinuz(依次验签通过并加载)。
+
+| 中文 | 英文 | 缩略语 | 中文定义/描述 |
+| :-----| :----- | :----- | :----- |
+| 安全启动 | Secure boot | Secure boot | 安全启动就是启动过程中,前一个部件验证后一个部件的数字签名,验证通过后,运行后一个部件,验证不通过就停下来。通过安全启动可以保证系统启动过程中各个部件的完整性。 |
+| 平台密钥 | Platform key | PK | OEM厂商所有,必须为 RSA 2048 或更强,PK为平台拥有者和平台固件之间建立可信关系。平台拥有者将PK的公钥部分PKpub注册到平台固件中,平台拥有者可以使用PK的私有部分PKpriv来改变平台的拥有权或者注册KEK密钥。 |
+| 密钥交换密钥 | Key exchange key | KEK | KEK为平台固件和OS之间创建可信关系。每一个操作系统和与平台固件通信的第三方应用在平台固件中注册KEK密钥的公共部分KEKpub。 |
+| 签名数据库 | Database white list | DB | 存储验证shim、grub、vmlinuz等组件的密钥。 |
+| 签名吊销数据库 | Database black list | DBx | 存储吊销的密钥。 |
+
+#### 功能说明
+
+本次实现的虚拟机安全启动特性基于edk开源项目。非安全启动模式下,Linux基本流程如下:
+
+**图 1** 系统启动流程图
+
+
+
+安全启动模式下UEFI BIOS启动后加载的首个组件是系统镜像中的shim,shim与UEFI BIOS进行交互获取存储在UEFI BIOS变量db里面的密钥对grub进行验证,加载grub后同样调用密钥和认证接口对kernel进行验证。Linux启动流程如下:
+
+**图 2** 安全启动流程图
+
+
+
+从整体处理流程上来看,安全启动特性包含多个关键场景,根据场景分析和系统分解,安全启动特性涉及以下几个子系统:UEFI BIOS校验shim,shim校验grub,grub校验kernel。UEFI BIOS对shim进行验证,验证通过则启动shim,不通过则提示错误,无法启动。Shim需要在镜像编译制作过程中使用私钥进行签名,公钥证书导入UEFI BIOS变量区DB中。Shim启动后验证启动grub,验证通过则启动grub,不通过则提示错误,无法启动。Grub需要在镜像编译制作过程中进行签名,使用和shim一样的公私钥对。Grub启动后检查调用shim注册在UEFI BIOS的认证接口和密钥对kernel进行验证,通过则启动内核,不通过则提示错误,grub需要在镜像编译制作过程中进行签名,使用和shim一样的公私钥对。
+
+#### 约束限制
+
+* 在不支持安全启动的UEFI BIOS上运行,对现有功能没有影响,业务无感知。
+* 安全启动特性依赖UEFI BIOS,必须在UEFI支持此功能的条件下才能发挥作用。
+* 在UEFI BIOS开启安全启动的情况下,如果相关部件没有签名或签名不正确,则无法正常启动系统。
+* 在UEFI BIOS关闭安全启动的情况下,启动过程的验证功能都会被关闭。
+* 安全启动验证链后半段,即shim->grub->kernel引导内核启动这部分的验证链由操作系统镜像实现,若操作系统不支持引导内核安全启动过程,则虚拟机安全启动失败。
+* 当前不提供x86架构使用nvram文件配置虚拟机安全启动
+
+### 安全启动实践
+
+虚拟机安全启动依赖于UEFI BIOS的实现,UEFI BIOS镜像通过edk rpm包安装,本节以AArch64为例对虚拟机安全启动进行配置。
+
+#### 虚拟机配置
+
+edk rpm包中的组件安装于/usr/share/edk2/aarch64目录下,包括`QEMU_EFI-pflash.raw`和`vars-template-pflash.raw`。虚拟机启动UEFI BIOS部分xml配置如下:
+
+```
+
+ hvm
+ /usr/share/edk2/aarch64/QEMU_EFI-pflash.raw
+
+
+```
+
+其中loader部分指定UEFI BIOS镜像路径。nvram部分指定nvram镜像路径,nvram镜像用于保存UEFI BIOS系统中的环境变量。
+
+#### 证书导入
+
+虚拟机安全启动时的证书从BIOS界面导入,在证书导入前需要将证书文件导入到虚拟机中。可以通过挂载磁盘的方式将证书文件所在目录挂载到虚拟机中,例如制作包含证书的镜像,并在虚拟机的配置文件xml中配置挂载该镜像:
+
+制作证书文件镜像
+
+```
+dd of='/path/to/data.img' if='/dev/zero' bs=1M count=64
+mkfs.vfat -I /path/to/data.img
+mkdir /path/to/mnt
+mount path/to/data.img /path/to/mnt/
+cp -a /path/to/certificates/* /path/to/mnt/
+umount /path/to/mnt/
+```
+其中,/path/to/certificates/为证书文件所在路径,/path/to/data.img为证书文件镜像所在路径,/path/to/mnt/为镜像挂载路径。
+
+在虚拟机xml文件中配置挂载该镜像
+
+```
+
+
+
+
+
+
+
+
+
+```
+
+启动虚拟机,导入PK证书,流程如下(KEK证书,DB证书导入方式相同):
+
+虚拟机启动后,点击F2进入bios界面
+
+**图 1** 进入bios界面
+
+
+
+**图 2** 进入Device Manager
+
+
+
+**图 3** 进入Custom Secure Boot Options
+
+
+
+**图 4** 进入PK Options
+
+
+
+**图 5** Enroll PK
+
+
+
+在File Explorer界面可以看到很多磁盘目录,其中包括我们通过磁盘挂载的证书文件目录
+
+**图 6** File Explorer
+
+
+
+在磁盘目录中选择要导入的PK证书
+
+**图 7** 进入证书所在磁盘
+
+
+
+**图 8** 选择Commit Changes and Exit保存导入证书
+
+
+
+#### 安全启动观测
+
+正确配置虚拟机并导入PK、KEK、DB证书后,虚拟机将以安全启动的方式运行。可以通过在虚拟机配置文件xml中配置串口日志文件观测虚拟机是否为安全启动,串口日志文件的配置方式如:
+
+```
+
+
+
+```
+虚拟机加载系统镜像成功后,当串口日志文件中出现"UEFI Secure Boot is enabled"信息时,表明虚拟机当前为安全启动。