Wie bringe ich / dev / random dazu, auf einer virtuellen Ubuntu-Maschine zu arbeiten?

19

Anscheinend basiert / dev / random auf Hardware-Interrupts oder ähnlichen unvorhersehbaren Aspekten physischer Hardware. Da virtuelle Maschinen keine physische Hardware haben, führt das Ausführen cat /dev/randominnerhalb einer virtuellen Maschine zu nichts. Ich verwende Ubuntu Server 11.04 als Host und Gast mit libvirt / KVM.

Ich muss Kerberos in einer VM krb5_newrealmeinrichten, bleibt aber für immer "Zufällige Daten werden geladen", da das System keine produziert.

Weiß jemand, wie man das umgeht? Ist es möglich, das / dev / random des Hosts (das sehr gesprächig ist) an die VM zu übergeben, damit die VM ihre zufälligen Daten verwenden kann?

Ich habe gelesen, dass es einige Software-Alternativen gibt, aber sie sind nicht gut für die Kryptologie, da sie nicht zufällig genug sind.

BEARBEITEN: Es scheint, dass cat / dev / random auf dem VM nur sehr, sehr langsam eine Ausgabe erzeugt. Ich habe mein Reich eingerichtet, indem ich ungefähr zwei Stunden gewartet habe, während es "Zufallsdaten laden" war. Irgendwann hat es gereicht, um weiterzumachen. Ich bin immer noch daran interessiert, dies zu beschleunigen.

Nick
quelle

Antworten:

10

Es sollte einfach funktionieren. Obwohl der VM keine dedizierte physische Hardware hat, hat er immer noch Zugriff auf einige sehr gute Zufallsquellen. Beispielsweise kann der TSC der CPU verwendet werden, um den Lesevorgang von virtuellen Datenträgern zeitlich zu steuern. Dadurch werden physische Datenträger letztendlich auf die milliardstel Sekunde genau zeitlich gesteuert. Diese Zeiten hängen von der turbulenten Luftströmungsscherung auf der Festplatte ab, die nicht vorhersehbar ist.

Eine ähnliche Logik gilt für den Netzwerkverkehr. Obwohl die Schnittstelle virtualisiert ist, hängt das Paket-Timing von der Phasenverschiebung zwischen dem Quarzoszillator auf der Netzwerkkarte ab, solange das Paket in einem physischen Netzwerk stammt (und nicht lokal in der Box ist, z. B. aus einer anderen VM) und der Quarzoszillator, der den TSC antreibt. Dies ist abhängig von mikroskopischen Zonentemperaturschwankungen in den beiden Quarzkristallen. Auch das ist nicht vorhersehbar.

Wenn es aus irgendeinem Grund nicht funktioniert, besteht die einfachste Lösung darin, ein Programm zur Minenentropie zu schreiben und es dem Systempool hinzuzufügen. Die Netzwerkschnittstelle ist Ihre zuverlässigste Quelle. Beispielsweise können Sie Code schreiben an:

1) Fragen Sie die TSC ab.

2) Stellen Sie eine DNS-Abfrage an einen Server, von dem bekannt ist, dass er sich nicht auf demselben physischen Computer befindet.

3) Fragen Sie die TSC ab, wenn die Abfrage abgeschlossen ist.

4) Wiederholen Sie dies einige Male, und akkumulieren Sie alle TSC-Werte.

5) Führen Sie einen sicheren Hash für die akkumulierten TSC-Funktionen durch.

6) Übergeben Sie die Ausgabe der sicheren Hash-Funktion an den Entropiepool des Systems.

7) Überwachen Sie den Entropiepool und warten Sie, bis er niedrig ist. Wenn dies der Fall ist, kehren Sie zu Schritt 1 zurück.

Linux verfügt über einfache IOCTL-Aufrufe, um dem Pool Entropie hinzuzufügen, den Pool-Level zu überprüfen usw. Sie haben wahrscheinlich rngd, was Entropie aus einer Pipe nehmen und es in den Systempool einspeisen kann. Sie können die Pipe von jeder beliebigen Quelle aus füllen, unabhängig davon, ob es sich um TSC- oder Wget-Anforderungen von Ihrer eigenen Entropiequelle handelt.

