文章目录
- linux secure boot(安全启动)下为内核模块签名
- 背景
- Secure Boot安全启动开启关闭方法
- 内核驱动签名
- 生成签名证书和私钥
- 导入签名证书
- BIOS(UEFI)导入证书(重要)
- 制作带签名的驱动
- 参考
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/