虚拟机Secure Boot安全启动

这篇具有很好参考价值的文章主要介绍了虚拟机Secure Boot安全启动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

Secure Boot 作为 UEFI 的一个选项,它可以被设置为开启或关闭。 Secure Boot 所需要的公钥证书被保存在计算机的主板的 FLASH 里面,FLASH 里面保存着 PK , KEK, db, dbx 的证书链。下面我们在虚拟机中使能Secure Boot功能,可以在虚拟机中实验,这样比较安全。

工具

以下工具是必不可少的:

openssl
efitools
sbsigntools

在有些系统上 efitools 和 sbsigntools 无法直接获取,请从源码包编译,其中efitools依赖 sbsigntools。

yum install -y perl-File-Slurp.noarch
git clone https://gitee.com/mirrors_kernel_googlesource/efitools.git
git clone https://git.kernel.org/pub/scm/linux/kernel/git/jejb/sbsigntools.git/

在用源代码编译 efitools 时,需要 Perl 的一个模块,名字为 File Slurp,上面的命令安装该 module。

步骤

这里简要介绍 PK,KEK,db,dbx 和 MOK 的概念。

Platform Key (PK) - PK 是用于在硬件平台层和硬件平台拥有者建立起的信任关系 ,规定一个硬件平台只能被一个拥有者所拥有,即 PK 只能存在一个 ,与拥有者相关的公钥被存储在 FLASH 里面的 PK 变量里面,同时,拥有者的私钥可以来对 PK, KEK, db, dbx 进行签名和管理。

Key Exchange Key (KEK) - KEK 是用于在硬件平台和操作系统之间建立信任关系 ,KEK 的公钥可以在主板的 FLASH 存在多个不同项,即 KEK 可以存在多个 ,每一项对应一种可以被启动的操作系统,同样,KEK 的私钥可以来对 db, dbx 进行签名和管理。

Database (db) - db 是用于对 被许可的 EFI 文件予以加载的数据签名库 ,和 KEK 一样, db 的公钥可以存在很多项 。(在 UEFI 平台里面,操作系统加载文件就是一个 EFI 文件)

Database Excluded (dbx) - dbx 是一个 黑名单数据签名库 ,只要谁的 EFI 签名在这,谁就被屏蔽掉, dbx 的公钥也可以存在很多项 。后面不会使用这个。

下面主要是有两种方式将证书更新到 flash 中,一种通过 efivar 方式,另外一种是通过 BIOS 图形界面,前者需要创建EFI list 文件,之后可以通过命令行自动化操作;而后者需要的证书文件较少,但是需要通过图形界面进行操作。

自动化导入证书

建立 PK,KEK,db 密钥对,同时还需要创建EFI list。

建立密钥对

openssl req -new -x509 -newkey rsa:2048 -subj "/CN=Platform Key/" -keyout PK.key -out PK.crt -days 3650 -nodes -sha256

上面的 -subj 的参数可以自己设置,参数 -days 是密钥的有效期,这里设置为 10 年,也可以设置为其他,生成私钥 PK.key,公钥 PK.crt。

同理,KEK 和 db 亦是如此:

openssl req -new -x509 -newkey rsa:2048 -subj "/CN=Key Exchange Key/" -keyout KEK.key -out KEK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=Database/" -keyout db.key -out db.crt -days 3650 -nodes -sha256

建立 EFI List 文件
EFI List 文件其实就是公钥配以平台拥有者的 GUID 的文件,所以这里我们需要有一个GUID,可以通过uuidgen 生成。

guid=$(uuidgen)
cert-to-efi-sig-list -g $(cat guid) PK.crt PK.esl
cert-to-efi-sig-list -g $(cat guid) KEK.crt KEK.esl
cert-to-efi-sig-list -g $(cat guid) db.crt db.esl

这样三个公钥就全变成 List 文件了。

给 List 文件签名

sign-efi-sig-list -k PK.key -c PK.crt PK PK.esl PK.esl.signed
sign-efi-sig-list -k PK.key -c PK.crt KEK realKEK.esl realKEK.esl.signed
sign-efi-sig-list -k KEK.key -c KEK.crt db realDB.esl realDB.esl.signed

上述中,平台的 Key 权限最高,可以对 PK 本身,和 KEK 签名,KEK 是建立操作系统和硬件平台之间的信任关系,它只用于对于 db 进行签名。

完整的脚本:

#!/bin/bash

echo -n "请输入一个通用名,比如公司名称或个人名字: "
read NAME

openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME PK/" -keyout PK.key \
        -out PK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME KEK/" -keyout KEK.key \
        -out KEK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME DB/" -keyout DB.key \
        -out DB.crt -days 3650 -nodes -sha256
openssl x509 -in PK.crt -out PK.cer -outform DER
openssl x509 -in KEK.crt -out KEK.cer -outform DER
openssl x509 -in DB.crt -out DB.cer -outform DER

