Linux via UEFI mit Secure Boot booten – so gehts

hier nun die überarbeitete Version! Viel Spaß!

UEFI + Secureboot Howto

Vorwort

Ich habe in diversen howtos nachgelesen, immer gabs irgendwelche Schwierigkeiten, mein Linux mittels UEFI und MIT eingeschaltetem secureboot booten zu können.
Im Folgenden beschreibe ich die Einrichtung einer UEFI-tauglichen Boot-Lösung für Linux, die auch Multiboot kann. Windows kann also nach wie vor auch gestartet werden.
Sollte euer Linux auf grub oder burg als bootloader basieren und sollen automatische Kernelupdates weiterhin funktionieren, müsst ihr in Kleinigkeiten von diesem Howto abweichen. An entsprechender Stelle werde ich dann darauf hinweisen.
Ich habe das Ganze mit einem Gigabyte GA-Z87X-D3H gemacht, allerdings ohne Windowsinstallation.

Sehr hilfreich war/ist auch die Website zu rEFInd: http://www.rodsbooks.com/refind/

! ! ! W A R N U N G ! ! !


Wir machen uns an Partitionstabelle und Bootloaderinstallationen zu schaffen! Sichert eure Daten! Wenn etwas schiefgeht, hafte ich für NICHTS
!

! ! ! W A R N U N G ! ! !

Voraussetzungen

  • eine Festplatte 😉
  • ein lauffähiges Linux, entweder als Livesystem (weitere Punkte beachten) oder auf temporärer 2. Platte
  • die Pakete gnu-efi, shim, rEFInd, efitools, sbsigntools, gpt-fdisk, dosfstools, wget, unzip, efibootmgr
  • grundlegende Linuxkenntnisse
  • Zeit, Ruhe, Geduld

Konventionen

Für unser Beispiel wird Folgendes angenommen:

(Wenn eure Konfiguration abweicht, müsst ihr hier entsprechend die Befehle anpassen.
)

  • die zu installierende Festplatte ist die erste im System (/dev/sda)
  • unsere Linuxinstallation soll eine gesonderte /boot-Partition bekommen (dev/sda2)
  • auf /usr /home usw wird nicht gesondert eingegangen, wenn gesonderte Partitionen gewünscht werden, müssen die eben extra angelegt werden
  • unser Sytem ist ein 64-Bit-System
  • Secureboot ist zunächst AUSgeschaltet.

Einrichtung der Festplatte

An dieser Stelle kommt das Tool gdisk (Paket gpt-fdisk) zum Einsatz. Hiermit legen wir die benötigten Partitionen an:

gdisk /dev/sda

Bild1
Wenn schon Betriebssysteme installiert sind, die weiter genutzt werden sollen,
prüfen wir, ob schon eine EFI-Partition vorhanden ist und ob genug Platz für unser Linux frei ist. Dazu drücken wir:

p

Wenn hier alles ok ist, löschen wir die vorhandene Partitionstabelle natürlich nicht, sondern legen gegebenenfalls nur noch unsere /boot- und Systempartition an (siehe weiter unten).

Durch Drücken der Taste „o“ erstellen wir eine neue, leere GPT. (DATENVERLUST!) 
gdisk möchte dies durch Drücken der Taste „y“ bestätigt haben.
Nun legen wir zunächst unsere EFI-Partition an:

n

Nun werden wir nach der gewünschten Partitionsnummer und dem Startsektor gefragt und bestätigen diese beiden Fragen einfach durch „enter“, um die Standardwerte zu verwenden.
Die nächste Frage nach dem Endsektor beantworten wir mit

+512M

Nun werden wir nach dem Partitionstyp gefragt und beantworten dies mit

EF00

Jetzt legen wir noch unsere /boot- und unsere Systempartition, ggf auch die fürs Windows an:

n
Enter
Enter
+1024M
Enter
n
Enter
Enter+<gewünschte Größe in MB>M
Enter
Enter

(evtl weitere Partitionen nach gleichem Schema)
Beim Anlegen der Windows-Partition geben wir als Partitionstyp abweichend von den anderen an:

0700

Zur Kontrolle drücken wir nochmal

