linux secure boot(安全启动)下为内核模块签名

文章介绍了Linux系统下SecureBoot的安全启动机制,它要求内核和驱动必须有数字签名。在UEFI环境中,未签名的驱动将无法加载。解决方案包括禁用SecureBoot或使用MOK(MachineOwnerKey)导入自签名证书。文章详细阐述了如何生成签名证书和私钥,导入BIOS以及为内核驱动签名的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux secure boot(安全启动)下为内核模块签名

背景

随着计算机性能和存储空间的提升,为了替代 BIOS,Intel 在 2000 年开发了了 EFI ,全称:Extensible Firmware Interface,即「可扩展固件接口」。随后,由业界多家著名公司共同成立统一可扩展固件接口论坛;将 EFI 统一化便形成了 「UEFI」:全称 Unified Extensible Firmware Interface,即「统一的可扩展固件接口」。它拥有图形化的界面、多样的操作方式以及允许植入硬件驱动等 BIOS 没有的特性,这些特性让 UEFI 相比于传统 BIOS 更加易用、更加多功能、更加方便。现在大部分的电脑默认都是使用 UEFI 的。

在 UEFI 的规范中定义了一项名为「Secure Boot」的协议,Secure Boot 只允许载入有数字签名的 EFI 驱动和启动程序。

现在很多 OS 都是通过 UEFI 引导的,如果 UEFI 里使能了 secure boot,那么需要 Signed kernel image 才能加载,对应的 kernel module 也需要是签过名的。

SecureBoot 在你系统启动前会对内核等底层的东西进行签名验证。验证通过则继续启动,验证失败无法进去系统并弹出提示。

第三方内核模块,一般是后面才编译的,编译的时候不可能拿到ubuntu官方的私钥来做签名。这些不签名的驱动,在 secure boot 模式下,就会被内核拒绝加载了(当BIOS启用Secure Boot模式后,不带签名的驱动无法加载。)

思路:解决此问题的最简单方法是在UEFI(BIOS)设置中禁用安全启动,这样内核也不检查模块的签名了,要么就把自己使用的私钥对应的公钥加到UEFI的数据库里面去。bios可以自己配置或者MOK相关的工具可以修改UEFI的公钥数据库。

即便 UEFI 里没有使能 secure boot,但如果内核是按照 CONFIG_MODULE_SIG_FORCE 配置的(也可通过内核启动参数*”module.sig_enforce=1″* 打开),那么也只有签过名的驱动能加载。

如果内核只是设置了 CONFIG_MODULE_SIG,那么未签名的驱动虽可被加载,但会被标记为 taint。

Secure Boot安全启动开启关闭方法

Secure Boot的中文名叫安全启动,它的作用就是利用预置的公钥密码,验证主板上加载的操作系统或者驱动程序,是否受信任。也就是说只有通过公钥对应的私钥签名过的系统、软件才能够通过验证并正常启动,而未通过验证的程序则无法加载。在Win8发布时微软规定硬件厂商主板中必须开启Secure Boot,并内置其公钥文件,所以Win7和一些Linux版本只能通过关闭Secure Boot才能安装启动。

1、开机界面按del键进入BIOS,一般在"Security 安全”或者“Boot 启动"中找到“Secure Boot 安全启动”。

2、将“Secure Boot”选项切换成"Enabled"表示开启,"Disabled"则是关闭。

注意:大部分主板会同时兼容两种BIOS,分别是传统Legacy BIOS和新型UEFI BIOS,只有切换到仅有UEFI模式或关闭CSM双模式自动兼容功能才能正常使用Secure Boot功能。

内核驱动签名

从内核版本4.4.0-20开始,强制要求在启用安全启动的情况下不允许运行未签名的内核模块。 如果您想要保持安全启动并运行这些模块,那么下一个逻辑步骤是签署这些模块。

生成签名证书和私钥

做驱动签名首先依赖mokutil和shim-signed

sudo apt install mokutil
sudo apt install shim-signed
sudo update-secureboot-policy --new-key

生成的证书(MOK.der)和私钥(MOK.priv)位于 /var/lib/shim-signed/mok/ 目录下。

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"

导入签名证书

导入签名证书:

sudo mokutil --import /var/lib/shim-signed/mok/MOK.der

导入时会提示输入password,随便指定就行,后面在BIOS导入的时候要用到。

BIOS(UEFI)导入证书(重要)

从 UEFI 到 OS,再从 OS 到 driver,这是一条信任链,只有被已经在 UEFI 里注册过的 key 签名的驱动,才是可信的。除了 UEFI 出厂时由 vendor 设置的 key,我们还可以在后续的使用过程中自行添加(称为 “enroll”),其依据的原理大致是:既然都能够操作 UEFI 了,那该用户添加的 key 应该是可被信赖的。

重新启动后,UEFI将询问您是否要更改安全设置。选择”Yes”。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
输入密码重启系统。

制作带签名的驱动

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /var/lib/shim-signed/mok/MOK.priv /var/lib/shim-signed/mok/MOK.der /path/to/module

