UKIFY(1)

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

ÜBERSICHT

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

BESCHREIBUNG

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.

BEFEHLE

Die folgenden Befehle werden verstanden:

  build

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].

  genkey

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.

KONFIGURATIONSEINSTELLUNGEN

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:

  Reine Befehlszeilenoptionen

--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 oder @, gefolgt von einem Pfadnamen, sein. 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.

  Abschnitt [UKI]

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 oder »@«, gefolgt von einem Pfadnamen, sein. 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].

  [PCRSignature:NAME] Abschnitt

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.

BEISPIELE

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
    SecureBootCerificate=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.

SIEHE AUCH

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

ANMERKUNGEN

1.  Vereinigtes Kernelabbild (UKI)
    https://uapi-group.org/specifications/specs/unified_kernel_image/

2.  Shim-Dokumentation
    https://github.com/rhboot/shim/blob/main/SBAT.md

Ü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 (https://www.gnu.org/licenses/gpl-3.0.html) 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 (debian-l10n-german@lists.debian.org).