Dr. Stefan Schlott, BeOne Stuttgart GmbH
Java-Entwickler, Scala-Enthusiast, Linux-Jünger
Seit jeher begeistert für Security und Privacy
Verschiedene Möglichkeiten der Anmeldung sind mit Browser-Bordmitteln realisierbar:
...und natürlich noch diverse Single-Sign-On-Lösungen (z.B. OpenID, BrowserID, Facebook/Google login) mit „Dritt-Server-Unterstützung“
Übertragen der Formulardaten via https
Wichtig: Formular bereits auf einer https-Seite
Aktiver Angreifer („Man in the middle“): Kann Daten lesen und manipulieren, aber keine validen SSL-Zertifikate erzeugen
<form action="https://my.site/login" method="post">
<form action="http://my.site/login" method="post">
Website via http/https identisch: Nutzer merkt nichts
Weitere Problematik: Eingabe in Adressleiste ohne Protokoll
<Virtualhost *:80>
ServerName my.site
Redirect permanent / https://my.site/
</VirtualHost>
Http Strict Transport Security (HSTS) als Hilfe gegen SSL Stripping
Was tun gegen systematisches Ausprobieren?
Typischerweise keine gute Idee:
Rate Limit pro Username
Captcha ab einer gewissen Versuchszahl
...und natürlich gute Passwörter
Mindestlänge, Mindestkomplexität haben gewissen Wert
„Gängelung“ durch zu häufiges Wechseln: Kein Sicherheitsgewinn
Passwort-Knacker auf gängige Schemata vorbereitet
Hinweise für gute Passwortwahl geben!
Lieber längere Passwörter als Sonderzeichen verwenden
Passwörter nicht mehrfach verwenden, Hinweis auf Generatoren mit Masterpasswort wie z.B. Password Hasher
Brauchbare Schemata für Merkhilfen:
Das Passwort als einzige Hürde?
2-Faktor-Authentisierung: Wissen + Besitzen
Google Authenticator! (bzw. einen seiner Forks)
Standard: RFC6238 (Time-based OTP)
Apps für Android, iOS, Blackberry
Nicht vergessen: „Notfall-Keys“ für Notzugang
ohne Smartphone
Zur Einrichtung: Probeeingabe(n) verlangen
Funktion: Symmetrisch zum SSL-Serverzertifikat
Authentisierung, wenn
Überprüfung geschieht im SSL-Offloader bzw. SSL-Bibliothek
Möglichkeit, die Anwendung komplett nach außen abzuschotten
Selbe CA in mehreren Anwendungen: Single-Sign-On!
Häufig gewünscht: API-Zugang, Mashups, etc.
User-Passwort in fremde Apps eingeben: Schlecht
Standard-Procedere: OAuth, alternativ: Generierte Tokens
Separater Schlüssel für Apps
Anwendung kann Schlüsseln unterschiedliche Rechte einräumen
Vorsicht: User-Passwort-Wechsel macht OAuth-Tokens nicht ungültig
Best Practice:
Bisherige Betrachtung:
Bisher: Passwort-Sicherheit im Kontext Web-Login
Worst-Case-Vorbereitung: Angreifer hat Zugriff aufs System. Nutzer schützen!
Passwörter nie im Klartext!
Passwörter nie reversibel verschlüsselt!
Lösung: Hashes („Fingerabdruck“ des Passworts)
Kryptographischer Hash („Falltür-Funktion“)
Unschön: Identische Passwörter sind so erkennbar
Einfache Berechnung: Schnelles Durchprobieren möglich
Salt-Wert: Zeichenfolge, die dem Passwort hinzugefügt wird:
Statt Hash(pass): Hash(salt + pass)
Salt-Wert mitspeichern
Salt-Wert muss nicht zwingend zufällig sein; idealerweise jeden Salt-Wert nur 1x verwenden
Pepper: Weiterer, seiteneinheitlicher „Salt-Wert“
Nicht in Datenbank gespeichert
Nutzen umstritten. Wenn verwenden, dann HMAC-Funktion benutzen
Garlic: „New kid on the block“
Parameter, um Speicherbedarf der Hashfunktion zu erhöhen
Abwehr gegen GPU-Berechnungen
Langsame Hashfunktionen verwenden
Also scrypt/bcrypt, nicht SHA256, SHA512, ... direkt
Mithalten mit Wettrüsten: Nötige Rechenzeit erhöhen
Wenn Algorithmus das nicht hergibt: Bits im gespeicherten Hash wegwerfen (und beim Login ignorieren)
Wiedererkennen eines Users über Requests hinweg
Generieren einer Session-ID
Session-ID wird bei jedem Request mitgeliefert (typischerweise Cookie)
Serverseitig: Speicher, der mit Session-ID assoziiert ist, enthält eigentliche Session-Informationen
...unter anderem User-ID, Privilegien, ...
Für die Dauer der Session: Session-Cookie ist Username-Passwort-Äquivalent!
Erzeugen der Session-ID: Containerabhängig
Wenn Session-ID vorhersagbar: „Einstieg“ in fremde Sessions möglich
Gegenmaßnahmen:
Ziel: Opfer eine dem Angreifer bekannte Session „unterschieben“
Voraussetzung: Session-ID ist von außen setzbar - z.B. Tomcats Fallback bei fehlenden Cookies:
http://my.site/some/url;jsessionid=...
Angreifer generiert eine Session, lockt Opfer auf Seite z.B. mittels präpariertem Link
Gegenmaßnahmen:
COOKIE
Session-ID vor Angriffen schützen
Erschweren des Stehlens der Session-ID durch XSS-Angriffe: Cookie-Attribut HttpOnly In Tomcats web.xml:
true
Wird https verwendet: Übertragung via http mittels Secure unterbinden. In Tomcats web.xml:
true
Sollen mehrere gleichzeitig gültige Session-Cookies möglich sein?
Vorteil: Auf mehreren Browsern angemeldet bleiben
Nachteil: Diebstahls-Risiko, vergessen abzumelden, etc.
Bei naiver Verwendung der Sessions: Mehrfachlogin möglich
Hinweis: Mögliche inkonsistente Daten bei Verwendung von Session als Daten-Cache
Best Practice:
Fragen nach Lieblingstier, Name der Mutter, etc. leicht zu erraten
Recovery per E-Mail
Authentisierungs-Token verloren?
Einloggen mittels „Notfall-Keys“, Re-Keying
Passwort vergessen?
Recovery-Link plus Token-Abfrage
→ Kein Single Point of Failure!
Security-Themen können tricky sein
Beim Thema Login und Session-Management: Wenig „Baukästen“, Defaultkonfiguration überprüfen
Strebe nach „Secure By Default“
Preparedness, Constant Vigilance