Sicherer API-Zugriff mit NGINX und Azure Active Directory

NGINX | 06. Oktober 2022

APIs spielen eine entscheidende Rolle bei der Vernetzung von Anwendungen, sind jedoch auch anfällig für Angriffe. Früher gab es bei monolithischen Anwendungen nur einen einzigen Zugangspunkt, der abgesichert werden musste. In Microservices-Architekturen besteht eine einzelne Anwendung häufig aus vielen Microservices, die über APIs miteinander verbunden sind, wobei jede dieser APIs Hunderte von Endpunkten haben kann. Dadurch entsteht eine enorme potenzielle Angriffsfläche für APIs, da jede neue API einen weiteren Zugangspunkt innerhalb Ihres Sicherheitsperimeters schafft.

Es gibt viele Strategien zum Schutz Ihrer APIs. Eine der grundlegendsten ist die Zugriffskontrolle. Einfach ausgedrückt müssen Sie die Identität des Benutzers überprüfen (Authentifizierung bzw. AuthN) und sicherstellen, dass er auf bestimmte Ressourcen zugreifen darf (Autorisierung bzw. AuthZ). Die Implementierung von OpenID Connect (OIDC) ist einer der gängigsten Ansätze zur Zugriffskontrolle bei APIs. Mit dem API Connectivity Manager, einem Bestandteil der F5 NGINX Management Suite, können Sie dies innerhalb weniger Minuten einrichten.

In diesem Tutorial erfahren Sie, wie Sie den Autorisierungsteil des OIDC-Workflows durchführen, indem Sie die Validierung von JSON Web Tokens (JWT) mit API Connectivity Manager und Azure Active Directory (Azure AD) einrichten.

Was ist OpenID Connect?

OpenID Connect (OIDC) ist ein Identitätsprotokoll, das auf dem OAuth 2.0-Protokoll aufbaut. Mit OIDC können Clients die Identität des Endbenutzers oder Geräts überprüfen. Dies ist ein Teil der Zugriffskontrolle, die sowohl Authentifizierung als auch Autorisierung umfasst:

  • Authentifizierung überprüft, ob ein Benutzer oder Gerät tatsächlich die angegebene Identität besitzt
  • Autorisierung legt fest, worauf ein verifizierter Benutzer oder ein verifiziertes Gerät zugreifen kann

Es gibt viele verschiedene Implementierungen von OIDC, darunter Azure AD, das Sie in diesem Tutorial verwenden werden. Alternativ können Sie mit API Connectivity Manager auch andere OIDC-Lösungen verwenden, beispielsweise F5 BIG-IP Access Policy Manager (APM), Okta, Auth0, Ping Identity und weitere.

Was Sie für den Einstieg benötigen

Stellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllen:

Sie können sich für eine 30-tägige kostenlose Testversion der NGINX Management Suite registrieren, wenn Sie Zugriff auf den API Connectivity Manager benötigen.

Eine Azure AD-Anwendung erstellen

Öffnen Sie einen Browser und melden Sie sich bei Ihrem Azure-Portal an.

Klicken Sie im Menü auf der linken Seite auf „App-Registrierungen“.

Startseite des Azure-AD-Portals

Abbildung 1: Startseite des Azure-AD-Portals

Klicken Sie auf die Schaltfläche „Neue Registrierung“.

Azure AD-App-Registrierung

Abbildung 2: Azure AD-App-Registrierung

Um eine neue Anwendung zu erstellen, geben Sie einen Namen, einen Umleitungs-URI ein und klicken Sie auf die Schaltfläche „Registrieren“. In dieser Demo verwenden Sie Postman, daher nutzen Sie den Postman-OIDC-Umleitungs-URI.

Neue Azure AD-App erstellen

Abbildung 3: Erstellen einer neuen Azure AD-App

Nachdem Ihre App nun erstellt wurde, müssen Sie OAuth-Bereiche erstellen, um den Zugriff auf die API zu ermöglichen. Klicken Sie im Menü auf der linken Seite auf den Link „Eine API verfügbar machen“.

Eine API verfügbar machen

Abbildung 4: Eine API bereitstellen

Klicken Sie auf „Bereich hinzufügen“.

Bereich hinzufügen

Abbildung 5: Einen Bereich hinzufügen

Übernehmen Sie den standardmäßigen Anwendungs-ID-URI, oder erstellen Sie einen eigenen, und klicken Sie auf die Schaltfläche „Speichern und fortfahren“. Wenn Sie einen eigenen Anwendungs-ID-URI erstellen möchten, müssen Sie die gewünschte Domäne bei Azure AD registrieren.

