LUKS-Fehler beim Booten

7
alg: drbg: could not allocate DRNG handle for ...

Ich sehe diesen Fehler nur auf der Konsole während des Startvorgangs der von uns erstellten virtuellen Maschinen. EDIT: 05.02.16 - Ich sehe es auch bei einigen Bare-Metal-Installationen. (Es wird vollständig gestartet.) Ich gehe davon aus, dass dies etwas mit der virtualisierten Hardware und dem Fehlen eines (kompatiblen) Zufallszahlengenerators zu tun hat. Das Problem ist, dass ich den Schweregrad nicht beurteilen kann. Ist die Verschlüsselungsstärke beeinträchtigt? (Sollte ich mich überhaupt um diesen Fehler kümmern?) Wie kann ich ihn beheben?

Wir verwenden QEMU / KVM unter CentOS 6.7. Ich kann virsh dumpxml ein Beispielsystem erstellen, wenn Sie wirklich glauben, dass es helfen wird. Wir verwenden die Standard-Chiffrier- / Schlüsselgröße von Anaconda . (aes-xts-plain64 / 512)

Dies ist die früheste Referenz, die ich auf der Linux-Crypto-Mailingliste gefunden habe . Leider geht es mir etwas über den Kopf.

http://www.mail-archive.com/linux-crypto%40vger.kernel.org/msg10398.html

alg: drbg: DRNG-Handle konnte nicht zugeordnet werden für ...

Aaron Copley
quelle
1
In der Regel verschlüsseln Sie den von den VMs verwendeten Speicher. Dies ist für die VM transparent. Dies ist einfach genug, wenn Sie die Infrastruktur betreiben.
Michael Hampton
Normalerweise verschlüssele ich VMs nicht, aber ich bin auf diesen Randfall gestoßen. Wenn LUKS in virtuellen Umgebungen nicht unterstützt wird, akzeptiere ich dies mit Zitieren.
Aaron Copley
1
Hmm. Von dieser Funktion wird ein Errno übergeben, aber diese Kernel-Nachrichten machen sich nicht die Mühe, ihn zu drucken.
Michael Hampton
1
Nein, ich spreche über den Code im eigentlichen Kernel (ab heute!).
Michael Hampton
1
Ich habe eine neue verschlüsselte VM installiert. Ich sehe die gleichen Meldungen, aber dann startet die VM normal weiter.
Michael Hampton

Antworten:

8

Ich glaube nicht, dass dies die Stärke Ihrer Verschlüsselung beeinflusst.

Ich habe den Quellcode überprüft und solange ich das, was ich richtig lese, interpretiere, müssen Sie sich darüber keine Sorgen machen.

Dieser Code gehört zum Modul 'stdrng'. Zumindest unter Fedora 23 ist dies in den Kernel integriert und wird nicht als Kernelmodul exportiert.

Wenn stdrng zum ersten Mal initialisiert wird, treten die folgenden Aufrufe auf.

In crypto / drbg.c beginnt hier die Initialisierung.

1997 module_init(drbg_init);

Dies registriert alle dem System bekannten Drbgs.

1985         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1986                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 1);
1987         for (j = 0; ARRAY_SIZE(drbg_cores) > j; j++, i++)
1988                 drbg_fill_array(&drbg_algs[i], &drbg_cores[j], 0);

Anschließend wird es an eine Hilfsfunktion übergeben, die die Initialisierung durchführt:

1989         return crypto_register_rngs(drbg_algs, (ARRAY_SIZE(drbg_cores) * 2));

In crypto/rng.cdiesem Fall wird einfach jedes Rng durchlaufen, um es zu registrieren.

210         for (i = 0; i < count; i++) {
211                 ret = crypto_register_rng(algs + i);
212                 if (ret)
213                         goto err;
214         }

Diese Funktion führt eine Reihe von Initialisierungsschritten aus und ruft dann eine andere Funktion zur Zuordnung auf.

196         return crypto_register_alg(base);

Was nicht so offensichtlich ist, ist, was während der Registrierung passiert.

Ein anderes Modul, das tcryptebenfalls in den Kernel integriert ist, erhält Benachrichtigungen über das Einfügen neuer Algorithmen. Sobald ein neuer registrierter Algorithmus angezeigt wird, plant er einen Test. Dies erzeugt die Ausgabe, die Sie auf Ihrem Bildschirm sehen.