echo $(uuidgen) > myGUID.txt

cert-to-efi-sig-list -g $GUID PK.crt PK.esl
cert-to-efi-sig-list -g $GUID KEK.crt KEK.esl
cert-to-efi-sig-list -g $GUID DB.crt DB.esl
rm -f noPK.esl
touch noPK.esl

sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k PK.key -c PK.crt PK PK.esl PK.auth
sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k PK.key -c PK.crt PK noPK.esl noPK.auth
sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k PK.key -c PK.crt KEK KEK.esl KEK.auth
sign-efi-sig-list -t "$(date --date='1 second' +'%Y-%m-%d %H:%M:%S')" \
                  -k KEK.key -c KEK.crt db DB.esl DB.auth
echo ""
echo "For use with KeyTool, copy the *.auth and *.esl files to a FAT USB"
echo "flash drive or to your EFI System Partition (ESP)."
echo "For use with most UEFIs' built-in key managers, copy the *.cer files."
echo ""

更新到虚拟机的证书列表中
通过写入 efivars 的方式更新到 flash 中,首先必须保证系统的 efivarfs 被正确挂载,ls 一下 /sys/firmware/efi/efivars/ 是否存在文件,否则需要手动挂载:

# mount -t efivarfs efivarfs /sys/firmware/efi/efivars/

再把那三个签过名的 List 文件写入主板:

# efi-updatevar -f PK.esl.signed PK
# efi-updatevar -f realKEK.esl.signed KEK
# efi-updatevar -f realDB.esl.signed db

图形界面导入证书

图形化导入证书只识别后缀名为 .crt, .der , .cer的证书,但是编码方式需要是 DER,所以需要对证书进行一次转换。

openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME PK/" -keyout PK.key \
        -out PK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME KEK/" -keyout KEK.key \
        -out KEK.crt -days 3650 -nodes -sha256
openssl req -new -x509 -newkey rsa:2048 -subj "/CN=$NAME DB/" -keyout DB.key \
        -out DB.crt -days 3650 -nodes -sha256
openssl x509 -in PK.crt -out PK.cer -outform DER
openssl x509 -in KEK.crt -out KEK.cer -outform DER
openssl x509 -in DB.crt -out DB.cer -outform DER

之后将证书拷贝到磁盘中,在虚拟化中可以将宿主机文件镜像以磁盘的形式呈现给虚拟机,我们这里使用单独的一个文件镜像来存储证书。

