UKIFY(1) ukify UKIFY(1)

ukify - Komponenten zu einem einzigen, vereinigten Kernelabbild für UEFI-Systeme kombinieren

ÜBERSICHT

/usr/lib/systemd/ukify [OPTIONEN…] build

ukify [OPTIONEN…] genkey

Hinweis: Dieser Befehl ist derzeit experimentell. Es ist zwar geplant, dass er eine normale Komponente von Systemd wird, aber sein Verhalten und seine Schnittstellen können sich noch ändern.

ukify ist ein Werkzeug, dessen Hauptzweck die Kombination von Komponenten (normalerweise einem Kernel, einer Initrd und einem UEFI-Startrumpf) ist, um ein Vereinigtes Kernelabbild (UKI)[1] zu erstellen – ein PE-Programm, das durch die Firmware ausgeführt werden kann, um einen eingebetteten Linux-Kernel zu starten. Siehe systemd-stub(7) für Details über den Rumpf.

Die folgenden Befehle werden verstanden:

Dieser Befehl erstellt ein vereinigtes Kernelabbild. Die zwei zentralen Optionen, die für das Verb build angegeben werden sollten, sind Linux=/--linux= und Initrd=/--initrd=. Initrd= akzeptiert mehrere, durch Leerraum getrennte Pfade und --initrd= kann mehrfach angegeben werden.

Es werden zusätzliche Abschnitte in den UKI eingefügt, entweder automatisch oder nur falls eine bestimmte Option bereitgestellt wird. Siehe die nachfolgende Besprechung von Cmdline=/--cmdline=, OSRelease=/--os-release=, DeviceTree=/--devicetree=, Splash=/--splash=, PCRPKey=/--pcrpkey=, Uname=/--uname=, SBAT=/--sbat= und --section=.

ukify kann auch zum Zusammenbau eines PE-Programmabbilds verwandt werden, das nicht ausführbar ist, aber zusätzliche Daten enthält, beispielsweise zusätzliche Kernelbefehlszeileneinträge.

Falls über die Optionen PCRPrivateKey=/--pcr-private-key= und PCRPublicKey=/--pcr-public-key= PCR-Signierschlüssel bereitgestellt werden, werden PCR-Werte, die nach dem Systemstart mit dem angegebenen Kernel, der Initrd und anderen Abschnitten vorkommen, berechnet, signiert und in das UKI eingebettet. Diese Berechnung und Signatur erfolgt mit systemd-measure(1).

Die Berechnung von PCR-Werten erfolgt für bestimmte Systemstartphasenpfade. Diese können mit der Option Phases=/--phases= angegeben werden. Falls nicht angegeben, wird die von systemd-measure(1) bereitgestellte Vorgabe verwandt. Es ist auch möglich, die Argumente PCRPrivateKey=/--pcr-private-key=, PCRPublicKey=/--pcr-public-key= und Phases=/--phases= mehr als einmal anzugeben. Die Signaturen erfolgen dann mit jedem der angegebenen Schlüssel. Wird auf der Befehlszeile sowohl --phases= als auch --pcr-private-key= verwandt, müssen sie beide gleich häufig angegeben werden und der n-te Systemstartphasenpfad wird mit dem n-ten Schlüssel signiert. Dies kann zur Erstellung verschiedener Vertrauensrichtlinien für die verschiedenen Phasen des Systemstarts verwandt werden. In der Konfigurationsdatei werden PCRPrivateKey=, PCRPublicKey= und Phases= in verschiedene Abschnitte gruppiert, die getrennte Systemstartphasen beschreiben.

Falls ein SecureBoot-Signaturschlüssel über die Option SecureBootPrivateKey=/--secureboot-private-key= bereitgestellt ist, wird das resultierende PE-Programm als Ganzes damit signiert. Damit wird ermöglicht, dass SecureBoot dem gesamten UKI vertraut. Siehe auch die Erläuterung der automatischen Registrierung in systemd-boot(7).

