Hinweis:

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

Ziele

Am Ende dieses Tutorials haben Sie folgende Ziele erreicht:

Erforderliche Packages werden installiert

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

  1. Erstellen Sie ein ~/hello-Verzeichnis.

  2. 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);
    
  3. 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
    
  4. Erstellen und installieren Sie das Modul.

    cd ~/hello
    make && sudo make install
    
  5. 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

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

  2. 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'
    -----
    
  3. Exportieren Sie das Zertifikat im PEM-Format.

    openssl x509 -inform DER -in pubkey.der -out pubkey.pem
    
  4. 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:
    
  5. 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
    
  6. 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.

  1. 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:
    
  2. 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
    
  3. 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
    
  4. 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":
    
  5. 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/.

  1. 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:
    
  2. 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.

    1. 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.
    2. Wählen Sie "MOK registrieren".
    3. Wählen Sie View-Schlüssel 0.
    4. Prüfen Sie, ob der Schlüssel mit den gewünschten Werten übereinstimmt.
    5. Klicken Sie auf eine beliebige Taste, und wählen Sie "Continue".
    6. Wählen Sie "Yes", um den Schlüssel anzumelden.
    7. Geben Sie das Kennwort an, das beim Import des Schlüssels mit mokutil verwendet wird.
    8. Wählen Sie "reboot".
  3. 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
    
  4. 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.

Das Komprimierungsproblem wird in den entsprechenden Versionen dieser Kernel auf Oracle Linux 8 nicht beobachtet.

Weitere Informationen

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.