Príspevok

Secure Boot + VirtualBox: problém s podpisom

Problém

Nedávno som na mojej obľúbenej linuxovej distribúcii začal používať VirtualBox na správu vlastných virtuálnych počítačov. Kôli bezpečnosti mám aktivovaný secure boot. Problém, s ktorým som sa stretol, je, že môj VirtualBox nebol schpný spustiť žiadne virtuálne počítače a skončil chybovou hláškou s požiadavkou, aby som opätovne spustil /sbin/vboxconfig ako root. Keď však spustím tento skript, objaví sa nasledujúca chybová správa:

1
2
3
4
5
6
7
8
9
10
11
12
13
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: You must sign these kernel modules before using VirtualBox:
  vboxdrv vboxnetflt vboxnetadp vboxpci
See the documenatation for your Linux distribution..
vboxdrv.sh: Building VirtualBox kernel modules.
vboxdrv.sh: failed: modprobe vboxdrv failed. Please use 'dmesg' to find out why.

There were problems setting up VirtualBox.  To re-start the set-up process, run
  /sbin/vboxconfig
as root.  If your system is using EFI Secure Boot you may need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system's documentation for more information.

Je to preto, že Secure Boot neumožňuje použitie nepodpísaných ovládačov jadra a VirtualBox si vytvára vlastné ovládače ako súčasť vlastnej konfigurácie. Veľké distribúcie nepodpisujú moduly jadra tretích strán (vbox*), ale dávajú používateľovi možnosť vypnúť Secure Boot pri inštalácii balíka VirtualBox. Dá sa to riešiť aj takto, ale potom by sa pri každom spustení počítača zobrazovala nepríjemná správa “Bootovanie v nezabezpečenom režime” a tiež by nefungoval dual boot - ak tam máte napríklad Windows.

Po hľadaní na rôznych fórach som našiel skvelé rešenie tohto problému. Tu sú kroky ktoré som urobil, aby VirtualBox správne fungoval v Debian/Ubuntu s plne povoleným UEFI Secure Boot.

Riešenie

  1. Nainštalujte balíček mokutil (ak ho vaša inštalácia ešte neobsahuje)
    1
    2
    
    sudo apt-get update
    sudo apt-get install mokutil
    
  2. V novom priečinku si vytvorte RSA kľúč
    1
    2
    3
    4
    5
    
    sudo -i
    mkdir /root/signed-modules
    cd /root/signed-modules
    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"
    chmod 600 MOK.priv
    
  3. Tento príkaz vás požiada o vytvorenie hesla, ktoré budete potrebovať po ďalšom reštarte
    1
    
    sudo mokutil --import MOK.der
    
  4. Reštartujte systém a zobrazí sa modrá obrazovka ako je v úvode tohto článku, vyberte možnosť Enroll MOK --> Continue --> zadajte predchádzajúce heslo a systém sa spustí

  5. Teraz si vytvoríme skript, ktorý sa spustí neskôr (po aktualizácii systému)
    1
    2
    
    cd /root/signed-modules
    nano sign-virtual-box
    

    Do tohto skriptu pridajte nasledujúce riadky:

1
2
3
4
5
6
7
8
#!/bin/bash

for modfile in $(dirname $(modinfo -n vboxdrv))/*.ko; do
  echo "Signing $modfile"
  /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 \
                                /root/signed-modules/MOK.priv \
                                /root/signed-modules/MOK.der "$modfile"
done

Ak sa vyššie uvedené nepodarí, použite nižšie uvedený postup na nájdenie signfile a podľa toho upravte skript.

1
find /usr/src -name signfile

Vytvorenému skriptu pridajte oprávnenie pre spustenie/vykonanie a spustite skript

1
2
chmod 700 sign-virtual-box
./sign-virtual-box 

Spustite VirtualBox

1
modprobe vboxdrv

Po aktualizácii kernelu

Ako to už tak býva, nič nefunguje večne. Taktiež tento návod nefungoval na 100% a po aktualizácii kernelu som musel vykonať nasledovné príkazy (ako root), aby sa VirtualBox chytil

1
2
3
4
5
6
7
cd /root/signed-modules/
./sign-virtual-box 
lsmod | grep vbox
insmod /lib/modules/TVOJ_KERNEL-generic/misc/vboxdrv.ko 
modprobe vboxnetadp 
modprobe vboxnetflt 
lsmod | grep vbox

Namiesto TVOJ_KERNEL je potrebné dať správne označenie aktuálne používaného kernelu, napríklad 5.15.0-52. Zistíte to príkazom uname -r

Automatizácia (doplnené)

Kernel sa aktualizuje pomerne často a predchádzajúci krok bol dosť otravný. Aj na to však existuje liek, stačí procesu systemd doplniť novú službu /etc/systemd/system/sign-virtual-box.service s nasledovným obsahom:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
SourcePath=/root/signed-modules/sign-virtual-box
Description=Zabezpecenie podpisania modulov jadra Linuxu vo VirtualBoxe
Before=vboxdrv.service
After=

[Service]
Type=oneshot
Restart=no
TimeoutSec=30
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/root/signed-modules/sign-virtual-box

[Install]
RequiredBy=vboxdrv.service
WantedBy=multi-user.target

Spustite sudo systemctl reload-daemon a potom službu povoľte spustením sudo systemctl start sign-virtual-box.service

To by malo podpísať a povoliť ovládače vbox a umožniť vám spustiť vaše stroje vo VirtualBox-e.

Tento príspevok je licencovaný pod CC BY 4.0 jeho autorom.

Comments powered by Disqus.

© zvalo. Niektoré práva vyhradené.

Poháňa ma Jekyll s Chirpy témou.