UKIFY(1)

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

ÜBERSICHT

ukify [OPTIONEN…] build

ukify [OPTIONEN…] genkey

ukify [OPTIONEN…] inspect DATEI…

BESCHREIBUNG

ukify ist ein Werkzeug, dessen Hauptzweck die Kombination von Komponenten (normalerweise einem Kernel, einer Initrd und dem systemd-stub(7)-UEFI-Rumpf) ist, um ein UAPI.5-Vereinigtes Kernelabbild (UKI)[1] zu erstellen – ein einzelnes PE-Programm, das das System startet. Wenn das UKI ausgeführt wird, extrahiert der Rumpf den eingebetteten Linux-Kernel und startet ihn. Das UKI kann direkt durch die Firmware oder mittels eine Systemstartladers gestartet werden. Wird es mit Qemu[2] verwandt, kann ein UKI auch mittels »direktem Kernel-Systemstart« ausgeführt werden, schauen Sie dazu in das Beispiel weiter unten.

ukify kann auch zur Erstellung anderer Typen von UKI-artigen Abbildern verwandt werden, insbesondere Erweiterungen. Schauen Sie dazu in die nachfolgende Beschreibung des Unterbefehls build. ukify kann auch Zertifikate und Schlüssel für SecureBoot und PCR-Signierung erstellen, schauen Sie dazu in die nachfolgende Beschreibung des Unterbefehls genkey. ukify kann auch detaillierte Informationen über vereinigte Kernelabbilder ausgeben, Informationen dazu finden Sie in der nachfolgenden Beschreibung des Unterbefehls inspect.

BEFEHLE

Die folgenden Befehle werden verstanden:

  build

Dieser Befehl erstellt ein vereinigtes Kernelabbild. Die zwei zentralen Optionen, die für den Unterbefehl 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 Microcode=/--microcode=, Cmdline=/--cmdline=, OSRelease=/--os-release=, DeviceTree=/--devicetree=, DeviceTreeAuto=/--devicetree-auto=, HWIDs=/--hwids=,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= oder PCRCertificate=/--pcr-certificate= 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= oder PCRCertificate=/--pcr-certificate= 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 entweder SigningEngine=/--signing-engine= oder SigningProvider=/--signing-provider= angegeben wird, dann werden die Argumente mit den öffentlichen Schlüsseln unverändert an openssl(1) als URIs weitergegeben und die Argumente mit den öffentlichen Schlüsseln werden als X.509-Zertifikate geladen, so dass das Signieren mit einer OpenSSL-Engine bzw. einem -Provider erfolgen kann.

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

  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.

  inspect

Zeigt Informationen über die Abschnitte in dem oder den angegebene(n) Programme(n). Falls --all angegeben ist, werden alle Abschnitte angezeigt. Falls andernfalls die Option --section= mindestens einmal angegeben ist, werden nur diese Abschnitte angezeigt. Andernfalls werden nur gut bekannte Abschnitte angezeigt, die typischwerweise in eine UKI eingebunden werden, angezeigt. Für jeden Abschnitt wird ihr Name, ihre Größe und ihr SHA256-Hash angezeigt. Für Textabschnitte werden die Inhalte angezeigt.

Siehe auch die Beschreibung von -j/--json= und --section=.

Andere Werkzeuge könnten zum Untersuchen von UKIs nützlich sein: llvm-objdump(1) -p und pe-inspect.

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.

Falls keine Konfigurationsoption mit der Option --config=PFAD bereitgestellt wird, wird ukify versuchen, nach einer Standardkonfigurationsdatei in den folgenden Pfaden in dieser Reihenfolge zu suchen: /etc/systemd/ukify.conf, /run/systemd/ukify.conf, /usr/local/lib/systemd/ukify.conf und /usr/lib/systemd/ukify.conf und dann die erste gefundene laden. ukify wird normal fortfahren, falls keine Konfigurationsdatei angegeben und keine in der Vorgabe gefunden wurde.

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.

    Hinzugefügt in Version 254.

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

    Hinzugefügt in Version 253.

--policy-digest, --no-policy-digest
    Aktiviert oder deaktiviert einen Aufruf von systemd-measure(1), um vorberechnete PCR-TPM2-Richtlinien-Hashes auszugeben. Nützlich zur Offline-Signierung von PCR-Richtlinien. Standardmäßig false.

    Hinzugefügt in Version 258.

