Entropie unter Linux: urandom und haveged fuer schnelle PHP-Sessions
AI generated
$
/etc
Linux · Entropie · PHP · Sicherheit
Entropie unter Linux: urandom und haveged fuer schnelle PHP-Sessions
Wie ein leerer Zufallszahlen-Pool Requests unsichtbar ausbremst

Jeder session_start()-Aufruf, jede TLS-Verbindung und jede Erzeugung eines CSRF-Tokens in PHP benoetigt zufaellige Bytes vom Betriebssystem. Reicht die gesammelte Entropie des Kernels nicht aus, blockieren betroffene Aufrufe, bis genuegend Zufallsdaten vorliegen, ein Effekt, der auf virtuellen Maschinen und in Containern besonders haeufig auftritt und sich als schwer erklaerbare, sporadische Latenzspitzen zeigt.

17 Min. Lesezeit getrandom() · haveged · virtio-rng Linux · PHP 8 · KVM/Cloud

1. Warum Entropie-Mangel Requests unsichtbar verzoegert

Wer Performance-Probleme bei Magento-Servern untersucht, prueft in aller Regel zuerst CPU, Arbeitsspeicher, Disk-I/O und Netzwerk. Die Qualitaet des Zufallszahlengenerators gehoert selten zu den ersten Verdaechtigen, obwohl sie in bestimmten Umgebungen eine ebenso reale Ursache fuer Latenz sein kann wie jede dieser klassischeren Metriken.

Jede kryptographisch sichere Zufallszahl, die eine Anwendung unter Linux anfordert, sei es fuer eine Session-ID, einen CSRF-Token oder den Schluesselaustausch bei einem TLS-Handshake, stammt letztlich aus dem Entropie-Pool des Kernels. Dieser Pool wird kontinuierlich aus unvorhersehbaren Ereignissen gespeist: Interrupt-Timing, Festplattenzugriffe, Netzwerkpakete und, auf physischer Hardware, Maus- und Tastaturbewegungen. Reicht die gesammelte Entropie nicht aus, kann ein Zufallszahlen-Aufruf ins Blockieren geraten, bis genuegend neue Entropie gesammelt wurde.

In sicherheitskritischen Kontexten wie Zahlungsabwicklung und Authentifizierung ist eine belastbare Zufallszahlenquelle ohnehin nicht verhandelbar. Die hier beschriebenen Massnahmen adressieren deshalb ausschliesslich die Performance-Seite dieses Themas, ohne die kryptographische Staerke der erzeugten Zufallsdaten zu beeintraechtigen.

Fuer einen Magento-Webserver bedeutet das: PHP ruft bei jedem session_start() und bei jeder Verwendung von random_bytes() intern eine Kernel-Funktion auf, die Zufallsdaten liefert. Auf einem gut ausgelasteten Bare-Metal-Server mit vielfaeltigen Interrupt-Quellen ist Entropie-Mangel selten ein Problem, weil der Pool durch die natuerliche Systemaktivitaet konstant aufgefuellt wird. Auf frisch gestarteten virtuellen Maschinen oder in minimalen Container-Images sieht die Situation dagegen vollstaendig anders aus.

Das tueckische an Entropie-Mangel ist seine Unsichtbarkeit in klassischen Performance-Metriken: Die CPU-Auslastung bleibt niedrig, die Netzwerkverbindung ist nicht ausgelastet, und trotzdem haengt ein Request scheinbar grundlos fuer einige hundert Millisekunden bis wenige Sekunden. Erst eine gezielte Untersuchung des Entropie-Pool-Fuellstands deckt in solchen Faellen die tatsaechliche Ursache auf.

2. /dev/random, /dev/urandom und getrandom() im Vergleich

Diese Unterscheidung sorgt in der Praxis regelmaessig fuer Verwirrung, insbesondere weil aeltere Tuning-Ratgeber teils veraltete Empfehlungen zu /dev/random enthalten, die auf modernen Kernel-Versionen nicht mehr zutreffen.

Um die richtige Wahl fuer die eigene Umgebung zu treffen, hilft ein kurzer Blick zurueck auf die historische Entwicklung dieser Schnittstellen.

