Modulüberprüfung fehlgeschlagene Signatur und / oder erforderlicher Schlüssel fehlen


9

Ich arbeite an einem Kernelmodul, das gut funktioniert. Beim Durchsuchen von dmesg wird jedoch eine Meldung zu meinem Modul angezeigt, dass die Modulüberprüfung fehlgeschlagen ist (die Modulüberprüfung hat die Signatur fehlgeschlagen und / oder der erforderliche Schlüssel fehlt).

Wie kann ich dieses Problem beheben? Wie kann ich mein Modul zur Überprüfung signieren lassen?

Vielen Dank.


Antworten:


2

Alles was Sie brauchen ist hier beschrieben

KERNEL-MODUL-UNTERZEICHNUNGSANLAGE


INHALT

  • Überblick.
  • Modul-Signatur konfigurieren.
  • Signaturschlüssel generieren.
  • Öffentliche Schlüssel im Kernel.
  • Module manuell signieren.
  • Signierte Module und Abisolieren.
  • Laden signierter Module.
  • Ungültige Signaturen und nicht signierte Module.
  • Verwalten / Schützen des privaten Schlüssels.

ÜBERBLICK

Die Kernelmodul-Signaturfunktion signiert Module während der Installation kryptografisch und überprüft dann die Signatur beim Laden des Moduls. Dies ermöglicht eine erhöhte Kernelsicherheit, indem das Laden von nicht signierten Modulen oder Modulen, die mit einem ungültigen Schlüssel signiert sind, nicht zugelassen wird. Das Signieren von Modulen erhöht die Sicherheit, indem es das Laden eines schädlichen Moduls in den Kernel erschwert. Die Modulsignaturprüfung wird vom Kernel durchgeführt, sodass keine vertrauenswürdigen Userspace-Bits erforderlich sind.

Diese Funktion verwendet X.509 ITU-T-Standardzertifikate, um die beteiligten öffentlichen Schlüssel zu codieren. Die Signaturen selbst sind in keinem Industriestandardtyp codiert. Die Einrichtung unterstützt derzeit nur den Verschlüsselungsstandard für öffentliche RSA-Schlüssel (obwohl er steckbar ist und die Verwendung anderer ermöglicht). Die möglichen Hash-Algorithmen, die verwendet werden können, sind SHA-1, SHA-224, SHA-256, SHA-384 und SHA-512 (der Algorithmus wird durch Daten in der Signatur ausgewählt).


MODUL-SIGNIERUNG KONFIGURIEREN

Die Modulsignaturfunktion wird aktiviert, indem Sie im Abschnitt "Unterstützung für ladbare Module aktivieren" der Kernelkonfiguration aufrufen und aktivieren

CONFIG_MODULE_SIG   "Module signature verification"

Dies hat eine Reihe von Optionen zur Verfügung:

  1. "Module müssen gültig signiert sein" (CONFIG_MODULE_SIG_FORCE)

    Dies gibt an, wie der Kernel mit einem Modul umgehen soll, dessen Signatur der Schlüssel nicht bekannt ist, oder mit einem Modul ohne Vorzeichen.

    Wenn dies deaktiviert ist (dh "zulässig"), sind Module zulässig, für die der Schlüssel nicht verfügbar ist, und Module, die nicht signiert sind. Der Kernel wird jedoch als fehlerhaft markiert, und die betroffenen Module werden als fehlerhaft markiert mit dem Zeichen 'E'.

    Wenn dies aktiviert ist (dh "restriktiv"), werden nur Module geladen, die eine gültige Signatur haben, die durch einen öffentlichen Schlüssel im Besitz des Kernels überprüft werden kann. Alle anderen Module erzeugen einen Fehler.

    Unabhängig von der Einstellung hier wird das Modul, wenn es einen Signaturblock hat, der nicht analysiert werden kann, sofort abgelehnt.

  2. "Alle Module automatisch signieren" (CONFIG_MODULE_SIG_ALL)

    Wenn diese Option aktiviert ist, werden die Module während der Phase "modules_install" eines Builds automatisch signiert. Wenn dies deaktiviert ist, müssen die Module manuell signiert werden mit:

    scripts/sign-file
    
  3. "Mit welchem ​​Hash-Algorithmus sollen Module signiert werden?"

    Hier können Sie auswählen, mit welchem ​​Hash-Algorithmus die Installationsphase die Module signiert:

    CONFIG_MODULE_SIG_SHA1      "Sign modules with SHA-1"
    CONFIG_MODULE_SIG_SHA224    "Sign modules with SHA-224"
    CONFIG_MODULE_SIG_SHA256    "Sign modules with SHA-256"
    CONFIG_MODULE_SIG_SHA384    "Sign modules with SHA-384"
    CONFIG_MODULE_SIG_SHA512    "Sign modules with SHA-512"
    

    Der hier ausgewählte Algorithmus wird auch in den Kernel integriert (anstatt ein Modul zu sein), sodass Module, die mit diesem Algorithmus signiert sind, ihre Signaturen überprüfen können, ohne eine Abhängigkeitsschleife zu verursachen.

  4. "Dateiname oder PKCS # 11 URI des Modul-Signaturschlüssels" (CONFIG_MODULE_SIG_KEY)

    Wenn Sie diese Option auf einen anderen Wert als den Standardwert "certs / signing_key.pem" setzen, wird die automatische Generierung von Signaturschlüsseln deaktiviert und das Signieren der Kernelmodule mit einem Schlüssel Ihrer Wahl ermöglicht. Die angegebene Zeichenfolge sollte eine Datei identifizieren, die sowohl einen privaten Schlüssel als auch das entsprechende X.509-Zertifikat in PEM-Form enthält, oder - auf Systemen, auf denen OpenSSL ENGINE_pkcs11 funktionsfähig ist - einen PKCS # 11-URI gemäß RFC7512. Im letzteren Fall sollte der PKCS # 11-URI sowohl auf ein Zertifikat als auch auf einen privaten Schlüssel verweisen.

    Wenn die PEM-Datei, die den privaten Schlüssel enthält, verschlüsselt ist oder wenn das PKCS # 11-Token eine PIN benötigt, kann dies beim Erstellen mithilfe der Variablen KBUILD_SIGN_PIN bereitgestellt werden.

  5. "Zusätzliche X.509-Schlüssel für den Standard-Systemschlüsselring" (CONFIG_SYSTEM_TRUSTED_KEYS)

    Diese Option kann auf den Dateinamen einer PEM-codierten Datei festgelegt werden, die zusätzliche Zertifikate enthält, die standardmäßig im Systemschlüsselring enthalten sind.