Falls der Rumpf oder der Kernel einen Abschnitt ».sbat« enthält, werden sie im UKI zusammengeführt, so dass Widerrufsaktualisierungen, die eines davon betreffen, berücksichtigt werden, wenn das UKI vom Shim geladen wird. Für weitere Informationen zu SBAT siehe die Shim-Dokumentation.[2].

Dieser Befehl erstellt die Schlüssel für die PCR-Signatur und die Schlüssel und Zertifikate, die für das SecureBoot-Signieren verwandt werden. Die gleichen Konfigurationsoptionen, die bestimmen, welche Schlüssel und in welchen Pfaden für die Signatur benötigt werden, wenn build verwandt wird, bestimmen hier, welche Schlüssel erstellt werden. Siehe die nachfolgende Diskussion von PCRPrivateKey=/--pcr-private-key=, PCRPublicKey=/--pcr-public-key= und SecureBootPrivateKey=/--secureboot-private-key=.

Die Ausgabedatei darf nicht existieren.

Einstellungen können in Konfigurationsdateien vorkommen (die Syntax mit EineEinstellung=Wert) und auf der Befehlszeile (die Syntax mit --eine-Einstellung=Wert). Für einige Befehlszeilenparameter ist auch eine einbuchstabige Kurzform verfügbar. In den Konfigurationsdateien muss die Einstellung in dem geeigneten Abschnitt sein, daher sind die Beschreibungen nachfolgend nach Abschnitten gruppiert. Wenn die gleiche Einstellung in der Konfigurationsdatei und auf der Befehlszeile vorkommt, hat im Allgemeinen die Befehlszeileneinstellung die höhere Priorität und überschreibt die Konfigurationsdateieinstellungen vollständig. Falls sich eine Einstellung anders verhält, ist dies nachfolgend beschrieben.

Die positionsabhängigen Argumente LINUX und INITRD oder die äquivalenten Einstellungen Linux= und Initrd= sind optional. Falls mehr als ein Initrd angegeben ist, werden sie alle in einen einzigen PE-Abschnitt kombiniert. Dies ist zum Beispiel nützlich, um der eigentlichen Initrd Microcode voranzustellen.

Die folgenden Optionen und Einstellungen werden verstanden:

--config=PFAD

Lädt die Konfiguration aus der angegebenen Konfigurationsdatei. Im Allgemeinen sind in der Konfigurationsdatei angegebene Einstellungen gegenüber den Einstellungen als Optionen nachrangig. In den Fällen, in denen die Befehlszeilenoption die Einstellung aus der Konfigurationsdatei nicht vollständig außer Kraft setzt, ist dies in der Beschreibung der entsprechenden Optionen explizit erwähnt.

--measure, --no-measure

Aktiviert oder deaktiviert einen Aufruf von systemd-measure(1), um vorberechnete PCR-Werte auszugeben. Standardmäßig falsch.

--section=NAME:TEXT|@PFAD

Gibt einen beliebigen, zusätzlichen Abschnitt »NAME« an. Beachten Sie, dass der Name unverändert verwandt wird und den Punkt enthalten muss, falls der Abschnittsname mit einem Punkt beginnen soll. Das Argument kann eine wörtliche Zeichenkette sein oder @, gefolgt von einem Pfadnamen. Diese Option kann mehr als einmal angegeben werden. Jeder auf diese Weise angegebene Abschnitt wird (in der Reihenfolge) vor dem Abschnitt ».linux«, der immer der letzte ist, eingefügt.

--tools=VERZ

Gibt eines oder mehrere Verzeichnisse mit Hilfswerkzeugen an. ukify wird zuerst in diesen Verzeichnissen nach Hilfswerkzeugen schauen und, falls sie dort nicht gefunden werden, sie auf die übliche Weise aus $PATH laden.

--output=DATEINAME