Anwendungs-ID-URL

Abbildung 6: Anwendungs-ID-URL

Für diese Demo basiert Ihr Bereich auf einem Microsoft-Beispiel. Füllen Sie das Formular mit den folgenden Informationen aus und klicken Sie anschließend auf die Schaltfläche „Bereich hinzufügen“:

Bereichsname: Employees.Read.All
Wer kann zustimmen?: Administratoren und Benutzer
Anzeigename für die Administratoreinwilligung: Schreibgeschützter Zugriff auf Mitarbeiterdatensätze
Beschreibung der Administratoreinwilligung: Schreibgeschützten Zugriff auf alle Mitarbeiterdaten zulassen.
Anzeigename für die Benutzereinwilligung: Schreibgeschützter Zugriff auf Ihre Mitarbeiterdatensätze
Beschreibung der Benutzereinwilligung: Schreibgeschützten Zugriff auf Ihre Mitarbeiterdaten zulassen.

Bereich hinzufügen

Abbildung 7: Bereich hinzufügen

Als Nächstes müssen Sie die Clientanwendung autorisieren. Rufen Sie dazu die Client-ID ab. Klicken Sie im Menü auf der linken Seite auf den Link „Übersicht“ und kopieren Sie die „Anwendungs-ID (Client)“.

Anwendungsclient-ID

Abbildung 8: Anwendungs-Client-ID

Klicken Sie erneut auf den Link „API verfügbar machen“ und anschließend auf die Schaltfläche „Clientanwendung hinzufügen“.

Clientanwendung hinzufügen

Abbildung 9: Client-Anwendung hinzufügen

Fügen Sie die Anwendungsclient-ID in das Feld „Client-ID“ ein und aktivieren Sie das Kontrollkästchen neben Ihrer Anwendungs-ID-URI. Klicken Sie anschließend auf die Schaltfläche „Anwendung hinzufügen“.

Clientanwendung hinzufügen

Abbildung 10: Client-Anwendung hinzufügen

Als Nächstes verwenden Sie für diese Demo einen Autorisierungscode mit dem Autorisierungscodeflow. Daher wird für Postman ein geheimer Clientschlüssel benötigt. Klicken Sie im Menü auf der linken Seite auf den Link Zertifikate und Geheimnisse und anschließend auf die Schaltfläche Neuer geheimer Clientschlüssel.

Neuer geheimer Clientschlüssel

Abbildung 11: Neues Client-Geheimnis

Benennen Sie Ihr Geheimnis und behalten Sie die standardmäßige Ablaufzeit bei.

Geheimnisname

Abbildung 12: Geheimer Name

Kopieren Sie als Nächstes Ihren geheimen Clientschlüssel und speichern Sie ihn in einem Passwort-Tresor, damit Sie ihn später verwenden können.

Client-Secret

Abbildung 13: Client Secret

JWT-Assertion im API Connectivity Manager konfigurieren

Nachdem Sie Ihre Azure AD-Anwendung konfiguriert haben, können Sie den API-Gateway-Cluster im API Connectivity Manager so einrichten, dass er für den von Ihnen definierten Dienst eine JSON Web Token Assertion durchführt. Für diesen Schritt müssen Sie den URI für die JSON Web Key (JWK) Sets Ihres Azure AD-Mandanten ermitteln.

Sie können Ihren JWKS-URI über den Well-Known-Endpunkt Ihres Azure AD-Mandanten abrufen:
https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration

Diese Seite stellt eine JSON-Nutzlast bereit, die den Schlüssel jwks_uri enthält. Kopieren Sie den zugehörigen Wert.

Bekannter Endpunkt des Azure AD-Mandanten

Abbildung 14: Well-Known-Endpunkt des Azure-AD-Mandanten

Nachdem Sie nun über Ihre JWKS-URI verfügen, öffnen Sie die API Connectivity Manager-Konsole und navigieren Sie zur Konfiguration Ihres Service-Proxys. Klicken Sie auf „Richtlinie hinzufügen“ für die Richtlinie „JSON-Web-Token-Assertion“.

Richtlinien für den Gateway-Service-Proxy

Abbildung 15: Proxy-Richtlinien für den Gateway-Dienst

Fügen Sie als Nächstes den JKWS-URI Ihres Azure AD-Mandanten in das Feld „URI-Speicherort“ ein und klicken Sie anschließend auf die Schaltfläche „Hinzufügen“.

