May 19, 2021
Eine gute Lernkultur hat viele Vorteile für Ihr Unternehmen, Ihre Mitarbeiter und Kunden. Es mag einige Zeit dauern, aber hier bei Intertec arbeiten wir ständig daran, eine Umgebung zu schaffen, in der die Mitarbeiter ihr Wissen mit anderen teilen und das Know-how des Unternehmens verbessern können.
In diesem Sinne haben wir diesen Monat in einem gemeinsamen Artikel mit meinem Kollegen Vlatko einige wichtige Punkte zu Spring Security und Cognito diskutiert. Lesen Sie weiter, um mehr über die Unterschiede zwischen Cognito und Spring Security zu erfahren und um herauszufinden, wie wir zu dem Schluss gekommen sind, dass Cognito der richtige Weg ist, wenn es um die Implementierung von Authentifizierung und Autorisierung in einem kundenspezifischen Softwarelösungsprojekt geht.
Martin über Cognito: Wenn es darum geht, die wichtigste Frage von Kunden und Projektmanagern zu beantworten: "Wie schnell können wir globale Authentifizierung und Autorisierung in unserem System implementieren?", kommt Cognito zur Hilfe. Cognito ist eine Out-of-the-Box-Lösung, die manuell oder über CloudFormation (später CF genannt) Templates eingerichtet werden kann.
Wenn jedoch mehrere Projekte auf der AWS-Infrastruktur laufen, ist es sinnvoller, CF-Vorlagen zu verwenden. CF bietet zwei Möglichkeiten zum Schreiben der Vorlage, JSON oder YAML. Die Einrichtung dauert in der Regel etwa 2 Minuten (je nachdem, welche Region bereitgestellt wird).
Darüber hinaus bietet es neben der Einrichtung eine anpassbare Benutzeroberfläche für die Anmeldung, Registrierung, Passwortwiederherstellung, Passwortänderung, föderierte Authentifizierung und Multi-Faktor-Authentifizierung (später als MFA bezeichnet) (unter Verwendung von SMS, E-Mail und Einmal-Passwort), was bedeutet, dass wir den Ingenieuren keine zusätzlichen Kopfschmerzen bereiten müssen.
Vlatko über Spring Security: Das Hinzufügen von Spring Security zu einer Spring Boot-Anwendung ist so einfach wie das Hinzufügen von Spring Security zum Klassenpfad. Für Spring-Anwendungen, die Spring Boot nicht verwenden, ist eine zusätzliche Konfiguration erforderlich. Die folgenden Dinge werden mit diesem einfachen Setup erreicht:
Durch das Hinzufügen einer zusätzlichen Anmerkung oder das Erweitern einer zusätzlichen Klasse in einigen unserer Konfigurationsklassen haben wir bereits die Möglichkeit, Sicherheit auf Methodenebene zu verwenden, und es ist so einfach wie die Verwendung einer zusätzlichen Anmerkung auf der Methode, die wir zusätzlich sichern wollen. Diese Grundeinstellung kann je nach den Bedürfnissen der Anwendung leicht erweitert oder geändert werden, indem Methoden der bereits definierten Beans überschrieben oder neu definiert werden.
Zum Beispiel können wir den CSRF-Schutz einfach deaktivieren, die globale CORS-Konfiguration erweitern, festlegen, welche Endpunkte gesichert werden sollen, die Standardkonfiguration für Authentifizierung und Autorisierung erweitern usw. Wie wir sehen können, ist es ziemlich einfach und schnell, eine Anwendung zu sichern, indem man die anfängliche Standard-Grundkonfiguration verwendet, die von Spring Security bereitgestellt wird.
Oft reicht diese Grundkonfiguration nicht aus, und in diesen Fällen hängt die Entwicklungszeit von den Anforderungen an die Anwendungssicherheit ab. Spring Security bietet jedoch eine Vielzahl von Out-of-the-Box-Optionen, die leicht modifiziert oder erweitert werden können. Dies beschleunigt den Entwicklungsprozess und spart Entwicklungszeit.
Martin on Cognito: Normalerweise benötigen unsere Kunden einen starken Authentifizierungs- und Autorisierungsdienst. Mit dem Begriff "stark" meinen sie zuverlässig, zufriedene Kunden, die keine Probleme beim Einloggen, Registrieren, Ändern von Passwörtern und der Sicherheit persönlicher Daten haben. Wenn man sich vor Augen hält, was hinter Cognito steht, nämlich die allmächtigen Amazon Web Services, fällt es leichter, diese Art von Frage zu beantworten. Als vollständig verwalteter Dienst garantiert er eine monatliche Betriebszeit von mindestens 99,9 %, so dass wir uns über die Verfügbarkeit keine Gedanken machen müssen.
Was die Sicherheit betrifft, so verfügt er über grundlegende und erweiterte Sicherheitsfunktionen. Auf der einen Seite bietet er über das AWS Amplify-Modul die Verschlüsselung von Daten auf Anwendungsebene. Auf der anderen Seite schützen erweiterte Sicherheitsfunktionen die Benutzerkonten vor unbefugtem Zugriff.
Cognito verfügt über eine intelligente Funktion zur Risikoberechnung, die Benutzer erkennt, die Anmeldeinformationen eingegeben haben, die an anderer Stelle kompromittiert wurden, und sie auffordert, ihr Passwort zu ändern. Die Daten werden in der gesicherten und streng bewachten Datenbank gespeichert, die nur über AWS Amplify oder die eigene API zugänglich ist. Die Sicherheit der in Cognito gespeicherten Inhalte wird von AWS gewährleistet. AWS wendet ein Modell der geteilten Verantwortung für den Datenschutz an, d. h. sowohl AWS als auch seine Kunden sind für den Schutz der Daten verantwortlich.
In Cognito hat AWS einen großen Einfluss, da es seine eigenen Verschlüsselungsschlüssel verwendet und keine vom Kunden definierten Schlüssel unterstützt. Die folgenden Grundsätze sorgen jedoch dafür, dass die Inhalte vollständig branchenkonform und sicher sind:
Es ist mit den folgenden Standards/Programmen konform: SOC, PCI, ISMAP, FedRAMP, DoD CC SRG, HIPAA BAA, IRAP, MTCS, C5, K-ISMS, ENS High, OSPAR, HITRUST CSF, FINMA.
Vlatko über Spring Security: Die Zuverlässigkeit von Spring Security hängt von den verwendeten Diensten von Drittanbietern ab (z. B. Datenbankzugriff oder Lightweight Directory Access Protocol-Server), je nach Konfigurationseinstellung. Was die Sicherheit betrifft, so ist Spring Security sicher, solange es richtig konfiguriert und verwendet wird.
Spring Security im Web-Tier basiert auf Beans vom Typ Filter, durch die die Anfragen verarbeitet werden, und jede von ihnen kann dazu verwendet werden, den Aufruf nachgelagerter Filter zu verhindern. Neben der Absicherung von Webanwendungen bietet Spring Security auch Unterstützung für die Verwendung von Sicherheit auf Methodenebene. Web-Sicherheit und Sicherheit auf Methodenebene können in derselben Anwendung kombiniert werden. Die Filterkette bietet Funktionen für die Benutzererfahrung, wie z. B. Authentifizierung und Umleitungen zu Anmeldeseiten, und die Sicherheit auf Methodenebene bietet Schutz auf einer detaillierteren Ebene.
Spring Security bietet Schutz gegen einige der beliebtesten Exploits wie CSRF-Angriffe und Session Fixation, fügt Security Headers zu den Antworten hinzu und bietet konfigurierbare CORS-Unterstützung. Es gibt keine einfache, sofort einsatzbereite Lösung, um Datenverschlüsselung auf Anwendungsebene zu aktivieren. Spring Security unterstützt die Verschlüsselung von Daten mit dem Security Crypto Module, das Unterstützung für symmetrische Verschlüsselung, Schlüsselgenerierung und Passwortverschlüsselung bietet. Neben der üblichen Passwortverschlüsselung können wir mit diesem Modul auch Daten in/aus der Datenbank ver- und entschlüsseln, aber dazu müssen wir unser benutzerdefiniertes Attribut zu einer Datenbankspalte hinzufügen (und umgekehrt).
Martin on Cognito: Wenn es um autorisierte Benutzer im System geht, würde ich sagen, dass es von den Anforderungen und der Granularität des Rollenberechtigungsmodells abhängt, das festgelegt werden muss. Cognito unterstützt dies über den Identitätspool in Kombination mit IAM-Rollen. Beides zusammen gibt uns die Möglichkeit, den Zugriff von AWS-Services bis hin zu einer Zeile einer Tabelle in DynamoDB zu steuern. Die Einrichtung der Autorisierung in Cognito ist ziemlich einfach, wenn Sie die folgenden Schritte befolgen:
Wenn Sie diese vier Schritte beachtet haben, können Sie Cognito nicht nur als Authentifizierungskomponente, sondern auch als Autorisierungsendpunkt verwenden. Der Umgang mit mehreren Rollen und unterschiedlichen Berechtigungen für diese ist durch die Verwaltung von Benutzergruppen im User Pool machbar.
Manchmal wird die Frage aufgeworfen, ob einem Benutzer mehrere Rollen zugewiesen werden können. Die Antwort lautet: Ja, es reicht aus, den Benutzer der gewünschten Gruppe hinzuzufügen. Auf der einen Seite ist es mit wenig Aufwand verbunden, ein ACL-Modell festzulegen, aber auf der anderen Seite kann es in diesem Umfang eine kleine Herausforderung sein.
Vlatko über Spring Security: Unabhängig davon, wie Sie sich authentifizieren wollen, können die Autorisierungsdienste in Ihrer Anwendung konsistent und einfach verwendet werden.
Der "AccessDecisionManager" ist die Hauptschnittstelle, die für die Entscheidungen zur Zugriffskontrolle in Spring Security verantwortlich ist, indem sie die Methode "decide" verwendet, die ein "Authentication"-Objekt annimmt. Alle Implementierungen der "Authentication"-Schnittstelle verfügen über eine Liste von "GrantedAuthority"-Objekten, die die Berechtigungen darstellen, die dem Auftraggeber gewährt wurden. Der "AuthenticationManager" ist für das Hinzufügen der "GrantedAuthority"-Objekte in das "Authentication"-Objekt verantwortlich, die später vom "AccessDecisionManager" gelesen werden, wenn er Autorisierungsentscheidungen trifft. Spring Security enthält eine spezifische "GrantedAuthority"-Implementierung - "SimpleGrantedAuthority".
Spring Security im Web-Tier basiert auf einer Sicherheitsfilterkette, die über einen Request Matcher verfügt, mit dem entschieden wird, ob sie auf einen HTTP-Request angewendet werden soll. Innerhalb der Filterkette können Sie jedoch eine feinere Steuerung der Autorisierung vornehmen, indem Sie zusätzliche Matcher im HttpSecurity-Konfigurator festlegen. Neben der Unterstützung für die Absicherung von Webanwendungen bietet Spring Security auch Unterstützung für die Anwendung von Zugriffsregeln auf die Ausführung von Java-Methoden. Spring Security verwendet Spring EL als Autorisierungsmechanismus, mit dem komplizierte boolesche Logik in einem einzigen Ausdruck gekapselt werden kann.
Vier Annotationen unterstützen Ausdrucksattribute, um Autorisierungsprüfungen vor und nach dem Aufruf zu ermöglichen: @PreAuthorize, @PreFilter, @PostAuthorize und @PostFilter. Um die Autorisierung in Spring Security anzupassen, sollten wir daher Folgendes tun:
Die gängigste Implementierung besteht darin, dass wir für jeden Benutzer mehrere Rollen und für jede dieser Rollen mehrere Berechtigungen haben.
Martin on Cognito: Die Antwort ist JA und es gibt hauptsächlich einen Kompromiss. Wenn es um die Autorisierung geht, bietet uns Cognito, wie ich im vorherigen Abschnitt erwähnt habe, einen Mechanismus über IAM-Rollen, um den Zugriff auf bestimmte Dienste in der Cloud zu spezifizieren. Wie lässt sich das umsetzen, indem man einen Identitätspool konfiguriert, der den Cognito-Benutzerpool als Authentifizierungsmethode verwendet, und eine oder mehrere IAM-Rollen, die eine einzelne Rolle mit spezifischen Berechtigungen darstellen?
Wenn es um die Komplexität des Rollen-/Berechtigungsmodells geht, das mit Cognito entwickelt werden kann, lautet die Antwort: Ja: Cognito unterstützt das bis zu einem gewissen Grad, legt aber mehr Wert auf Zuverlässigkeit, Konsistenz und Verfügbarkeit. Mit "bis zu einem gewissen Grad" meine ich, wenn Sie beispielsweise eine Rollenhierarchie innerhalb eines Systems erstellen möchten, sollten Sie eine oder mehrere Benutzergruppen im Benutzerpool anlegen. Dieser Gruppe kann eine einzelne IAM-Rolle zugewiesen werden. Wenn Sie einem bestimmten Benutzer Berechtigungen für einen Dienst erteilen möchten, der für diese Gruppe nicht verfügbar ist, müssen Sie diesen Benutzer in eine andere Gruppe aufnehmen, die diese Berechtigung für den spezifischen Dienst hat. Dies kann die Vergabe von Berechtigungen und die damit verbundene Flexibilität ziemlich verkomplizieren und zu schwerfälligen Gruppen, Benutzern und IAM-Rollen führen.
Vlatko über die Sicherheit von Spring: Wir können sagen, dass Spring im Allgemeinen (nicht nur Spring Security) eine steile Lernkurve hat. Das liegt daran, dass das Spring Framework eigentlich eine Sammlung von mehreren Projekten ist, die verschiedene Aspekte der Entwicklung von Unternehmensanwendungen abdecken. Sobald Sie sich jedoch mit dem Spring Framework vertraut gemacht haben, werden Sie produktiver bei der Bewältigung von Geschäftsfunktionen, indem Sie dem Framework erlauben, allgemeine Aufgaben zu übernehmen.
Ein weiterer erwähnenswerter Nachteil ist, dass es keine einfache Out-of-the-Box-Lösung gibt, um die Datenverschlüsselung auf Anwendungsebene zu ermöglichen. Um dies zu erreichen, müssen wir uns mit dem Security Crypto Module vertraut machen. Mit diesem Modul können wir Daten in/aus der Datenbank verschlüsseln/entschlüsseln, aber dazu müssen wir unser benutzerdefiniertes Attribut zu einer Datenbankspalte hinzufügen (und umgekehrt). Als Workaround kann stattdessen auch eine Dateisystemverschlüsselung oder eine Datenbankverschlüsselung (sofern von der Datenbank-Engine unterstützt) verwendet werden.
Martin über Cognito: Bei der Nutzung von Cognito erfolgt die Abrechnung auf Basis der monatlich aktiven Nutzer (MAUs). Das bedeutet, dass innerhalb eines Kalendermonats ein Identitätsvorgang in Bezug auf einen Benutzer stattfindet, z. B. eine Anmeldung, ein Sign-in, eine Token-Aktualisierung oder eine Passwortänderung. Aber es geht bei den AWS-Diensten nicht nur darum, Geld zu verlangen. In Cognito gibt es einen recht großen so genannten Free Tier, der 50.000 MAUs unterstützt. Das Gute daran ist, dass es nach dem 12-monatigen kostenlosen Zeitraum nicht ausläuft. Außerdem werden keine Gebühren für nachfolgende Sitzungen und inaktive Benutzer innerhalb des Monats erhoben.
Selbst bei unseren großen Projekten mit mehr als 50.000 MAUs ist der zu zahlende Preis sehr gering. Die Tabelle unten zeigt die Preisstufen.

