前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SecureBoot101:初始安全启动

SecureBoot101:初始安全启动

作者头像
绿盟科技研究通讯
发布2023-12-05 09:39:59
2680
发布2023-12-05 09:39:59
举报

一. 概述

几十年来,个人电脑一直受到病毒、蠕虫和其他恶意软件的困扰。最早的一些个人电脑病毒是以引导扇区病毒的形式传播的:它们以代码形式存在于软盘的引导扇区中,当用户使用受感染的 DOS 软盘启动计算机时,病毒就会从一台计算机传播到另一台计算机。虽然随着软盘的淘汰和互联网连接的普及,其他病毒传播方式也逐渐受到重视,但预启动的恶意软件对系统安全仍造成巨大威胁。通过在操作系统内核获得计算机控制权之前执行,恶意软件可以 "隐藏 "起来,从而使病毒扫描程序几乎无法检测到恶意软件。

BIOS 几乎无法防止启动前恶意软件的感染;在 BIOS 启动路径中,操作系统默认信任作为启动加载程序执行的任何程序。不过,安全启动旨在为预启动过程添加一层保护。激活安全启动后,固件会检查执行的任何 EFI 程序是否存在加密签名。如果加密签名不存在、与计算机 NVRAM 中的密钥不一致或被列入 NVRAM 的黑名单,固件就会拒绝执行该程序。当然,这只是整个过程的开始;一个可信的 EFI 引导加载器必须以安全的方式继续引导过程,最终实现一个本身安全的操作系统。

“安全启动”是 2012 年出现的 Windows 8 预装电脑里的 UEFI 功能。目前所有的 Ubuntu 64位(非32位)版本支持此功能。简而言之,安全启动工作原理是在固件中启用信任源机制。这篇文章将以Ubuntu 为例,对Linux启动过程进行一个高层次的介绍,然后将继续探讨 SecureBoot 在启动过程中的作用。这篇文章的目的是让读者熟悉一些基本概念,包括:shim、EFI变量和MOK。

了解Linux的启动过程和 SecureBoot 非常重要,因为如果不充分了解 Linux 系统的内部运作,在尝试启用 SecureBoot 等设置时就很容易意外损坏系统,甚至会引发一系列的安全问题。

二. 传统启动过程与安全启动

当Ubuntu机器启动,它将经历如下4个步骤:

  • BIOS/UEFI阶段--主板上的固件,通常以只读存储器 (ROM) 的形式存储,包含用于初始化计算机硬件组件和获取引导程序(bootloader)代码的代码。
  • Bootloader阶段--将操作系统和initrd一起加载到内存中。
  • 内核阶段--内核在 initrd 文件系统内执行 init 脚本。这将加载硬件驱动程序并挂载根分区。
  • 系统启动--操作系统加载系统守护进程和服务、设置网络、挂载文件系统、启动系统日志并执行其他初始化任务

安全启动是一项安全标准。当电脑开机时,安全启动程序会从主板中的固件开始,检查每个启动文件的加密签名。这包括 UEFI 固件驱动程序(又称可选 ROM)、EFI 应用程序和操作系统。一旦通过验证,电脑就会启动,固件将控制权交给操作系统。

三. 安全启动必知的几个概念

3.1

Shim

在启用安全启动时,了解 shim 非常重要。就 SecureBoot 而言,"shim "是一种预引导程序( pre-bootloader),旨在与SecureBoot固件配合使用。当Bootloader和内核模块未包含在SecureBoot数据库中,shim提供了一种机制去加载它们。在 Ubuntu 中,pre-bootloader已预先安装并由微软签名。

安全启动使用非对称加密技术。密钥对可由用户生成,私钥用于签署所有允许运行的程序,包括 GRUB。UEFI 的固件将使用公钥来验证签名,只有签名验证通过才允许程序运行。可以使用sbverify 命令来检查自己的 shim 加载器的签名。

图1. Shim签名验证

3.2

UEFI变量

