当前位置:   article > 正文

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

linux secure boot

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
  • 1
  • 2
sudo update-secureboot-policy --new-key
  • 1

生成的证书(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/"
  • 1

导入签名证书

导入签名证书:

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

导入时会提示输入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
  • 1

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

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

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

参考

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/620132
推荐阅读
相关标签
  

闽ICP备14008679号