AWS Cognito vs. Spring Security: Unser Fazit

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.

Spart es Entwicklungszeit?

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:

  • Alle Endpunkte der Anwendung sind bereits gesichert
  • Das Anmeldeformular wird generiert
  • Formularbasierte Anmeldung und HTTP-Basic-Sicherheit sind aktiviert
  • Ein Standardbenutzer wird erstellt, der für die Anmeldung und den Zugriff auf die Endpunkte verwendet werden kann (dessen Kennwort zur Laufzeit auf der Konsole ausgegeben wird)
  • Der Schutz vor CSRF-Angriffen ist aktiviert
  • Session Fixation Schutz ist aktiviert

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.

Ist es sowohl zuverlässig als auch sicher?

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:

  • MFA mit jedem Kundenkonto
  • Verwendung von SSL/TLS für die Kommunikation mit Cognito
  • In-Transit-Verschlüsselung, d. h. Verwendung von Cipher Suites mit Perfect Forward Secrecy (PFS) wie Ephemeral Diffie-Hellman (DHE) oder Elliptic Curve Ephemeral Diffie-Hellman (ECDHE)

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).

Wird der Umgang mit der Autorisierung unterstützt und ist er einfach zu implementieren?

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:

  • Definieren Sie einen Benutzerpool, der als Benutzerverzeichnis dienen wird.
  • Erstellen Sie einen Identitätspool und integrieren Sie ihn mit dem Benutzerpool
  • Erstellen Sie eine IAM-Rolle(n) und definieren Sie, was sie autorisieren soll
  • Erstellen Sie eine Gruppe im Benutzerpool und weisen Sie ihr die IAM-Rolle zu.

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:

  • Implementieren Sie einen eigenen "UserDetailsService", der vom "AccessDecisionManager" verwendet wird, wenn er Autorisierungsentscheidungen trifft. Im "UserDetailsService" sollten wir die "GrantedAuthority"-Objekte für den Benutzer setzen. Hier sollten auch andere Eigenschaften für das Benutzerkonto festgelegt werden (ob das Konto aktiviert, abgelaufen oder gesperrt ist oder ob die Anmeldedaten abgelaufen sind).
  • Legen Sie fest, wie und wann die Autorisierung erforderlich sein wird, indem Sie die Sicherheitsfilterkette durch Einstellen des HttpSecurity-Konfigurators anpassen.
  • Verwenden Sie die @EnableGlobalMethodSecurity-Annotation (auf jeder @Configuration-Instanz), wenn wir annotationsbasierte Sicherheit für die Anwendung von Zugriffsregeln auf Java-Methodenausführungen verwenden wollen.
  • Stellen Sie sicher, dass bei der Erstellung/Registrierung eines Benutzers die entsprechenden Berechtigungen zugewiesen werden.

Die gängigste Implementierung besteht darin, dass wir für jeden Benutzer mehrere Rollen und für jede dieser Rollen mehrere Berechtigungen haben.

Gibt es irgendwelche spezifischen Kompromisse, die gemacht werden müssen?

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.

Es geht nicht nur um den Dienst. Was ist mit den Kosten?

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.

AWS_Cognito_vs_Spring_Security_Our_Weigh_In_2.webp

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

AWS_Cognito_vs_Spring_Security_Our_Weigh_In_3.webp

Wenn wir zum Beispiel ein System mit 60.000 monatlich aktiven Benutzern haben, ergeben sich folgende Berechnungen:

  • 0 SAML- oder OIDC-Verbund-MAUs - 50 kostenlose SAML- oder OIDC-Verbund-MAU-Anfragen pro Monat = -50,00 abrechenbare SAML- oder OIDC-Verbund-MAU-Anfragen
  • Maximal (-50,00 abrechenbare SAML- oder OIDC-Verbund-MAU-Anfragen, mindestens 0 abrechenbare SAML- oder OIDC-Verbund-MAU-Anfragen) = 0 abrechenbare SAML- oder OIDC-Verbund-MAU-Anfragen insgesamt
  • SAML- oder OIDC-Federation-Kosten (monatlich): 0 USD
  • 60.000 MAUs - 50000 kostenlose MAU-Anfragen pro Monat = 10.000,00 abrechenbare MAU-Anfragen
  • Gestaffelter Preis für: 10000.000000 MAUs
  • 10000 MAUs x 0,0055000000 USD = 55,00 USD
  • Gesamtkosten der Stufe = 55,00 USD (Benutzerpool MAUs)
  • Benutzerpool MAU Kosten (monatlich): 55 USD
  • Kosten für erweiterte Sicherheitsfunktionen (monatlich): 0 USD
  • Cognito MAU-Kosten (monatlich): 55,00 USD

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.

Und zum Schluss: Warum Cognito?

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

Martin Ristevski

Buchen Sie eine kostenlose Beratung

Wählen Sie Ihre Branche*

Bitte wählen Sie Ihre Branche*

Wählen Sie Ihren Servicetyp

Bitte wählen Sie Ihren Servicetyp

calendarWann passt es Ihnen am besten für ein kurzes Gespräch

Die mit * gekennzeichneten Felder sind Pflichtfelder

Alle Beiträge anzeigen