技术博客

04/07/2017 作者 Mikkel

Linux系统安全启动


这是关于Linux安全启动和签名模块两篇系列文章的第1篇:

  1. Linux系统安全启动
  2. 构建并安装已签名Kvaser驱动程序模块 

什么是安全启动?

“安全启动”是2012年出现的Windows 8预装电脑里的UEFI功能。所有目前的Ubuntu 64位(非32位)版本现在支持此功能。简而言之,安全启动工作原理是在固件中启用信任源机制。虽然其它实现方式是可能的,但在实践中通过x509证书来实现信任链。根证书1嵌入在固件中,使得它可以验证签名的引导加载程序,然后,签名的引导加载程序可以验证已签名内核或已签名的第二级引导加载程序等。有关安全启动的更多信息见Ubuntu维基。2 为了使用安全启动,我们需要使用UEFI启动系统,而不是旧的BIOS。


BIOS与UEFI有什么区别?

两者都可初始化计算机,任务是加载操作系统。BIOS通过读取硬盘上的第一个扇区(主引导记录(MBR))并执行它来启动。相比之下,UEFI通过从硬盘上的分区(称为EFI系统分区(ESP))加载EFI程序文件(使用.efi文件扩展名)来启动。3


我的Linux系统是使用UEFI还是BIOS启动的?

最简单的方法是检查文件夹/sys/firmware/efi是否存在。

secureBoot:~$ ls /sys/firmware/efi/
config_table  fw_platform_size  runtime      systab
efivars       fw_vendor         runtime-map  vars

如果Linux计算机使用传统BIOS启动,则不会出现/sys/firmware/efi文件夹。

legacy:~$ ls /sys/firmware/efi
ls: cannot access /sys/firmware/efi: No such file or directory

我的Linux系统是否使用安全启动?

mokutil命令用于管理机主密钥(MOK)。这些密钥由shim层用于验证grub2和内核映像,也可用于验证安全启动是否启用。

secureBoot:~$ mokutil --sb-state
SecureBoot enabled

我们也可以使用mokutil命令来查看当前所有已注册的密钥。

secureBoot:~$ mokutil --list-enrolled

未签名模块的特征是什么?

如果我们在启用了安全启动的计算机上编译并安装了无有效签名的Kvaser驱动程序模块,即使我们连上了Kvaser分析仪,在运行listChannels示例的时候我们也不会侦测到任何通道。

secureBoot:~$ ./listChannels
Canlib version 5.20
Found 0 channel(s).

我们可以使用lsusb命令验证Kvaser分析仪实际上是由USB子系统连接和识别的。

secureBoot:~$ lsusb | grep Kvaser
Bus 003 Device 008: ID 0bfd:0108 Kvaser AB

我们现在查找系统日志中的错误,并会发现类似错误“所需密钥不可用”。

  apr 19 16:05:38 mypc /usr/sbin/mhydra.sh[22789]: modprobe: ERROR: could not insert ’mhydra’:
Required key not available
  apr 19 16:05:38 mypc systemd-udevd[22776]: Process ’/usr/sbin/mhydra.sh start’ failed
with exit code 1.

这告诉我们需要签名模块使其在计算机上工作。在下篇文章中我们将看看如何构建和签署Kvaser驱动程序模块,以便能够在启用了安全启动的Linux计算机上使用它们。


脚注

1  根证书是由受信任的证书颁发机构(CA)颁发的证书

2  有关安全启动的更多内容见Ubuntu维基https://wiki.ubuntu.com/SecurityTeam/SecureBoot/

3 BIOS和UEFI之比较见超级用户文章:https://superuser.com/questions/496026/what-is-the-difference-in-boot-with-bios-and-boot-with-uefi

Author Image

Mikkel Gerdes