Beachten Sie, dass durch das Aktivieren der Modulsignatur eine Abhängigkeit von den OpenSSL-Entwicklungspaketen zu den Kernel-Build-Prozessen für das Tool hinzugefügt wird, das die Signatur ausführt.


Generieren von Signaturschlüsseln

Kryptografische Schlüsselpaare sind erforderlich, um Signaturen zu generieren und zu überprüfen. Ein privater Schlüssel wird verwendet, um eine Signatur zu generieren, und der entsprechende öffentliche Schlüssel wird verwendet, um sie zu überprüfen. Der private Schlüssel wird nur während des Builds benötigt. Danach kann er gelöscht oder sicher gespeichert werden. Der öffentliche Schlüssel wird in den Kernel integriert, damit die Signaturen beim Laden der Module überprüft werden können.

Unter normalen Bedingungen generiert der Kernel-Build automatisch ein neues Schlüsselpaar mit openssl, wenn CONFIG_MODULE_SIG_KEY gegenüber dem Standardwert unverändert bleibt, falls in der Datei keines vorhanden ist:

certs/signing_key.pem

während des Erstellens von vmlinux (der öffentliche Teil des Schlüssels muss in vmlinux eingebaut werden) unter Verwendung der Parameter in:

certs/x509.genkey

Datei (die auch generiert wird, wenn sie noch nicht vorhanden ist).

Es wird dringend empfohlen, eine eigene x509.genkey-Datei bereitzustellen.

Vor allem in der Datei x509.genkey sollte der Abschnitt req_distinguished_name vom Standard geändert werden:

[ req_distinguished_name ]
#O = Unspecified company
CN = Build time autogenerated kernel key
#emailAddress = unspecified.user@unspecified.company

Die generierte RSA-Schlüsselgröße kann auch festgelegt werden mit:

[ req ]
default_bits = 4096

Es ist auch möglich, die privaten / öffentlichen Schlüsseldateien mithilfe der Konfigurationsdatei für die Schlüsselgenerierung x509.genkey im Stammknoten des Linux-Kernelquellenbaums und des Befehls openssl manuell zu generieren. Im Folgenden finden Sie ein Beispiel zum Generieren der öffentlichen / privaten Schlüsseldateien:

openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
   -config x509.genkey -outform PEM -out kernel_key.pem \
   -keyout kernel_key.pem

Der vollständige Pfadname für die resultierende Datei kernel_key.pem kann dann in der Option CONFIG_MODULE_SIG_KEY angegeben werden, und das darin enthaltene Zertifikat und der Schlüssel werden anstelle eines automatisch generierten Schlüsselpaars verwendet.


ÖFFENTLICHE SCHLÜSSEL IM KERN

Der Kernel enthält einen Ring öffentlicher Schlüssel, die von root angezeigt werden können. Sie befinden sich in einem Schlüsselring namens ".system_keyring", der gesehen werden kann durch:

[root@deneb ~]# cat /proc/keys
...
223c7853 I------     1 perm 1f030000     0     0 keyring   .system_keyring: 1
302d2d52 I------     1 perm 1f010000     0     0 asymmetri Fedora kernel signing key: d69a84e6bce3d216b979e9505b3e3ef9a7118079: X509.RSA a7118079 []
...

Neben dem öffentlichen Schlüssel, der speziell für die Modulsignatur generiert wurde, können zusätzliche vertrauenswürdige Zertifikate in einer PEM-codierten Datei bereitgestellt werden, auf die durch die Konfigurationsoption CONFIG_SYSTEM_TRUSTED_KEYS verwiesen wird.

