random(4) Kernel-Geräte zur Erzeugung von Zufallszahlen

Other Alias

urandom

ÜBERSICHT

#include <linux/random.h>

int ioctl(fd, RNDrequest, param);

BESCHREIBUNG

Die zeichenorientierten Gerätedateien /dev/random und /dev/urandom (seit Linux 1.3.30 vorhanden) sind eine Schnittstelle zum kernelinternen Zufallszahlengenerator. Die Datei /dev/random hat die Major-Gerätenummer 1 und die Minor-Gerätenummer 8. Die Datei /dev/urandom hat die Major-Gerätenummer 1 und die Minor-Gerätenummer 9.

Der Zufallszahlengenerator sammelt das Umgebungs-»Rauschen« von Gerätetreibern und anderen Quellen in einem Entropie-Pool. Der Generator merkt sich seine Schätzung der Anzahl der Rausch-Bits im Entropie-Pool. Aus diesem Entropie-Pool von Zufallszahlen werden erzeugt.

When read, the /dev/random device will return random bytes only within the estimated number of bits of noise in the entropy pool. /dev/random should be suitable for uses that need very high quality randomness such as one-time pad or key generation. When the entropy pool is empty, reads from /dev/random will block until additional environmental noise is gathered. If open(2) is called for /dev/random with the flag O_NONBLOCK, a subsequent read(2) will not block if the requested number of bytes is not available. Instead, the available bytes are returned. If no byte is available, read(2) will return -1 and errno will be set to EAGAIN.

A read from the /dev/urandom device will not block waiting for more entropy. If there is not sufficient entropy, a pseudorandom number generator is used to create the requested bytes. As a result, in this case the returned values are theoretically vulnerable to a cryptographic attack on the algorithms used by the driver. Knowledge of how to do this is not available in the current unclassified literature, but it is theoretically possible that such an attack may exist. If this is a concern in your application, use /dev/random instead. O_NONBLOCK has no effect when opening /dev/urandom. When calling read(2) for the device /dev/urandom, signals will not be handled until after the requested random bytes have been generated.

Seit Linux 3.16 wird ein read(2) aus /dev/urandom höchstens 32 MB zurückliefern. Ein read(2) aus /dev/random wird höchstens 512 Bytes zurückliefern (340 Bytes unter Linux-Kerneln vor Version 2.6.12).

Writing to /dev/random or /dev/urandom will update the entropy pool with the data written, but this will not result in a higher entropy count. This means that it will impact the contents read from both files, but it will not make reads from /dev/random faster.

Verwendung

Wenn Sie unsicher sind, ob Sie /dev/random oder /dev/urandom verwenden sollten, dann ist wahrscheinlich letzteres das Richtige für Sie. Als allgemeine Regel sollte /dev/urandom für alles außer langlebige GPG/SSL/SSH-Schlüssel verwendet werden.

Es wird empfohlen, eine Seed-Datei über Neustarts des Systems hinweg zu speichern. (Alle gängigen Linux-Distributionen tun das seit spätestens dem Jahr 2000). Dann ist die Ausgabe des Zufallszahlengenerators kryptografisch sicher gegen Angreifer ohne lokalen Root-Zugriff, sobald die Seed-Datei während der Boot-Sequenz neu geladen wird, und völlig ausreichend für Sitzungs-Schlüssel bei Netzwerk-Verschlüsselung. Da Lesezugriffe auf /dev/random blockieren können, werden die Nutzer in der Regel sie im nicht blockierenden Modus öffnen (oder für den Lesezugriff eine Zeitschranke setzen) und eine Art von Benachrichtigung des Benutzers realisieren wollen, wenn die gewünschte Entropie nicht sofort verfügbar ist.

Der Kernel-Zufallszahlen-Generator wurde entwickelt, um eine kleine Menge von qualitativ hochwertigem Seed (»Saatgut«) für die Initialisierung eines kryptographischen Pseudo-Zufallszahlengenerators (CPRNG) zu erzeugen. Er ist auf Sicherheit und nicht auf Geschwindigkeit ausgelegt. Für die Erzeugung großer Mengen von Zufallsdaten ist er nicht geeignet. Anwender sollten sehr sparsam bei der Entnahme von Seed aus /dev/urandom (und /dev/random) sein; der Verbrauch unnötig großer Datenmengen von diesem Gerät wird eine negative Auswirkung auf die Mitbenutzer des Geräts haben.

Die erforderliche Menge an Seed für die Erstellung eines kryptografischen Schlüssels entspricht der effektiven Größe des Schlüssels. Zum Beispiel hat eine 3072-Bit-RSA oder ein privater Diffie-Hellman-Schlüssel eine effektive Schlüssellänge von 128 Bit (es werden etwa 2^128 Operationen benötigt, um den Schlüssel zu knacken brechen). Somit muss ein Schlüsselgenerator nur 128 Bit (16 Byte) von Seed aus /dev/random entnehmen.

Während ein Sicherheitszuschlag über dieses Minimum heraus sinnvoll ist, um sich gegen Mängel im CPRNG-Algorithmus abzusichern, kann keine heute verfügbare kryptographische Primitive mehr als 256 Bit an Sicherheit. Wenn also ein Programm mehr als 256 Bit (32 Byte) pro Aufruf oder angemessenem Regenerierungsintervall (mindestens eine Minute) aus dem Entropiepool liest, sollte das als Zeichen genommen werden, dass seine Kryptographie ungeschickt implementiert ist.