Historisch bot Linux zwei Zufallszahlengeneratoren als Geraetedateien an: /dev/random, das blockiert, sobald der geschaetzte Entropie-Vorrat des Kernels erschoepft ist, und /dev/urandom, das nach der initialen Kernel-Startphase praktisch nie blockiert, weil es einen kryptographisch sicheren Pseudozufallszahlengenerator (CSPRNG) verwendet, der einmal mit ausreichend Entropie initialisiert wurde. Fuer nahezu alle Anwendungsfaelle, einschliesslich kryptographischer Schluessel, gilt /dev/urandom seit Jahren als die richtige Wahl, da moderne CSPRNGs auch mit begrenzter initialer Entropie kryptographisch starke Ausgaben liefern.

Seit Linux-Kernel-Version 3.17 existiert zusaetzlich der Systemaufruf getrandom(), den moderne PHP-Versionen fuer random_bytes() und random_int() intern nutzen. getrandom() blockiert nur einmalig, direkt nach dem Systemstart, bis der Kernel-CSPRNG initial mit ausreichend Entropie geseedet wurde, und liefert danach ohne weitere Blockierung Zufallsdaten. Genau diese einmalige Initialisierungsphase ist der kritische Moment, in dem ein frisch gestarteter Server oder Container unerwartet haengen bleiben kann, wenn keine ausreichend schnelle Entropie-Quelle zur Verfuegung steht.


# Check the current entropy pool size the kernel considers available
cat /proc/sys/kernel/random/entropy_avail

# On modern kernels this typically reports a high value (thousands)
# once the CSPRNG has been fully seeded after boot

3. Wie der Kernel Entropie sammelt

Ein grundlegendes Verstaendnis dieser Sammlungsmechanismen erklaert, warum manche Server-Klassen strukturell anfaelliger fuer Entropie-Mangel sind als andere, unabhaengig von der konkreten Linux-Distribution oder Kernel-Version.

Diese Sammlung erfolgt vollstaendig automatisch und ohne Zutun des Administrators, solange geeignete Quellen ueberhaupt vorhanden sind, was den naechsten Abschnitt zur zentralen Frage macht.

Der Kernel sammelt Entropie aus mehreren unabhaengigen Quellen und mischt sie in einen internen Pool. Auf physischer Hardware liefern Interrupt-Timing von Festplatten, Netzwerkkarten und, bei Desktop-Systemen, Eingabegeraete einen kontinuierlichen Strom an unvorhersehbaren Ereignissen. Moderne CPUs bringen zudem oft eine Hardware-Zufallszahlenquelle mit, etwa die RDRAND-Instruktion auf x86-Prozessoren, die der Kernel als zusaetzliche, sehr schnelle Entropie-Quelle nutzen kann, sofern sie als vertrauenswuerdig eingestuft wird.

Diese Luecke ist der eigentliche Ausgangspunkt fuer die in den folgenden Abschnitten beschriebenen Werkzeuge, die genau diese fehlenden Quellen kompensieren sollen.

Bei Servern ohne physische Eingabegeraete und ohne rotierende Festplatten, wie es bei den meisten Cloud-Instanzen und dedizierten Servern mit reinem SSD/NVMe-Storage der Fall ist, fallen zwei traditionell wichtige Entropie-Quellen komplett weg. Der Kernel ist dann staerker auf Netzwerk-Interrupt-Timing und, falls vorhanden, eine Hardware-RNG-Instruktion angewiesen, um seinen Pool zu fuellen, was in bestimmten Konstellationen zu einer spuerbar langsameren initialen Befuellung fuehren kann.

4. Warum VMs und Container besonders betroffen sind

Diese Anfaelligkeit betrifft nicht nur den initialen Boot-Vorgang, sondern kann sich bei jedem Neustart, jedem automatischen Skalierungsereignis und jedem Deployment eines neuen Images erneut zeigen, solange keine zusaetzliche Entropie-Quelle konfiguriert ist.