Ferner kann der Architekturcode öffentliche Schlüssel aus einem Baumarkt nehmen und diese ebenfalls hinzufügen (z. B. aus der UEFI-Schlüsseldatenbank).

Schließlich ist es möglich, zusätzliche öffentliche Schlüssel hinzuzufügen, indem Sie Folgendes tun:

keyctl padd asymmetric "" [.system_keyring-ID] <[key-file]

z.B:

keyctl padd asymmetric "" 0x223c7853 <my_public_key.x509

Beachten Sie jedoch, dass der Kernel das Hinzufügen von Schlüsseln zu .system_keyring nur zulässt, wenn der X.509-Wrapper des neuen Schlüssels von einem Schlüssel gültig signiert ist, der sich zum Zeitpunkt des Hinzufügens des Schlüssels bereits im .system_keyring befindet.


MANUELL UNTERZEICHNEN VON MODULEN

Verwenden Sie zum manuellen Signieren eines Moduls das im Linux-Kernel-Quellbaum verfügbare Skript- / Signdatei-Tool. Das Skript erfordert 4 Argumente:

1.  The hash algorithm (e.g., sha256)
2.  The private key filename or PKCS#11 URI
3.  The public key filename
4.  The kernel module to be signed

Das folgende Beispiel zeigt ein Kernelmodul:

scripts/sign-file sha512 kernel-signkey.priv \
    kernel-signkey.x509 module.ko

Der verwendete Hash-Algorithmus muss nicht mit dem konfigurierten übereinstimmen. Wenn dies nicht der Fall ist, sollten Sie sicherstellen, dass der Hash-Algorithmus entweder in den Kernel integriert ist oder geladen werden kann, ohne sich selbst zu benötigen.

Wenn für den privaten Schlüssel eine Passphrase oder PIN erforderlich ist, kann diese in der Umgebungsvariablen $ KBUILD_SIGN_PIN angegeben werden.


UNTERZEICHNETE MODULE UND STRIPPING

Ein signiertes Modul hat eine digitale Signatur, die einfach am Ende angehängt wird. Die Zeichenfolge "~ Modul Signatur angehängt ~." am Ende der Moduldatei wird bestätigt, dass eine Signatur vorhanden ist, aber nicht, dass die Signatur gültig ist!

Signierte Module sind BRITTLE, da sich die Signatur außerhalb des definierten ELF-Containers befindet. Daher dürfen sie NICHT entfernt werden, sobald die Signatur berechnet und angehängt wurde. Beachten Sie, dass das gesamte Modul die signierte Nutzlast ist, einschließlich aller Debug-Informationen, die zum Zeitpunkt der Signatur vorhanden waren.


LADEN VON UNTERZEICHNETEN MODULEN

Module werden mit insmod, modprobe, init_module () oder finit_module () geladen, genau wie bei nicht signierten Modulen, da im Userspace keine Verarbeitung erfolgt. Die Signaturprüfung erfolgt ausschließlich im Kernel.


NICHT GÜLTIGE UNTERZEICHNUNGEN UND UNSIGNIERTE MODULE

Wenn CONFIG_MODULE_SIG_FORCE aktiviert ist oder assertcemodulesig = 1 in der Kernel-Befehlszeile angegeben ist, lädt der Kernel nur gültig signierte Module, für die er einen öffentlichen Schlüssel hat. Andernfalls werden auch Module ohne Vorzeichen geladen. Jedes Modul, für das der Kernel einen Schlüssel hat, das jedoch eine Signaturinkongruenz aufweist, darf nicht geladen werden.

Jedes Modul mit einer nicht analysierbaren Signatur wird abgelehnt.


VERWALTUNG / SCHUTZ DES PRIVATEN SCHLÜSSELS

Da der private Schlüssel zum Signieren von Modulen verwendet wird, können Viren und Malware den privaten Schlüssel zum Signieren von Modulen verwenden und das Betriebssystem gefährden. Der private Schlüssel muss entweder zerstört oder an einen sicheren Ort verschoben werden und darf nicht im Stammknoten des Kernel-Quellbaums aufbewahrt werden.


Danke aber, ich habe diesen Text schon mal gesehen. Das Problem, auf das ich stoße, ist, dass ich, obwohl ich meine Datei signieren kann, die Datei immer noch nicht laden kann, weil: "Der Kernel erlaubt nur das Hinzufügen von Schlüsseln zu .system_keyring, wenn der X.509-Wrapper des neuen Schlüssels von gültig signiert ist Ein Schlüssel, der sich zum Zeitpunkt des Hinzufügens des Schlüssels bereits im .system_keyring befindet. "
OmnipotentEntity

Ich habe das auch schon mehrmals gesehen, aber es hilft nicht. Es gibt einen Fehler in Ubuntu, der alle Motherboards betrifft, die uefi nicht unterstützen: bugs.launchpad.net/ubuntu/+source/linux-lts-xenial/+bug/1656670
musbach

0

Bearbeiten ./include/generated/autoconf.hund ändern Sie die Zeile

define CONFIG_MODULE_SIG 1

zu

define CONFIG_MODULE_SIG 0
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.