p

Bild2

Diese speichern wir nun durch Drücken der Taste

w

gdisk sollte ohne Fehlermeldung beendet werden. Hierbei gibt das System einen Hinweis aus, dass die Disks gesynct werden. Sollte hier die Info kommen, dass die neue Partitionstabelle nach dem nächsten Systemstart benutzt wird, war die Platte irgendwie in Benutzung, was eigentlich nicht sein sollte. Bevor ihr neustartet, solltet ihr hier nachsehen, warum das der Fall ist. Möglicherweise habt ihr die falsche Platte erwischt!

Die Partitionierung ist damit abgeschlossen.

>>> An dieser Stelle kann der Rechner neugestartet werden zwecks Windowsinstallation. Danach kann gegebenenfalls auch schon ein Linux installiert werden, dies könnte aber  beim Bootloader fehlschlagen.
 Wenn dies geschehen ist, starten wir wieder unser temporäres System oder das frisch installierte Linux im „Legacy-Modus“

Unsere Tools und die nächsten Arbeitsschritte setzen voraus, dass unsere EFI-Partition unter /boot/efi eingehängt ist. Vorher müssen wir diese aber noch formatieren:

mkfs.ext3 -L BOOT /dev/sda2 #(2. Partition der ersten Platte, im Bsp 1 GB groß)

Wenn wir keine vorhandene EFI-Partition nutzen, sondern im letzten Schritt selbst eine angelegt haben:

mkfs.vfat -F 32 -n EFISYS /dev/sda1

Jetzt können wir das Ganze einhängen:

mount /dev/sda2 /boot && mkdir /boot/efi && mount /dev/sda1 /boot/efi

Jetzt folgt die eigentliche Arbeit…

Installation von shim und rEFInd

shim ist quasi ein kleiner bootloader, der häufig anderen vorangestellt wird, um Secureboot zu ermöglichen. Er erleichtert und das Leben mit den Signaturen unter Linux, da wir sogenannte MOK-Zertifikate benutzen können.

rEFInd dagegen ist ein Bootmanager. Aktuelle Linuxkernel sind unter EFI quasi ohne echten Bootloader ladefähig, rEFInd ermöglicht uns Multiboot und andere nette Sachen.

Wir benötigen nun ein Arbeitsverzeichnis mit ein wenig Platz, notfalls können wir uns das temporär in unserem /boot-Verzeichnis anlegen. In dieses Verzeichnis wechseln wir und laden uns die Pakete herunter und entpacken sie: Wenn Dein Linux mit grub etc arbeitet, brauchst Du nun ein grub-image, das efi-kompatibel ist. Anstelle von rEFInd kopierst Du nun dieses nach /boot/EFI/BOOT/grubx64.efi.

 

wget http://www.codon.org.uk/~mjg59/shim-signed/shim-signed-0.2.tgz
wget http://downloads.sourceforge.net/project/refind/0.7.3/refind-bin-0.7.3.zip
tar xf shim-signed-0.2.tgz
unzip refind-bin-0.7.3.zip
mkdir -p /boot/efi/EFI/BOOT/
cp shim-signed/MokManager.efi /boot/efi/EFI/BOOT/
cp shim-signed/shim.efi /boot/efi/EFI/BOOT/BOOTX64.efi
cp -a refind-bin-0.7.3/refind/{drivers_x64,icons} /boot/efi/EFI/BOOT/
cp refind-bin-0.7.3/refind/refind.conf-sample /boot/efi/EFI/BOOT/refind.conf
cp refind-bin-0.7.3/refind/refind_x64.efi /boot/efi/EFI/BOOT/grubx64.efi
cp -a refind-bin-0.7.3/fonts /boot/efi/EFI/BOOT/

