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
- 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 - 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 - Tento príkaz vás požiada o vytvorenie hesla, ktoré budete potrebovať po ďalšom reštarte
1
sudo mokutil --import MOK.der -
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í - Teraz si vytvoríme skript, ktorý sa spustí neskôr (po aktualizácii systému)
1 2
cd /root/signed-modules nano sign-virtual-boxDo 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.

Comments powered by Disqus.