David Schwartz
quelle
Ihr zweiter Vorschlag scheint theoretisch interessant zu sein, aber ich habe auf eine Lösung gehofft, die keine Programmierung beinhaltet. Ich frage mich, ob das Kopieren einer großen Datei von einem USB-Laufwerk zum oder vom Host den Entropie-Pool des VMs beeinträchtigen würde (dh, es würde schneller funktionieren). In diesem Fall könnte ich versuchen, mein Realm zu erstellen, während ein Backup eines Maschinenabbilds auf dem Host ausgeführt wird ...
Nick,
1
Sie können einige Tests durchführen, um festzustellen, was den Entropiepool auffüllt. Wenn Sie etwas gefunden haben, das funktioniert, können Sie das einfach tun. Netzwerkverkehr sollte es tun. Laufwerksaktivität sollte es tun. Sie können testen, was mit diesem Befehl funktioniert: cat /proc/sys/kernel/random/entropy_availAlles, was zunimmt, funktioniert.
David Schwartz
Denken Sie daran, dass laufende Katze Entropie "frisst" (Randomisierung des Adressraums). Sie können verwenden python -c 'while True: import time; print str(time.sleep(1))[0:0] + open("/proc/sys/kernel/random/entropy_avail", "rb").read(),'. Ja, das ist schwer zu lesen, aber ich sehe keine Möglichkeit, neue Zeilen in Kommentare
einzutragen
10

Ich verwende Haveged auf allen meinen Headless-Servern, die kryptografische Operationen ausführen (z. B. TLS-Handshakes, Kerberos usw.). Es sollte sich im Paket-Repository der meisten Ubuntu-Versionen befinden: http://packages.ubuntu.com/search?keywords=haveged&searchon=names&suite=all§ion=all

haveged verwendet den HAVAGE-Algorithmus, um Entropie aus dem internen Zustand moderner Prozessoren zu extrahieren. Hier ist eine ausführliche Erklärung: http://www.irisa.fr/caps/projects/hipsor/

Sie können die Zufälligkeit der generierten Entropie mit dem ent-Paket überprüfen. Auf meinen Systemen hat die erzeugte Entropie von haveged alle Zufallstests von ent bestanden

Frank L
quelle
Sie müssen auch die NIST-Testsuite ausführen, um sicherzugehen.
Michael Hampton
7

Ja, du kannst es aussäen, von:

http://manpages.ubuntu.com/manpages/jaunty/man4/random.4.html

Sie können das einfach in / dev / urandom einfügen und es sollte den Entropiepool auslösen. Ich konnte dies bestätigen durch:

root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
128
root@mx01-ewr:/proc/sys/kernel/random# cat /dev/xvda >/dev/urandom  &
[1] 16187 # just using this as a source of data, you could do ssh hostIP 'cat /dev/random' >... etc
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1221
root@mx01-ewr:/proc/sys/kernel/random# cat entropy_avail 
1398

Bonus, wenn Sie den Befehl ssh über einen Router ausführen, sodass Entropie generiert wird * :)

Polynom
quelle
Ich bin verwirrt über den Mittelteil. Ich habe kein "/ dev / xvda" im System. Ist das Ziel, ssh zu verwenden, um das / dev / random des Hosts in das / dev / urandom des virtuellen Computers zu routen? Ich kann alles, was ich will, in "/ dev / urandom" senden und es kommt aus "/ dev / random"?
Nick
Ich kann mit "ssh 192.168.1.1 'cat / dev / random'" zufällige Daten vom Host abrufen, aber ich weiß nicht, wie sich dies auf die Gäste "/ dev / random" auswirkt. "ssh 192.168.1.1 'cat / dev / random'> / dev / urandom" scheint nichts zu tun.
Nick
Ich habe gerade getestet, indem ich 'cat / dev / random' in einem Terminal ausgeführt und gewartet habe, bis die Datenausgabe gestoppt wurde. Dann habe ich in einem anderen 'cat somerandomfile> / dev / urandom' gemacht und langsam hat das 'cat / dev / random' wieder angefangen, Sachen auszugeben. Es sieht so aus, als bräuchten Sie eine Menge zufälliger Eingaben in / dev / urandom, um würdige / dev / zufällige Eingaben zu machen. Wollen Sie damit sagen, dass Sie beim Ausführen der Katze ... '> / dev / urandom überhaupt keine Ausgabe auf / dev / random sehen?
Polynom
Ich sehe irgendwann eine Ausgabe, aber sie ist sehr langsam. Ich bin mir nicht sicher, ob es mehr ist als das, was natürlich produziert wird. Ich habe festgestellt, dass eine sehr langsame und kleine Menge zufälliger Daten in VMs generiert wird, es dauert nur ewig. Ich habe mein Reich geschaffen, nachdem ich es für ungefähr 2 Stunden sitzen und "zufällige Daten sammeln" ließ.
Nick
+1 für hilfreiche Antwort.
Nick
5

