Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zum Registrieren eines kostenlosen Accounts finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Er verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, Mandanten und Compartments. Ersetzen Sie diese Werte beim Durchführen Ihrer Übung durch spezifische Werte für Ihre Cloud-Umgebung.
Kernel-Module zur Verwendung mit UEFI Secure Boot signieren
In diesem Tutorial wird erläutert, wie Sie Ihre eigenen Module für UEFI Secure Boot auf Oracle Linux mit installiertem Unbreakable Enterprise Kernel signieren. Im Tutorial wird auch erläutert, wie Sie Ihr eigenes Zertifikat zum vertrauenswürdigen Zertifikatschlüsselring des Kernels hinzufügen, falls Sie vor UEK R6U3 einen UEK R6-Kernel verwenden. Außerdem wird erläutert, wie Sie mit dem Dienstprogramm mokutil den UEFI-Boot-Shim mit dem Signaturzertifikat aktualisieren.
Warnung
Dieses Tutorial richtet sich an Entwickler, die Softwaretests durchführen. Verwenden Sie nicht die Verfahren in diesem Tutorial zu Produktionssystemen, die von Oracle unterstützt werden.
Voraussetzungen
- Oracle Linux-System (entweder Oracle Linux 7 oder Oracle Linux 8)
- System führt den neuesten UEKR6-Kernel aus
- Firmwareimplementierung und -konfiguration des Servers unterstützen das MOK-Utility (weitere Informationen finden Sie unter https://docs.oracle.com/en/learn/mokutil-uefi/)
Ziele
Am Ende dieses Tutorials haben Sie folgende Ziele erreicht:
- Mit UEFI Secure Boot zu verwendende Module signieren
- Zertifikate zum vertrauenswürdigen Schlüsselring des Kernel-Zertifikats hinzufügen
- Verwenden Sie das Utility
mokutil
, um das UEFI-Boot-Shim mit dem Signaturzertifikat zu aktualisieren
Erforderliche Packages werden installiert
-
Führen Sie die folgenden Befehle auf Basis Ihres Oracle Linux-Systems aus.
-
Oracle Linux 8
sudo dnf update sudo dnf group install "Development Tools" sudo dnf install kernel-uek kernel-uek-devel keyutils mokutil pesign
-
Oracle Linux 7
sudo yum-config-manager --enable ol7_optional_latest sudo yum update sudo yum group install "Development Tools" sudo yum-config-manager --enable ol7_UEKR6 && yum-config-manager --disable ol7_UEKR5
-
-
Starten Sie das System neu.
Erstellen eines benutzerdefinierten Kernel-Beispielmoduls
Im Rahmen dieses Tutorials erstellen und erstellen wir ein benutzerdefiniertes Kernel-Beispielmodul. In den meisten Fällen wird das Modul bereits von einem externen Anbieter bereitgestellt, und dieser Schritt ist nicht erforderlich. Das hier beschriebene Verfahren dient zur Veranschaulichung.
-
Erstellen Sie ein
~/hello
-Verzeichnis. -
Erstellen Sie die Datei
~/hello/hello.c
mit den folgenden Einträgen:#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("A.Developer"); MODULE_DESCRIPTION("Hello World Linux Kernel Module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; } static void __exit hello_exit(void) { printk(KERN_INFO "Unloading Hello world.\n"); } module_init(hello_init); module_exit(hello_exit);
-
Erstellen Sie die Datei
~/hello/Makefile
mit den folgenden Einträgen:obj-m += hello.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean install: cp hello.ko /lib/modules/$(shell uname -r)/extra depmod
-
Erstellen und installieren Sie das Modul.
cd ~/hello make && sudo make install
-
Testen Sie das Modul.
sudo modprobe hello modprobe: ERROR: could not insert 'hello': Operation not permitted
Wenn das System im Secure Boot-Modus ausgeführt wird, schlägt
modprobe
fehl, da das Modul noch nicht gültig ist.
Lokale Zertifikate erstellen und Modul signieren
-
Erstellen Sie eine OpenSSL-Konfigurationsdatei, um ein lokales Signaturzertifikat zu erstellen.
Typ:
cat >>/tmp/x509.conf <<EOF [ req ] default_bits = 4096 distinguished_name = req_distinguished_name prompt = no string_mask = utf8only x509_extensions = extensions [ req_distinguished_name ] O = Module Signing Example CN = Module Signing Example Key emailAddress = first.last@example.com [ extensions ] basicConstraints=critical,CA:FALSE keyUsage=digitalSignature subjectKeyIdentifier=hash authorityKeyIdentifier=keyid EOF
Geben Sie für die Felder O, CN und emailAddress Werte ein, die besser geeignet sind.
-
Generieren Sie ein neues Private/Public-Key-Paar basierend auf der neuen Konfiguration.
Beachten Sie, dass das Zertifikat 10 Jahre lang gültig ist (3.650 Tage).
mkdir ~/certs cd ~/certs openssl req -x509 -new -nodes -utf8 -sha512 -days 3650 -batch -config /tmp/x509.conf -outform DER -out pubkey.der -keyout priv.key Generating a RSA private key ........................................................ ............................++++ writing new private key to 'priv.key' -----
-
Exportieren Sie das Zertifikat im PEM-Format.
openssl x509 -inform DER -in pubkey.der -out pubkey.pem
-
Erstellen Sie eine PKCS#12-Version des Zertifikats.
Geben Sie das Exportkennwort an, wenn Sie dazu aufgefordert werden.
openssl pkcs12 -export -inkey priv.key -in pubkey.pem -name cert -out cert.p12 Enter Export Password: Verifying - Enter Export Password:
-
Signieren Sie das Modul mit dem soeben generierten Schlüssel.
cd ~/certs sudo /usr/src/kernels/$(uname -r)/scripts/sign-file sha512 priv.key pubkey.der /lib/modules/$(uname -r)/extra/hello.ko
-
Prüfen Sie mit dem Befehl
modinfo
, ob das Modul mit dem von Ihnen erstellten Schlüssel signiert wurde.modinfo hello filename: /lib/modules/5.4.17-2036.103.3.1.el8uek.x86_64/extra/hello.ko description: Hello World Linux Kernel Module author: A.Developer license: GPL srcversion: D51FB4CF0B86314953EE797 depends: retpoline: Y name: hello vermagic: 5.4.17-2036.103.3.1.el8uek.x86_64 SMP mod_unload modversions sig_id: PKCS#7 signer: Module Signing Example Key sig_key: AB:2C:E3:AB:87:D9:9C:6A:31:B8:80:20:D4:92:25:F3:9A:26:DC sig_hashalgo: sha512 signature: 9F:B0:25:CB:14:C1:C7:10:7F:60:1E:E6:66:82:64:58:91:1F:01:A5: D9:03:1B:9C:2D:42:00:45:78:2B:FA:70:F8:C7:3B:1A:A2:42:00:09: 33:E0:81:1D:C6:E6:46:A5:FE:8B:9F:8C:3D:4E:A1:3A:05:52:ED:F6: 25:F9:88:98:D3:70:78:1D:7E:63:F3:73:C8:C8:14:C2:3A:52:B4:8F: ...
Zertifikat zum vertrauenswürdigen Kernel-Schlüsselring hinzufügen (UEK R6U2 und darunter)
Hinweis:
Sie müssen diesen Schritt nicht ausführen, wenn Sie UEK R6U3 oder höher ausführen. Die Secure Boot-Implementierung in UEK R6U3 wird aktualisiert, um das Laden von Modulen für Module zu ermöglichen, die mit Schlüsseln in der MOK-Datenbank signiert sind. Bei UEK R6-Releases vor UEK R6U3 können Module nur geladen werden, wenn die Schlüssel, mit denen sie signiert sind, im integrierten Trust Keyring des Kernels enthalten sind.
-
Erstellen Sie eine NSS-Datenbank zur Verwendung mit
pesign
.cd ~/certs certutil -d . -N Enter a password which will be used to encrypt your keys. The password should be at least 8 characters long, and should contain at least one non-alphabetic character. Enter new password: Re-enter password:
-
Fügen Sie der Datenbank den PCKS#12-Schlüssel hinzu.
cd ~/certs pk12util -d . -i cert.p12 Enter Password or Pin for "NSS Certificate DB": Enter password for PKCS12 file: pk12util: PKCS12 IMPORT SUCCESSFUL
-
Fügen Sie den Schlüssel in
bzImage
des Kernels ein.Hinweis: Dem Kernel kann nur ein einzelnes zusätzliches benutzerdefiniertes Zertifikat hinzugefügt werden, da die komprimierte Größe des Boot-Images des Kernels nicht erhöht werden kann.
cd ~/certs sudo /usr/src/kernels/$(uname -r)/scripts/insert-sys-cert -s /boot/System.map-$(uname -r) -z /boot/vmlinuz-$(uname -r) -c pubkey.der INFO: Executing: gunzip <vmlinux-ceDv0X >vmlinux-rFFumH WARNING: Could not find the symbol table. INFO: sym: system_extra_cert INFO: addr: 0xffffffff828915d6 INFO: size: 8194 INFO: offset: 0x1c915d6 INFO: sym: system_extra_cert_used INFO: addr: 0xffffffff828935d8 INFO: size: 0 INFO: offset: 0x1c935d8 INFO: sym: system_certificate_list_size INFO: addr: 0xffffffff828935e0 INFO: size: 0 INFO: offset: 0x1c935e0 INFO: Inserted the contents of pubkey.der into ffffffff828915d6. INFO: Used 1481 bytes out of 8194 bytes reserved. INFO: Executing: gzip -n -f -9 <vmlinux-rFFumH >vmlinux-5wHA2r
-
Entfernen Sie die vorhandene PE-Signatur, und signieren Sie den Kernel mit dem neuen unter Verwendung des zuvor erstellten NSS-Datenbankkennworts erneut.
cd ~/certs sudo pesign -u 0 -i /boot/vmlinuz-$(uname -r) --remove-signature -o vmlinuz.unsigned sudo pesign -n . -c cert -i vmlinuz.unsigned -o vmlinuz.signed -s Enter Password or PIN for 'NSS Certificate DB":
-
Kopieren Sie den signierten Kernel wieder nach
/boot
.cd ~/certs sudo cp -bf vmlinuz.signed /boot/vmlinuz-$(uname -r)
Zertifikat bei der UEFI Secure Boot Key-Datenbank anmelden
Bei UEK R6-Kerneln vor UEK R6U3 müssen Sie den Schlüssel registrieren, mit dem das Kernel-Image in der MOK-Datenbank signiert wurde. Bei allen anderen Kerneln wird der Schlüssel, mit dem das Modul selbst signiert wird, bei der Datenbank angemeldet. Diese Schlüssel können identisch sein, wenn Sie mit demselben Schlüssel das Modul und den Kernel signiert haben.
Hinweis: Weitere Informationen zur Verwendung des Utilitys
mokutil
finden Sie unter https://docs.oracle.com/learn/mokutil-uefi/.
-
Fügen Sie den entsprechenden Schlüssel als MOK (Machine Owner Key) zum UEFI-Boot-Shim hinzu. Mit dem Befehl
mokutil import
werden Sie aufgefordert, ein Kennwort einzugeben, das Sie im nächsten Schritt angeben müssen.sudo mokutil --import pubkey.der input password: input password again:
-
Starten Sie den Rechner neu.
Beim Neustart muss das UEFI SHIM automatisch MokManager starten, mit dem der MOK-Schlüssel zur UEFI Secure Boot-Schlüsseldatenbank hinzugefügt wird.
- Drücken Sie eine Taste, um MOK Management auszuführen.
Drücken Sie innerhalb von 10 Sekunden eine Taste, um den Boot-Prozess zu unterbrechen und Ihre MOK-Taste hinzuzufügen. - Wählen Sie "MOK registrieren".
- Wählen Sie View-Schlüssel 0.
- Prüfen Sie, ob der Schlüssel mit den gewünschten Werten übereinstimmt.
- Klicken Sie auf eine beliebige Taste, und wählen Sie "Continue".
- Wählen Sie "Yes", um den Schlüssel anzumelden.
- Geben Sie das Kennwort an, das beim Import des Schlüssels mit mokutil verwendet wird.
- Wählen Sie "reboot".
- Drücken Sie eine Taste, um MOK Management auszuführen.
-
Prüfen Sie, ob das Zertifikat im vertrauenswürdigen Schlüsselring installiert ist.
sudo keyctl show %:.builtin_trusted_keys Keyring 892034081 ---lswrv 0 0 keyring: .builtin_trusted_keys 367808024 ---lswrv 0 0 \_ asymmetric: Oracle CA Server: fbcd3d4d950c6b2b0e01f0a146c5a4e3855ae704 230958440 ---lswrv 0 0 \_ asymmetric: Module Signing Example Key: a43b4e638874b0656db2bc26216f56c0ac39f72b 408597579 ---lswrv 0 0 \_ asymmetric: Oracle America, Inc.: Ksplice Kernel Module Signing Key: 09010ebef5545fa7c54b626ef518e077b5b1ee4c 839574974 ---lswrv 0 0 \_ asymmetric: Oracle Linux Kernel Module Signing Key: 2bb352412969a3653f0eb6021763408ebb9bb5ab
-
Prüfen Sie, ob das Modul erfolgreich geladen werden kann.
sudo modprobe hello lsmod | grep hello hello 16384 0 dmesg | tail -2 [ 108.848848] hello: loading out-of-tree module taints kernel. [ 108.849191] Hello world!
Bekannte Probleme
Bei den folgenden Kernel-Versionen in Oracle Linux 7 kann es zu Problemen kommen, die ein neues Zertifikat akzeptieren, während die gleiche (oder kleinere) komprimierte Größe für die resultierende vmlinuz
-Datei beibehalten wird. Es wird empfohlen, ein Update auf das neueste verfügbare Release UEKR6 durchzuführen, bevor Sie diesen Prozess starten.
- 5.4.17-2022.el7uek.x86_64
- 5.4.17-2023.el7uek.x86_64
- 5.4.17-2025.el7uek.x86_64
- 5.4.17-2026.el7uek.x86_64
- 5.4.17-2028.1.el7uek.x86_64
- 5.4.17-2028.el7uek.x86_64
- 5.4.17-2011.3.2.el7uek.x86_64
- 5.4.17-2011.4.0.el7uek.x86_64
- 5.4.17-2013.el7uek.x86_64
- 5.4.17-2016.1.el7uek.x86_64
Das Komprimierungsproblem wird in den entsprechenden Versionen dieser Kernel auf Oracle Linux 8 nicht beobachtet.
Weitere Informationen
- Oracle Linux: Mit UEFI Secure Boot arbeiten
- Hinweise zu Oracle Linux UEFI Secure Boot Update
- Oracle Linux: Zertifikate und Public Key-Infrastruktur verwalten
- Oracle Linux- und unumgängliche Enterprise Kernel-(UEK-)Releases
- mokutil(1) manuelle Seite
- pesign(1) Manpage
pesign --help
-Befehl
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere Inhalte für kostenloses Lernen im Oracle Learning YouTube-Kanal zu. Außerdem besuchen Sie education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Produktdokumentation finden Sie im Oracle Help Center.
Sign Kernel Modules for Use With UEFI Secure Boot
F55219-01
March 2022
Copyright © 2021, Oracle and/or its affiliates.