--section=NAME:TEXT|@PFAD, --section=NAME:text|binary[@PFAD]
    Für alle Unterbefehle außer inspect wird die erste Syntax verwandt. Gibt einen beliebigen zusätzlichen Abschnitt »NAME« an. 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.

    Für den Unterbefehl inspect wird die zweite Syntax verwandt. Der Abschnitt NAME wird (falls gefunden) untersucht. Falls das zweite Argument »text« ist, dann wird der Inhalt angezeigt. Falls das dritte Argument angegeben ist, werden die Inhalte in die Datei mit Namen PFAD gespeichert.

    Beachten Sie, dass der Name unverändert verwandt wird und falls der Abschnittsname mit einem Punkt beginnen sollte, er in NAME aufgenommen werden muss.

    Hinzugefügt in Version 253.

--join-profile=PFAD
    Akzeptiert einen Pfad zu einer bestehenden PE-Datei, die ein zusätzliches Profil enthält, das dem vereinigten Kernelabbild hinzugefügt werden soll. Das Profil kann vorab mit ukify erstellt werden. Das Profil muss nicht signiert sein oder PCR-Messungen enthalten. Alle UKI-PE-Abschnitte der angegebenen PE-Datei werden in das erstellte UKI kopiert. Dies ist zum Erstellen von UKIs mit mehreren Profile nützlich. Beachten Sie, dass dies nur die PE-Abschnitte kopiert, die durch die UKI-Spezifikation definiert sind. Andere Abschnitte, beispielsweise ».text« oder ähnlich, werden ignoriert.

    Hinzugefügt in Version 257.

--sign-profile=KENNUNG
    Akzeptiert eine Profilkennung, für die signierte PCR-Messungen durch ukify erstellt werden sollen. Diese Option kann zusammen mit --join-profile= beim Bau des letztendlichen vereinigten Kernelabbildes verwandt werden. Falls nicht angegeben, werden signierte PCR-Messungen für alle Profile hinzugefügt.

    Hinzugefügt in Version 258.

--join-pcrsig=PFAD, --pcrsig=TEXT|@PFAD
    --join-pcrsig= akzeptiert einen Pfad zu einer bestehenden PE-Datei, die ein vorher gebautes UKI enthält. --pcrsig= akzeptiert einen Pfad zu einem bestehenden Pcrsig-JSON-Blob oder einen wörtlichen, direkt angegebenen Blob. Sie müssen zusammen und ohne Angabe irgendwelcher anderen UKI-Abschnittparameter angegeben werden. ukify wird den Pcrsig-JSON-Blob an das UKI anhängen. Dies ist in Kombination mit --policy-digest nützlich, um ein UKI zu erstellen und dann den TPM2-Richtlinien-Hash offline zu signieren.

    Hinzugefügt in Version 258.

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

    Hinzugefügt in Version 253.

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

    Hinzugefügt in Version 253.

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

    Hinzugefügt in Version 254.

--all
    Gibt (mit dem Unterbefehl inspect) alle Abschnitte aus.

    Hinzugefügt in Version 255.

--json
    Erstellt (mit dem Unterbefehl inspect) JSON-Ausgabe.

    Hinzugefügt in Version 255.

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

    Hinzugefügt in Version 254.

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. Falls dies explizit auf eine leere Zeichenkette gesetzt wird, entfällt der Abschnitt ».osrel« aus dem UKI (dies wird für die meisten Fälle nicht empfohlen und führt dazu, dass das erstellte Artefakt von anderen Werkzeugen wie kernel-install(8) und bootctl(1) nicht als UKI erkannt wird).

    Hinzugefügt in Version 253.

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.

    Hinzugefügt in Version 253.

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.

    Hinzugefügt in Version 254.

Microcode=UCODE, --microcode=UCODE
    Pfad zu der Initrd, die Microcode-Aktualisierungen enthält. Falls dies nicht angegeben ist, wird der Abschnitt nicht vorhanden sein.

    Hinzugefügt in Version 256.

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.

    Hinzugefügt in Version 253.

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.

    Hinzugefügt in Version 253.

DeviceTreeAuto=PFAD…, --devicetree-auto=PFAD
    Null oder mehr automatisch auswählbare DeviceTree-Dateien. In der Konfigurationsdatei werden Einträge durch Leerraum getrennt. Jeder DeviceTree wird in einem separaten ».dtbauto«-Eintrag sein.

    Hinzugefügt in Version 257.

