Fedora 24: VirtualBox Kernelmodule für SecureBoot selbst signieren


VirtualBox nutze ich wegen der relativ guten Grafikperformance gerne für meine Windows-VM unter Fedora 24. Bei ersten Start schlug mir eine Fehlermeldung entgegen: Das notwendige “vboxdrv”-Kernelmodul sei noch nicht geladen, daher könne die VM nicht gestartet werden. Gut - das lässt sich ja lösen:

sudo modprobe vbxdrv

… doch damit war es nicht getan: Das Modul ließ sich nicht in den Kernel einbinden, weil es für das aktive SecureBoot nicht mit einem passenden MOK (Machine Owner Key) signiert worden war. Andere geladene Kernelmodule sind bereits von Fedora signiert - bei den VirtualBox Modulen war das nicht der Fall. Warum das so ist, konnte ich noch nicht herausfinden. (=>siehe Notiz unten)

modprobe: ERROR: could not insert 'vboxdrv': Required key not available

Es gibt drei Möglichkeiten, das Problem zu beheben:

1) Secure Boot Deaktivieren

Die einfachste Möglichkeit, das SecureBoot-Problem zu umgehen, ist, die Funktion im UEFI des PCs abzuschalten.

2) Boot-Checks deaktivieren

Wer SecureBoot nicht im UEFI deaktivieren will oder kann, kann alternativ auch die Boot-Checks durch Shim deaktivieren. SecureBoot bleibt dabei aktiviert, allerdings werden Bootloader (GRUB), Kernel und Kernelmodule nicht mehr durch Shim überprüft:

sudo mokutil --disable-verification

Passwort vergeben => Neu starten => “Change secure boot state” => Passwort bei der Deaktivierung angeben

Quelle: http://www.heise.de/open/meldung/Einschraenkungen-durch-Secure-Boot-bei-Fedora-deaktivierbar-1805100.html

3) Module einen eigenen Machine Owner Key signieren

SecureBoot bleibt hierbei aktiviert und bleibt voll funktionsfähig. Eigenen MOK generieren und registrieren

Da wir den offiziellen Fedora-Key natürlich nicht zum signieren nutzen können, muss ein eigener MOK erstellt werden, sodass wir die VirtualBox-Module einfach selbst signieren können. Ein neuer Key wird so generiert:

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Custom MOK/"

Dabei werden zwei neue Keyfiles im aktuellen Verzeichnis erzeugt: MOK.priv (der private key) und MOK.der (der public key). Beide Dateien solltet ihr unbedingt gut gesichert ablegen. Das gerade erzeugte Schlüsselpaar wird nun im SecureBoot-System registriert:

sudo mokutil --import MOK.der

An dieser Stelle muss ein Passwort für die Registrierung vergeben werden. Dieses wird im nächsten Schritt nur einmalig verwendet. Sobald das Passwort festgelegt ist, wird der Rechner neu gestartet. Ihr bekommt dann einen blauen Bildschirm agezeigt, auf dem ihr gebeten werdet, eine beliebige Taste zu drücken. Wählt dann den zweiten Menüpunkt “Enroll MOK”. Mit “View Key” könnt ihr den Schlüssel nocheinmal überprüfen und via “Continue” den Key importieren. Für den Import ist das vorher gewählte Passwort notwendig. Denkt daran, dass das Tastaturlayout an dieser Stelle auf “US” umgestellt ist, sodass beispielsweise “z” und “y” auf der Tastatur vertauscht sind. Der Rechner startet nach dem Import neu.

Nach dem Neustart könnt ihr im Terminal prüfen, ob der neue Key korrekt installiert wurde. Dazu wird eine Liste der registrierten Keys ausgegeben:

mokutil --list-enrolled

Oben sollte euer eigener Key mit dem CN “Custom MOK” erscheinen. Der Key ist nun im System registriert und kann verwendet werden, um Kernelmodule zu signieren Kernelmodule mit MOK signieren

Die Signierung der VirtualBox-Module (bzw. beliebiger anderer Kernelmodule) erfolgt nun über diesen Befehl:

sudo /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)

… wobei der markierte Modulname natürlich an das zu signierende Modul angepasst werden muss. Danach kann ein Modul ganz normal via modprobe eingebunden werden:

sudo modprobe vboxdrv

In meinem Fall habe ich die Module “vboxdrv”, “vboxnetflt”, “vboxnetadp” und “vboxpci” signiert und geladen. VirtualBox funktionierte dann wieder einwandfrei. Nach VirtualBox-Updates müssen die Module ggf. neu signiert werden. MOK entfernen

Wer - aus welchen Gründen auch immer - einen MOK aus dem System entfernen will, kann das via

sudo mokutil --delete MOK.der

tun. Alle mit diesem Key signierten Kernelmodule verlieren damit ihre Gültigkeit und müssen erneut signiert werden. Auch für das Entfernen von MOKs muss eine Passphrase festgelegt werden. Nach einem Reboot startet die Schlüsselverwaltung, wo im Menüpunkt “Delete MOK” der jeweilige Schlüssel mithilfe das vorher festgelegten Passworts entfernt werden kann.

Nachtrag: Die VirtualBox Kernelmodule sind nicht mit dem offiziellen Fedora-Key signiert, weil das VB-Paket nicht von Fedora stammt, sondern aus dem von mir hinzugefügten RPM Fusion-Repository. Dort unterstützt man SecureBoot bislang nicht: http://rpmfusion.org/Howto/Secure%20Boot