Das hat bei mir funktioniert

Das Ausführen von krb5_newrealm in einer VM kann lange dauern (nachdem die Meldung "Zufällige Daten werden geladen" angezeigt wurde). Sie können den folgenden Hack verwenden, um die Dinge ein wenig zu beschleunigen.

$ sudo aptitude install rng-tools -y
$ sudo rngd -r /dev/urandom -o /dev/random  # don't do this in production!

Gepostet unter http://fossies.org/linux/john/doc/Kerberos-Auditing-HOWTO.md

Vivek
quelle
1

Die X86-Antwort lautet: Stellen Sie sicher, dass Ihre VM RdRand oder RdSeed nicht abfängt. Sie vertrauen Ihrer VM in vielen Dingen, dies ist einer von ihnen.

Ein ausreichend aktueller RNGd auf einer Post-Snady-Bridge-CPU wird (oder kann angewiesen werden) RdRand oder RdSeed verwenden, und ein nicht abgefangener RdRand oder RdSeed wird in die VM entropisiert. / dev / random arbeitet dann mit einer realen (nicht virtuellen) Entropiequelle.

Das ist kein Zufall. Es ist genau dort in den Intel-Architekturdokumenten.

Für eine gerätebasierte Hardware-Entropiequelle (IE verwendet einen Kerneltreiber, um sie freizugeben) muss die VM die physische Quelle ordnungsgemäß virtualisieren. Ich habe keine Ahnung, ob und für welche Geräte sie dies tun.

Wenn Ihr RNGd die unten stehende Option drng nicht hat, aktualisieren Sie sie. Wenn Ihre Hardware kein schnelles Hardware-RNG hat, sind Sie zum Scheitern verurteilt und sollten aus Sicherheitsgründen die Verwendung unterschiedlicher Hardware in Betracht ziehen.

# rngd --help
Usage: rngd [OPTION...]
Check and feed random data from hardware device to kernel entropy pool.

  -b, --background           Become a daemon (default)
  **-d, --no-drng=1|0          Do not use drng as a source of random number input**
                             (default: 0)
  -f, --foreground           Do not fork and become a daemon
  -n, --no-tpm=1|0           Do not use tpm as a source of random number input
                             (default: 0)
  -o, --random-device=file   Kernel device used for random number output
                             (default: /dev/random)
  -p, --pid-file=file        File used for recording daemon PID, and multiple
                             exclusion (default: /var/run/rngd.pid)
  -q, --quiet                Suppress error messages
  -r, --rng-device=file      Kernel device used for random number input
                             (default: /dev/hwrng)
  -s, --random-step=nnn      Number of bytes written to random-device at a time
                             (default: 64)
  -v, --verbose              Report available entropy sources
  -W, --fill-watermark=n     Do not stop feeding entropy to random-device until
                             at least n bits of entropy are available in the
                             pool (default: 2048), 0 <= n <= 4096
 -?, --help                 Give this help list
  --usage                Give a short usage message
  -V, --version              Print program version

Mandatory or optional arguments to long options are also mandatory or optional
for any corresponding short options.

Report bugs to Jeff Garzik <[email protected]>.
David Johnston
quelle
0

Ich hatte auch Probleme mit krb5_newrealm. Dies funktionierte gut für mich, basierend auf der obigen Antwort:

cat /dev/sda > /dev/urandom

Möglicherweise möchten Sie es beenden, wenn Sie mit dem Bedarf an zufälligen Daten fertig sind. / dev / sda enthält wahrscheinlich mehr Daten als Sie benötigen.

Hinweis: Ich bin nicht sicher, wie zufällig die auf diese Weise erzeugten Zufallsdaten tatsächlich sind.

mgwilliams
quelle
Bitte verweisen Sie auf andere Posts, indem Sie den Namen des Posts verwenden. "Oben" oder "unten" zu sagen ist bedeutungslos, weil wir nicht alle Beiträge in der gleichen Reihenfolge sehen.
John Gardeniers
4
Dies mag funktionieren, aber / dev / sda enthält viele nicht zufällige Daten (mindestens Tonnen von Nullen), was die Idee aus Sicherheitsgründen nicht sehr gut macht. Zusätzlich zu Nullen beginnt es mit MBR, was eigentlich sehr vorhersehbar ist, ich kann mindestens 3 Bytes erraten ... oder es
bootet