Apropos haveged: Evtl könnte ein Patch in Gluon bzw fastd helfen (der recht trivial ist, und den ich vor einigen Monaten auch mal machen wollte, aber am fehlenden Testbed war es bei mir gescheitert)
Wie bereits verlinkt wurde, benötigt fastd nur einmal beim Start kurz ganz wenig Entropie, danach läuft alles über den eigenen Zufallsgenerator. Außerdem benötigt man Entropie, wenn Schlüssel generiert werden.
Dazu wird /dev/random
aufgerufen, welches auf Linux blockiert, wenn ein „Entropie-Zähler“ auf 0 ist. Dieser Zähler wird erhöht, wenn Entropie aus Hardwarequellen hinzugefügt wird, und verringert, wenn Bits aus /dev/random
gelesen werden. Auf den kleinen TP-Links ist nur wenig solche Hardware-Entropie pro Zeiteinheit verfügbar, also installiert man haveged
welcher durch dunkle Magie aus der Programmausführung selbst Entropie gewinnt. So weit so gut.
Die Sache ist: Dieses Design ist eigentlich für quasi alle Anwendungszwecke unnötig, kryptographische Anwendungen explizit eingeschlossen. Sobald der Zufallsgenerator einmal ordentlich initialisiert ist, liefert er für immer kryptographisch sichere und unvorhersagbare Zufallszahlen. Man könnte in dem Fall auch von /dev/urandom
lesen, welcher nicht blockiert.
Warum also /dev/random
? Problem ist eben die Initialisierung. Normalerweise wird beim Shutdown ein wenig Entropie weggespeichert, um damit ganz früh im Bootprozess den Zufallsgenerator zu seeden. Das doofe ist nun bei unseren Freifunk-Kisten, dass wir nur Flash haben, den wir nicht kaputt schreiben wollen. Also müssen wir wohl oder übel /dev/random
nutzen, wenn wir sicher gehen sollen, dass wir nicht aus einem uninitialisierten Zufallsgenerator lesen.
Oder? Eigentlich nicht. Denn ab Linux 3.17 gibt es einen neuen getrandom(2)
Syscall. Dieser verhält sich exakt so wie /dev/urandom
(liefert beliebig viel Entropie), mit der Ausnahme, dass er direkt nach dem Boot solange blockiert (d.h. den anfragenden Prozess „eingefroren“ lässt), bis er einmal ordentlich initialisiert ist.
Da Gluon bereits auf Kernel 4.x ist, würde es ggf. helfen alle Aufrufe von /dev/random
durch Aufrufe von syscall(SYS_getrandom)
zu ersetzen. Der Patch ist ziemlich einfach, müsste nur mal wer™ machen.