我正在使用 GRUB2、SecureBoot 和 Kernel Signing,我想我在安全启动中发现了一个可能的错误,但我想先检查一下我对这些过程的理解。
我知道启用安全启动后,只能启动使用固件中加载的密钥签名的二进制文件,因此必须对所有引导加载程序进行签名。在典型的情况下是 shim 和 GRUB。
如果引导失败或者您有一些密钥要导入或删除,Shim 应该启动 MoakManager,如果一切正常,它应该启动 GRUB,它是真正的引导加载程序。
问题是我刚刚生成了一个自定义版本的 GRUB grub-mkstandalone,我用它用 OpenSSl 创建的新密钥进行了签名;我尚未在固件中导入的密钥,并且 shim 能够在没有来自安全启动的任何报告的情况下启动它。
我检查了密钥,mokutil --list-enrolled它只报告了规范证书。
所以,回顾一下:
在我的 EFI 分区中,我有:
grubx64.efi.在引导时,SHIM 可以午餐 GRUB,而 GRUB 可以成功引导 Ubuntu。
如果某些 Secure Boot 只检查第一个引导加载程序的标志,而其他加载程序负责验证它们自己以及它们预加载和用户最终加载的模块,那么这里的安全问题就非常高。
我会做更多的测试,但也许我应该打开一个错误票。
有任何想法吗?
我知道已经有很多关于此的主题,但没有一个对我有用。我尝试了这里提到的解决方案:
这是我尝试过的:
1)sudo pm-hibernate
什么都不做。
2) sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
该文件现在看起来像这样:
[在upower中默认重新启用休眠] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=yes
[在 logind 中默认重新启用休眠] Identity=unix-user:* Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1 .hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit ResultActive=yes
[默认为 login1 重新启用休眠] Identity=unix-user:*
Action=org.freedesktop.login1.hibernate ResultActive=yes[在 logind 中默认为多个用户重新启用休眠]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate-multiple-sessions
ResultActive=yes
我还将文件更改为:
[在upower中默认重新启用休眠] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=yes
[在 logind 中默认重新启用休眠] Identity=unix-user:* Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions ResultActive=yes
……但还是不行。
3)sudo update-grub菜单中仍然没有休眠选项
4) 安装 tuxonice
sudo add-apt-repository ppa:tuxonice/ppa
sudo apt-get update
sudo apt-get install tuxonice-userui linux-generic-tuxonice linux-headers-generic-tuxonice
Run Code Online (Sandbox Code Playgroud)
然后 …
过去,我成功创建了证书并签署了 virtualbox 内核模块以供使用。现在,除了 --sb-state 之外,我在运行 mokutil 时尝试的所有其他参数都失败了。
基础信息:
示例结果:
--reset
Failed to write MokAuth
Failed to issue a reset request
--list-enrolled
Failed to read MokListRT: No such file or directory
--password
input password:
input password again:
Failed to write MokPW: Invalid argument
--import MOK.der
input password:
input password again:
Failed to enroll new keys
Run Code Online (Sandbox Code Playgroud)
可能的相关资料:
dmesg | grep -i mok
[ 9.114419] MODSIGN: Couldn't get UEFI MokListRT
Run Code Online (Sandbox Code Playgroud)
有没有人对我做错了什么有任何建议?MokAuth、MokListRT、MokPW 等存储在何处无法写入它们?
一个可能相关的信息。之前成功使用 mokutil 是在硬件更改之前。我有一个 …
在显示 GRUB 之前,它显示
无法触发 tcg2 最终事件表:无效参数
出现严重错误:import_mok_state() 失败
:无效参数
和机器断电。
这是我第一次在这台机器上安装Ubuntu 19.04,带有UEFI的DELL T5810。Ubuntu 安装很好,注册Machine Owner Key MOK导致启动错误。当我跑sudo apt install virtualbox。virtualbox安装提示我注册MOK;我重新启动了机器,并注册了 MOK。然后就进入了上面的死状态。
从 Ubuntu 的 LiveUSB 安装程序引导显示相同的错误消息。幸运的是,我仍然可以在同一台机器上启动到 Windows 10。我只想恢复注册 MOK。以后不安装 Virtualbox 是可以接受的。
我试过的:
前 3 个分区是
前言:我不打算禁用安全启动,因为我有第二个安装了 Windows 10 的硬盘。这两个操作系统存在于两个独立的驱动器上,并在运行时相互隔离。Windows 启动管理器和 GRUB 存在于各自的驱动器上,彼此完全不知道。
相关系统配置为:
因此,我一直在尝试使用 mokutil 来注册我自己的证书,以便我可以使用它来加载已签名的 Nvidia 驱动程序,但是我在使整个过程正常工作时遇到了麻烦。
所以我采取的步骤是:
mokutil --enable-validation,输入了密码。mokutil --import将新创建的证书添加到安全启动密钥列表中。shimx64.efishim 是一个简单的 EFI 应用程序,它在运行时会尝试打开并执行另一个应用程序。它最初会尝试通过标准 EFI
LoadImage()和StartImage()调用来执行此操作。如果这些失败(例如,因为启用了安全启动并且二进制文件未使用适当的密钥签名),它将根据内置证书验证二进制文件。如果此操作成功并且二进制或签名密钥未列入黑名单,则 shim 将重新定位并执行二进制。
我一直在阅读以了解启用安全启动选项时验证过程是如何发生的:
vmlinuz *-generic 和 *-generic.efi.signed 的区别
我现在可以说程序是这样的:
Shim 首先由机器的固件运行。现在 shim 必须运行引导加载程序。我不明白的是 shim 如何验证二进制文件?例如,上面引用的段落指出 shim 尝试通过标准 EFILoadImage()和StartImage()调用启动另一个应用程序,如果失败,shim 尝试从内置证书验证二进制文件。那么这个内置证书属于 shim 吗?本质上,为什么 shim 被称为 Machine Owner Key Manager (MOK)?因为它有自己的密钥数据库来验证二进制文件。
简单地说,机器的固件在 NVRAM 中有自己的密钥数据库来验证二进制文件,而 shim 有自己的密钥数据库来验证二进制文件?
在验证并执行引导加载程序后,引导加载程序在哪里查找需要引导的已签名内核的密钥,例如从固件的密钥数据库中?
华硕UEFI告诉:“UEFI驱动程序不支持该VGA卡”并启用CSM(兼容性支持模块:传统BIOS启动模式)。
启用 CSM 没有多大意义,因为如果您使用 GPT 或操作系统需要 UEFI 启动,则它不会有帮助。
背景:我将旧的 ATI RV710 (HD 4x50) 插入我的 PC 中以构建多座位环境。
我在我当前的笔记本电脑以及我想要出售的旧笔记本电脑上运行 Xubuntu 18.04。我最近把它安装在后者上;它完全干净,没有 PPA 或额外的内核。
\n\n两个系统都是 Nvidia Optimus 笔记本电脑,并且都以 UEFI 模式安装。我当前的笔记本电脑已关闭安全启动。我还没有对旧的做过类似的事情。我已经在我的主笔记本电脑上通过图形驱动程序 PPA 安装了 nvidia 396,并在旧笔记本电脑上使用了官方存储库中的 nvidia 390。我的主笔记本电脑有 xanmod 内核和普通内核。旧笔记本电脑只有原厂内核。
\n\n两个系统在尝试升级内核时都会遇到 dpkg 完全挂起的情况。系统本身不会挂起,但升级会卡住。一些终端侦查表明了这一点:
\n\nTiZLappy:~$ pgrep dpkg\n2499\nTiZLappy:~$ pstree -l 2499\ndpkg\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80linux-image-4.1\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80run-parts\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80dkms_autoinstal\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80dkms\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80dkms\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80frontend\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80update-securebo\n \xe2\x94\x94\xe2\x94\x80whiptail\nTiZLappy:~$ ps aux | grep securebo\nroot 5146 0.0 0.1 111876 22928 pts/1 S+ 23:57 0:00 /usr/bin/perl -w /usr/share/debconf/frontend /usr/sbin/update-secureboot-policy --enroll-key\nroot 5160 0.0 0.0 4628 1844 pts/1 S+ 23:57 0:00 /bin/sh /usr/sbin/update-secureboot-policy --enroll-key\ntiz 10409 0.0 0.0 22004 1028 pts/2 S+ 23:59 0:00 grep --color=auto securebo\nTiZLappy:~$ ps aux | grep whiptail\nroot …Run Code Online (Sandbox Code Playgroud) 我已经使用 ubuntu 18.04从这里安装了主线内核 4.18 http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.18/
这些软件包未签名,现在 grub 在每次更新时都会抱怨这一点。
E: Your kernels are unsigned. This system will fail to boot in a secure boot environment.
Run Code Online (Sandbox Code Playgroud)
我怎样才能让这条消息消失?或者签署一些4.18?
我不打算构建自己的内核。
我在这个论坛上研究了安全启动主题以及如何禁用休眠功能。
但是,我在其他地方读到,使用补丁编译自己的内核可以启用休眠功能。有人可以提供如何执行此操作的指导吗?我找不到任何具体的东西。
顺便说一句,休眠映像无法自签名的问题是否意味着无论安全启动使用的密钥如何,它们都会被加载?
secure-boot ×10
boot ×5
kernel ×4
uefi ×4
grub2 ×2
hibernate ×2
16.04 ×1
18.04 ×1
19.04 ×1
amd-graphics ×1
apt ×1
bootloader ×1
dkms ×1
dpkg ×1
drivers ×1
dual-boot ×1
efibootmgr ×1
grub-efi ×1
signature ×1