Der Ausgabedateiname. Falls nicht angegeben, wird der Name des Arguments LINUX mit der Endung ».unsigned.efi« oder ».signed.efi« verwandt, abhängig davon, ob die Signatur für SecureBoot durchgeführt wurde.

--summary

Gibt eine Zusammenfassung der geladenen Konfiguration aus und beendet das Programm. Dies ist nützlich, um zu überprüfen, wie die Optionen aus der Konfigurationsdatei und der Befehlszeile kombiniert werden.

-h, --help

Zeigt einen kurzen Hilfetext an und beendet das Programm.

--version

Zeigt eine kurze Versionszeichenkette an und beendet das Programm.

Linux=LINUX, --linux=LINUX

Ein Pfad zu dem Kernelprogramm.

Initrd=INITRD, --initrd=LINUX

Null oder mehr Initrd-Pfade. In der Konfigurationsdatei werden Einträge durch Leerraum getrennt. Die Initrds werden in der Reihenfolge der Angabe kombiniert, wobei die in der Konfigurationsdatei angegebenen Initrds zuerst kommen.

Cmdline=TEXT|@PFAD, --cmdline=TEXT|@PFAD

Die Kernelbefehlszeile (der Abschnitt ».cmdline«). Das Argument kann eine wörtliche Zeichenkette sein oder »@«, gefolgt von einem Pfadnamen. Falls dies nicht angegeben ist, wird keine Befehlszeile eingebettet.

OSRelease=TEXT|@PFAD, --os-release=TEXT|@PFAD

Die Betriebssystem-Veröffentlichungsbeschreibung (der Abschnitt ».osrel«). Das Argument kann eine wörtliche Zeichenkette oder »@«, gefolgt von einem Pfadnamen, sein. Falls dies nicht angegeben ist, wird die Datei os-release(5) vom Rechnersystem genommen.

DeviceTree=PFAD, --devicetree=PFAD

Die Devicetree-Beschreibung (der Abschnitt ».dtb«). Das Argument ist ein Pfad zu einer kompilierten binären DeviceTree-Datei. Falls dies nicht angegeben ist, wird der Abschnitt nicht vorhanden sein.

Splash=PFAD, --splash=PFAD

Ein Bild, das während des Systemstarts angezeigt werden soll (der Abschnitt ».splash«). Das Argument ist ein Pfad zu einer BMP-Datei. Falls dies nicht angegeben ist, wird der Abschnitt nicht vorhanden sein.

PCRPKey=PFAD, --pcrpkey=PFAD

Ein Pfad zu einem öffentlichen Schlüssel, der im Abschnitt ».pcrpkey« eingebettet werden soll. Falls nicht angegeben und genau ein Argument PCRPublicKey=/--pcr-public-key= vorhanden ist, wird dieser Schlüssel verwandt. Andernfalls wird dieser Abschnitt nicht vorhanden sein.

Uname=VERSION, --uname=VERSION

Gibt die Kernelversion an (wie in uname -r, den Abschnitt ».uname«). Falls nicht angegeben, wird versucht, die Versionszeichenkette aus dem Kernelabbild auszulesen. Es wird empfohlen, sie explizit zu übergeben, wenn sie bekannt ist, da das Auslesen auf Heuristiken basiert und nicht sehr zuverlässig ist. Falls nicht angegeben und das Auslesen fehlschlägt, wird der Abschnitt nicht vorhanden sein.

PCRBanks=PFAD, --pcr-banks=PFAD

Eine Kommata- oder Leerraum-getrennte Liste von PCR-Bänken, für die eine Richtlinie signiert werden soll. Falls nicht vorhanden, werden alle bekannten Bänke verwandt (»sha1«, »sha256«, »sha384«, »sha512«). Dies wird fehlschlagen, wenn das vom System nicht unterstützt wird.

SecureBootSigningTool=SIGNIERER, --signtool=SIGNIERER

Ob »sbsign« oder »pesign« verwandt werden soll. Abhängig von dieser Wahl werden verschiedene Parameter benötigt, um ein Abbild zu signieren. Standardmäßig »sbsign«.