Virtuelle Maschinen sind fuer Entropie-Probleme besonders anfaellig, weil der Hypervisor viele der physischen Hardware-Interrupts, aus denen ein Bare-Metal-System seine Entropie schoepft, entweder gar nicht durchreicht oder in einer Form virtualisiert, die weniger unvorhersehbares Timing liefert. Ein frisch gebooteter Cloud-Server kann deshalb in den ersten Sekunden nach dem Start einen spuerbar langsameren Zugriff auf kryptographisch sichere Zufallsdaten haben als ein vergleichbares Bare-Metal-System, selbst wenn beide denselben Linux-Kernel nutzen.

Autoscaling-Gruppen in der Cloud sind hiervon besonders betroffen, da sie per Definition auf schnelles, wiederholtes Hochfahren neuer Instanzen ausgelegt sind, jede davon mit demselben potenziellen Entropie-Engpass in der Startphase.

Container verschaerfen dieses Problem tendenziell weiter, weil mehrere Container auf demselben Host typischerweise denselben Kernel-Entropie-Pool teilen und keine eigene, isolierte Entropie-Sammlung betreiben. Startet eine grosse Anzahl von PHP-FPM-Containern gleichzeitig, etwa nach einem Deployment oder einem automatischen Skalierungsereignis, und fuehrt jeder Container in der Startphase kryptographische Operationen aus, kann das kurzzeitig zu einer spuerbaren Verzoegerung fuehren, bis der gemeinsame Host-Pool ausreichend Entropie liefert.

5. Auswirkung auf PHP: Sessions, random_bytes und TLS

Diese Kette von Zufallszahlen-Anforderungen entsteht bei jedem einzelnen Checkout-Vorgang neu und ist deshalb kein einmaliges Randproblem, sondern eine wiederkehrende Belastung fuer den Entropie-Pool bei jedem neuen Kunden-Request.

PHP nutzt Zufallsdaten an mehreren kritischen Stellen: session_start() erzeugt eine neue Session-ID mit kryptographisch sicherem Zufall, random_bytes() und random_int() werden haeufig fuer CSRF-Token, Passwort-Reset-Links und API-Keys in Magento-Erweiterungen genutzt, und jeder TLS-Handshake, den ein PHP-Prozess als Client durchfuehrt, etwa beim Aufruf einer externen Zahlungs- oder Versand-API, benoetigt ebenfalls Zufallsdaten fuer den Schluesselaustausch.

Auch wiederkehrende Hintergrundprozesse wie das Versenden von Bestaetigungs-E-Mails ueber ein verschluesseltes SMTP-Relay oder der Abgleich mit einem externen Lagerbestandssystem koennen zusaetzliche TLS-Handshakes ausloesen, die denselben Entropie-Pool belasten wie die eigentliche Kundeninteraktion.

Bei einem Magento-Checkout-Prozess mit Zahlungsanbieter-Integration summieren sich diese Aufrufe: Session-Erzeugung beim ersten Seitenaufruf, CSRF-Token fuer das Bestellformular und ein ausgehender TLS-Handshake zum Zahlungsdienstleister koennen alle in kurzer Folge Zufallsdaten anfordern. Auf einem System mit ausreichend gefuelltem Entropie-Pool ist das vollstaendig unproblematisch, auf einem frisch gestarteten Container ohne zusaetzliche Entropie-Quelle koennen sich diese Aufrufe dagegen zu einer spuerbaren, wenn auch meist kurzen, Verzoegerung addieren.

6. haveged und rng-tools als Entropie-Quelle einrichten

Beide Werkzeuge sind seit Jahren in den Standard-Repositories aller gaengigen Linux-Distributionen verfuegbar und bringen in aller Regel sinnvolle Standardeinstellungen mit, sodass eine manuelle Feinjustierung nur in Ausnahmefaellen noetig ist.

haveged ist ein Daemon, der auf Basis von CPU-Timing-Variationen zusaetzliche Entropie generiert und dem Kernel-Pool zufuehrt, ohne auf physische Hardware-Interrupts angewiesen zu sein. Fuer Server ohne Maus, Tastatur und rotierende Festplatten ist haveged eine der einfachsten und zuverlaessigsten Loesungen, um den Entropie-Pool auch ohne diese klassischen Quellen konstant gut gefuellt zu halten. Die Installation ist auf den meisten Distributionen denkbar einfach und erfordert keine weitere Konfiguration fuer den Standardbetrieb.

