[Linux] Der Zufall und warum Cryptofunktionen manchmal ewig dauern

Wer schon einmal auf einem Embedded-System wie Router oder einer VM versucht hat einen geheimen Schlüssel unter Linux zu erzeugen wird das kennen: Es dauert ewig. Schuld daran ist nicht nur die meist spartanische Leistung des Prozessors, sondern auch die Art, mit welcher Linux seine Zufallsdaten erzeugt.

Wie Zufällig darf es denn sein?

Holen wir mal etwas aus: Viele Verschlüsselungen benötigen – beispielsweise zur Erstellung von Schlüsseln – Zufallswerte. Leider ist ein PC mit seinen An-Aus recht vorhersagbar und das genaue Gegenteil von Zufall. Um trotzdem verschlüsseln zu können kommen Pseudozufallsgeneratoren zum Einsatz. Diese verwenden meist schlecht vorhersagbare Quellen um eine hohe Qualität der Zufallszahlen zu erreichen – also eine Zahl, deren Herleitung man möglichst später nicht mehr nachvollziehen kann. Quelle kann Beispielsweise das Rauschen eines Gerätes, vergleichbar mit einem zu laut eingestellten Eingangs einer Soundkarte, sein.

Von vollen und von leeren Pools

Unter Linux kümmert sich der Kernel selbst um die Sammlung dieses Zufalls, diesen verwaltet er im Entropiepool. Üblicherweise werden maximal 4096 Bit vorgehalten, den aktuellen Füllstand kann man unter /proc/sys/kernel/random/entropy_avail einsehen. Um Zufallszahlen zu erhalten gibt es nun zwei Geräte mit den selben Aufgaben, aber wichtigen Unterschieden:

/dev/random stellt die Daten aus dem Pool zur Verfügung und dabei sicher, dass die Daten eine gewisse Qualität haben. Das bedeutet allerdings auch, dass – wenn die 4096bit aufgebraucht sind – das Lesen so lange pausiert wird, bis neue Zufallswerte vorliegen. Das ist Ideal für Verschlüsselungen und andere kritische Bereiche in denen sensible Daten behandelt werden sollen. Gleichzeitig heißt es auch, dass Systeme mit geringer Nutzung entsprechend lange zum Lesen benötigen. Häufig wird empfohlen für Fesplatten- oder Netzlast zu sorgen oder Maus und Tastatur intensiv zu nutzen um zusätzlichen Zufall zu generieren, ob dies tatsächlich auch für den Linux RNG hilft oder nur einen Placeboeffekt darstellt ist mir nicht bekannt.

/dev/urandom stellt die selben Daten bereit, blockiert allerdings nicht. Hierbei macht man sich eine Eigenheit eines Zufalls zu Nutze: Die Zufallswerte sind nicht wie ein Treibstoff, der durch Nutzung verbrannt wird, sondern eher das geschriebene Wort eines Füllers. Ist die Quelle des Zufalls langsam erschöpft, also die Tinte fast leer, sieht das Geschriebene nicht mehr schön aus, ist aber immer noch deutlich besser als Nichts. Je länger man jedoch mit leerer Patrone schreibt, desto schlechter wird das Ergenis. Aber zurück: Ist der Pool also leer werden die übrigen Daten nochmal in die Mangel genommen und neu gemischt um zumindest irgendwas zu haben. Ganz nach dem Motto: Egal wie, es kommt etwas raus. Die Qualität der herauspurzelnden Werte ist – wie oben schon angerissen – nicht garantiert, vor allem bei leerem Pool und wenig Aktivität steigt die Gefahr, dass die Werte nachvollziehbar werden. Für wichtige Crypto sollte man urandom entsprechend nicht benutzen, reicht aber „etwas Zufall“ aus – beispielsweise um Werte für ein Spiel oder das testen einer Festplatte zu erhalten – ist man hier richtig und kann viel Zeit sparen. Auch kann es als „letzter Ausweg“ genutzt werden, wenn Zeit wichtiger ist als Sicherheit – oder soll der Kunde des Onlineshops mehrere Minuten beim Laden warten, weil grade der Pool leer ist?