SecureBootPrivateKey=SB_SCHLÜSSEL, --secureboot-private-key=SB_SCHLÜSSEL

Ein Pfad zu einem privaten Schlüssel, der zum Signieren des resultierenden Programms verwandt wird. Falls die Option SigningEngine=/--signing-engine= verwandt wird, kann dies auch eine Engine-spezifische Festsetzung sein. Diese Option wird von SecureBootSigningTool=sbsign/--signtool=sbsign benötigt.

SecureBootCertificate=SB_ZERT, --secureboot-certificate=SB_ZERT

Ein Pfad zu einem Zertifikat, das zum Signieren des resultierenden Programms verwandt wird. Falls die Option SigningEngine=/--signing-engine= verwandt wird, kann dies auch eine Engine-spezifische Festsetzung sein. Diese Option wird von SecureBootSigningTool=sbsign/--signtool=sbsign benötigt.

SecureBootCertificateDir=SB_PFAD, --secureboot-certificate-dir=SB_PFAD

Ein Pfad zu einem NSS-Zertifikatsdatenbankverzeichnis, das zum Signieren des resultierenden Programms verwandt wird. Wird wirksam, wenn SecureBootSigningTool=pesign/--signtool=pesign verwandt wird. Standardmäßig /etc/pki/pesign.

SecureBootCertificateName=SB_ZERTNAME, --secureboot-certificate-name=SB_ZERTNAME

Der Name des NSS-Zertifikatsdatenbankeintrags, der zur Signierung des entstehenden Programms verwandt werden soll. Diese Option wird von SecureBootSigningTool=pesign/--signtool=pesign verlangt.

SecureBootCertificateValidity=TAGE, --secureboot-certificate-validity=TAGE

Gültigkeitsdauer (in Tagen) für ein durch genkey erstelltes Zertifikat. Standardmäßig 3650, d.h. 10 Jahre.

SigningEngine=ENGINE, --signing-engine=ENGINE

Eine »Engine« zum Signieren des resultierenden Programms. Diese Option wird derzeit unverändert an die Option --engine= von sbsign(1) weitergegeben.

SignKernel=LOGISCH, --sign-kernel, --no-sign-kernel

Setzt die Erkennung, ob das Linux-Programm selbst vor dem Einbetten in das kombinierte Abbild signiert werden soll, außer Kraft. Falls nicht angegeben, wird es signiert, falls ein SecureBoot-Signaturschlüssel über die Option SecureBootPrivateKey=/--secureboot-private-key= bereitgestellt wird und das Programm noch nicht signiert wurde. Falls --sign-kernel wahr ist und das Programm bereits signiert wurde, wird die Signatur trotzdem angehängt.

SBAT=TEXT|@PFAD, --sbat=TEXT|@PFAD

Dem UKI oder der Ergänzung zugeordnete SBAT-Metadaten. SBAT-Richtlinien sind zum Widerruf von Gruppen von UKIs oder Ergänzungen mit einer einzelnen, statischen Richtlinienaktualisierung nützlich, die keinen Platz in DBX/MOKX belegt. Falls nicht händisch angegeben, wird ein Standardmetadateneintrag bestehend aus »uki,1,UKI,uki,1,https://www.freedesktop.org/software/systemd/man/systemd-stub.html« verwandt, um sicherzustellen, dass es immer möglich ist, UKIs und Ergänzungen zu widerrufen. Für weitere Informationen über SBAT siehe die Shim-Dokumentation[2].

In der Konfigurationsdatei werden diese Optionen nach Abschnitten gruppiert. Auf der Befehlszeile müssen sie in der gleichen Reihenfolge angegeben werden. Die in beiden Quellen angegebenen Abschnitte werden kombiniert.

PCRPrivateKey=PFAD, --pcr-private-key=PFAD

Ein privater Schlüssel zum Signieren von PCR-Richtlinien. Auf der Befehlszeile darf diese Option mehr als einmal angegeben werden. Dann werden mehrere Signaturen erstellt.

