Arch manual pages

RANDOM(4) Linux-Programmierhandbuch RANDOM(4)

random, urandom - Kernel-Geräte zur Erzeugung von Zufallszahlen

#include <linux/random.h>

int ioctl(fd, RNDrequest, param);

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.

Linux 3.17 und neuer stellt die einfachere und sichere Schnittstelle getrandom(2) zur Verfügung, die keine besonderen Dateien benötigt; siehe die Handbuchseite von getrandom(2) für Details.

Beim Lesen aus dem Gerät /dev/urandom werden mittels eines Pseudozufallszahlengenerators, dessen Seed aus dem Entropie-Pool stammt, zufällige Bytes zurückgeliefert. Lesevorgänge aus diesem Gerät blockieren nicht (d.h. die CPU kriecht nicht), können aber zu einer merkbaren Verzögerung führen, wenn große Mengen an Daten angefordert werden.

Beim Lesen aus /dev/urandom während der frühen Systemstartphase könnten Daten zurückgeliefert werden, die vor dem Zeitpunkt der Initialisierung des Entropie-Pools stammen. Falls dies für Ihre Anwendung ein Problem sein könnte, verwenden Sie stattdessen getrandom(2) oder /dev/random.

Das Gerät /dev/random ist eine historische Schnittstelle, die zu einem Zeitpunkt entstand, als den kryptographischen Primitiven, die in der Implementierung von /dev/urandom verwendet werden, nicht durchgehend vertraut wurde. Sie liefert nur so viele zufällige Bits zurück, wie schätzungsweise an Bits durch frisches Rauschen in den Entropie-Pool kommen und blockiert, falls notwendig. /dev/random ist für Anwendungen geeignet, die Zufall hoher Güte benötigen und zwischenzeitliche Verzögerungen verkraften können.

Wenn der Entropie-Pool leer ist, werden Lesezugriffe auf /dev/random blockiert, bis weiteres Umgebungsrauschen gesammelt wurde. Wenn open(2) mit dem Schalter O_NONBLOCK für /dev/random aufgerufen wird, werden folgende read(2) nicht blockieren, falls die angeforderte Anzahl an Bytes nicht verfügbar ist. Stattdessen werden die verfügbaren Bytes zurückgeliefert. Falls kein Byte verfügbar ist, wird read(2) -1 zurückliefern und errno auf EAGAIN gesetzt werden.

Der Schalter O_NONBLOCK hat beim Öffnen von /dev/urandom keinen Effekt. Beim Aufruf von read(2) für das Gerät /dev/urandom werden Leseanforderungen von bis zu 256 bytes so viele Bytes wie angefordert zurückliefern und werden nicht durch einen Signal-Handler unterbrochen. Leseanforderungen mit mehr als dieser Anzahl könnten weniger als die angeforderte Anzahl an Bytes zurückliefern oder mit dem Fehler EINTR fehlschlagen, falls sie durch einen Signal-Handler unterbrochen wurden.

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

Durch Schreiben nach /dev/random oder /dev/urandom wird der Entropie-Pool mit den geschriebenen Daten aktualisiert, aber dies führt nicht zu einer höheren Entropie. Das bedeutet, dass dies die Inhalte der von beiden Dateien gelesenen Dateien beeinflusst, aber die Lesevorgänge aus /dev/random nicht beschleunigt.

Die Schnittstelle /dev/random wird als historische Schnittstelle betrachtet und /dev/urandom wird bevorzugt und als ausreichend für alle Anwendungsfälle angesehen. Die einzige Ausnahme sind Anwendungen, die Zufall während der frühen Systemstartphase benötigen. Für diese Anwendungen muss stattdessen getrandom(2) verwandt werden, da es blockiert, bis der Entropie-Pool initialisiert ist.

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.

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 sichernl
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 dem obigen Beispiel nehmen wir Linux 2.6.0 oder neuer an, wobei /proc/sys/kernel/random/poolsize die Größe des Entropie-Pools in Bits zurückliefert (siehe unten).

Die Dateien im Verzeichnis /proc/sys/kernel/random (verfügbar seit 2.3.16) stellen zusätzliche Informationen über das Gerät /dev/random zur Verfügung.
entropy_avail
Die nur lesbare Datei gibt die verfügbare Entropie in Bits an. Dies ist eine Zahl im Bereich 0 bis 4096.
poolsize
Diese Datei gibt die Größe des Entropie-Pools 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 und neuer:
Diese Datei ist nur lesbar und enthält die Größe des Entropie-Pools in Bits. Sie enthält den Wert 4096.
read_wakeup_threshold
Diese Datei gibt die erforderliche Entropie (in Bits) an, um »schlafend« auf Entropie aus /dev/random wartende Prozesse zu »wecken«. Der Standardwert ist 64.
write_wakeup_threshold
Diese Datei 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.
uuid und boot_id
Diese nur lesbaren Dateien enthalten zufällige Zeichenketten wie 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Die erstere wird bei jedem Lesezugriff neu erzeugt, die letztere nur einmal.

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
Ermittelt die Entropieanzahl des Eingabe-Pools, der Inhalt wird identisch zudem der Datei entropy_avail unter Proc sein. Das Ergebnis wird in dem Int gespeichert, auf den das zweite Argument zeigt.
RNDADDTOENTCNT
Erhöht oder erniedrigt die Entropianzahl in dem Eingabe-Pool um den Wert, auf den das Argument zeigt.
RNDGETPOOL
Entfernt in Linux 2.6.9
RNDADDENTROPY
Fügt zusätzliche Entropie in den Eingabe-Pool hinzu, erhöht damit die Entropiezahl. Dies unterscheidet sich vom Schreiben nach /dev/random oder /dev/urandom, bei dem nur Daten hinzugefügt werden, aber nicht die Entropiezahl erhöht wird. Die folgende Struktur wird verwandt:

struct rand_pool_info {
    int    entropy_count;
    int    buf_size;
    __u32  buf[0];
};

    

Hierbei ist entropy_count der Wert, der zu der Entropiezahl hinzugefügt (oder davon entfernt) wird und buf der Puffer der Größe buf_size, der zum Entropie-Pool hinzugefügt wird.
RNDZAPENTCNT, RNDCLEARPOOL
Nullt die Entropiezahl aller Pools und fügt einige Systemdaten (wie die Uhrzeit) zu den Pools hinzu.

/dev/random
/dev/urandom

Für einen Überblick und Vergleich über die verschiedenen Schnittstellen, die zum Erlangen von Zufall verwandt werden können, siehe random(7).

Während der frühen Systemstartphase können Lesezugriffe auf /dev/urandom Daten zurückliefern, die vor der Initialisierung des Entropie-Pools erzeugt wurden.

mknod(1), getrandom(2), random(7)

RFC 1750, »Randomness Recommendations for Security«

Diese Seite ist Teil der Veröffentlichung 5.03 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/.

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>, Dr. Tobias Quathamer <toddy@debian.org> und Helge Kreutzmann <debian@helgefjell.de> 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 <debian-l10n-german@lists.debian.org>.

15. September 2017 Linux