Programmdiktatur

Während man als Programmierer die Wahl zwischen den Qualitäten hat ist man als Nutzer meist den Entscheidungen des Programmierers ausgeliefert. Dies macht auch meist Sinn, beispielsweise wenn das Cryptoprotokoll auf dem blockierenden /dev/random beharrt. Arbeitet man jedoch beispielsweise auf einem Testsystem und muss hunderte Schlüssel erzeugen, die ohnehin nur unwichtige Testdaten verarbeiten, wäre ein umschalten auf /dev/urandom hilfreich. Sicher, man könnte den Symlink verbiegen, aber wirklich schön ist das nicht.

Mittelweg Füllhilfen

Eine Lösung kann ein zusätzlicher Zufallsgenerator sein, welcher als weitere Quelle die Füllung des Entropiepools beschleunigen kann. Eine Möglichkeit ist es – wenn vorhanden – die Hardware zu bemühen. Viele aktuelle Rechner haben einen Zusallsgenerator eingebaut, beispielsweise unterstützen Intel-CPUs mit DRNG entsprechende funktionen oder auch das vielfach verbaute TPM-Modul kann hierzu verwendet werden. Nutzer von QEmu können mit virtio_rng auch virtuelle Rechner versorgen. Nutzbar machen lässt sich dies über den rngd, welcher als Dienst gestartet die Vermittlung übernimmt und meist in einem Paket namens rng-tools o.Ä. zu finden ist. Die Gefahr, dass die Hardwareimplementierung eine Lücke hat besteht natürlich immer, denn diese Quellen sind meist fest verdrahtet und Lücken im Algorithmus können nicht „weggepatched“ werden. Auch liegen die Details der Implementierung häufig nicht offen, sodass die Qualität der Zahlen nicht prüfbar ist. Um hier zumindest ein grundsätzliches Fallnetz zu ziehen wird rngd in der Standardeinstellung nur anteilmäßig zur Generierung der Zahlen genutzt.

Steht keine Hardware zur Verfügung, beispielsweise in vielen VM-Umgebungen, ist es auch in Software möglich. Der bekannteste Vertreter ist hierbei haveged. Hierbei wird sich zu nutze gemacht, dass der Prozessor intern einige Operationen durchführt, welche nicht vorhersagbar erscheinen. Der Vorteil: Diese Quelle ist auf jedem Rechner verfügbar – vom normalen PC bis hin zum kleinsten Router. Problem: Nicht jeder Prozessor ist „gleich zufällig“, ob die Qualität also hoch ist lässt sich nur schwer bestimmen.

Pest oder Cholera?

Welchen Weg man wählt, dass muss man für sich selbst entscheiden. Lange Wartezeiten ergeben zwar meist eine höhere Sicherheit, aber in der heutigen Zeit zählen all zu oft andere Werte. Viele Nutzer sind nicht bereit ihen Komfort für Sicherheit zu opfern. Ein Hardware-RNG kann – wenn vorhanden und man der Quelle genug vertraut – eine große Hilfe sein. Auch Software ist als Ausweg eine Option. Am Ende lässt sich Zufall jedoch nie testen, die Qualität der einzelnene Lösungen ist also nur schwer zu bewerten. Am Ende ist es meist eine gute Idee mehrere Quellen zu nutzen und so den Zufall des Zufalls nicht ganz dem Zufall zu überlassen.

Linux: ARP-Cache zurücksetzen

Oops, das war daneben… Durch eine falsche Routerkonfiguration fühlte sich dieser für alle IPs eines Subnetzes zuständig und hat entsprechend brav auf jeden ARP-Requests geantwortet. Ergebnis: Die Systeme im betroffenen Subnet konnten untereinander nicht mehr kommunizieren. Kein Problem: Config rückgängig und schon läuft wieder alles, oder? Nicht ganz, denn die Server fragen nicht jedes mal neu nach der MAC-Adresse. Zum Glück funktionierte der Zugriff von draußen noch – diese läuft ja über den Router, also schnell auf die Shell der Linux-Kisten und den Cache zurücksetzen:

ip neigh flush all

Schon ist wieder Ruhe im Monitoring. Fein.

Mehr Arten den Cahce zu löschen, z.B. nur für bestimmte Netzwerkkarten oder Ziele, finden sich in der Manitu-Wiki.

[Linux/GnuPG] Key-Erstellung nicht möglich: command get_passphrase failed: Operation cancelled

Beim Versuch einen GPG-Key für eine Backupverschlüsselung zu erzeugen bricht GPG an der Stelle, an der nach einem Kennwort gefragt werden müsste, mit folgender Meldung ab:

can't connect to `/home/user/.gnupg/S.gpg-agent': No such file or directory
gpg-agent[4854]: command get_passphrase failed: Operation cancelled
gpg: cancelled by user
gpg: Key generation canceled.

Grund dafür ist offenbar die Art, mit welcher die aktuelle Shell gestartet wurde. Ich nutzte su um von root, mit dem ich die nötigen Pakete installiert hatte, in den Benutzerkontext des Backupnutzers zu wechseln. Dies seint allerdings etwas Chaos bei der Umgebungsdefinition zu verursachen und wird von GPG offenbar nicht unterstützt. Mann muss sich mit dem User direkt auf der Konsole oder per SSH anmelden, dann lässt sich der Schlüssel fehlerfrei generieren. (via christian-stankowic.de)

Finanzbehörden und Verschlüsselung – the never ending story…

Dieser Artikel lag einige Jahre im Entwurfsordner und ist nicht mehr aktuell. Meines Wissens nach nutzt Elster inzwischen korrekte Zertifikate, zudem hat Microsoft das Produkt Forefront TMG eingestellt.

Sicherheit von IT-Systemen spielt in vielen Unternehmen eine immer größere Rolle. Kein Wunder, dass vorallem bei sensiblen Daten wie Mitarbeiterdaten und Behördenkommunikation versucht wird ein gewisses Sicherheitslevel zu halten. Leider gilt das nur für Unternehmen, die Behörden scheinen noch nicht so weit zu sein. Seit 2005 sind Unternehmen verpflichtet Steuerdaten elektronisch an das Finanzamt zu übermitteln. Anfangs kam hierbei die auf Java basierende Schnittstelle „COALA“ zum Einsatz, welche die (intern verschlüsselten) Daten über HTTP-Aufrufe an die Elster-Server weitergab. Mitte des Jahres soll nun letztendlich diese Schnittstelle abgeschaltet werden, fortan ist nur der neuere „ELSTER Rich Client“ aka. ERiC nutzbar. Prinzipiell sind die Unterschiede – abgesehen vom Umstieg auf C statt Java – nur minimal, jedoch hat man die Sicherheit ein kleines Stück erhöht – oder es jedenfalls versucht: Statt HTTP wird nun auf HTTPs gesetzt. Was sich auf den ersten Blick gut anhört ist in der Praxis leider eher nervig, denn die X.509-Regeln interpretiert die zuständige Steuerbehörde etwas frei. Die Zertifikate sind selbstsigniert und haben nicht wie vorgesehen den DNS des Servers sondern den Eigennamen der Behörde als CN deklariert. Das hierauf jedes Sicherheitsprogramm allergisch reagiert und den Zugriff sperrt versteht sich von selbst. Apropos DNS: In der Software sind selbstverstandlich die IPv4-Adressen hardcoded, wer also darauf hofft die Ausnahmefunktion der Sicherheitssoftware nutzen zu können muss bangen. So erlaubt z.B. Microsoft Forefront TMG nur eine Definition von Ausnahmen auf Domainebene, für die IPs direkt ist eine Freischaltung also nicht möglich. Einen Workaround zeigt it-training-grote.de, dieser bietet jedoch ein (zugegebenerßen geringes) Missbrauchspotential, da hier mehr IPs als gewünscht freigegeben werden.

