Karriere
Wissen
Über uns
25. Jul 2023
Einblicke in die Sicherheitsthemen im Webumfeld.
In der heutigen vernetzten Welt ist die sichere Kommunikation zwischen Servern von entscheidender Bedeutung. Eine wichtige Komponente, um diese Sicherheit zu gewährleisten, sind JSON Web Tokens (JWT). Diese Tokens ermöglichen den sicheren Austausch von Informationen zwischen verschiedenen Servern und tragen zur Gewährleistung der Integrität und Authentizität der Daten bei.
Im Rahmen eines spannenden zweitägigen Workshops haben uns Urs Müller und Mischa Bachmann von der Firma Compass Security detaillierte Einblicke in die Sicherheitsthemen im Webumfeld gegeben. Wir haben bereits einen Blogbeitrag zur Authentifizierung mittels HTTP-Formularen verfasst. Des Weiteren werden wir in einem kommenden Beitrag das Thema OAuth und OpenID behandeln, die ebenfalls zur Verbesserung der Sicherheit von Webanwendungen beitragen.
Nun möchten wir uns in diesem Beitrag genauer mit dem Thema JWT befassen. Wir werden die Struktur von JWT untersuchen, Validierungsmechanismen beleuchten und Best Practices für eine sichere Implementierung vorstellen. Dabei werden wir auch auf die Verbindung zwischen JWT und der Authentifizierung mittels HTTP-Formularen eingehen, um Ihnen ein umfassendes Verständnis für die Sicherheitsaspekte von Webanwendungen zu vermitteln.
JWT können in Form von Signed Tokens (JWS) oder Encrypted Tokens (JWE) vorliegen, wobei wenn von einem JWT gesprochen wird meistens ein JWS gemeint ist. Auch ich werde dies verwenden und von nun an von JWT sprechen wenn ich JWS beschreibe.
Ein JWT besteht aus drei Teilen: dem Header, Payload und der Signatur. Jeder Teil ist Base64-Codiert und durch ein Punkt getrennt aneinander gehängt. Hier ist zu beachten, obwohl es für uns Menschen so aussieht, ist die Base64-Codierung keine Verschlüsselung und kann leicht decodiert werden. Für JWT wird eine URL sichere Version der Base64-Codierung verwendet, oft auch base64url genannt. Damit JWT auch direkt ohne weitere Codierung in eine URL gepackt werden können.
Der Header enthält Metadaten über das Token, wie den verwendeten Signaturalgorithmus und den Token-Typ (immer auf "JWT" gesetzt).
Der Payload enthält die tatsächlichen Daten, die übertragen werden sollen, in Form von Key-Value-Paaren den sogenannten Claims. Einige dieser Claims sind vordefiniert, diese sollten nur für die vordefinierte Funktion verwendet werden. Ein Set von sieben Claims ist auch empfohlen, aber nicht erforderlich, in allen JWT mit einzubauen diese sind:
Die Signatur wird aus dem Header und der Payload mithilfe des im Header definierten Signaturalgorithmus erstellt und stellt sicher, dass das JWT nicht unerlaubt verändert wurde.
Man kann entweder symmetrische oder asymmetrische Verschlüsselung für die Signatur verwenden. Bei der simpleren und schneller zu berechnender symmetrischer Verschlüsselung haben sowohl der Autorisierungsservice als auch der Service der Applikation den gleichen Schlüssel zur Validierung der Signatur. Bei asymmetrischer Kryptografie hingegen hat der Autorisierungsservice einen privaten Schlüssel für die Signaturerstellung und einen öffentlichen Schlüssel zur Validierung. Es ist wichtig zu beachten, dass bei Kompromittierung eines symmetrischen Schlüssels der Angreifer valide JWT erstellen kann, während dies bei asymmetrischer Verschlüsselung nur möglich ist, wenn der Angreifer Zugriff auf das geheime Passwort des Autorisierungsservers hat. Aus diesem Grund ist die Verwendung asymmetrischer Signatur in den meisten Fällen zu bevorzugen, es sei denn, Autorisierung und Applikation laufen auf demselben Server.
Ein JWT gewährleistet durch seine Signatur, dass sowohl der Header als auch die Payload nicht manipuliert wurden. Jedoch ermöglicht es jedem, der Zugriff auf das JWT hat, dieses auszulesen. Wenn ein Schutz gegen Auslesen gewünscht ist, kann ein JWE verwendet werden. Jedoch ist dies normalerweise nur selten nötig, da JWT in der Regel über sichere und verschlüsselte Verbindungen übertragen werden. Es ist jedoch somit wichtig, dass das Token auch sicher im Client, meistens ein Browser, abgelegt ist und keiner anderen als der Zielwebsite zugänglich ist. Daher sollten in einem JWT keine sensiblen Daten wie Passwörter, sondern lediglich Benutzernamen, Rollen oder ähnliches abgelegt werden.
Um die Sicherheit der Signatur zu garantieren, muss die Library, die zur Verarbeitung von JWT verwendet wird, so konfiguriert werden, dass nur der erwartete Signaturalgorithmus erlaubt ist. Wenn ein JWT einen unerwarteten Signaturalgorithmus verwendet, sollte es verworfen werden. Ansonst können möglicherweise valide Tokens generiert werden. Wenn beispielsweise bei einem auf asymmetrischer Signatur basierten Token eine symmetrische Validierung verwendet wird, geht die gesamte Sicherheit verloren, da das Token mit dem öffentlichen Schlüssel signiert werden kann und somit gültig ist, aber jeder Zugriff auf den öffentlichen Schlüssel hat. Selbst wenn man diesen Sicherheitsschritt weglässt sollte man sicherstellen, dass nur sichere Signaturalgorithmen zugelassen sind. Aktuell sind alle im Standard definierte Algorithmen ausser "none" sicher. Der "none" Algorithmus beinhaltet keine Signatur und lässt somit keine Validierung zu.
Um Missbrauch von JWT zu verhindern, zum Beispiel indem ein Benutzer mehr Rechte behält, nachdem sie ihm entzogen wurden, sollte der JWT ein Ablaufdatum im Header enthalten. Die Lebensdauer des Tokens sollte so kurz wie möglich gewählt werden, um sicherzustellen, dass immer die neuesten Benutzeransprüche verwendet werden.
Um die eigene Implementierung zu validieren, kann man die folgenden Schritte prüfen:
JWT können ein wichtiges Tool sein, um einen sicheren und manipulationsresistenten Austausch von Informationen zwischen Servern zu ermöglichen. Damit dies funktioniert, ist es wichtig, einige Schritte einzuhalten. Deine Applikation sollte nur valide JWT akzeptiert, die die von der Applikation erwartete Parameter enthält. Alle anderen sollten verworfen werden. Insbesondere solche, mit unerwarteten Signieralgorithmen. Zudem sollte der Inhalt von JWT nicht durch andere einsehbar sein, sollten sie über einen verschlüsselten Kanal gesendet werden oder alternativ verschlüsselte Tokens (JWE) verwendet werden.
Falls dich das Thema zu Sicherheit im Webumfeld interessiert findest du weitere Informationen in unseren Blogbeitrag Leitfaden zur Authentifizierung mittels http-Formularen
Danke für Ihr Interesse an Cudos. Ihre Angaben werden vertraulich behandelt – den Newsletter können Sie jederzeit abbestellen.