Richtlinie für JSON-Web-Token-Assertions

Abbildung 16: JSON-Web-Token-Assertion-Richtlinie

Klicken Sie auf die Schaltfläche „Speichern und veröffentlichen“, um diese Richtlinie in Ihrem API-Gateway-Cluster bereitzustellen.

Service-Gateway-Richtlinie

Abbildung 17: Service-Gateway-Richtlinie

Das war's! Ihre API-Connectivity-Manager-Instanz ist jetzt so konfiguriert, dass sie eine JWT-Assertion auf dem konfigurierten Service-Gateway durchführt.

Testen mit Postman

Jetzt ist es an der Zeit, Ihre Konfiguration zu testen und sicherzustellen, dass sie sich wie erwartet verhält. Zunächst benötigen Sie einige Angaben aus Ihrer Azure AD-Anwendung:

  • Geheimer Clientschlüssel der Anwendung (diesen haben Sie zuvor gespeichert)
  • OAuth-Berechtigungsumfang
  • OAuth-Autorisierungsendpunkt
  • OAuth-Token-Endpunkt

Um den OAuth-Bereich abzurufen, öffnen Sie Ihr Azure-Portal und navigieren Sie zurück zur Registrierungsseite Ihrer App. Klicken Sie anschließend im Menü auf der linken Seite auf den Link „Eine API verfügbar machen“ und dann auf das Symbol „Kopieren“ für Ihren Bereich. Speichern Sie diesen Wert, damit Sie ihn in wenigen Minuten verwenden können.

API-Bereiche

Abbildung 18: API-Berechtigungsbereiche

Um die OAuth-Autorisierungs- und Token-Endpunkte abzurufen, klicken Sie im Menü auf der linken Seite auf den Link „Übersicht“ und anschließend auf die Schaltfläche „Endpunkte“. Kopieren Sie danach die URIs der Autorisierungs- und Token-Endpunkte.

Azure AD-Anwendungsendpunkte

Abbildung 19: Azure AD-Anwendungsendpunkte

Endpunkt-URLs der Azure AD-Anwendung

Abbildung 20: Endpunkt-URLs der Azure-AD-Anwendung

Öffnen Sie Postman und klicken Sie auf das Menü „Environments“. Klicken Sie anschließend auf den Link „Create Environment“.

Postman-Umgebung erstellen

Abbildung 21: Postman-Umgebung erstellen

Benennen Sie Ihre Umgebung und fügen Sie sechs Variablen mit den in den vorherigen Schritten gespeicherten Werten in die Spalten „Initial Value“ und „Current Value“ ein. Klicken Sie anschließend auf die Schaltfläche „Save“.

  • client_id: Client-ID der Azure AD-Anwendung
  • client_secret:Clientschlüssel der Azure AD-Anwendung
  • auth_url: OAuth-Autorisierungs-URL des Azure AD-Mandanten
  • token_url: OAuth-Token-URL des Azure-AD-Mandanten
  • tenant_id: Azure AD-Verzeichnis-ID (Mandanten-ID)
  • scope: API-Bereich der Azure AD-Anwendung mit Anwendungs-ID-URL

Postman-Umgebungsvariablen

Abbildung 22: Postman-Umgebungsvariablen

Öffnen Sie in Postman eine neue Registerkarte und führen Sie die folgenden Schritte aus:

  • Ändern Sie oben rechts Ihre Umgebung in „ACM“.
  • Fügen Sie Ihre API-URL in die Adressleiste ein
  • Klicken Sie auf die Registerkarte „Authentifizierung“.
  • Ändern Sie den Typ in OAuth 2.0
  • Scrollen Sie in der Authentifizierungskonfiguration nach unten und legen Sie die folgenden Variablen fest:
  • Authentifizierungs-URL: {{auth_url}}
  • Zugriffstoken-URL: {{token_url}}
  • Client-ID: {{client_id}}
  • Client-Geheimnis: {{client_secret}}
  • Klicken Sie auf die Schaltfläche „Neues Zugriffstoken abrufen“.

Postman-Anfrage

Abbildung 23: Postman-Anfrage

Postman-Authentifizierungskonfiguration

Abbildung 24: Postman-Authentifizierungskonfiguration

Ein Browserfenster wird geöffnet und Sie werden aufgefordert, sich mit Ihren Azure AD-Anmeldeinformationen anzumelden. Nach erfolgreicher Authentifizierung werden Sie zurück zu Postman weitergeleitet und das folgende Fenster wird angezeigt. Klicken Sie auf die Schaltfläche „Token verwenden“.