HWIDs=PFAD, --hwids=PFAD
    Die Hardware-Kennung-Gerätetabelle (der Abschnitt ».hwids«). Das Argument ist ein Pfad zu einem Verzeichnis mit JSON-HWID-Gerätebeschreibungsdateien. Jede Datei muss ein einzelnes JSON-Objekt mit den Schlüsseln »name«, »compatible« und »hwids« enthalten. Die Schlüssel »name« und »compatible« müssen Zeichenkettenwerte enthalten und der Schlüssel »hwids« muss eine Liste von Zeichenketten als Wert enthalten, wobei die Zeichenketten gültige UUIDs darstellen müssen, die CHIDs/HWIDs darstellen. Beispiel:

        {
            "type": "devicetree",
            "name": "Beispiel-Laptop 16 Gen 7",
            "compatible": "Beispiel,laptop-16-g7",
            "hwids": [
                "5dc05bf4-01f6-4089-b464-a08c47ea9295",
                "3e3f8f3c-2003-46f2-811c-85554f7d5952"
            ]
        }

    Hier ist »Beispiel-Laptop 16 Gen 7« der »name« (Name) des Geräts (wie durch den Hersteller definiert), »Beispiel,laptop-16-g7« der »compatible« (Kompatibilität, wie durch den Kernel definiert) und »hwids« (Hardware-Kennungen) ein Feld mit CHIDs/HWIDs (zum Beispiel aus der Ausgabe von fwupdtool hwids extrahiert). Falls nicht angegeben, ist der Abschnitt nicht vorhanden. Es wird empfohlen, diesen Parameter anzugeben, falls automatisch auswählbare DeviceTrees verwandt werden sollen.

    Hinzugefügt in Version 257.

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.

    Hinzugefügt in Version 253.

SBAT=TEXT|@PFAD, --sbat=TEXT|@PFAD
    SBAT-Metadaten, die dem UKI oder der Erweiterung zugeordnet sind. SBAT-Richtlinien sind nützlich, um gesamte Gruppen von UKIs oder Erweiterungen mit einer einzigen, statischen Richtlinien-Aktualisierung, die keinen Platz im DBX/MOKX belegt, zu wiederrufen. Falls nicht manuell angegeben, wird ein Standard-Metadateneintrag, der aus

        uki,1,UKI,uki,1,https://uapi-group.org/specifications/specs/unified_kernel_image/

    für UKIs und

        uki-addon,1,UKI Addon,addon,1,https://www.freedesktop.org/software/systemd/man/latest/systemd-stub.html

    für Ergänzungen besteht, verwandt, um sicherzustellen, dass sie immer zurückgezogen werden können. Weitere Informationen zu SBAT finden Sie in der Shim-Dokumentation[3].

    Hinzugefügt in Version 254.

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= oder PCRCertificate=/--pcr-certificate= vorhanden ist, wird dieser Schlüssel verwandt. Andernfalls wird dieser Abschnitt nicht vorhanden sein.

    Hinzugefügt in Version 253.

Profile=PFAD, --profile=PFAD
    Ein Pfad zu einem UKI-Profil, das in einem Abschnitt ».profile« abgelegt werden soll. Diese Option ist zur Erstellung von UKIs mit mehreren Profile nützlich und wird typischerweise in Kombination mit --join-profile= verwandt, um das angegebene UKI mit einem zusätzlichen Profil zu erweitern.

    Hinzugefügt in Version 257.

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.

    Hinzugefügt in Version 253.

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

    Hinzugefügt in Version 254.

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= oder SigningProvider=/--signing-provider= verwandt wird, kann dies auch eine Engine- oder Provider-spezifische Festsetzung sein. Diese Option wird von SecureBootSigningTool=sbsign/--signtool=sbsign und SecureBootSigningTool=systemd-sbsign/--signtool=systemd-sbsign benötigt.

    Hinzugefügt in Version 253.

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= oder SigningProvider=/--signing-provider= verwandt wird, kann dies auch eine Engine- oder Provider-spezifische Festsetzung sein. Diese Option wird von SecureBootSigningTool=sbsign/--signtool=sbsign und SecureBootSigningTool=systemd-sbsign/--signtool=systemd-sbsign benötigt.

    Hinzugefügt in Version 253.

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.

    Hinzugefügt in Version 254.

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.

    Hinzugefügt in Version 254.

SecureBootCertificateValidity=TAGE, --secureboot-certificate-validity=TAGE
    Gültigkeitsdauer (in Tagen) für ein durch genkey erstelltes Zertifikat. Standardmäßig 3650, d.h. 10 Jahre.

    Hinzugefügt in Version 254.

SigningEngine=ENGINE, --signing-engine=ENGINE
    Eine OpenSSL(1)-Engine, die zum Signieren des entstehenden Programms und der PCR-Messungen verwandt werden soll, siehe openssl-engine(1).

    Hinzugefügt in Version 253.