Für erweiterte Sicherheitsfunktionen gibt es ebenfalls Preise. Nachstehend finden Sie eine Tabelle mit den Preisen pro Stufe:

Wenn wir zum Beispiel ein System mit 60.000 monatlich aktiven Benutzern haben, ergeben sich folgende Berechnungen:
Vlatko über Spring Security: Spring Security selbst ist kostenlos. Wenn Sie sich jedoch dafür entscheiden, Ihre Anwendung mit Spring Security abzusichern, hängen die zusätzlichen Kosten von den bereits genutzten Drittanbieterdiensten ab.
AWS Cognito ist die bessere Wahl, wenn es um die Implementierung fortschrittlicher Sicherheitsfunktionen wie Telefonnummernvalidierung, Multi-Faktor-Authentifizierung oder föderierte Authentifizierung geht. AWS Cognito bietet ein komplettes System für die Verwaltung von Benutzeridentitäten, mit dem Sie großartige Benutzererlebnisse für Endbenutzer über mehrere Plattformen hinweg erstellen können. Es handelt sich um eine schnellere, zuverlässigere, sicherere und skalierbare Lösung, bei der Sie sich nicht um das Backend kümmern müssen, da dies bereits durch den Dienst selbst bereitgestellt wird.
Und nicht zuletzt ist es ein großartiges Werkzeug, um Authentifizierung und Autorisierung für Ihre Projekte oder Dienste zu implementieren.
Sind Sie auf der Suche nach einer neuen Herausforderung? Möchten Sie in einem Unternehmen arbeiten, in dem unkonventionelles Denken gefördert wird? Werfen Sie einen Blick auf unsere aktuellen Stellenausschreibungen.

Martin Ristevski
Vertrauen bei führenden Unternehmen weltweit




Intertec


Aneta Pejchinoska


Intertec