Fuer die meisten Magento-Hosting-Umgebungen ohne spezielle Compliance-Anforderungen an die Zufallsquelle reicht haveged als alleinige Massnahme vollstaendig aus und stellt in der Praxis die mit Abstand am haeufigsten gewaehlte Loesung dar.

Alternativ oder ergaenzend kann rng-tools mit dem Daemon rngd eingesetzt werden, der Hardware-Zufallszahlenquellen wie RDRAND oder ein Trusted-Platform-Module (TPM) direkt in den Kernel-Pool einspeist. Auf Servern mit einer entsprechenden Hardware-RNG-Quelle ist dieser Ansatz oft die bevorzugte Wahl, weil er echte Hardware-Zufallszahlen nutzt, statt sie aus CPU-Timing-Variationen abzuleiten.


# Install and enable haveged as an additional entropy source
sudo apt-get install haveged
sudo systemctl enable --now haveged

# Verify it is running and check the resulting entropy pool level
systemctl status haveged
cat /proc/sys/kernel/random/entropy_avail

7. virtio-rng fuer virtuelle Maschinen nutzen

Wer eigene KVM-Hosts betreibt, sollte diese Konfiguration in die Standard-VM-Vorlage aufnehmen, damit jede neu erstellte virtuelle Maschine von Anfang an ueber eine zuverlaessige Entropie-Anbindung verfuegt, statt dies nachtraeglich pro Instanz nachruesten zu muessen.

Wichtig ist dabei die Unterscheidung zwischen dem Backend-Typ der virtio-rng-Konfiguration: /dev/random als Backend kann theoretisch auf dem Host blockieren, waehrend /dev/urandom als Backend, wie im folgenden Beispiel gezeigt, praktisch nie blockiert und deshalb fuer die meisten Setups die pragmatischere Wahl darstellt.

Fuer KVM-basierte virtuelle Maschinen bietet virtio-rng einen direkten, paravirtualisierten Kanal zur Entropie-Quelle des Host-Systems. Statt die Gast-VM auf eigene, oft unzureichende Entropie-Sammlung angewiesen sein zu lassen, leitet der Hypervisor Entropie vom Host, der in der Regel ueber ausreichend eigene Quellen verfuegt, direkt an den Gast weiter. Dies ist auf vielen Cloud-Plattformen bereits standardmaessig aktiviert, sollte aber bei selbst verwalteten KVM-Umgebungen explizit in der VM-Definition konfiguriert werden.

Fuer Xen-basierte Virtualisierung existiert ein aehnliches Konzept, und auch grosse Cloud-Anbieter stellen eigene virtualisierte Hardware-RNG-Schnittstellen bereit. Vor der Inbetriebnahme eines neuen VM-Images lohnt sich deshalb immer eine kurze Pruefung, ob eine virtualisierte RNG-Quelle bereits aktiv ist, bevor zusaetzlich haveged installiert wird, da beide Ansaetze sich zwar nicht gegenseitig ausschliessen, aber bei bereits vorhandenem virtio-rng oft redundant sind.


<!-- libvirt domain XML: add a virtio-rng device backed by /dev/urandom -->
<devices>
  <rng model="virtio">
    <backend model="random">/dev/urandom</backend>
  </rng>
</devices>

8. Entropie-Pool-Fuellstand ueberwachen

Ein dauerhaftes Monitoring dieser Kennzahl gehoert in dieselbe Kategorie wie die Ueberwachung von Load Average oder freiem Arbeitsspeicher: unauffaellig im Normalbetrieb, aber entscheidend fuer die schnelle Diagnose, wenn ein Problem tatsaechlich auftritt.

Idealerweise wird dieser Wert in ein bestehendes Monitoring-System wie Prometheus, Zabbix oder Nagios integriert, statt ihn nur manuell nach einem bereits aufgetretenen Problem zu pruefen.