Damit sind nun zumindest die grundlegenden Voraussetzungen geschaffen, bootfähig ist das so aber noch nicht. Die Datei /boot/EFI/BOOT/refind.conf beinhaltet die eigentliche Konfiguration und ist gut kommentiert. Wenn diese passt (man kann rEFInd beim Booten auch nach möglichen Betriebssystemen suchen lassen, man muss das nur aktivieren), steht dem Booten per UEFI theoretisch nun nichts mehr im Wege, solange secureboot ausgeschaltet ist. Wir testen das Ganze am besten einfach, indem wir versuchen, von unserer Platte via UEFI zu booten. Sollte das NICHT klappen, müssen wir dem EFI sagen, wo es den Bootloader findet, das wird nun etwas kniffeliger. Wenn nach dem Reboot ein hübscher rEFInd-Screen erscheint, kann der nächste Abschnitt übersprungen werden.

Einrichtung des UEFI für unseren Bootmanager

Hier wirds kniffelig. Um dem UEFI zu sagen, dass es unseren Bootmanager benutzen soll, müssen wir irgendwie schon via UEFI gebootet haben.
Der Trick: Ich benutze eine Fedora-Live-Version, die ich mir auf einen USB-Stick gebastelt habe. Anleitungen dazu findet ihr ganz schnell via google. 🙂 Wir booten vom Stick also im UEFI-Modus (nicht legacy, ganz wichtig). Jetzt kommt ein Programm namens efibootmgr zum Einsatz, dazu brauchen wir eine Konsole mit root-Rechten. Der einfache Aufruf zeigt uns nun, was das System alles als bootfähig erkannt hat:

efibootmgr

In etwa sieht die Ausgabe dann so aus:

Bild3

In diesem Falle hat das System von der angezeigten Festplatte gebootet, das sieht bei Euch dann etwas anders aus, ist aber auch nicht weiter schlimm. Wie angenommen, möchten wir von der ersten Platte im System booten und sagen unserem EFI das nun:

efibootmgr -c -l \EFI\BOOT\BOOTX64.efi -L "UEFI: OS"

Wir bekommen nun eine Ausgabe, wie oben, nur erweitert um unseren Eintrag. Interessant ist jetzt die Reihenfolge, die da hinter „Bootorder“ steht. Unser neuer Eintrag hat ja auch eine Nummer erhalten. In meinem Falle war die 0000 nicht vergeben und der neue Eintrag hat diese nun bekommen. Allerdings ist die Reihenfolge ja noch: 0001,0000.  Wir ändern das mit

efibootmgr -o 0,1

und bekommen das nun bestätigt. Wichtig: natürlich müsst ihr die Nummern angeben, die EUER System benutzt.

Bild4

Nach einem Neustart sollte jetzt in jedem Falle der rEFInd-Screen zu sehen sein. Wenn nicht, ist Fehlersuche angesagt. Eventuell ist ja weiter oben etwas unbemerkt schiefgelaufen. Speziell würde ich folgendes prüfen:

  • Sind alle Dateien in /boot/efi/EFI/BOOT vorhanden, intakt und richtig benannt?
  • ist die /boot/efi/EFI/boot/refind.conf in Ordnung? (Hier auch Pfade prüfen)
  • zeigt efibootmgr unser Bootsystem an und stimmt die Bootreihenfolge?

Secureboot

Unser Linux bootet, allerdings noch immer ohne Secureboot. Jetzt werden wir genau DAS noch ändern. Zusammenfassend sollte das jetzt so aussehen:

  • Unser Linux ist inzwischen installiert. (kann man im Legacy-Mode machen, nachdem Windows installiert wurde)
  • /boot und /boot/efi sind korrekt gemountet
  • Die Pakete gnu-efi, help2man und sbsigntools sind installiert.

Problematik: shim und auch rEFInd sind zwar signiert, allerdings kennt unser „BIOS“ diese Signaturen ja gar nicht. Außerdem sind diese verschieden signiert und unser Kernel ist es überhaupt nicht.

Erstellung der Schlüssel und Zertifikate

Wir werden uns daher nun die Efitools besorgen, eigene Schlüssel und Zertifikate erzeugen, alle nötigen Binaries signieren und unserem „BIOS“ unseren Schlüssel bekannt machen. Die Efitools gibts hier:

http://download.opensuse.org/repositories/home:/jejb1:/UEFI/

Oder Du baust sie dir selbst (benötigt git). Dies ist die von mir bevorzugte Variante, man bekommt auf einen Schlag alle Zertifikate und Keys in ganz frisch. Zunächst prüfen wir, ob es im System ein xxd-Kommando gibt:

