Von Zufall spricht man dann, wenn für ein einzelnes Ereignis oder das Zusammentreffen mehrerer Ereignisse keine kausale Erklärung gegeben werden kann. Als kausale Erklärungen für Ereignisse kommen in erster Linie allgemeine Gesetzmäßigkeiten oder Absichten handelnder Personen in Frage. Die Erklärung für Zufall ist also gerade der Verzicht auf eine (kausale) Erklärung.
Quelle: wikipedia.org
Zum generieren von z.B. OpenSSL-Schlüsseln ist es wichtig, dass der verwendete Zufall so zufällig und unkontrolliert wie möglich ist.
Unter Linux hat man dazu 2 Devices:
- /dev/random
Hierbei handelt es sich um ein Block-Device. Der Zufallsgenerator sammelt Umgebungsrauschen von Gerätetreibern und anderen Quellen in einem Entropie-„Pool“. Beim Lesen gibt /dev/random nur solange Zufallszahlen zurück, bis die abgeschätzte Entropiemenge erschöpft ist; dann blockieren Lesezugriffe auf /dev/random, bis zusätzliches Umgebungsrauschen erhalten wurde.
- /dev/urandom
Im Gegensatz zu /dev/random blockiert es nicht, wenn eine definierte Entropieschwelle unterschritten wird.
Als allgemeine Regel sollte /dev/urandom für alles außer langlebige GPG/SSL/SSH-Schlüssel verwendet werden.
Ermitteln der verfügbaren Entropie:
Ich verwende hier zum testen Ubuntu 16.04 LTS als Minimal-Installation.
Der aktuelle Füllstand des Entropie-Pools lässt sich unter Linux aus der Datei /proc/sys/kernel/random/entropy_avail
ermitteln. Eine Ausgabe der Datei liefert die verfügbare Entropie in bit, wobei das Maximum von 4096 bit einem vollständig gefüllten „Pool“ entspricht.
root@ubuntu:~# cat /proc/sys/kernel/random/entropy_avail
120
Bei einem Wert von unter 1000 sollten dringend entsprechende Maßnahmen ergriffen werden um den Wert zu erhöhen.
Erhöhen der Entropie
haveged
Das Verfahren macht sich den Umstand zunutze, dass moderne Prozessoren Elemente zur Verzweigungsvorhersage (Branch Prediction), Caches, Pipelines und vieles mehr besitzen. Das normale Benutzen der CPU löst ein Trommelfeuer an Statusänderungen bei Tausenden dieser Elemente aus, und genau daraus produziert das Havege-Verfahren viel und hochwertigen Zufall.
Installation: apt install haveged
root@ubuntu:~# systemctl status haveged.service
● haveged.service - Entropy daemon using the HAVEGE algorithm
Loaded: loaded (/lib/systemd/system/haveged.service; enabled; vendor preset: enabled)
Active: active (running) since Di 2018-03-27 16:39:16 CEST; 8s ago
Docs: man:haveged(8)
http://www.issihosts.com/haveged/
Main PID: 1188 (haveged)
CGroup: /system.slice/haveged.service
└─1188 /usr/sbin/haveged --Foreground --verbose=1 -w 1024
Mär 27 16:39:16 ubuntu systemd[1]: Started Entropy daemon using the HAVEGE algorithm.
Mär 27 16:39:16 ubuntu haveged[1188]: haveged: ver: 1.9.1; arch: x86; vend: GenuineIntel; build: (gcc 5.2.1 ITV); collect: 128K
Mär 27 16:39:16 ubuntu haveged[1188]: haveged: cpu: (L4 VC); data: 32K (L4 V); inst: 32K (L4 V); idx: 19/40; sz: 31614/64718
Mär 27 16:39:16 ubuntu haveged[1188]: haveged: tot tests(BA8): A:1/1 B:1/1 continuous tests(B): last entropy estimate 7.99893
Mär 27 16:39:16 ubuntu haveged[1188]: haveged: fills: 0, generated: 0
root@ubuntu:~# cat /proc/sys/kernel/random/entropy_avail
2437
Wie man sieht hat sich der Wert 20fach erhöht.
Rng-Tools
Auch hierbei handelt es sich um einen Daemon, welcher mehr Zufall (aus Hardware-Devices) in den Entropie-Pools leitet.
root@ubuntu:~# systemctl status rng-tools.service
● rng-tools.service
Loaded: loaded (/etc/init.d/rng-tools; bad; vendor preset: enabled)
Active: active (running) since Di 2018-03-27 16:38:36 CEST; 6s ago
Docs: man:systemd-sysv-generator(8)
CGroup: /system.slice/rng-tools.service
└─1378 /usr/sbin/rngd -r /dev/hwrng
Mär 27 16:38:36 ubuntu systemd[1]: Starting rng-tools.service...
Mär 27 16:38:36 ubuntu rng-tools[1366]: Starting Hardware RNG entropy gatherer daemon: rngd.
Mär 27 16:38:36 ubuntu systemd[1]: Started rng-tools.service.
Nach der Installation durch: apt install rng-tools
zeigt auch hier die Ausgabe von cat /proc/sys/kernel/random/entropy_avail
eine starke Erhöhung des Wertes:
root@ubuntu:~# cat /proc/sys/kernel/random/entropy_avail
3101