/path/to/module 为你的驱动文件路径
例如:

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n xxx)

modinfo命令用于显示kernel模块的信息。
modinfo -n 为驱动的文件路径。

参考

Linux安全启动内核签名(UEFI Linux Secure Boot Kernel Signing and Verification demo)
参考URL: https://www.bilibili.com/video/av838517397/

<think>好的,用户问为什么要关闭Secure Boot安全启动)。首先,我得回忆一下Secure Boot的作用。它是UEFI固件的一个功能,用来确保启动过程中加载的软件是经过数字签名的,防止恶意软件在启动时加载。这对于Windows系统来说确实提高了安全性。 但用户的问题是在安装Ubuntu时要关闭Secure Boot,所以需要解释为什么Ubuntu安装需要这么做。首先,Ubuntu本身是支持Secure Boot的,因为Canonical有注册他们的引导加载程序的签名。那为什么有些情况下需要关闭呢? 可能的原因有几个:一是用户可能使用第三方或未经签名的驱动或内核模块,这些在Secure Boot启用时无法加载。比如某些无线网卡或显卡的专有驱动。二是如果用户使用的引导加载器(如GRUB)没有正确签名,或者安装的第三方操作系统没有注册签名Secure Boot会阻止启动。 另外,有些教程可能过时,或者用户遇到特定硬件兼容性问题,可能需要关闭Secure Boot才能继续安装。例如,某些Dell机型可能有特定的硬件配置,导致Ubuntu的默认签名驱动无法正确加载,从而需要禁用Secure Boot。 用户可能还担心关闭Secure Boot是否安全。需要解释在安装Linux时暂时关闭是常见的做法,安装完成后可以重新启用,只要所有组件都支持。但有时保持关闭可能更方便,尤其是使用自定义内核或驱动时。 还需要考虑用户的技术水平,他们可能对Secure Boot不太了解,担心关闭后的安全风险。需要简明扼要地说明利弊,以及为什么在安装Ubuntu时需要这样做。可能还要提到,虽然Ubuntu官方支持Secure Boot,但某些情况下关闭可以避免安装过程中的潜在问题。 最后,总结关键点:兼容性、驱动支持、第三方软件,以及安装后的重新启用可能性。确保回答清晰,帮助用户理解背后的原因,而不仅仅是步骤。</think>以下是关于关闭Secure Boot的详细说明: --- ### 一、Secure Boot的核心作用 $$ \text{安全启动} = \text{UEFI固件} + \text{数字签名验证} $$ 1. **设计原理** - 只允许加载经微软认证的启动程序 - 阻止未签名内核/驱动加载(如`恶意引导程序`) 2. **Windows环境优势** - 防御`Rootkit`等底层攻击 - 确保系统启动链完整性 --- ### 二、关闭Secure Boot的三大原因 #### 1. Linux兼容性问题 | 开启Secure Boot | 关闭Secure Boot | |----------------|----------------| | 仅支持带微软签名的发行版(Ubuntu已注册) | 允许加载任意开源驱动 | | 无法安装第三方内核模块(如NVIDIA驱动) | 支持自定义内核修改 | - **典型案例** ```bash # 安装NVIDIA驱动时可能出现的错误 ERROR: Unable to load the 'nvidia-drm' kernel module ``` #### 2. 硬件驱动限制 - 部分无线网卡(如Broadcom BCM43xx系列) - 老旧打印机/扫描仪驱动 - 虚拟机增强工具(VirtualBox Guest Additions) #### 3. 特殊安装需求 - 使用`LUKS`全盘加密时需要关闭 - 安装非主流Linux发行版(如Arch Linux) - 需要加载`DKMS`编译的内核模块 --- ### 三、安全风险对比 | 安全级别 | 开启Secure Boot | 关闭Secure Boot | |--------|----------------|----------------| | 启动防护 | ✔️ 阻止未签名代码 | ❌ 可能被恶意引导程序攻击 | | 运行防护 | ❌ 不影响系统运行时安全 | ✔️ 依赖系统防火墙和杀毒软件 | > **注意**:关闭Secure Boot后仍可通过以下方式提升安全性: > ```bash > sudo apt install apparmor ufw > ``` --- ### 四、Dell电脑的特殊情况 1. **企业级机型**(如Latitude系列) - 默认开启Intel Boot Guard - 关闭Secure Boot仍需硬件级验证 2. **推荐操作流程** ```mermaid graph LR A[进入BIOS] --> B[关闭Secure Boot] B --> C[安装Ubuntu] C --> D{需要微软认证?} D -->|是| E[重开Secure Boot] D -->|否| F[保持关闭] ``` --- ### 五、最佳实践建议 1. **安装完成后可重新开启**(Ubuntu 22.04已支持Secure Boot) 2. **驱动安装优先方案**: - 使用`ubuntu-restricted-extras`软件包 - 选择带`Signed Drivers`标识的驱动 3. **企业用户替代方案**: ```bash # 导入自定义密钥 sudo mokutil --import /path/to/key.der ``` > **提示**:通过`mokutil --sb-state`命令可随时查看Secure Boot状态
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值