PCRPublicKey=PFAD, --pcr-public-key=PFAD

Ein öffentlicher Schlüssel, der zum Signieren von PCR-Richtlinien verwandt wird.

Auf der Befehlszeile darf diese Option mehr als einmal angegeben werden, ähnlich wie die Option --pcr-private-key=. Falls nicht vorhanden werden die öffentlichen Schlüssel aus den privaten Schlüsseln abgeleitet. Falls auf der Befehlszeile vorhanden, muss diese Option genauso oft wie die Option --pcr-private-key= angegeben werden.

Phases=LISTE, --phases=LISTE

Eine durch Kommata oder Leerzeichen getrennte Liste von Doppelpunkt getrennten Phasenpfaden, für die eine Richtlinie signiert werden soll. Jede Gruppe von Systemstartphasenpfaden wird mit dem entsprechenen privaten Schlüssel signiert. Falls nicht vorhanden, wird die Vorgabe von systemd-measure(1) verwandt.

Wenn dieses Argument auf der Befehlszeile vorhanden ist, muss es genauso oft wie die Option --pcr-private-key= vorkommen.

Beispiel 1. Minimaler Aufruf

$ ukify build \

--linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \
--initrd=/ein/Pfad/initramfs-6.0.9-300.fc37.x86_64.img \
--cmdline='quiet rw'

Dies erstellt ein unsigniertes UKI ./vmlinuz.unsigned.efi.

Beispiel 2. Mit allem Schnickschnack

$ /usr/lib/systemd/ukify build \

--linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \
--initrd=early_cpio \
--initrd=/ein/Pfad/initramfs-6.0.9-300.fc37.x86_64.img \
--sbat='sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
uki.author.myimage,1,UKI for System,uki.author.myimage,1,https://www.freedesktop.org/software/systemd/man/systemd-stub.html' \
--pcr-private-key=pcr-private-initrd-key.pem \
--pcr-public-key=pcr-public-initrd-key.pem \
--phases='enter-initrd' \
--pcr-private-key=pcr-private-system-key.pem \
--pcr-public-key=pcr-public-system-key.pem \
--phases='enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit \
enter-initrd:leave-initrd:sysinit:ready' \
--pcr-banks=sha384,sha512 \
--secureboot-private-key=sb.key \
--secureboot-certificate=sb.cert \
--sign-kernel \
--cmdline='quiet rw rhgb'

Dies erstellt ein signiertes UKI ./vmlinuz.signed.efi. Der Initrd-Abschnitt enthält zwei aneinandergehängte Teile, early_cpio und initramfs-6.0.9-300.fc37.x86_64.img. Die in dem Abschnitt ».pcrsig« eingebettete Richtlinie wird für die Initrd mit dem Schlüssel pcr-private-initrd-key.pem signiert (die Phase enter-initrd) und für das Hauptsystem (Phase leave-initrd, sysinit, ready) mit dem Schlüssel pcr-private-system-key.pem. Das Linux-Programm und das resultierende kombinierte Abbild wird mit dem SecureBoot-Schlüssel sb.key signiert.

Beispiel 3. Mit allem Schnickschnack, über eine Konfigurationsdatei

Dies ist das gleiche wie das vorherige Beispiel, diesmal wird die Konfiguration aber in einer Datei gespeichert:

$ cat ukify.conf
[UKI]
Initrd=early_cpio
Cmdline=quiet rw rhgb
SecureBootPrivateKey=sb.key
SecureBootCertificate=sb.cert
SignKernel=yes
PCRBanks=sha384,sha512
[PCRSignature:initrd]
PCRPrivateKey=pcr-private-initrd-key.pem
PCRPublicKey=pcr-public-initrd-key.pem
Phases=enter-initrd
[PCRSignature:system]
PCRPrivateKey=pcr-private-system-key.pem
PCRPublicKey=pcr-public-system-key.pem
Phases=enter-initrd:leave-initrd

