AWS Germany – Amazon Web Services in Deutschland

Lambda Funktion URLs sichern mit Amazon Cognito, Amazon Cloudfront und AWS WAF

Original von Madhu Singh und Krupanidhi Jay, übersetzt durch Marco Buss

Lambda-Funktions-URLs sind dedizierte HTTPs-Endpunkte für AWS Lambda-Funktionen. Sie können eine Funktions-URL so konfigurieren, dass sie eine von zwei Arten der Authentifizierung unterstützt: IAM oder NONE. IAM-Authentifizierung bedeutet, dass Sie den Zugriff auf die Funktions-URL (und damit den Zugriff zum Aufrufen der Lambda-Funktion) auf bestimmte AWS-Prinzipale (wie Rollen oder Benutzer) beschränken. Der Authentifizierungstyp NONE bedeutet, dass die Lambda-Funktions-URL keine Authentifizierung hat und für jeden zum Aufrufen der Funktion offen ist.

Dieser Blog beschreibt, wie Lambda-Funktions-URLs mit einem Authentifizierungstyp NONE verwendet und eine benutzerdefinierte Autorisierungslogik als Teil des Funktionscodes implementiert werden kann, um nur Anfragen zuzulassen, die gültige Amazon Cognito-Anmeldedaten beim Aufrufen der Funktion vorlegen. Sie erfahren auch, wie Sie Ihre Lambda-Funktions-URL gegen gängige Sicherheitsbedrohungen wie DDoS mithilfe von AWS WAF und Amazon CloudFront schützen können.

Lambda-Funktions-URLs bieten eine einfachere Möglichkeit, Ihre Funktion über HTTP-Aufrufe aufzurufen. Es ersetzt jedoch nicht das Amazon API Gateway, welches erweiterte Funktionen wie Anfragevalidierung und Drosselung bietet.

Lösungsübersicht

Die Beispiellösung besteht aus vier Kernkomponenten.

1. Eine Lambda-Funktion mit aktivierter Funktions-URL

Im Kern des Beispiels ist eine Lambda-Funktion mit aktivierter Funktions-URL-Funktion mit dem Authentifizierungstyp NONE. Diese Funktion antwortet mit einer Erfolgsmeldung, wenn beim Aufrufen ein gültiger Autorisierungscode übergeben wird. Andernfalls antwortet sie mit einer Fehlermeldung.

2. Amazon Cognito-Benutzerpool

Amazon Cognito-Benutzerpools ermöglichen die Benutzerauthentifizierung auf Websites und in mobilen Apps. Sie können auch öffentlich zugängliche Anmelde– und Registrierungsseiten in Ihren Anwendungen mit der Funktion „Gehostete Benutzeroberfläche“ von Amazon Cognito-Benutzerpools bereitstellen.

In diesem Beispiel wird ein Benutzerpool und die zugehörige Gehostete Benutzeroberfläche verwendet, um die Anmeldung und Registrierung von Benutzern auf der Website zu ermöglichen, die als Einstiegspunkt dient. Diese Lambda-Funktion validiert den Autorisierungscode gegen diesen Amazon Cognito-Benutzerpool.

3. CloudFront-Verteilung mit AWS WAF

CloudFront ist ein Content Delivery Network (CDN)-Dienst, der dabei hilft, Inhalte mit geringer Latenz an Endbenutzer auszuliefern und gleichzeitig die Sicherheit Ihrer Anwendungen zu verbessern.

AWS WAF ist eine Web Application Firewall, die Ihre Webanwendungen oder APIs vor gängigen Web-Exploits und Bots schützt, und AWS Shield ist ein verwalteter Distributed Denial of Service (DDoS)-Schutzdienst, der Anwendungen, die auf AWS laufen, absichert. AWS WAF untersucht die eingehende Anfrage gemäß den konfigurierten Web-Zugriffskontrolllisten (Web ACL)-Regeln.

Das Hinzufügen von CloudFront vor Ihrer Lambda-Funktions-URL hilft, Inhalte näher am Betrachter zu cachen, und die Aktivierung von AWS WAF und AWS Shield trägt dazu bei, die Sicherheit gegen mehrere Arten von Angriffen, einschließlich Netzwerk- und Anwendungsschicht-DDoS-Angriffen, zu erhöhen.

4. Öffentliche Website, die die Lambda-Funktion aufruft