which xxd

Wenn hier ein Pfad mit dem Kommando angegeben wird, ist alles schick, ansonsten installieren wir es:

wget http://grail.cba.csuohio.edu/~somos/xxd-1.10.tar.gz 
tar xf xxd-1.10.tar.gz && cd xxd-1.10
make && cp xxd /usr/bin
cp xxd.1 /usr/share/man/man1
cd ..
git clone git://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git
cd efitools
make
make install
cp /usr/share/efitools/efi/* /boot/efi/EFI/tools/
mkdir /boot/PK
for file in *.crt *.key *.auth *.esl; do cp $file /boot/PK/; done
pushd /boot/PK
for name in DB KEK PK; do openssl x509 -in ${name}.crt -out ${name}.cer -outform DER; done

Unsere Schlüssel und zugehörigen Zertifikate sind damit erstellt. Für die Weiterarbeit ist es sinnvoll, sie im /boot-Verzeichnis zu belassen, ansonsten sollten sie gut gesichert werden. Wir räumen noch auf:

popd
cd ..
rm -rf efitools xxd-1.10

als nächstes werden wir nun Bootloader, Bootmanager und den Kernel signieren.
Wir machen es uns bequem und wechseln nach /boot

cd /boot

zunächst signieren wir alles im EFI-Ordner, was noch nicht mit unserem eigenen Schlüssel signiert ist:

for file in `find efi/EFI/BOOT/ -name *.efi`; do mv $file{,-unsigned} && sbsign --key PK/DB.key --cert PK/DB.crt --output $file ${file}-unsigned && rm -f ${file}-unsigned; done

Jetzt noch den/die Kernel:

for file in `ls vmlinu*`; do mv $file{,-unsigned} && sbsign --key PK/DB.key --cert PK/DB.crt --output $file ${file}-unsigned && rm -f ${file}-unsigned; done


mv PK efi/

Einfügen unserer Signaturen ins nvram

Nun kommt der letzte Schritt: wir müssen noch unserem EFI unsere neuen Schlüssel mitgeben. Das läuft über das BIOS Setup. Wenn wir das aufgerufen haben, sollte es unter dem Menüpunkt „BIOS Features“ die Einstellungen für Secureboot geben. Bei OS soll tatsächlich Windows8 stehen, nicht „Other OS“. Secureboot schalten wir nun ein. Weiter unten gibts bei mir den Punkt „Secure Boot Mode“. Den stellen wir von „standard“ auf „custom“

Bild5

Wir gehen weiter unten in das Key Management:

Bild6

In diesem Menü suchen wir uns den Punkt „Append an entry to KEK“. Mit Enter kommen wir in ein Auswahlmenü. Der Ordner „PK“, den wir vorhin noch verschoben haben, sollte sichtbar sein. Wir hangeln uns durch bis zur Datei „KEK.auth“, bestätigen so oft, bis uns das Bios sagt, dass der Vorgang erfolgreich war.

Jetzt gehen wir zum Punkt „Append an entry to DB“. Die Vorgehensweise ist gleich, nur diesmal wählen wir die Datei „DB.auth“ aus.

Bild7

Nachdem auch dies erfolgreich war, beenden wir mit „Save & Exit“ und sollten bald unseren rEFInd-Screen wiedersehen.

Bild8

Unter „Info“ sollte nun auch stehen „secure boot enabled“.

Bild9

Und wenn wir jetzt wieder zurück gehen ins Hauptmenü, sollte unser System dort natürlich jetzt auch bootfähig sein.

Wenn alles geklappt hat, ist es sinnvoll, den Ordner /boot/efi/PK so zu sichern, dass nichts und niemand dort herankommt, außer man selbst. Er muß nicht zwangsläufig auf der /boot-Partition bleiben.

Ich habe nicht versucht, Windows so zu booten, aber es sollte funktionieren. Wenn nicht, kann man auch den Windows-Bootloader verwenden, um rEFInd zu starten, dies soll hier aber nicht behandelt werden.

Schlagwörter: , ,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Ich stimme zu.