/me vs. encfs: Verdammte Sicherheit…

Dieser Artikel lag einige Jahre im Entwurfsordner und ist ggf. nicht mehr aktuell

Vor einigen Wochen las ich einen Artikel über EncFS: Dateiverschlüsselung im Userspace? Funktioniert mit Android? Perfekt für Cloud-Anwendungen! Einige Minuten später war das Tool installiert und die Dateien verschlüsselt. Sicher, oder? Definitiv. Es kam wie es kommen musste: Nach dem letzten Neustart meines PCs das große Fragezeichen: Wie war nochmal das Passwort? Zwar keine all zu wichtigen Dateien, allerdings liegen die ursprünglichen auf einem Laptop, der grade nicht da ist und die Backups – nunja, Bänder dauern. Also auf in den Kampf:

Schritt 1: Wo schwächelt es
Nunja, EncFS setzt auf gut abgehangene Algorithmen – dort auf Schwachstellensuche zu gehen dürfte aussichtslos sein.

Schritt 2: Gewalt ist eine Lösung
Wordlist, PHP, Go – ein kleines Script rückte encfs auf den Leib: Sicher nicht die schnellste Methode, aber bei über 3 Sekunden bis encfs eine Fehlermeldung spuckt käme vermutlich keine Scriptsprache ins Schwitzen. Primitives Multithreading verkürzt die Zeit da schon eher, so laufen dann einige Wörten in diversen Kombinationen durch die Wordlist – ein Testpasswort kann ja nicht zu schwer sein

Schritt 3: Da war ja was
Da der PC beschäftigt ist mal schnell am Server noch Updates machen – moment… Server? Aha – hier ist das EncFS noch geöffnet! Die Daten wären also spätestens jetzt gerettet (aber als braver Admin habe ich natürlich ohnehin ein Backup). Trotzdem: EncFS muss brechen. Die einfachste Methode: Passwort ändern. Keine Chance, hierzu wird das alte Kennwort erneut abgefragt. Schade drum.

Schritt 4: Wo gehobelt wird gibt’s einen Müllsack
Aber denken wir mal logisch: Wenn ich auf die Daten zugreifen kann muss der Key irgendwo sein. Das /proc-Dateisystem gibt schnell Zugriff auf die relevanten Speicherbereiche*, das Tool strings fördert lesbares hervor. Allerdings kein Kennwort. Nunja, Versuch war es wert.

* Der Support für die nötigen Funktionen wurde offenbar aus Sicherheitsgründen aus dem Kernel entfernt, entsprechend muss man bei neueren Kerneln ggf. selbst Hand anlegen.

Schritt 5: Faulheit obsiegt
Ich hab die Daten, ich bin Faul. Also: Neuen Ordner angelegt, neues Kennwort vergeben und die alten Daten neu Synchronisieren. Der ISP flucht, ich hab ruhe

Schritt 6: Geduldige sind schneller fertig
Kopiervorgang bei knapp 50% und es kommt, was kommen musste: Schritt 2 meldet ein vergnügtes „lamepassword“. Ich sollte weniger hak5 gucken. Und bessere Passwörter holen.

Auch am PC: Musiksuche durch vorsummen

Ihr kennt das sicher: Ihr habt eine Melodie im Kopf, kommt aber nicht auf den Namen des Liedes. Am Handy sind vielen vermutlich Dienste wie SoundHound oder Shazam bekannt, welche auch aus nicht wirklich gut gesummt- oder gesungenen Tonaufnahmen die passende Info heraussuchen. Allerdings hat man nun nicht immer ein Handy zu Hand und Google zu durchsuchen ist bequehmer als die Jackentaschen nach dem neuartigem Mobilfunkempfangsgerät. Ergebnis: Der Vorfahre von SoundHound, genannt Midomi, ist noch online und lässt dort auch eine Suche vom PC zu. Leider nur per Flash und nicht mit modernerem HTML5/WebRTC/Whatever-Voodoo, aber zumindest ich hab für solche Museumsseiten noch einen Chromium mit passenden Libraries im Chroot. Und jetzt die MP3 des gesuchten Liedes auf der Platte. DRM-frei versteht sich.