enter-initrd:leave-initrd:sysinit
enter-initrd:leave-initrd:sysinit:ready $ /usr/lib/systemd/ukify -c ukify.conf build \
--linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \
--initrd=/ein/Pfad/initramfs-6.0.9-300.fc37.x86_64.img

Eine »initrd« (early_cpio) wird in der Konfigurationsdatei angegeben und die andere Initrd (initramfs-6.0.9-300.fc37.x86_64.img) wird auf der Befehlszeile angegeben. Dies könnte beispielsweise nützlich sein, wenn die erste Initrd Mikrocode für die CPU enthält und bei Änderungen der Kernelversion nicht aktualisiert werden muss, anders als die eigentliche Initrd.

Beispiel 4. Kernelbefehlszeile, zusätzlicher PE

ukify build \

--secureboot-private-key=sb.key \
--secureboot-certificate=sb.cert \
--cmdline='debug' \
--sbat='sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
uki.addon.author,1,UKI Addon for System,uki.addon.author,1,https://www.freedesktop.org/software/systemd/man/systemd-stub.html'
--output=debug.cmdline

Dies erstellt ein signiertes PE-Programm, das den zusätzlichen Kernelbefehlszeilenparameter »debug« mit SBAT-Metadaten, die sich auf den Eigentümer der Ergänzung beziehen, enthält.

Beispiel 5. Signierrichtlinien entscheiden und Zertifikate und Schlüssel erstellen

Zuerst wird eine Konfigurationsdatei erstellt, die angibt, welche Signaturen erstellt werden sollen:

# cat >/etc/kernel/uki.conf <<EOF
[UKI]
SecureBootPrivateKey=/etc/kernel/secure-boot.key.pem
SecureBootCertificate=/etc/kernel/secure-boot.cert.pem
[PCRSignature:initrd]
Phases=enter-initrd
PCRPrivateKey=/etc/kernel/pcr-initrd.key.pem
PCRPublicKey=/etc/kernel/pcr-initrd.pub.pem
[PCRSignature:system]
Phases=enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit

enter-initrd:leave-initrd:sysinit:ready PCRPrivateKey=/etc/kernel/pcr-system.key.pem PCRPublicKey=/etc/kernel/pcr-system.pub.pem EOF

Als nächstes können die Zertifikate und Schlüssel erstellt werden:

# /usr/lib/systemd/ukify genkey --config=/etc/kernel/uki.conf
Writing SecureBoot private key to /etc/kernel/secure-boot.key.pem
Writing SecureBoot certificate to /etc/kernel/secure-boot.cert.pem
Writing private key for PCR signing to /etc/kernel/pcr-initrd.key.pem
Writing public key for PCR signing to /etc/kernel/pcr-initrd.pub.pem
Writing private key for PCR signing to /etc/kernel/pcr-system.key.pem
Writing public key for PCR signing to /etc/kernel/pcr-system.pub.pem

(Beide Aktionen müssen als Root durchgeführt werden, um Schreibzugriff auf /etc/kernel/ zu erlauben.)

Nachfolgende Aufrufe, die die Konfigurationsdatei (/usr/lib/systemd/ukify build --config=/etc/kernel/uki.conf) verwenden, werden diese Zertifikats- und Schlüsseldateien verwenden. Beachten Sie, dass kernel-install(8)-Erweiterung 60-ukify.install standardmäßig /etc/kernel/uki.conf verwendet. Daher würde nach der Erstellung dieser Datei bei der Installation von Kerneln, die mittels kernel-install einen UKI auf der lokalen Maschine erstellen, die Signatur mittels dieser Konfiguration erfolgen.

systemd(1), systemd-stub(7), systemd-boot(7), systemd-measure(1), systemd-pcrphase.service(8)

1.
Vereinigtes Kernelabbild (UKI)
2.
Shim-Dokumentation

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.

systemd 254