Das Beispiel erstellt auch eine öffentliche Website, die auf React JS basiert und in AWS Amplify gehostet wird. Diese Webseite dient als Einstiegspunkt für die Demo. Diese Website funktioniert sowohl im Authentifizierten- als auch im Gastmodus. Für die Authentifizierung verwendet die Website Amazon Cognito-Benutzerpools Gehostete Benutzeroberfläche.

Lösungsarchitektur

Das folgende Bild zeigt die Architektur des Beispiels und den Informationsfluss für Benutzeranfragen.

Im Anfragefluss:

  1. Der Einstiegspunkt ist die in AWS Amplify gehostete Website. Auf der Homepage werden Sie bei Auswahl von „Sign In“ zur Amazon Cognito gehosteten Benutzeroberfläche für den Benutzerpool weitergeleitet.
  2. Nach erfolgreicher Anmeldung gibt Amazon Cognito den Autorisierungscode zurück, der als Cookie mit dem Namen „code“ gespeichert wird. Der Benutzer wird zurück zur Website weitergeleitet, die eine Schaltfläche „Execute Lamabda“ hat.
  3. Wenn der Benutzer „Execute Lambda“ wählt, wird der Wert aus dem „code“-Cookie im Anfragetext an den CloudFront-Verteilungsendpunkt übermittelt.
  4. Die AWS WAF Web ACL-Regeln sind so konfiguriert, dass sie feststellen, ob die Anfrage von IP-Adressen aus den USA oder Kanada stammt, und ob die Anfrage zum Aufrufen der Lambda-Funktions-URL zugelassen werden soll.
  5. Zulässige Anfragen werden an den CloudFront-Verteilungsendpunkt weitergeleitet.
  6. Amazon CloudFront ist so konfiguriert, dass CORS-Header zugelassen werden und die Lambda-Functions-URL der Ursprung ist. Die Anfrage, die Amazon CloudFront erhält, wird dadurch an die Funktions-URL übergeben.
  7. Dadurch wird die Lambda-Funktion aufgerufen, die der Funktions-URL zugeordnet ist. Diese validiert das Token.
  8. Der Funktionscode führt folgende Schritte aus:
    1. Tauscht den Autorisierungscode im Anfragetext (der als Event-Objekt an die Lambda-Funktion übergeben wird) gegen einen Zugriffstoken unter Verwendung des Token-Endpunkts von Amazon Cognito aus (siehe Dokumentation für weitere Details).
      1. Die Attribute des Amazon Cognito-Benutzerpools wie Benutzerpool-URL, Client-ID und Secret werden aus dem AWS Systems Manager Parameter Store (SSM-Parameter) abgerufen.
      2. Diese Werte werden beim Bereitstellen dieser Ressourcen über das AWS CDK in den SSM-Parametern gespeichert (siehe Abschnitt „Bereitstellung“).
    2. Das Zugriffstoken wird dann auf Authentizität überprüft.
    3. Wenn gültig, gibt die Lambda-Funktion eine Meldung zurück, dass der Benutzer als <Benutzername> authentifiziert wurde und die Ausführung erfolgreich war.
    4. Wenn entweder kein Autorisierungscode vorhanden war, z.B. wenn sich der Benutzer im „Gastmodus“ auf der Website befand, oder der Code ungültig oder abgelaufen ist, gibt die Lambda-Funktion die Meldung zurück, dass der Benutzer nicht autorisiert ist, die Funktion auszuführen.
  9. Die Webseite zeigt die Rückgabenachricht der Lambda-Funktion als Warnung an.

Erste Schritte

Voraussetzungen:

Bevor Sie die Lösung bereitstellen, folgen Sie bitte der README-Datei aus dem GitHub-Repository und nehmen die notwendigen Schritte vor, um die Voraussetzungen zu erfüllen.

Beispiellösung bereitstellen

1. Laden Sie aus dem Code-Verzeichnis die Abhängigkeiten herunter:

$ npm install

2. Starten Sie die Bereitstellung der für die Lösung erforderlichen AWS-Ressourcen:

$ cdk deploy

Hinweis:

  • Geben Sie optional das Argument –profile an, falls erforderlich
  • Die Bereitstellung kann bis zu 15 Minuten dauern

3. Sobald die Bereitstellung abgeschlossen ist, sieht die Ausgabe ähnlich wie folgt aus:

