当前位置: 首页 > news >正文

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

文章目录

  • 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/

相关文章:

  • 解决数据兼容性问题
  • myBaits Target Capture Kits;myBaits 靶向捕获试剂盒,快速捕获富集目标序列
  • 百度、字节终于不再相互“抄袭”
  • 20230202英语学习
  • TypeScript类
  • this作用全解(全局this 、函数this、全局函数 this call apply bind……)
  • k8s核心资源ingress
  • 【MySQL】《狂飙》电视剧火了,如果程序一直狂飙,扛不住了,怎么办呢?
  • golang 协程关闭——谁敢说没踩过坑
  • 熵值法原理及python实现 附指标编制案例
  • Small RTOS51 学习笔记(10)Small RTOS51 的移植
  • CentOS7 LVM 逻辑卷2种读写策略(磁盘IO性能优化)—— 筑梦之路
  • 湫湫系列故事——减肥记Ⅰ(Python)
  • 分享158个ASP源码,总有一款适合您
  • 机器学习常见面试问题汇总
  • 低代码:让企业“活”起来,赋能企业数字转型
  • SAP IFRS 17 面向服务架构详细解析(包含分类账规则)
  • JavaWeb:过滤器与监听器
  • SpringBoot Log4j2日志
  • 导致商标注册失败的四大原因?
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