首页 > 系统相关 >Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)

Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)

时间:2024-07-21 19:52:26浏览次数:21  
标签:公钥 GRUB 内核 Machine 签名 驱动 加载 UEFI

PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

环境说明

  无

前言


  只要装过各种系统的人都或多或少会接触到UEFI或者BIOS这样的概念。本文也不会对这些概念进行详解,本文主要把这些概念串起来,并引入MOK(Machine Owner Key)。

  为什么需要MOK,是因为在使用现代linux系统时(如:PVE),如果我们需要自己安装一些自己构建的驱动(例如想实现gpu sr-iov),会用到此功能。





UEFI/BIOS


  BIOS (Basic Input/Output System) 和UEFI (Unified Extensible Firmware Interface) 这两个名字或者功能我们非常的熟悉了,机器开机自检完成后,一般f2/del等进入的界面,就是这个系统在显示工作。如果我们不按f2/del等键,系统会默默运行BIOS或者UEFI,然后自动加载引导程序,然后加载OS来运行。

  UEFI主要是为了取代BIOS系统的,因为其有:支持更多分区、启动速度快、支持更多硬件、更加安全、维护简单(统一标准)等等优点。其有个大的缺点就是,有些时候会因为安全的问题,需要更多的设置过程。

  对于BIOS来说,机器开机自检完成后,自动读取MBR(Master boot record),一般在磁盘的开始的扇区,然后加载OS或者其他进行启动。注意,这里MBR分区是一种老旧的分区格式了。

  对于UEFI来说,机器开机自检完成后,自动读取GPT分区(GUID Partition Table)中的EFI分区,然后加载OS或者其他进行启动。

  总的来说,随着时间的推进,UEFI是一种标准,已经被各大厂商支持和实现了。BIOS其已经完成了其历史的作用,除了为了兼容老机器,否则我们不应该使用它。





Linux 在UEFI下,自构建驱动安装问题


  这里有一个背景知识,那就是现代的linux内核,在加载内核驱动的时候,一般都会对内核驱动做一系列校验,其中一项就是做签名校验,如果校验失败,内核拒绝加载驱动。对于这部分内容,可以参考《Linux驱动加载源码分析(安全加载 、签名、校验)》 https://www.cnblogs.com/Iflyinsky/p/18301894 一文。

  在《常用加密及其相关的概念、简介(对称、AES、非对称、RSA、散列、HASH、消息认证码、HMAC、签名、CA、数字证书、base64、填充)》 https://www.cnblogs.com/Iflyinsky/p/18076852 中我们介绍了签名的原理,这里简单提一下:首先有非对称加密算法生成公钥、私钥。然后对消息进行摘要,对摘要进行私钥加密得到签名,最后可以用公钥来验证(解密)此签名是否正确。

  那么对应到内核驱动签名验证这里就是:首先对驱动模块使用私钥进行签名,并将签名文件写入驱动模块文件中,当我们加载驱动模块时,内核会使用其带的公钥来对驱动模块进行签名验证。

  注意,这里有一个重要的问题是:内核带的公钥是哪里来的?一般来说,有两个渠道可以增加内核的公钥,一个是编译内核的时候,一个是通过运行时的一些方法动态写入一些公钥到内核。