Konfiguration

Wenn auf Ihrem System /dev/random und /dev/urandom nicht schon vorhanden sind, können sie mit den folgenden Befehlen erzeugt werden:

    mknod -m 666 /dev/random c 1 8
    mknod -m 666 /dev/urandom c 1 9
    chown root:root /dev/random /dev/urandom

Wenn ein Linux-System wenig Benutzerinteraktion während des Systemstarts hat, kann der Entropie-Pool in einem ziemlich vorhersehbaren Zustand sein. Dadurch verringert sich die tatsächliche Höhe des Rauschens im Entropie-Pool unter die Schätzung. Um diesem Effekt entgegenzuwirken, kann man Informationen über den Entropie-Pool über Stillstandszeiten und Systemstarts hinweg zu übernehmen. Dazu fügen Sie die Zeilen in ein geeignetes Skript ein, das während das des Hochfahrens des Linux-Systems ausgeführt wird:

    echo "Initialisierung des Zufallszahlengenerators …"
    random_seed=/var/run/random-seed
    # Seed über einen Neustart hinweg sichern
    # den gesamten Entropie-Pool laden und dann sichern
    if [ -f $random_seed ]; then
        cat $random_seed >/dev/urandom
    else
        touch $random_seed
    fi
    chmod 600 $random_seed
    poolfile=/proc/sys/kernel/random/poolsize
    [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
    bytes=$(expr $bits / 8)
    dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

Fügen Sie ebenfalls in einem passenden Skript, das beim Herunterfahren des Linux-Systems ausgeführt wird, die folgenden Zeilen ein:

    # Seed über einen Neustart hinweg sichern
    # den gesamten Entropie-Pool sichern
    echo "Seed wird gesichert …"
    random_seed=/var/run/random-seed
    touch $random_seed
    chmod 600 $random_seed
    poolfile=/proc/sys/kernel/random/poolsize
    [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
    bytes=$(expr $bits / 8)
    dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

In the above examples, we assume Linux 2.6.0 or later, where /proc/sys/kernel/random/poolsize returns the size of the entropy pool in bits (see below).

/proc-Schnittstelle

Die Dateien im Verzeichnis /proc/sys/kernel/random (verfügbar seit 2.3.16) stellen eine zusätzliche Schnittstelle zu /dev/random zur Verfügung.

Die nur lesbare Datei entropy_avail gibt die verfügbare Entropie an. Normalerweise ist das 4096 (Bits), ein voller Entropie-Pool.

Die Datei poolsize gibt die Größe des Entropiepools an. Die Semantik dieser Datei variiert mit den Kernel-Versionen:

Linux 2.4:
Diese Datei gibt die Größe des Entropie-Pools in Bytes an. Normalerweise wird diese Datei den Wert 512 haben. In sie kann aber geschrieben werden und auf jeden Wert geändert werden, für den ein Algorithmus verfügbar ist. Als möglichkeite Werte stehen 32, 64, 128, 256, 512, 1024 oder 2048 zur Verfügung.
Linux 2.6:
Diese Datei ist nur lesbar und enthält die Größe des Entropie-Pools in Bits. Sie enthält den Wert 4096.

Die Datei read_wakeup_threshold gibt die erforderliche Entropie (in Bits) an, um »schlafend« auf Entropie aus /dev/random wartende Prozesse zu »wecken«. Der Standardwert ist 64. Die Datei write_wakeup_threshold gibt die Entropie-Schwelle in Bits an, unterhalb derer Prozesse aufgeweckt werden, die ein select(2) oder ein poll(2) für den schreibenden Zugriff auf /dev/random ausführen. Diese Werte können geändert werden, indem in die Dateien geschrieben wird.

Die nur lesbaren Dateien, die uuid und boot_id enthalten zufällige Zeichenketten wie 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Die erstere wird bei jedem Lesezugriff neu erzeugt, die letztere nur einmal.

ioctl(2)-Schnittstelle

Die folgenden ioctl(2)-Anfragen sind in mit entweder /dev/random oder /dev/urandom verbundenen Datei-Deskriptoren definiert. Alle ausgeführten Anfragen werden mit dem Eingabe-Entropie-Pool wechselwirken und damit auf /dev/random und /dev/urandom auswirken. Die Capability CAP_SYS_ADMIN wird für alle Anfragen außer RNDGETENTCNT benötigt.
RNDGETENTCNT
Retrieve the entropy count of the input pool, the contents will be the same as the entropy_avail file under proc. The result will be stored in the int pointed to by the argument.
RNDADDTOENTCNT
Increment or decrement the entropy count of the input pool by the value pointed to by the argument.
RNDGETPOOL
Entfernt in Linux 2.6.9
RNDADDENTROPY
Add some additional entropy to the input pool, incrementing the entropy count. This differs from writing to /dev/random or /dev/urandom, which only adds some data but does not increment the entropy count. The following structure is used:
    struct rand_pool_info {
        int    entropy_count;
        int    buf_size;
        __u32  buf[0];
    };
Here entropy_count is the value added to (or subtracted from) the entropy count, and buf is the buffer of size buf_size which gets added to the entropy pool.
RNDZAPENTCNT, RNDCLEARPOOL
Zero the entropy count of all pools and add some system data (such as wall clock) to the pools.

DATEIEN

/dev/random
/dev/urandom

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 4.06 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <[email protected]> und Helge Kreutzmann <[email protected]> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <[email protected]>.