UEFI变量存储在固件的非易失性 RAM(NV-RAM)中。这些变量存储各种数据,如启动顺序首选项、超时值、网络设置、存储设备详细信息和安全启动设置。每个 UEFI 变量在/sys/firmware/efi/efivars/ 下都有自己的二进制文件。这些文件的命名规则是变量名后跟供应商 GUID。例如,SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8cm可用于存储安全启动是启用(0x01)还是禁用(0x00)。可以通过列出/sys/firmware/efi/efivars/ 的内容或使用 efivarfs 工具列出并读取值来查看其中一些变量。

图2. UEFI

3.3

Secure Boot数据库

安全启动用到了 4 个关键数据库:

允许签名数据库 (db)--包含允许在启动过程中加载的加密签名列表。

禁止签名数据库 (dbx)--包含在启动过程中不允许加载的加密签名列表。

密钥注册密钥数据库 (KEK)- 包含用于验证其他数据库的密钥交换密钥。

平台密钥数据库 (PK) - 包含用于验证bootloader或固件的签名的公钥。UEFI 建议使用 RSA-2048 平台密钥。

密钥数据库主要是规定了哪些签名允许加载、哪些不允许加载。这些数据库对安全启动非常重要,因为它有助于在模块执行前验证模块的完整性。

3.3

Machine Owner Keys (MOKs)

启动过程的另一个组成部分是机器所有者密钥(MOK)。MOK 是一个额外的密钥数据库,可由用户管理。它与 shim 附带的证书授权密钥是分开的。它们能让用户更好地控制哪些模块可以加载。例如,当用户在系统上注册一个 MOK 时,与之相关的密钥就会被添加到允许的签名数据库 (db)。这意味着在启动过程中,固件将信任任何使用该密钥签名的二进制文件。这些文件通常位于/var/lib/shim-signed/mok/目录下,名称为 MOK.der、MOK.pem 或 MOK.priv。

默认情况下,shim 提供了一个名为 MokManager 的管理工具,可用于 "注册密钥、删除密钥、注册二进制哈希值、在 shim 级别切换安全启动验证"。使用 MokManager 时通常需要密码来验证使用该工具的用户。

需要进行密钥管理时,MokManager 将帮助正确配置密钥。完成密钥管理后,系统将重新启动以启用密钥管理更改。

3.4

BootLoader配置和信息

/proc/cmdline 文件包含启动过程中传递给内核的内核启动命令行参数。

图4. 启动参数

该命令将输出bootloader通过 BOOT_IMAGE 加载的内核映像文件的路径。

BOOT_IMAGE是操作系统核心的二进制文件。它包含启动系统、管理内存、处理输入/输出操作和执行用户程序所需的代码和数据结构。bootloader可使用它们来启动操作系统。BOOT_IMAGE的名称通常代表其版本和架构。

bootloader包含自己的文件系统驱动程序(initramfs),可以通过查看/boot/initrd*文件。在 initramfs 中,early 和 early2 指的是initramfs的第一和第二阶段。在第一阶段,加载初始化硬件和挂载真实根文件系统所需的最小驱动程序和工具。在第二阶段,early2 会加载完全initramfs所需的其他驱动程序和工具。

initramfs 的主文件夹包含实际的根文件系统映像,以及启动过程中可能需要的其他工具或驱动程序。挂载根文件系统后,系统就可以继续加载运行操作系统所需的常规服务和守护进程。

图5. initramfs文件结构

可以使用 modinfo 命令检查哪些模块有数字签名,内核的签名将显示为一长串十六进制值,中间用冒号隔开。

图6. 内核模块签名

四. 结论

本文介绍了Secure Boot的几个核心概念,对Linux用户来说,安全启动介于 "无所谓 "和 "很麻烦 "之间。尽管安全启动可以提高安全性,但用户实际操作过程中,“不小心”的操作仍会造成安全风险。后续的文章将会介绍安全启动需要注意的事项,欢迎读者关注。

内容编辑:创新研究院 高 翔

责任编辑:创新研究院 董炳佑

本公众号原创文章仅代表作者观点,不代表绿盟科技立场。所有原创内容版权均属绿盟科技研究通讯。未经授权,严禁任何媒体以及微信公众号复制、转载、摘编或以其他方式使用,转载须注明来自绿盟科技研究通讯并附上本文链接。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 绿盟科技研究通讯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档