Machine Owner Key


  在实际我们自己测试自己的驱动模块的时候,一般都会自己生成一个私钥,公钥对来对自己的驱动模块进行签名。但是在启用的UEFI+ 支持安全启动的linux系统上,我们的驱动模块是无法正常加载的,因为我们的驱动无法过签名验证。

  从上面的描述来看,如果要成功加载我们的内核模块,那么我们应该把我们的公钥传给内核。

  在解决怎么把公钥传给内核前,我们第一步要简单了解一下linux secure boot的简单流程:

  • 机器开机及硬件自检完成,然后进入uefi固件,uefi固件里面有微软公钥。
  • uefi加载shim固件(独立与linux发行版,被微软私钥预先签名,例如这个包: https://packages.debian.org/sid/amd64/shim-signed )。此外shim有各大发行版公钥。
  • shim固件加载grub固件(grub固件被各大发行版私钥签名)。
  • grub加载linux签名内核。

  其实从上面的流程来看,就是一环环签名校验,保证了信任链的传递。

  回到我们之前的问题,我们怎么把我们私钥、公钥传给内核呢?必定是有一个工具能够将相关信息传进去,这个工具就是mokutil工具。



mokutil

  简而言之,shim除了自带发行版的公钥外,还维护一个用户可以操作的密钥数据库,里面存储的是Machine Owner Key。通过mokutil工具,我们可以增加和删除这些密钥。这样我们就可以将我们自己的模块签名公钥嵌入到了UEFI启动流程中去,然后根据适当的方法即可交给内核使用,并能够加载我们自己密钥签名的驱动程序。

  mokutil工具添加过程:

  1. 导入公钥
mokutil --import /var/lib/dkms/mok.pub 
# 并输入一次性密码
  1. 重启系统,此时新一次的uefi的启动流程会启动mok管理器,让用户按照要求注册新的密钥,并输入之前的一次性密码。(弹个框,自己选择,输入密码即可)

  2. 这样启动系统后,我们的密钥成功加载。

  3. 测试系统是否成功注册密码

mokutil --test-key /var/lib/dkms/mok.pub

  这样我们就可以使用mok.pub对应的私钥对我们的驱动进行签名,然后就可以正常使用公钥验证,然后加载驱动了。

  此外,这里还要多提一下,其实android的安全加载也有类似的过程,也是两个要点:信任链传递、驱动签名。





后记


  了解了越来越多计算机的知识,不得不感叹:知识总是不经意间出现在日常生活工作中。

参考文献




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

标签:公钥,GRUB,内核,Machine,签名,驱动,加载,UEFI
From: https://www.cnblogs.com/Iflyinsky/p/18314889

相关文章

  • AMD R2000 Bilby 单板 串口在Grub和Linux下的使用
    Ubuntu20启动时,自动加载了UART驱动,系统启动信息含有UART的相关信息。[2.418748]printk:console[ttyS4]disabled[2.418757]AMDI0020:00:ttyS4atMMIO0xfedc9000(irq=3,base_baud=3000000)isa16550A[2.418820]printk:console[ttyS4]enabled[......
  • 机器学习 -> Machine Learning (III)
    1对抗学习对抗学习的目的是增加鲁棒性。对抗生成网络(GAN)包括生成器(Generator)和判别器(Discriminator)。如果目标是创建能够生成新内容的系统,那么生成器是希望得到并优化的模型,这是一个零和问题。1.1GenBGenB是对抗网络用于VQA的产物,如图添加了偏置模型和目标模型。训练......
  • vmware安装在scsi磁盘上的grub无法发现/引导其它scsi磁盘
    #虚拟机盘结构virtual-disk-1(scsi,gpt)--fat32(EFI,grub)--ext4(empty)virutal-disk-2(scsi,gpt)--ext4(ubuntu,system,rootfs)virtual-disk-3(scsi,gpt)--ext4(empty)之前引导分区和ubuntu者在一个scsi盘上,所以没有注意到启动时有grub,进grubshell,但ls......
  • UEFI中的PassThru()
    UEFI中的PassThru()最开始的时候,我是学习SATA-AHCI协议探索EDK2的源码,而在ATA中,PassThru函数是实现ATA通过协议时最重要的功能,它执行以下操作:初始化内部寄存器以进行命令/数据传输。将有效的ATA命令放到特定于硬件的内存或寄存器位置。启动传输。可选择等待执行的完成。......
  • 施耐德EcoStruxure Machine SCADA Expert(EMSE)软件应用(三)
    (出差了几天)今天我们来讨论下EMSE的工程新建首先打开软件后,点“新建”可以看到下面的新增向导:专案名称:工程项目的名称支持中文,但是个人建议还是英文比较好,可以避免很多莫名的Bug。位置:工程存放的位置,这个无所谓,在哪里都可以,只要你自己能找得到。目标平台:这个很重要,首先......
  • 支持向量机(Support Vector Machine,SVM)
    支持向量机(SupportVectorMachine,简称SVM)是一种监督学习模型,主要用于分类和回归分析。SVM的基本思想是寻找一个决策边界或超平面,使得两类样本之间的间隔最大化。这个间隔被定义为支持向量到超平面的最短距离,而支持向量就是那些恰好位于间隔边缘上的训练样本点。线性可分......
  • spring statemachine
    进行状态转化的逻辑:org.springframework.statemachine.support.ReactiveStateMachineExecutor#queueEventFlux<Message<E>>messages=Flux.merge(message,Flux.fromIterable(deferList)); MonoSinkStateMachineExecutorCallbacktriggerCallback=newMonoSinkSt......
  • Fundamentals of Machine Learning for Predictive Data Analytics Algorithms, Worke
    主要内容:本书介绍了机器学习在预测数据分析中的基本原理、算法、实例和案例研究,涵盖了从数据到决策的整个过程。书中涉及机器学习项目生命周期的各个方面,包括数据准备、特征设计和模型部署。结构:本书分为五个部分,共计14章和若干附录:引言(IntroductiontoMachineLearn......
  • 6CCS3ML1 Machine Learning
    6CCS3ML1 (Machine Learning)Coursework 1(Version 1.5)1 OverviewFor this coursework, you will have to implement a classifier. You will use this classifier in some code that has to make a decision.  The code will be controll......
  • 在 Windows 操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tc
    在Windows操作系统中,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的两个重要参数控制着TCP/IP协议栈的行为。这些参数可以通过注册表来配置,影响网络连接和端口资源的管理。1.MaxUserPort路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe......