random(4) Device Drivers Manual random(4) BEZEICHNUNG random, urandom - Kernel-Gerate zur Erzeugung von Zufallszahlen UBERSICHT #include int ioctl(fd, RNDrequest, param); BESCHREIBUNG Die zeichenorientierten Geratedateien /dev/random und /dev/urandom (seit Linux 1.3.30 vorhanden) sind eine Schnittstelle zum kernelinternen Zufallszahlengenerator. Die Datei /dev/random hat die Major-Geratenummer 1 und die Minor-Geratenummer 8. Die Datei /dev/urandom hat die Major-Geratenummer 1 und die Minor-Geratenummer 9. Der Zufallszahlengenerator sammelt das Umgebungs->>Rauschen<< von Geratetreibern und anderen Quellen in einem Entropie-Pool. Der Generator merkt sich seine Schatzung 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 Verfugung, die keine besonderen Dateien benotigt; siehe die Handbuchseite von getrandom(2) fur Details. Beim Lesen aus dem Gerat /dev/urandom werden mittels eines Pseudozufallszahlengenerators, dessen Seed aus dem Entropie-Pool stammt, zufallige Bytes zuruckgeliefert. Lesevorgange aus diesem Gerat blockieren nicht (d.h. die CPU kriecht nicht), konnen aber zu einer merkbaren Verzogerung fuhren, wenn grosse Mengen an Daten angefordert werden. Beim Lesen aus /dev/urandom wahrend der fruhen Systemstartphase konnten Daten zuruckgeliefert werden, die vor dem Zeitpunkt der Initialisierung des Entropie-Pools stammen. Falls dies fur Ihre Anwendung ein Problem sein konnte, verwenden Sie stattdessen getrandom(2) oder /dev/random. Das Gerat /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 zufallige Bits zuruck, wie schatzungsweise an Bits durch frisches Rauschen in den Entropie-Pool kommen und blockiert, falls notwendig. /dev/random ist fur Anwendungen geeignet, die Zufall hoher Gute benotigen und zwischenzeitliche Verzogerungen verkraften konnen. Wenn der Entropie-Pool leer ist, werden Lesezugriffe auf /dev/random blockiert, bis weiteres Umgebungsrauschen gesammelt wurde. Seit Linux 5.6 wird der Schalter O_NONBLOCK ignoriert, da /dev/random nicht mehr langer blockieren wird (ausser im fruhen Systemstartprozess). Wenn open(2) in alteren Versionen mit dem Schalter O_NONBLOCK fur /dev/random aufgerufen wird, werden folgende read(2) nicht blockieren, falls die angeforderte Anzahl an Bytes nicht verfugbar ist. Stattdessen werden die verfugbaren Bytes zuruckgeliefert. Falls kein Byte verfugbar ist, wird read(2) -1 zuruckliefern und errno auf EAGAIN gesetzt werden. Der Schalter O_NONBLOCK hat beim Offnen von /dev/urandom keinen Effekt. Beim Aufruf von read(2) fur das Gerat /dev/urandom werden Leseanforderungen von bis zu 256 bytes so viele Bytes wie angefordert zuruckliefern und werden nicht durch einen Signal-Handler unterbrochen. Leseanforderungen mit mehr als dieser Anzahl konnten weniger als die angeforderte Anzahl an Bytes zuruckliefern 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 hochstens 32 MB zuruckliefern. Ein read(2) aus /dev/random wird hochstens 512 byte zuruckliefern (340 byte vor Linux 2.6.12). Durch Schreiben nach /dev/random oder /dev/urandom wird der Entropie-Pool mit den geschriebenen Daten aktualisiert, aber dies fuhrt nicht zu einer hoheren Entropie. Das bedeutet, dass dies die Inhalte der von beiden Dateien gelesenen Dateien beeinflusst, aber die Lesevorgange aus /dev/random nicht beschleunigt. Verwendung Die Schnittstelle /dev/random wird als historische Schnittstelle betrachtet und /dev/urandom wird bevorzugt und als ausreichend fur alle Anwendungsfalle angesehen. Die einzige Ausnahme sind Anwendungen, die Zufall wahrend der fruhen Systemstartphase benotigen. Fur diese Anwendungen muss stattdessen getrandom(2) verwandt werden, da es blockiert, bis der Entropie-Pool initialisiert ist. Es wird empfohlen, eine Seed-Datei uber Neustarts des Systems hinweg zu speichern. Dann ist die Ausgabe des Zufallszahlengenerators kryptografisch sicher gegen Angreifer ohne lokalen Root-Zugriff, sobald die Seed-Datei wahrend der Boot-Sequenz neu geladen wird, und vollig ausreichend fur Sitzungs-Schlussel bei Netzwerk-Verschlusselung. (Alle gangigen Linux-Distributionen haben spatestens seit dem Jahr 2000 die Seed-Datei uber Neustarts hinweg gespeichert). Da Lesezugriffe auf /dev/random blockieren konnen, werden die Nutzer in der Regel sie im nicht blockierenden Modus offnen (oder fur den Lesezugriff eine Zeitschranke setzen) und eine Art von Benachrichtigung des Benutzers realisieren wollen, wenn die gewunschte Entropie nicht sofort verfugbar ist. Konfiguration Wenn auf Ihrem System /dev/random und /dev/urandom nicht schon vorhanden sind, konnen 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 wahrend des Systemstarts hat, kann der Entropie-Pool in einem ziemlich vorhersehbaren Zustand sein. Dadurch verringert sich die tatsachliche Hohe des Rauschens im Entropie-Pool unter die Schatzung. Um diesem Effekt entgegenzuwirken, kann man Informationen uber den Entropie-Pool uber Stillstandszeiten und Systemstarts hinweg zu ubernehmen. Dazu fugen Sie die Zeilen in ein geeignetes Skript ein, das wahrend das des Hochfahrens des Linux-Systems ausgefuhrt wird: echo "Initialisierung des Zufallszahlengenerators " random_seed=/var/run/random-seed # Seed uber 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 Fugen Sie ebenfalls in einem passenden Skript, das beim Herunterfahren des Linux-Systems ausgefuhrt wird, die folgenden Zeilen ein: # Seed uber 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 Grosse des Entropie-Pools in Bits zuruckliefert (siehe unten). /proc-Schnittstellen Die Dateien im Verzeichnis /proc/sys/kernel/random (verfugbar seit Linux 2.3.16) stellen zusatzliche Informationen uber das Gerat /dev/random zur Verfugung. entropy_avail Die nur lesbare Datei gibt die verfugbare Entropie in Bits an. Dies ist eine Zahl im Bereich 0 bis 4096. poolsize Diese Datei gibt die Grosse des Entropie-Pools an. Die Semantik dieser Datei variiert mit den Kernel-Versionen: Linux 2.4: Diese Datei gibt die Grosse des Entropie-Pools in Bytes an. Normalerweise wird diese Datei den Wert 512 haben. In sie kann aber geschrieben werden und auf jeden Wert geandert werden, fur den ein Algorithmus verfugbar ist. Als moglichkeite Werte stehen 32, 64, 128, 256, 512, 1024 oder 2048 zur Verfugung. Linux 2.6 und neuer: Diese Datei ist nur lesbar und enthalt die Grosse des Entropie-Pools in Bits. Sie enthalt 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) fur den schreibenden Zugriff auf /dev/random ausfuhren. Diese Werte konnen geandert werden, indem in die Dateien geschrieben wird. uuid und boot_id Diese nur lesbaren Dateien enthalten zufallige 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 ausgefuhrten Anfragen werden mit dem Eingabe-Entropie-Pool wechselwirken und damit auf /dev/random und /dev/urandom auswirken. Die Capability CAP_SYS_ADMIN wird fur alle Anfragen ausser RNDGETENTCNT benotigt. 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 Erhoht oder erniedrigt die Entropianzahl in dem Eingabe-Pool um den Wert, auf den das Argument zeigt. RNDGETPOOL Entfernt in Linux 2.6.9 RNDADDENTROPY Fugt zusatzliche Entropie in den Eingabe-Pool hinzu, erhoht damit die Entropiezahl. Dies unterscheidet sich vom Schreiben nach /dev/random oder /dev/urandom, bei dem nur Daten hinzugefugt werden, aber nicht die Entropiezahl erhoht 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 hinzugefugt (oder davon entfernt) wird und buf der Puffer der Grosse buf_size, der zum Entropie-Pool hinzugefugt wird. RNDZAPENTCNT RNDCLEARPOOL Nullt die Entropiezahl aller Pools und fugt einige Systemdaten (wie die Uhrzeit) zu den Pools hinzu. DATEIEN /dev/random /dev/urandom ANMERKUNGEN Fur einen Uberblick und Vergleich uber die verschiedenen Schnittstellen, die zum Erlangen von Zufall verwandt werden konnen, siehe random(7). FEHLER Wahrend der fruhen Systemstartphase konnen Lesezugriffe auf /dev/urandom Daten zuruckliefern, die vor der Initialisierung des Entropie-Pools erzeugt wurden. SIEHE AUCH mknod(1), getrandom(2), random(7) RFC 1750, >>Randomness Recommendations for Security<< UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer , Dr. Tobias Quathamer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 random(4)