dd of=data.img if='/dev/zero' bs=1M count=16
mkfs.vfat -I data.img
mkdir mnt
mount data.img mnt
cp -a /path/to/certificates/* mnt
umount mnt/
rm -rf mnt

将文件镜像添加到虚拟机磁盘列表,可以通过virt-manager或者配置文件。

图形化导入证书

  1. 在启动过程中进入启动菜单,选择Security, 这个菜单可能出现的位置稍有不同。
    虚拟机Secure Boot安全启动
  2. 进入Secure Boot Configuration 之后,选择Secure Boot Mode中的Custom Mode, 会多出来一个菜单
    虚拟机Secure Boot安全启动
  3. 进入Custom Secure Boot Options 中进行证书导入
    虚拟机Secure Boot安全启动
  4. 选择导入PK
    虚拟机Secure Boot安全启动
  5. 选择证书文件
    虚拟机Secure Boot安全启动
    虚拟机Secure Boot安全启动
    虚拟机Secure Boot安全启动
  6. 导入证书,将证书存储到flash中
    虚拟机Secure Boot安全启动
    其他两个KEK 和 DB 可以导入也可以选择不导入,但是PK 是必须的。
    在之后会提示你需要重启来使刚才的证书和配置生效,此时如果没有对grub 进行签名,需要暂时禁掉 Secure Boot功能。

给二进制的 EFI 文件签名

这是密钥管理和签名的最后一步,给 grub 的 EFI 文件签名:

sbsign --key db.key --cert db.crt --output grubx64.efi.signed /boot/efi/EFI/BOOT/grub64.efi

可以不用给内核 vmlinuz 签名,毕竟 vmlinuz 不是硬件平台的启动 EFI 文件,不过给内核签名也没什么影响,如果想给内核签名类似于给 grub 签名,用 私钥 db.key 及对应的公钥 db.crt 对其签名,这里用的 db 是那个自己创建的 db ,即没有合并微软 db 的那个,合并了微软 db 的是 realDB 。
现在vmlinuz基本都需要支持 EFI 启动,即生成vmlinuz.efi 作为一个EFI应用直接启动,绕过了grub,这种方式下需要使用同样的方式对其进行签名。

sbsign --key db.key --cert db.crt --output vmlinuz.efi.signed vmlinuz.efi

重启系统

重启之后在BIOS中开启Secure Boot 选项,然后一切应该正常了。。。文章来源地址https://www.toymoban.com/news/detail-449984.html

到了这里,关于虚拟机Secure Boot安全启动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 53 最佳实践-安全最佳实践-虚拟机可信启动

    53 最佳实践-安全最佳实践-虚拟机可信启动 53.1 概述 可信启动包含度量启动和远程证明。其中虚拟化组件主要提供度量启动功能,远程证明由用户自己在虚拟机中安装相关软件(RA client)及搭建远程证明服务器(RA server)进行使能。 度量启动的两个基本要素是信任根和信任链

    2024年02月10日
    浏览(39)
  • 微软允许OEM对Win10不提供关闭Secure Boot

    用户可能将无法在Windows 10电脑上安装其它操作系统了,微软不再要求OEM在UEFI 中提供的“关闭 Secure Boot”的选项。 微软最早是在Designed for Windows 8认证时要求OEM的产品必须支持UEFI Secure Boot。Secure Boot 被设计用来防止恶意程序悄悄潜入到引导进程。问题是如果其它的操作系统,

    2024年02月03日
    浏览(36)
  • Spring Boot学习随笔-第一个SpringBoot项目快速启动(org.springframework.boot、@SpringBootApplication、application.yml)

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 创建第一个Module 环境要求 jdk1.8+ maven3.2+ Spring Framework 5.x+ Tomcat 9.0+ IDEA 2021 自动保存刷新pom 在resources下添加application.yml文件后,即可启动springboot应用 由于tomcat内嵌在springboot里面了,所以我们在修改端口号等设置也在配置

    2024年02月05日
    浏览(56)
  • Android安全启动学习(五):Android Verified Boot 2.0

    AVB2.0被用于启动引导,此用法添加一个“vbmeta.img”镜像。 public key被编译到bootloader中 用于 校验vbmeta数据 ,vbmeta.img包含应 由此public key验证的签名。 vbmeta.img包含用于验证的public key,但只有bootloader验证过vbmeta.img才会可信,就好比认证一样,包含可信public key和签名。 因此,

    2023年04月23日
    浏览(35)
  • Mac使用PD虚拟机安装win10提示安全启动功能发现未经授权更改固件、操作系统或 UEFI 驱动程序。若要进行安全启动设置管理,请选择虚拟机配置设置,单击硬件,并展开高级设置。

            Mac使用PD虚拟机安装win10提示安全启动功能发现未经授权更改固件、操作系统或 UEFI 驱动程序。若要进行安全启动设置管理,请选择虚拟机配置设置,单击硬件,并展开高级设置。           PD 虚拟机中的 TPM 芯片是一种安全芯片,它可以提供基于硬件的加密和

    2024年04月16日
    浏览(79)
  • VMware虚拟机启动Ubuntu时报错:“另一个程序已锁定文件的一部分,进程无法访问”该怎样解决呢?

    宝子们有木有遇到这样的问题呀“另一个程序已锁定文件的一部分,进程无法访问”,跟着辣面子来解决这个问题吧 按照自己路径寻找 放心将它们删除 出现此文件是因为虚拟机在运行的时候,会锁定文件,防止被修改,如果系统突然崩溃、异常关机等,虚拟机尚未把已经锁

    2024年02月11日
    浏览(59)
  • Secure Copy Protocol or SCP - 安全拷贝协议

    Secure Copy (remote file copy program) The SCP program is a software tool implementing the SCP protocol as a service daemon or client. It is a program to perform secure copying. The SCP server program is typically the same program as the SCP client. The SCP Server software can be installed on a Regular Machine and be configured to only accept SCP Traffic on

    2024年04月14日
    浏览(44)
  • 【网络协议】远程登录安全连接协议SSH(Secure Shell)

    SSH(Secure Shell)协议是一种用于在不安全网络上提供安全远程登录、命令执行和数据传输的加密网络协议,通过公钥加密和身份验证技术确保通信的安全性和隐私性。 SSH(Secure Shell)最初由Tatu Ylönen在1995年开发,现在已经发展成为一种广泛使用的标准工具,尤其是在Unix和

    2024年02月03日
    浏览(58)
  • SSL(Secure Sockets Layer)安全套接层协议详解

    SSL(Secure Sockets Layer 安全套接层)协议 ,及其继任者 TLS(Transport Layer Security传输层安全)协议 ,是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密,用于保障网络数据传输安全,利用数据加密技术,确保数据在网络传输过程中不会被截取

    2023年04月09日
    浏览(39)
  • Rust安全编码实践 Secure Coding Practices in Rust

    作者:禅与计算机程序设计艺术 Rust编程语言被称为可保证内存安全的系统编程语言,它在编译期间通过类型系统确保数据不出错。因此,Rust语言开发者需要掌握一些安全编码实践,如内存安全、访问控制、输入验证等。本文将对这些安全编码实践进行详细介绍,并结合Rus

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包