Öffnen Sie die amplifyAppUrl aus der Ausgabe in Ihrem Browser. Dies ist die URL für die Demo-Website. Wenn Sie nicht die Seite „Welcome to Compute Blog“ sehen, wird die Amplify-App noch erstellt und die Website ist noch nicht verfügbar. Probieren Sie es in einigen Minuten erneut. Diese Website funktioniert entweder im authentifizierten oder nicht authentifizierten Zustand.

Den authentifizierten Ablauf testen

1. Um den authentifizierten Ablauf zu testen, wählen Sie „Sign In“.

2. Wählen Sie auf der Anmeldeseite beim ersten Mal „Sign-Up“ und erstellen Sie einen Benutzernamen und ein Passwort.

3. Um vorhandene Benutzername und Passwort zu verwenden, geben Sie diese Anmeldeinformationen ein und wählen Sie „Login“.

4. Nach erfolgreicher Anmeldung oder Registrierung werden Sie zur Webseite mit der Schaltfläche „Execute Lambda“ weitergeleitet.

5. Wählen Sie diese Schaltfläche. In wenigen Sekunden erscheint ein Popup mit dem angemeldeten Benutzer/in und der Meldung, dass die Lambda-Ausführung erfolgreich war.

Den nicht authentifizierten Ablauf testen

1. Um den nicht authentifizierten Ablauf zu testen, wählen Sie auf der Homepage „Continue“.

2. Wählen Sie “ Execute Lambda“. In wenigen Sekunden sehen Sie eine Meldung, dass Sie nicht autorisiert sind, die Lambda-Funktion auszuführen.

Die Geo-Block-Funktion von AWS WAF testen

1. Rufen Sie die Website von einer anderen Region als den USA oder Kanada auf. Wenn Sie sich physisch in den USA oder Kanada befinden, können Sie einen VPN-Dienst verwenden, um eine Verbindung zu einer anderen Region als den USA oder Kanada herzustellen.

2. Wählen Sie die Schaltfläche Execute Lambda“. Im Netzwerkprotokoll des Browsers können Sie sehen, dass der Aufruf zum Aufrufen der Lambda-Funktions-URL mit der Antwort „Forbidden“ blockiert wurde.

3. Um entweder den authentifizierten oder nicht authentifizierten Ablauf erneut zu testen, wählen Sie “ Return to Home Page „, um zur Homepage mit den Schaltflächen „Sign In“ und „Continue“ zurückzukehren.

Aufräumen

Um die bereitgestellten Ressourcen zu löschen, führen Sie den Befehl cdk destroy mit der AWS CDK CLI aus.

Fazit

In diesem Blog haben Sie eine Lambda-Funktion mit aktivierter Funktions-URL mit NONE als Authentifizierungstyp erstellt. Anschließend haben Sie einen benutzerdefinierten Authentifizierungsmechanismus im Rahmen Ihres Lambda-Funktionscodes implementiert. Sie haben außerdem die Sicherheit Ihrer Lambda-Funktions-URL erhöht, indem Sie sie als Ursprung für die CloudFront-Verteilung festgelegt und Geo- und IP-Einschränkungsregeln von AWS WAF zum Schutz gegen gängige Web-Bedrohungen wie DDoS verwendet haben.

Für weitere serverlose Lernressourcen besuchen Sie Serverless Land.

Über die Autoren

Marcia Villalba ist Principal Developer Advocate für Amazon Web Services. Sie verfügt über 20 Jahre Erfahrung in der Softwarebranche und hat Erfahrung im Aufbau und Skalieren von Anwendungen. Ihre Leidenschaft liegt darin, Systeme zu entwerfen, die die Vorteile der Cloud voll ausschöpfen können und die DevOps-Kultur fördern.
Krupanidhi Jay ist Enterprise Solutions Architect bei AWS mit Sitz in Boston. Er ist ein erfahrener Architekt mit über 20 Jahren Erfahrung und unterstützt Kunden bei der digitalen Transformation sowie bei der Bereitstellung nahtloser digitaler Benutzererlebnisse. Er arbeitet gerne mit Kunden zusammen, um ihnen beim Aufbau skalierbarer und kosteneffizienter Lösungen in AWS zu helfen. In seiner Freizeit verbringt Jay gerne Zeit mit seiner Familie und reist gerne.