Der einfachste Diagnoseschritt ist ein regelmaessiger Blick auf /proc/sys/kernel/random/entropy_avail, das die vom Kernel geschaetzte verfuegbare Entropie in Bits anzeigt. Ein dauerhaft niedriger Wert, insbesondere kurz nach einem Systemstart oder Container-Start, deutet auf ein potenzielles Problem hin und rechtfertigt die Einrichtung einer zusaetzlichen Entropie-Quelle wie haveged oder virtio-rng.

Ein sinnvoller Schwellenwert fuer eine Alarmierung liegt deutlich unterhalb der Werte, die ein gesundes System im Normalbetrieb aufweist, da kurzfristige Schwankungen normal sind und nicht jede kleine Absenkung sofort ein Eingreifen erfordert.

Fuer eine tiefergehende Diagnose lassen sich blockierende getrandom()-Aufrufe mit strace auf einem betroffenen PHP-FPM-Prozess sichtbar machen. Erscheint ein getrandom()-Aufruf in der Trace-Ausgabe mit einer auffaellig langen Laufzeit, ist das ein starkes Indiz fuer tatsaechliches Blockieren mangels ausreichender Entropie, statt einer anderen, unabhaengigen Ursache fuer die beobachtete Verzoegerung.


# Trace a specific PHP-FPM worker for blocking getrandom() calls
sudo strace -f -e trace=getrandom -T -p "$(pgrep -f 'php-fpm: pool' | head -1)"

# The -T flag shows the time spent in each syscall;
# an unusually long getrandom() call indicates entropy starvation

9. Loesungsansaetze im direkten Vergleich

Welcher Ansatz im Einzelfall passt, haengt weniger von persoenlicher Praeferenz ab als von der konkreten Infrastruktur: Bare-Metal-Server, KVM-VMs und Container-Hosts profitieren jeweils von unterschiedlichen Kombinationen dieser Werkzeuge.

Die folgende Tabelle vergleicht die gaengigen Ansaetze zur Behebung von Entropie-Mangel fuer unterschiedliche Server-Umgebungen.

Ansatz Einsatzort Vorteil Einschraenkung
haveged Bare Metal, VM, Container-Host Einfach, keine Hardware-Abhaengigkeit Basiert auf CPU-Timing, nicht auf echtem Zufall
rng-tools (rngd) Hardware mit RDRAND/TPM Nutzt echte Hardware-Zufallsquelle Setzt entsprechende Hardware voraus
virtio-rng KVM/Xen-VMs Direkter Zugriff auf Host-Entropie Erfordert Konfiguration in der VM-Definition
Keine Massnahme Gut ausgelastete Bare-Metal-Server Kein zusaetzlicher Konfigurationsaufwand Risiko bei Neustarts und Lastspitzen

Die Tabelle zeigt: Fuer virtualisierte und containerisierte Magento-Infrastrukturen ist eine explizite Entropie-Strategie kein optionales Detail, sondern eine sinnvolle Grundabsicherung gegen sporadische, schwer diagnostizierbare Latenzspitzen.

Fuer neue Server-Vorlagen empfiehlt sich deshalb, eine der genannten Loesungen von Anfang an in das Standard-Provisioning aufzunehmen, statt erst nach einem konkreten Vorfall reaktiv nachzuruesten. Ein einmal etabliertes Monitoring des Entropie-Fuellstands macht diese Entscheidung zudem jederzeit ueberpruefbar, ohne dass eine erneute manuelle Diagnose noetig waere.

Mironsoft

Linux-Server-Tuning fuer Magento-Hosting-Infrastruktur

Sporadische Latenzspitzen ohne erkennbare Ursache?

Wir pruefen den Entropie-Pool eurer Server und Container, richten haveged oder virtio-rng dort ein, wo es sinnvoll ist, und stellen sicher, dass PHP-Sessions und TLS-Handshakes nie auf mangelnde Zufallsdaten warten muessen.

Entropie-Audit

entropy_avail und getrandom-Aufrufe auf allen Servern pruefen

Konfiguration

haveged, rng-tools oder virtio-rng je nach Umgebung einrichten