Wenn der Test beendet ist, geht der Algorithmus in einen TEST-Zustand über. Wenn der Test fehlschlägt, kann ich mir vorstellen (ich konnte das Bit, das dieses Verhalten erzeugt, nicht finden), dass es nicht für die Suche ausgewählt werden kann, wenn Sie die richtigen Flags übergeben.

Ob der Test erfolgreich ist oder nicht, wird definitiv intern gespeichert.

Darüber hinaus bewirkt das Aufrufen des Psudeo-Zufallszahlengenerators, dass eine Liste von Algorithmen von Prngs in der Reihenfolge der Stärke iteriert wird, wie in dieser Anmerkung in vorgegeben crypto/drbg.c

107 /*
108  * The order of the DRBG definitions here matter: every DRBG is registered
109  * as stdrng. Each DRBG receives an increasing cra_priority values the later
110  * they are defined in this array (see drbg_fill_array).
111  *

Da der stärkste nicht ausfällt (hmac sha256), ist es unwahrscheinlich, dass Sie die ausgefallenen verwenden, selbst wenn sie ausgewählt werden könnten.

Zusammenfassen -

  • Dies passiert, wenn das stdrngModul für etwas benötigt wird.
  • Es lädt alle bekannten Algorithmen.
  • Alle geladenen Algorithmen werden getestet. Einige können scheitern (warum wird in dieser Antwort nicht berücksichtigt).
  • Test fehlgeschlagene Algorithmen sollten später nicht zur Auswahl stehen.
  • Die PRNGS sind nach Stärke geordnet und starke PRNGS, die bestehen, werden zuerst ausprobiert.
  • Dinge, auf die man sich stdrnghoffentlich stützt, sollten diese Algorithmen nicht als Grundlage für ihre PRNG-Quelle verwenden.

Mit dem folgenden Befehl können Sie sehen, welche Algen erfolgreich waren und die Tests bestanden haben:

 grep -EC5 'selftest.*passed' /proc/crypto

Sie können die Auswahlpriorität auch im Feld "Priorität" anzeigen. Je höher der Wert, desto stärker ist der PRNG laut Modulautor.

Ich bin froh, dass ich mich hier irre, da ich mich nicht als Kernel-Programmierer betrachte, sondern abschließend -

Beim stdrngLaden werden anscheinend andere Algorithmen aus der Liste der akzeptablen Algen ausgewählt, die als stärker als die fehlgeschlagenen angesehen werden, und die fehlgeschlagenen werden wahrscheinlich sowieso nicht ausgewählt.

Daher glaube ich, dass dies kein zusätzliches Risiko für Sie ist, wenn Sie luks verwenden.

Matthew Ife
quelle
Vielen Dank für die sehr gründliche Analyse. Es hat wirklich geholfen, es aufzuschlüsseln. Gibt es einen bekannten Grund dafür, dass diese Tests bei einem QEMU / KVM-Gast konsistent fehlschlagen? (Ich sollte es wirklich aus Neugier in VirtualBox / VMware versuchen.)
Aaron Copley
1

Wie kann ich es reparieren?

Gemäß der Red Hat Knowledge Base müssen Sie Ihrem initrd das Kernelmodul 'ctr' hinzufügen. In ihren Anweisungen heißt es auch, 'ecb' einzuschließen, obwohl das Problem anscheinend darin besteht, dass das 'ctr'-Modul nicht geladen wird.

dracut -f -v --add-drivers "ctr ecb"

Abonnenten können die vollständigen Informationen anzeigen. Ich bin mir nicht sicher, ob ich den Rest hier erneut veröffentlichen darf, daher habe ich die vollständige Lösung umschrieben.

https://access.redhat.com/solutions/2249181

Bearbeiten 29.09.2016:

Sie können diese Treiber auch hinzufügen, /etc/dracut.confdamit sie bei Kernel-Upgrades zu den neuen initramfs hinzugefügt werden. Andernfalls treten Ihre Symptome viele Monate später auf mysteriöse Weise wieder auf. ;)

add_drivers+="ctr ecb"
Aaron Copley
quelle