Intel Haswell-ULT Integrated Graphics: Performance vs. Battery unter Linux

Mal wieder geht es um die interne Grafik der Haswell-CPUs: Ich arbeite häufig am Laptop, dieser ist mit i5 und der der internen Grafik ausreichend schnell um auf dem Sofa etwas zu Arbeiten und nebenbei HD-Videos per HDMI auf dem TV darzustellen. Etwas verwundert war ich, als ich vor kurzem Unterwegs war. Ein kleiner Film zwischendurch sollte ja passen, aber selbst 720p-Material auf dem internen Montior war nicht ruckelfrei zu schaffen.

Das Problem scheinen die Stromsparfunktionen zu sein: Startet oder Resumed man das System im Akkubetrieb nimmt die Grafikleistung massiv ab. Auch ein späterer Wechsel auf Netzbetrieb bringt hier keine Änderung. Einzige  Lösung: System ausschalten oder in StBy versetzen, Netzkabel anschließen und starten, schon hat man wieder volle Performance – auch im Akkubetrieb. Sehr ärgerlich, vor allem da man hierzu  nahezu keine Dokumentation im Netz findet. Einige behaupten, es wäre eine Funktion des SpeedStep/EIST-Treibers, dieser wird jedoch eigentlich unterstützt, scheint aber keine Grafikfunktionen zu implementieren.

Da offenbar das Umschalten bisher (3.19.2) nicht sauber funktioniert würde ich  fast empfehlen die Stromsparfunktionen der Grafikkarte fürs erste im BIOS abzuschalten.

BitBastelei #142 – Arduino als Kühlschrankmonitor mit DS18B20

BitBastelei #142 - Arduino als Kühlschrankmonitor mit DS18B20

(100 MB) 00:28:30

2015-03-29 10:00 🛈

Passend zum gestrigen Arduino-Day habe auch ich ein (kompatibles) Board ausgegraben. Das Ziel: Mein Kühlschrank. Diesen möchte ich bei Sonnenschein über einen Inverter an meiner Solaranlage betreiben, um unschöne Probleme zu vermeiden wäre es aber eine gute Idee die Temperatur im Auge zu behalten. Punkt für Arduino – durch die vielen Libraries lässt sich das Ganze in wenigen Minuten erledigen.

Als Bonus werfe ich einen Blick auf die Sleep-Modes, also die Möglichkeit den µC schlafen zu legen um weiteren Strom zu sparen.

Links zum Video:

BitBastelei #141 – Haarschneider-Reparatur: Kabelschaden

BitBastelei #141 - Haarschneider-Reparatur: Kabelschaden

(83 MB) 00:07:53

2015-03-22 11:00 🛈

Wer irgend ein „mobiles“ Gerät mit Stromanschluss hat wird diesen defekt kennen: Am Gerät selbst beginnt die Isolierung der Zuleitung mit der Zeit durch die ständige Bewegung zu brechen. In den meisten Fällen lässt sich ein solcher Defekt aber schnell reparieren.

BitNotice #87 – Improvisation: Sonnenfinsternis fotografieren

BitNotice #87 - Improvisation: Sonnenfinsternis fotografieren

(99 MB) 00:05:52

2015-03-19 23:30 🛈

Morgen ist Sonnenfinsternis und ich hatte keine Zeit etwas ordentliches vorzubereiten. Fotografieren also abblasen? Auch doof, also improvisieren wir mal einen Kamerafilter… Obs funktioniert? Ich werde es Morgen sehen…

Nerd Inside