Monitoring

Entropie-Fuellstand dauerhaft im Blick behalten und Alarme einrichten

Fuer Teams, die mehrere Magento-Instanzen auf unterschiedlicher Infrastruktur betreiben, von Bare Metal ueber KVM bis zu Container-Plattformen, lohnt sich eine einheitliche Richtlinie: welche Entropie-Loesung gilt als Standard fuer welchen Infrastruktur-Typ, und wie wird deren korrekte Funktion beim Server-Provisioning automatisiert verifiziert, statt sich auf eine einmalige manuelle Pruefung zu verlassen.

10. Zusammenfassung

Entropie-Mangel unter Linux ist eine der am schwersten zu diagnostizierenden Ursachen fuer sporadische Latenzspitzen, weil er in keiner der ueblichen Performance-Metriken auffaellt. /dev/urandom und der modernere Systemaufruf getrandom() sind fuer praktisch alle Anwendungsfaelle die richtige Wahl, koennen aber direkt nach dem Systemstart blockieren, wenn der Kernel-CSPRNG noch nicht ausreichend geseedet wurde, ein Effekt, der virtuelle Maschinen und Container besonders haeufig betrifft.

haveged liefert eine einfache, hardwareunabhaengige Loesung fuer Server ohne physische Entropie-Quellen, waehrend rng-tools echte Hardware-Zufallsquellen wie RDRAND nutzt und virtio-rng in KVM-Umgebungen direkten Zugriff auf die Host-Entropie ermoeglicht. Ein regelmaessiger Blick auf entropy_avail und gezielte strace-Diagnose auf blockierende getrandom()-Aufrufe helfen, das Problem zu erkennen, bevor es sich in schwer erklaerbaren Checkout-Verzoegerungen zeigt.

Entropie unter Linux — Das Wichtigste auf einen Blick

Grundproblem

PHP-Sessions, CSRF-Token und TLS-Handshakes benoetigen Zufallsdaten, die bei Entropie-Mangel blockieren koennen.

Besonders betroffen

Frisch gestartete VMs und Container ohne physische Entropie-Quellen wie Maus, Tastatur oder rotierende Platten.

Loesungen

haveged fuer CPU-Timing-basierte Entropie, virtio-rng fuer direkten Host-Zugriff in KVM-VMs.

Diagnose

entropy_avail pruefen, blockierende getrandom()-Aufrufe mit strace -T aufspueren.

11. FAQ: Entropie unter Linux fuer PHP-Sessions

1Was ist Entropie unter Linux?
Der Vorrat an unvorhersehbaren Daten fuer kryptographisch sichere Zufallszahlen. Zu wenig Entropie kann getrandom() blockieren lassen.
2/dev/random vs. /dev/urandom?
random blockiert bei Entropie-Mangel, urandom nutzt einen CSPRNG und blockiert nach dem Seeding praktisch nie mehr.
3Warum VMs anfaelliger?
Der Hypervisor virtualisiert viele physische Interrupt-Quellen, aus denen Bare Metal Entropie schoepft.
4Fuellstand pruefen?
cat /proc/sys/kernel/random/entropy_avail. Dauerhaft niedriger Wert deutet auf Problem hin.
5Was macht haveged?
Generiert Entropie aus CPU-Timing-Variationen, ohne physische Hardware-Interrupts zu benoetigen.
6Was ist virtio-rng?
Paravirtualisiertes Geraet mit direktem Zugriff auf die Host-Entropie in KVM-VMs.
7Auswirkung auf PHP?
session_start, random_bytes und TLS-Handshakes koennen kurzzeitig blockieren, ohne erhoehte CPU- oder Netzwerklast.
8Blockierende Aufrufe finden?
strace -f -e trace=getrandom -T auf dem betroffenen PHP-FPM-Prozess.
9haveged trotz virtio-rng noetig?
In der Regel nicht, beide sind bei aktivem virtio-rng oft redundant.
10Sicherheitsrisiko?
Kaum, moderne CSPRNGs bleiben kryptographisch stark. Das Problem ist Performance, nicht geschwaechte Zufallsqualitaet.