SigningProvider=PROVIDER, --signing-provider=PROVIDER
    Ein OpenSSL(1)-Provider, der zum Signieren des entstehenden Programms und der PCR-Messungen verwandt werden soll, siehe provider(7). Diese Option kann nur verwandt werden, wenn systemd-sbsign(1) als Signierwerkzeug verwandt wird.

    Hinzugefügt in Version 257.

CertificateProvider=PROVIDER, --certificate-provider=PROVIDER
    Ein OpenSSL(1)-Provider, der zum Laden von Zertifikaten zum Signieren des entstehenden Programms und der PCR-Messungen verwandt werden soll, siehe provider(7). Diese Option kann nur verwandt werden, wenn systemd-sbsign(1) als Signierwerkzeug verwandt wird.

    Hinzugefügt in Version 257.

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 true ist und das Programm bereits signiert wurde, wird die Signatur trotzdem angehängt.

    Hinzugefügt in Version 253.

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

    Hinzugefügt in Version 253.

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. Falls --pcr-certificate= verwandt wird, kann dies nicht angegeben werden.

    Hinzugefügt in Version 253.

PCRCertificate=PFAD, --pcr-certificate=PFAD
    Ein X.509-Zertifikat, das 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. Falls --pcr-public-key= verwandt wird, kann dies nicht angegeben werden.

    Hinzugefügt in Version 258.

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.

    Hinzugefügt in Version 253.

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. Direkter Kernelsystemstart in eine virtuelle Maschine

Bei der Verwendung von Qemu[2] mit OVMF[4] (UEFI-Firmware für virtuelle Maschinen) kann der Schalter -kernel direkt mit einem UKI verwandt werden. Beispiel:

qemu-kvm -drive if=pflash,format=qcow2,readonly=on,file=/usr/share/edk2/ovmf/OVMF_CODE_4M.qcow2 -kernel ./vmlinuz.unsigned.efi [ … ]

(Es könnte abhängig von der Distribution notwendig sein, den Pfad zu der Firmware-Datei anzupassen.) Normalerweise würde ein weiteres Argument -drive verwandt werden, um ein tatsächliches Plattenabbild anzuhängen, aber dies ist nicht zwingend.

Beispiel 3. Mit allem Schnickschnack

    $ ukify build \
          --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \
          --initrd=early_cpio \
          --initrd=/ein/Pfad/zur/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.meinabbild,1,UKI für System,uki.author.meinabbild,1,https://uapi-group.org/specifications/specs/unified_kernel_image/' \
          --pcr-private-key=tpm2-pcr-initrd-private-key.pem \
          --pcr-public-key=tpm2-pcr-initrd-public-key.pem \
          --phases='enter-initrd' \
          --pcr-private-key=tpm2-pcr-private-key-system.pem \
          --pcr-public-key=tpm2-pcr-public-key-system.pem \
          --phases='enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit \
                    enter-initrd:leave-initrd:sysinit:ready' \
          --pcr-banks=sha384,sha512 \
          --secureboot-private-key=secureboot-private-key.pem \
          --secureboot-certificate=secureboot-certificate.pem \
          --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 m».pcrsig« eingebettete Richtlinie wird für die Initrd mit dem Schlüssel tpm2-pcr-initrd-private-key.pem signiert (die Phase enter-initrd) und für das Hauptsystem (Phase leave-initrd, sysinit, ready) mit dem Schlüssel tpm2-pcr-private-key-system.pem. Das Linux-Programm und das resultierende kombinierte Abbild wird mit dem SecureBoot-Schlüssel secureboot-private-key.pem signiert.

