25 KVM管理虚拟机-虚拟机安全发动25.1 整体介绍25.1.1 概述25.1.2 功用说明25.1.3 约束约束25.2 安全发动实践25.2.1 虚拟机装备25.2.2 证书导入25.2.3 安全发动观测

25 KVM管理虚拟机-虚拟机安全发动

25.1 整体介绍

25.1.1 概述

安全发动(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 存储撤消的密钥。

25.1.2 功用说明

本次完成的虚拟机安全发动特性依据edk开源项目。非安全发动形式下,Linux基本流程如下:

图 1 体系发动流程图

25 KVM管理虚拟机-虚拟机安全启动

安全发动形式下UEFI BIOS发动后加载的首个组件是体系镜像中的shim,shim与UEFI BIOS进行交互获取存储在UEFI BIOS变量db里边的密钥对grub进行验证,加载grub后相同调用密钥和认证接口对kernel进行验证。Linux发动流程如下:

图 2 安全发动流程图

25 KVM管理虚拟机-虚拟机安全启动

从整体处理流程上来看,安全发动特性包括多个关键场景,依据场景分析和体系分解,安全发动特性触及以下几个子体系: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相同的公私钥对。

25.1.3 约束约束

  • 在不支持安全发动的UEFI BIOS上运行,对现有功用没有影响,业务无感知。
  • 安全发动特性依赖UEFI BIOS,必须在UEFI支持此功用的条件下才干发挥作用。
  • 在UEFI BIOS敞开安全发动的情况下,假如相关部件没有签名或签名不正确,则无法正常发动体系。
  • 在UEFI BIOS关闭安全发动的情况下,发动进程的验证功用都会被关闭。
  • 安全发动验证链后半段,即shim->grub->kernel引导内核发动这部分的验证链由操作体系镜像完成,若操作体系不支持引导内核安全发动进程,则虚拟机安全发动失利。
  • 当时不供给x86架构运用nvram文件装备虚拟机安全发动

25.2 安全发动实践

虚拟机安全发动依赖于UEFI BIOS的完成,UEFI BIOS镜像经过edk rpm包装置,本节以AArch64为例对虚拟机安全发动进行装备。

25.2.1 虚拟机装备

edk rpm包中的组件装置于/usr/share/edk2/aarch64目录下,包括QEMU_EFI-pflash.rawvars-template-pflash.raw。虚拟机发动UEFI BIOS部分xml装备如下:

<os>
   <type arch='aarch64' machine='virt'>hvm</type>
   <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
   <nvram template='/usr/share/edk2/aarch64/vars-template-pflash.raw'>/path/to/QEMU-VARS.fd</nvram>
</os>

其间/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw为UEFI BIOS镜像途径。/usr/share/edk2/aarch64/vars-template-pflash.raw为nvram镜像模板途径,/path/to/QEMU-VARS.fd为当时虚拟机nvram镜像文件途径,用于保存UEFI BIOS体系中的环境变量。

25.2.2 证书导入

虚拟机安全发动时的证书从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文件中装备挂载该镜像

<devices>
    <disk type='file' device='disk'>
        <driver name='qemu' type='raw' cache='none' io='native'/>
        <source file='/path/to/data.img'/>
        <target dev='sdc' bus='scsi'/>
        <boot order='2'/>
        <readonly/>
    </disk>
</devices>

发动虚拟机,导入PK证书,流程如下(KEK证书,DB证书导入方法相同):

虚拟机发动后,点击F2进入bios界面

图 1 进入bios界面

25 KVM管理虚拟机-虚拟机安全启动

图 2 进入Device Manager

25 KVM管理虚拟机-虚拟机安全启动

图 3 进入Custom Secure Boot Options

25 KVM管理虚拟机-虚拟机安全启动

图 4 进入PK Options

25 KVM管理虚拟机-虚拟机安全启动

图 5 Enroll PK

25 KVM管理虚拟机-虚拟机安全启动

在File Explorer界面能够看到许多磁盘目录,其间包括我们经过磁盘挂载的证书文件目录

图 6 File Explorer

25 KVM管理虚拟机-虚拟机安全启动

在磁盘目录中选择要导入的PK证书

图 7 进入证书地点磁盘

25 KVM管理虚拟机-虚拟机安全启动

图 8 选择Commit Changes and Exit保存导入证书

25 KVM管理虚拟机-虚拟机安全启动

导入证书后,UEFI BIOS将证书信息以及安全发动特点写入nvram装备文件/path/to/QEMU-VARS.fd中,虚拟机下一次发动时会从/path/to/QEMU-VARS.fd文件中读取相关装备并初始化证书信息以及安全发动特点,主动导入证书并敞开安全发动。相同,我们能够将/path/to/QEMU-VARS.fd作为其他相同装备虚拟机的UEFI BIOS发动装备模板文件,经过修正nvram template字段使其他虚拟机发动时主动导入证书并敞开安全发动选项,虚拟机xml装备修正如下:

<os>
   <type arch='aarch64' machine='virt'>hvm</type>
   <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
   <nvram template='/path/to/QEMU-VARS.fd'></nvram>
</os>

25.2.3 安全发动观测

正确装备虚拟机并导入PK、KEK、DB证书后,虚拟机将以安全发动的方法运行。能够经过在虚拟机装备文件xml中装备串口日志文件观测虚拟机是否为安全发动,串口日志文件的装备方法如:

<serial type='file'>
    <source path='/path/to/log_file' append='on'/>
</serial>

虚拟机加载体系镜像成功后,当串口日志文件中呈现”UEFI Secure Boot is enabled”信息时,表明虚拟机当时为安全发动。

点赞,你的认但是我创作的动力!

⭐️ 收藏,你的喜爱是我尽力的方向!

✏️ 谈论,你的意见是我进步的财富!

25 KVM管理虚拟机-虚拟机安全启动