Postman: Token verwenden

Abbildung 25: Token in Postman verwenden

Nachdem Sie nun über Ihr OAuth-Zugriffstoken verfügen, können Sie endlich Ihren API-Aufruf durchführen. Klicken Sie auf die Schaltfläche „Speichern“ und anschließend auf die Schaltfläche „Senden“.

Wenn alles korrekt konfiguriert ist, sollten Sie eine „200 OK“-Antwort erhalten.

Erfolgreiche Anfrage in Postman

Abbildung 26: Erfolgreiche Postman-Anfrage

Fazit

Ihre APIs werden nun durch den API Connectivity Manager mithilfe von Azure AD OAuth-Zugriffstoken geschützt. Als Nächstes könnten Sie zusätzliche OAuth-Bereiche hinzufügen und den API-Gateway-Cluster im API Connectivity Manager so konfigurieren, dass diese Bereiche an Ihre geschützten APIs weitergegeben werden – aber das ist ein Thema für einen anderen Beitrag!

Legen Sie noch heute los

Starten Sie eine 30-tägige kostenlose Testversion der NGINX Management Suite, die den API Connectivity Manager und den Instance Manager umfasst.

Eine Version dieses Beitrags erschien zuerst auf codygreen.com. Sie wurde redaktionell bearbeitet und wird hier mit Genehmigung des Autors erneut veröffentlicht.


Teilen
Schlagwörter: F5 NGINX, Tech

Ähnliche Blogbeiträge

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln
NGINX | 23.08.2022

Die Zukunft von NGINX: Zurück zu unseren Open-Source-Wurzeln

Beim NGINX Sprint 2022 besinnen wir uns auf unsere Open-Source-Wurzeln. Erfahren Sie mehr über die Initiativen, die wir im kommenden Jahr verfolgen, und teilen Sie uns mit, was Sie sich wünschen.

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen
NGINX | 08.09.2021

Ein Leitfaden zur Auswahl eines Ingress-Controllers, Teil 1: Ermitteln Sie Ihre Anforderungen

Ein Ingress-Controller kann eines der leistungsstärksten Tools in Ihrem Kubernetes-Stack sein. Erfahren Sie, wie Sie Ihre Ingress-Anforderungen ermitteln, um die beste Option auszuwählen.

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet
NGINX | 16.08.2021

Bereitstellung des NGINX Ingress Controllers auf Amazon EKS: So haben wir getestet

Wir haben kürzlich den Lösungsleitfaden zum NGINX Ingress Controller um Empfehlungen zur Dimensionierung für Amazon Elastic Kubernetes Service (EKS) ergänzt. In diesem Blogbeitrag erläutern wir, wie wir diese Empfehlungen erarbeitet haben, und stellen Ihnen alle Informationen zur Verfügung, die Sie benötigen, um selbst ähnliche Tests durchzuführen.

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77
NGINX | 12.12.2018

Protokollierung des Datenverkehrs zwischen NGINX und Upstream-Servern bei CDN77

Bei der Fehlersuche bei Datenverkehrsproblemen zwischen NGINX und Upstream-Servern konnte CDN77 die benötigten Daten nur aus dem Fehlerprotokoll mit aktivierter Debug-Ausgabe beziehen, was die Leistung beeinträchtigt und riesige Dateien erzeugt. Daher entwickelte das Team ein neues benutzerdefiniertes Modul, das ausschließlich die benötigten Daten protokolliert.

Ankündigung von NGINX Plus R16
NGINX | 05.09.2018

Ankündigung von NGINX Plus R16

NGINX Plus R16 ist eine einheitliche, elastische Ingress- und Egress-Schicht für Anwendungen, die die Funktionen eines Load Balancers, API-Gateways und einer WAF vereint und neue Features wie clusterfähige Ratenbegrenzung, Schlüssel-Wert-Speicher, „Random with Two Choices“, verbessertes UDP-Load-Balancing und vieles mehr bietet.

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing
NGINX | 13.10.2016

5 Gründe für den Umstieg auf softwarebasiertes Load Balancing

Entdecken Sie fünf Gründe für den Wechsel zu einem softwarebasierten Load Balancer wie NGINX Plus, darunter Kosteneinsparungen, die Einführung von DevOps und eine einheitliche Lösung für alle Umgebungen.