Beispiel 4. 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=secureboot-private-key.pem
    SecureBootCertificate=secureboot-certificate.pem
    SignKernel=yes
    PCRBanks=sha384,sha512
    [PCRSignature:initrd]
    PCRPrivateKey=tpm2-pcr-initrd-private-key.pem
    PCRPublicKey=tpm2-pcr-initrd-public-key.pem
    Phases=enter-initrd
    [PCRSignature:system]
    PCRPrivateKey=tpm2-pcr-private-key-system.pem
    PCRPublicKey=tpm2-pcr-public-key-system.pem
    Phases=enter-initrd:leave-initrd
           enter-initrd:leave-initrd:sysinit
           enter-initrd:leave-initrd:sysinit:ready
    $ 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 5. Kernelbefehlszeile, PE-Ergänzung

    ukify build \
          --secureboot-private-key=secureboot-private-key.pem \
          --secureboot-certificate=secureboot-certificate.pem \
          --cmdline='debug' \
          --sbat='sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
          uki-addon.author,1,UKI-Ergänzung für System,uki-addon.author,1,https://www.freedesktop.org/software/systemd/man/systemd-stub.html'
          --output=debug.addon.efi

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 6. 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/secureboot-private-key.pem
    SecureBootCertificate=/etc/kernel/secureboot-certificate.pem
    [PCRSignature:initrd]
    Phases=enter-initrd
    PCRPrivateKey=/etc/systemd/tpm2-pcr-initrd-private-key.pem
    PCRPublicKey=/etc/systemd/tpm2-pcr-initrd-public-key.pem
    [PCRSignature:system]
    Phases=enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit
           enter-initrd:leave-initrd:sysinit:ready
    PCRPrivateKey=/etc/systemd/tpm2-pcr-private-key-system.pem
    PCRPublicKey=/etc/systemd/tpm2-pcr-public-key-system.pem
    EOF

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

    # ukify genkey --config=/etc/kernel/uki.conf
    Writing SecureBoot private key to /etc/kernel/secureboot-private-key.pem
    Writing SecureBoot certificate to /etc/kernel/secureboot-certificate.pem
    Writing private key for PCR signing to /etc/systemd/tpm2-pcr-initrd-private-key.pem
    Writing public key for PCR signing to /etc/systemd/tpm2-pcr-initrd-public-key.pem
    Writing private key for PCR signing to /etc/systemd/tpm2-pcr-private-key-system.pem
    Writing public key for PCR signing to /etc/systemd/tpm2-pcr-public-key-system.pem

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

Nachfolgende Aufrufe, die die Konfigurationsdatei (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 werden 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.

Beispiel 7. UKI mit mehreren Profilen

Erstellen Sie zuerst einige Profile:

    $ ukify build \
          --profile='TITLE=Base' \
          --output=profile0.efi

Fügen Sie jetzt ein zweites Profil (@1) hinzu:

    $ ukify build \
          --profile='TITLE=Systemstart in einen Speicherzielmodus
    ID=storagetm' \
          --cmdline='quiet rw rd.systemd.unit=storage-target-mode.target' \
          --output=profile1.efi

Und ein drittes Profil (@2):

    $ ukify build \
          --profile='TITLE=Werkseinstellungen
    ID=factory-reset' \
          --cmdline='quiet rw systemd.unit=factory-reset.target' \
          --output=profile2.efi

Erstellen Sie dann ein UKI und binden Sie alle erstellten Profile ein:

    $ ukify build \
          --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \
          --initrd=/some/path/initramfs-6.0.9-300.fc37.x86_64.img \
          --cmdline='quiet rw' \
          --join-profile=profile0.efi \
          --join-profile=profile1.efi \
          --join-profile=profile2.efi \
          --output=base.efi

Das entstehende UKI base-with-profile-0-1-2.efi wird jetzt drei Profile enthalten.

Beispiel 8. Offline-Signieren des pcrsig-Abschnitts

Erstellen Sie zurst ein UKI und speichern den PCR-JSON-Blob:

    $ ukify build \
          --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \
          --initrd=/ein/Pfad/zur/initramfs-6.0.9-300.fc37.x86_64.img \
          --cmdline='quiet rw' \
          --pcr-public-key=tpm2-pcr-initrd-public-key.pem \
          --policy-digest \
          --json=short \
          --output=base.efi >base.pcrs

Signieren Sie dann den PCR-Hash offline und fügen ihn in den JSON-Blob ein:

    #!/usr/bin/python3
    import base64, json, subprocess
    priv_key = '/home/zbyszek/src/systemd/tpm2-pcr-private.pem'
    base_file = 'base.pcrs'
    base = json.load(open(base_file))
    for bank,policies in base.items():
        for policy in policies:
            pol = base64.b16decode(policy['pol'].upper())
            call = subprocess.run(['openssl', 'dgst', f'-{bank}', '-sign', priv_key],
                                  input=pol,
                                  check=True,
                                  capture_output=True)
            sig = base64.b64encode(call.stdout).decode()
            policy['sig'] = sig
    print(json.dumps(base))

Hängen Sie schließlich den aktualisierten JSON-Blob an das UKI:

    $ ukify build \
          --join-pcrsig=base.efi \
          --pcrsig=@base.pcrs \
          --json=short \
          --output=base-signed.efi

Das entstehende UKI base-signed.efi wird jetzt den signierten PCR-Hash enthalten.

SIEHE AUCH

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

ANMERKUNGEN

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

2.  Qemu
    https://www.qemu.org/docs/master/

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

4.  OVMF
    https://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper-c770f8c.txt

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