Karriere
Wissen
Über uns
18. Okt 2023
Ein Leitfaden
Die Sicherheit von Webanwendungen ist heutzutage von entscheidender Bedeutung, insbesondere wenn es um die Authentifizierung geht. Um unser Wissen zu den Sicherheitsthemen in Webanwendungen zu erweitern, haben wir an einem spannenden zweitägigen Workshop teilgenommen, der von Urs Müller und Mischa Bachmann von der Firma Compass Security geleitet wurde.
In diesem Blogbeitrag werden wir uns ausführlich mit dem Thema Authentifizierung mittels http-Formularen beschäftigen. Dabei werden wir uns insbesondere auf die damit verbundenen Sicherheitsrisiken und die besten präventiven Massnahmen konzentrieren. Darüber hinaus können Sie sich auf zwei weitere Beiträge freuen, in denen wir die speziellen Authentifizierungskonzepte JWT (Json Web Token) und OAuth (Open Authorization) genauer unter die Lupe nehmen werden.
Zuallererst möchten ich darauf hinweisen, dass es neben der Authentifizierung mittels http-Formularen auch andere Methoden wie die Basic- oder die Digest-Authentifizierung gibt. Allerdings wird ein Grossteil, aufgrund von Sicherheitsbedenken, nicht mehr für öffentlich zugängliche Applikationen empfohlen.
Bei der Authentifizierung mittels http-Formularen gibt der Benutzer seine Anmeldedaten in einem http-Formularen auf der Webseite ein. Die Übermittlung dieser Daten an den Server geschieht danach im Klartext. Um sicherzustellen, dass diese Daten geschützt sind, ist es somit von entscheidender Bedeutung, dass die Kommunikation über TLS (Transport Layer Security) verschlüsselt wird. Dies gewährleistet nicht nur den Schutz der Anmeldedaten, sondern ermöglicht auch im begrenzten Umfang die Überprüfung, ob die Verbindung mit dem richtigen Server hergestellt wurde.
Die Entwicklung einer sicheren Login-Implementierung, basierend auf http-Formularen, ist äusserst komplex, da es viele Fehlerquellen gibt. Aus diesem Grund empfehle ich, wenn möglich, eine vorhandene und bekannte Login-Lösung zu verwenden, die bereits gründlich getestet wurde und bei der Fehler schnell behoben werden. Falls man dennoch eine eigene Login-Lösung entwickeln möchte, sollte man auf folgende Punkte achten.
Ein häufig unterschätztes Sicherheitsrisiko ist der Enumeration-Angriff, bei dem ein Angreifer versucht, eine Liste gültiger Benutzernamen zu erhalten. Auch wenn eine solche Liste allein noch kein Problem darstellt, kann ein Angreifer mit validen Benutzernamen effizienteres Social Engineering betreiben und so erfolgreich Zugriff auf Konten erlangen. Das Passwort ist die einzige Unbekannte, was es einfacher macht, gültige Anmeldeinformationen zu finden, im Vergleich zur Erratung des Passworts und eines gültigen Benutzernamens. Deshalb ist es wichtig, dass beim Login neutrale Fehlermeldungen verwendet werden, wie "Benutzername oder Passwort ist inkorrekt". Dies sollte nicht nur für fehlgeschlagene Anmeldungen gelten, sondern auch für den Erstellungsprozess neuer Konten. Zudem sollten sogenannte Timing-Angriffe vermieden werden, bei denen ein Unterschied in der Antwortzeit zwischen dem Fall, in dem das Passwort falsch ist, und dem Fall, in dem der Benutzer unbekannt ist, besteht.
Um ein gültiges Passwort zu erhalten, versucht ein Angreifer mit Social Engineering den Benutzer zu manipulieren und seine Login-Daten preiszugeben. Wenn das nicht gelingt, führt der Angreifer Brute-Force Angriffe durch, um das richtige Passwort zu finden und Zugang zum Konto zu erhalten. Um sich vor solchen Angriffen zu schützen, empfehlen wir, den Benutzer nach einer bestimmten Anzahl von fehlgeschlagenen Anmeldeversuchen zu sperren. Diese Sperre kann entweder für eine bestimmte Zeitdauer oder bis zur Passwortrücksetzung des Benutzers gelten. Um solche Angriffe weniger offensichtlich zu machen, kann es sein, dass der Angreifer zu einem Passwort-Spraying Angriff wechselt. Bei diesem wird ein Passwort mit vielen Benutzernamen probiert, auch hier mit der Hoffnung, eine valide Anmelde Information zu finden. Bei beiden Angriffen kommen viele fehlgeschlagene Anmeldeversuche von wenigen IP-Adressen, daher ist es auch sinnvoll, eine temporäre IP-Sperre zu implementieren.
Eine wichtige Sicherheitsmassnahme ist es zudem, alle aktiven Sitzungen eines Benutzers zu beenden, wenn er sich abmeldet. Wenn ein Login über verschiedene Geräte hinweg möglich ist, sollten zumindest alle Sitzungen auf einem bestimmten Gerät geschlossen werden. Es ist wichtig, dass der Benutzer nach dem Abmelden nicht automatisch in anderen Tabs oder Fenstern angemeldet bleibt. Dies gewährleistet die Sicherheit, da der Benutzer ordnungsgemäss abgemeldet ist. Dies ist speziell kritisch wenn der Benutzer sich auf einem öffentlichen Gerät angemeldet hatte.
Auch beim Speichern von Passwörtern ist es ratsam, wenn möglich keine eigene Lösung zu implementieren, sondern eine bewährte Library oder einen Service zu verwenden. Falls es dennoch erforderlich ist, das Passwort selbst zu speichern, sollte sichergestellt werden, dass das Passwort niemals im Klartext abgespeichert wird. Stattdessen sollte das Passwort als "salted hash" gespeichert werden. Dabei wird ein für jedes Passwort zufällig generierter Wert (Salt) dem Passwort hinzugefügt und beides gehasht. Dadurch wird verhindert, dass man erkennt, welche Benutzer dasselbe Passwort verwenden, und es ist auch nicht möglich, vorberechnete Hash-Werte zu verwenden, um das Passwort zurückzuschliessen. Der verwendete Hash-Algorithmus sollte für Passwörter geeignet sein.
import bcrypt password = b"Compass" hash = bcrypt.hashpw(password, bcrypt.gensalt()) hash >>> b'$2b$12$OC1xKNMGbZ9028UzIDWpSOtjzpbfXngh8l04jP.JM7vzLjN60v3V6' hash = bcrypt.hashpw(password, bcrypt.gensalt()) hash >>> b'$2b$12$8NOCSKm0Q2IeY1wFpwoN0.PbedKwPb66XF.CNhNj5Yoyead/f0jcC' bcrypt.checkpw(b'Kompass', hash) >>> False bcrypt.checkpw(b'Compass', hash) >>> True
Hier sehen sie die Verwendung des bcrypt Passwort-Hashing Algorithmus in Python. Das Salt für das hashen wird mit bcrypt.gensalt() generiert. Wie man sehen kann gibt es trotz verwenden des gleichen Passworts zwei Komplet unterschiedliche Hashes.
Um das Risiko durch gestohlener Passwortinformationen zu minimieren, bietet sich die Implementierung einer 2-Faktor-Authentifizierung an. Bei dieser Methode wird der Benutzer nach der Eingabe seines Passworts aufgefordert, sich über einen zusätzlichen Faktor zu authentifizieren. Häufig erfolgt dies durch den Versand eines Codes per E-Mail oder SMS an den Benutzer. Durch die Verwendung dieses zusätzlichen Sicherheitsfaktors wird die Sicherheit erheblich erhöht. Allerdings ist es wichtig zu betonen, dass selbst die 2-Faktor-Authentifizierung keine vollständige Sicherheit gewährleisten kann, wie das genannte Beispiel verdeutlicht.
Es ist von entscheidender Bedeutung, bei der Entwicklung von Authentifizierungssystemen, alle Sicherheitsaspekte sorgfältig zu berücksichtigen. In dem man bewährte Sicherheitspraktiken berücksichtigt, kann man die Gefahr eines erfolgreichen Angriffes minimieren. Wichtig ist auf jeden Fall, dass Anmeldungs-Information nur über TLS-Verschlüsselten Verbindungen versendet werden. Es ist sehr wahrscheinlich, dass man bei einer eigenen Umsetzung eine spezielle Situation übersehen und dadurch eine Sicherheitslücke einbauen könnte. Deshalb ist es ratsam, bekannte und gut getestete Bibliotheken zur Verwaltung von Anmeldeinformationen zu verwenden. Stelle sicher, dass diese Bibliotheken regelmässig aktualisiert werden, damit immer die neueste Version mit geschlossenen Sicherheitslücken verwendet wird. Weitere Schutzmechanismen, wie der Sperrung nach fehlgeschlagenen Anmeldeversuchen und die Verwendung von 2-Faktor-Authentifizierung, stellen eine zusätzliche Schutzschicht dar, die die Gefahr eines erfolgreichen Angriffs weiter senkt.
Danke für Ihr Interesse an Cudos. Ihre Angaben werden vertraulich behandelt – den Newsletter können Sie jederzeit abbestellen.