BLOG | NGINX

Konfigurieren Sie NGINX Plus für SAML SSO mit der Microsoft Entra-ID

Akash Ananthanarayanan Miniaturansicht
Akash Ananthanarayanan
Veröffentlicht am 31. Oktober 2023

Um Sicherheit zu erhöhen und das Nutzererlebnis zu verbessern, unterstützt F5 NGINX Plus (R29+) jetzt Security Assertion Markup Language (SAML). Als etabliertes Protokoll ermöglicht SAML Single Sign-On (SSO) für Webanwendungen. Es lässt einen Identitätsanbieter (IdP) Nutzer für den Zugriff auf Ressourcen authentifizieren und gibt die Daten zur Autorisierung an einen Dienstanbieter (SP) weiter.

In diesem Blogbeitrag erläutern wir Schritt für Schritt, wie Sie NGINX mit Microsoft Entra ID , früher bekannt als Azure Active Directory (Azure AD), mithilfe einer Webanwendung integrieren, die SAML nicht nativ unterstützt. Wir erläutern auch, wie SSO für die Anwendung implementiert und in das Microsoft Entra ID-Ökosystem integriert wird. Indem Sie dem Tutorial folgen, erfahren Sie außerdem, wie NGINX Ansprüche aus einer SAML-Assertion (einschließlich UPN, Vorname, Nachname und Gruppenmitgliedschaften) extrahieren und diese dann über HTTP-Header an die Anwendung übergeben kann.

Das Tutorial umfasst drei Schritte:

  1. Konfigurieren von Microsoft Entra ID als IdP
  2. Konfigurieren der SAML-Einstellungen und NGINX Plus als Reverse-Proxy
  3. Testen der Konfiguration

Zum Abschließen dieses Tutorials benötigen Sie:

  • NGINX Plus (R29+), das Sie als kostenlose 30-Tage-Testversion erhalten können
  • Ein kostenloses oder Enterprise-Microsoft Entra ID-Konto
  • Ein gültiges SSL/TLS-Zertifikat, das auf dem NGINX Plus-Server installiert ist (dieses Tutorial verwendet dev.sports.com.crt und dev.sports.com.key )
  • Um die SAML-Assertionen zu überprüfen, was durch Herunterladen des öffentlichen Zertifikats demonginx.cer vom IdP erfolgen kann

Notiz : Dieses Tutorial gilt nicht für NGINX Open Source-Bereitstellungen, da der Schlüssel-Wert-Speicher exklusiv für NGINX Plus ist.

Verwenden von NGINX Plus als SAML-Dienstanbieter

In diesem Setup fungiert NGINX Plus als SAML SP und kann an einer SSO-Implementierung mit einem SAML IdP teilnehmen, der indirekt über den User Agent mit NGINX Plus kommuniziert.

Das folgende Diagramm veranschaulicht den SSO-Prozessablauf mit SP-Initiierung und POST-Bindungen für Anforderung und Antwort. Es ist wichtig, noch einmal darauf hinzuweisen, dass dieser Kommunikationskanal nicht direkt ist und über den User Agent verwaltet wird.

Abbildung 1: SAML SP-initiiertes SSO mit POST-Bindungen für AuthnRequest und Response

Schritt 1: Konfigurieren Sie Microsoft Entra ID als Identitätsanbieter

Um auf Ihr Microsoft Entra ID-Verwaltungsportal zuzugreifen, melden Sie sich an und navigieren Sie zum linken Bereich. Wählen Sie „Microsoft Entra ID“ und klicken Sie dann auf den Titel des Verzeichnisses, für das eine SSO-Konfiguration erforderlich ist. Wählen Sie nach der Auswahl „Unternehmensanwendungen“ aus.


Abbildung 2: Auswählen von Enterprise-Anwendungen im Verwaltungsportal

Um eine Anwendung zu erstellen, klicken Sie oben im Portal auf die Schaltfläche Neue Anwendung . In diesem Beispiel haben wir eine Anwendung namens demonginx erstellt.

Abbildung 3: Erstellen einer neuen Anwendung in Microsoft Entra ID

Nachdem Sie zur neu erstellten Anwendung Übersicht weitergeleitet wurden, gehen Sie über das linke Menü zu Erste Schritte und klicken Sie unter Verwalten auf Einmaliges Anmelden . Wählen Sie dann SAML als Single Sign-On-Methode aus.

Abbildung 4: Verwenden des SSO-Abschnitts zum Starten der SAML-Konfiguration

Um SSO in Ihrer Unternehmensanwendung einzurichten, müssen Sie NGINX Plus als SP innerhalb von Microsoft Entra ID registrieren. Klicken Sie dazu auf das Bleistiftsymbol neben „Bearbeiten“ in der grundlegenden SAML-Konfiguration , wie in Abbildung 5 dargestellt.

Fügen Sie die folgenden Werte hinzu und klicken Sie dann auf Speichern :

  • Kennung (Entitäts-ID) – https://dev.sports.com
  • Antwort-URL (Assertion Consumer Service-URL) – https://dev.sports.com/saml/acs
  • Anmelde-URL : https://dev.sports.com
  • Abmelde-URL (optional) : https://dev.sports.com/saml/sls

Die Verwendung von Verifizierungszertifikaten ist optional. Beim Aktivieren dieser Einstellung müssen zwei Konfigurationsoptionen in NGINX berücksichtigt werden:

  1. Um die Signatur mit einem öffentlichen Schlüssel zu verifizieren, müssen Sie $saml_sp_sign_authn auf true setzen. Dadurch wird der SP angewiesen, die an den IdP gesendete AuthnRequest zu signieren.
  2. Geben Sie den Pfad zum privaten Schlüssel an, der für diese Signatur verwendet wird, indem Sie $saml_sp_signing_key konfigurieren. Denken Sie daran, das entsprechende öffentliche Schlüsselzertifikat zur Signaturüberprüfung auf die Microsoft Entra ID hochzuladen.

Notiz : In dieser Demo wurden Attribute und Ansprüche geändert und neue SAML-Attribute hinzugefügt. Diese SAML-Attribute werden vom IdP gesendet. Stellen Sie sicher, dass Ihre NGINX-Konfiguration so eingerichtet ist, dass diese Attribute ordnungsgemäß empfangen und verarbeitet werden. Sie können die zugehörigen Einstellungen im NGINX-GitHub-Repository überprüfen und anpassen.

Laden Sie das IdP -Zertifikat (Raw) von Microsoft Entra ID herunter und speichern Sie es in Ihrer NGINX Plus-Instanz.

Abbildung 5: Herunterladen des IdP-Zertifikats (Raw) von Microsoft Entra ID

Abbildung 6: Hinzufügen eines neuen Benutzers oder einer neuen Gruppe

In Microsoft Entra ID können Sie Zugriff auf Ihre SSO-fähigen Unternehmensanwendungen gewähren, indem Sie Benutzer und Gruppen hinzufügen oder zuweisen.

Klicken Sie im linken Menü auf „Benutzer und Gruppen“ und dann auf die obere Schaltfläche „Benutzer/Gruppe hinzufügen“ .

Schritt 2: Konfigurieren Sie SAML-Einstellungen und NGINX Plus als Reverse-Proxy

Stellen Sie sicher, dass Sie über die erforderlichen Zertifikate verfügen, bevor Sie Dateien in Ihrem NGINX Plus SP konfigurieren:

  • Zertifikate zum Beenden der TLS-Sitzung ( dev.sports.com.crt und dev.sports.com.key )
  • Von Microsoft Entra ID heruntergeladenes Zertifikat zur IdP-Signaturüberprüfung ( demonginx.cer )

Notiz : Die Zertifikate müssen im SPKI-Format vorliegen.

Laden Sie zum Starten dieses Schritts das IdP-Zertifikat von Microsoft Entra ID zur Signaturüberprüfung herunter. Konvertieren Sie dann PEM in das DER-Format:

openssl x509 -in demonginx.cer -outform DER -out demonginx.der

Falls Sie SAML SP-Assertionen überprüfen möchten, wird empfohlen, andere öffentliche/private Schlüssel zu verwenden als die, die für die TLS-Terminierung verwendet werden.

Extrahieren Sie das öffentliche Schlüsselzertifikat im SPKI-Format:

openssl x509 -inform DER -in demonginx.der -pubkey -noout > demonginx.spki

Bearbeiten Sie die Datei frontend.conf, um diese Elemente zu aktualisieren:

  • ssl_certificate – Update, um den TLS-Zertifikatspfad einzuschließen.
  • ssl_certificate_key – Update, um den privaten TLS-Schlüsselpfad einzuschließen.

Bei der Produktionsbereitstellung können Sie je nach Geschäftsanforderung unterschiedliche Back-End-Ziele verwenden. In diesem Beispiel liefert das Backend eine angepasste Antwort:

„Willkommen auf der Bewerbungsseite\n Meine Objekt-ID ist $http_objectid\n Meine E-Mail ist $http_mail\n“;

Wir haben die Attribute und Ansprüche in Microsoft Entra ID geändert, indem wir neue Ansprüche für die E-Mail und Objekt-ID des Benutzers hinzugefügt haben. Diese Aktualisierungen ermöglichen Ihnen eine persönlichere und maßgeschneiderte Antwort auf Ihre Bewerbung, was zu einem verbesserten Benutzererlebnis führt.

Abbildung 7: Geänderte Attribute und Ansprüche in Microsoft Entra ID

Der nächste Schritt besteht darin, NGINX zu konfigurieren, das den Datenverkehr an die Backend-Anwendung weiterleitet. In dieser Demo ist die SAML-Backend-Anwendung öffentlich unter https://dev.sports.com verfügbar.

Bearbeiten Sie Ihre Datei frontend.conf :

# This is file frontend.conf 
# This is the backend application we are protecting with SAML SSO 
upstream my_backend { 
    zone my_backend 64k; 
    server dev.sports.com; 
} 

# Custom log format to include the 'NameID' subject in the REMOTE_USER field 
log_format saml_sso '$remote_addr - $saml_name_id [$time_local] "$request" "$host" ' 
                    '$status $body_bytes_sent "$http_referer" ' 
                    '"$http_user_agent" "$http_x_forwarded_for"'; 

# The frontend server - reverse proxy with SAML SSO authentication 
# 
server { 
    # Functional locations implementing SAML SSO support 
    include conf.d/saml_sp.server_conf; 
 

    # Reduce severity level as required 
    error_log /var/log/nginx/error.log debug; 
    listen 443 ssl; 
    ssl_certificate     /home/ubuntu/dev.sports.com.crt; 
    ssl_certificate_key  /home/ubuntu/dev.sports.com.key; 
    ssl_session_cache shared:SSL:5m; 
 

    location / { 
        # When a user is not authenticated (i.e., the "saml_access_granted." 
        # variable is not set to "1"), an HTTP 401 Unauthorized error is 
        # returned, which is handled by the @do_samlsp_flow named location. 
        error_page 401 = @do_samlsp_flow; 

        if ($saml_access_granted != "1") { 
            return 401; 
        } 

        # Successfully authenticated users are proxied to the backend, 
        # with the NameID attribute passed as an HTTP header        
        proxy_set_header mail $saml_attrib_mail;  # Microsoft Entra ID's user.mail 
        proxy_set_header objectid $saml_attrib_objectid; # Microsoft Entra ID's objectid 
        access_log /var/log/nginx/access.log saml_sso; 
        proxy_pass http://my_backend; 
        proxy_set_header Host dev.sports.com; 
        return 200 "Welcome to Application page\n My objectid is $http_objectid\n My email is $http_mail\n"; 
        default_type text/plain; 

   } 
} 
# vim: syntax=nginx         

Damit die Attribute saml_attrib_mail und saml_attrib_objectid in NGINX-Konfigurationen berücksichtigt werden, aktualisieren Sie den Schlüssel-Wert-Speicherteil von saml_sp_configuration.conf wie folgt:

keyval_zone    zone=saml_attrib_mail:1M                state=/var/lib/nginx/state/saml_attrib_email.json   timeout=1h; 
keyval   $cookie_auth_token $saml_attrib_mail    zone=saml_attrib_mail; 

 keyval_zone zone=saml_attrib_objectid:1M            state=/var/lib/nginx/state/saml_attrib_objectid.json   timeout=1h; 
keyval   $cookie_auth_token $saml_attrib_objectid   zone=saml_attrib_objectid; 

Konfigurieren Sie als Nächstes die SAML SSO-Konfigurationsdatei. Diese Datei enthält die primären Konfigurationen für SP und IdP. Um es entsprechend Ihrem spezifischen SP- und IdP-Setup anzupassen, müssen Sie die mehreren in der Datei enthaltenen Map{}-Blöcke anpassen.

Diese Tabelle enthält Beschreibungen der Variablen in saml_sp_configuration.conf :

VariableBeschreibung
saml_sp_entity_idDie von den Benutzern verwendete URL zum Zugriff auf die Anwendung.
saml_sp_acs_urlDie URL, die der Dienstanbieter nutzt, um die SAML-Antwort zu empfangen, die Benutzeridentität zu extrahieren und den Zugriff auf die angeforderte Ressource entsprechend den Angaben zu erlauben oder abzulehnen.
saml_sp_sign_authnGibt an, ob die SAML-Anforderung vom SP an den IdP signiert werden soll oder nicht. Die Signatur erfolgt mit dem SP-Signaturschlüssel und Sie müssen das zugehörige Zertifikat zum IdP hochladen, um die Signatur zu überprüfen.
saml_sp_signing_keyDer Signaturschlüssel, der zum Signieren der SAML-Anforderung vom SP an den IdP verwendet wird. Denken Sie daran, das zugehörige Zertifikat zum IdP hochzuladen, um die Signatur zu verifizieren.
saml_idp_entity_idDie Identität, die zum Definieren des IdP verwendet wird.
saml_idp_sso_urlDer IdP-Endpunkt, an den der SP die SAML-Assertion-Anforderung sendet, um die Authentifizierungsanforderung zu initiieren.
SAML_IDP_VerifizierungszertifikatDie Zertifizierung wird zum Überprüfen signierter SAML-Assertionen verwendet, die vom IdP empfangen wurden. Das Zertifikat wird vom IdP bereitgestellt und muss im SPKI-Format vorliegen.
saml_sp_slo_urlDer SP-Endpunkt, an den der IdP die SAML-Abmeldeanforderung (beim Einleiten eines Abmeldevorgangs) oder die Logout-Antwort (beim Bestätigen der Abmeldung) sendet.
saml_sp_sign_sloGibt an, ob das Logout-SAML vom SP signiert werden soll oder nicht.
saml_idp_slo_urlDer IdP-Endpunkt, an den der SP die LogoutRequest (beim Einleiten eines Abmeldevorgangs) oder die LogoutResponse (beim Bestätigen der Abmeldung) sendet.
saml_sp_want_signed_sloGibt an, ob der SAML-SP möchte, dass die SAML-Abmeldeantwort oder -Anforderung vom IdP signiert wird oder nicht.

Der folgende Code zeigt die bearbeiteten Werte nur für diesen Anwendungsfall in saml_sp_configuration.conf.

Notiz : Stellen Sie sicher, dass die restlichen Teile der Konfigurationsdatei weiterhin in der Datei enthalten sind (z. B. die Schlüssel-Wert-Speicher). Stellen Sie außerdem sicher, dass Sie die Variablen in der Datei saml_sp_configuration.conf basierend auf Ihrer Bereitstellung richtig anpassen.

 # SAML SSO configuration 

map $host $saml_sp_entity_id { 
    # Unique identifier that identifies the SP to the IdP. 
    # Must be URL or URN. 
    default "https://dev.sports.com"; 
} 

map $host $saml_sp_acs_url { 
    # The ACS URL, an endpoint on the SP where the IdP  
    # will redirect to with its authentication response. 
    # Must match the ACS location defined in the "saml_sp.serer_conf" file. 
    default "https://dev.sports.com/saml/acs"; 
} 

map $host $saml_sp_request_binding { 
    # Refers to the method by which an authentication request is sent from 
    # the SP to an IdP during the Single Sign-On (SSO) process. 
    # Only HTTP-POST or HTTP-Redirect methods are allowed. 
    default 'HTTP-POST'; 
} 

map $host $saml_sp_sign_authn { 
    # Whether the SP should sign the AuthnRequest sent to the IdP. 
    default "false"; 
} 

map $host $saml_sp_decryption_key { 
    # Specifies the private key that the SP uses to decrypt encrypted assertion 
    # or NameID from the IdP. 
    default ""; 
} 

map $host $saml_sp_force_authn { 
    # Whether the SP should force re-authentication of the user by the IdP. 
    default "false"; 
} 

map $host $saml_sp_nameid_format { 
    # Indicates the desired format of the name identifier in the SAML assertion 
    # generated by the IdP. Check section 8.3 of the SAML 2.0 Core specification 
    # (http://docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdf) 
    # for the list of allowed NameID Formats. 
    default "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"; 
} 

map $host $saml_sp_relay_state { 
    # Relative or absolute URL the SP should redirect to 
    # after successful sign on. 
    default ""; 
} 

map $host $saml_sp_want_signed_response { 
    # Whether the SP wants the SAML Response from the IdP 
    # to be digitally signed. 
    default "false"; 
} 

map $host $saml_sp_want_signed_assertion { 
    # Whether the SP wants the SAML Assertion from the IdP 
    # to be digitally signed. 
    default "true"; 
} 

map $host $saml_sp_want_encrypted_assertion { 
    # Whether the SP wants the SAML Assertion from the IdP 
    # to be encrypted. 
    default "false"; 
} 

map $host $saml_idp_entity_id { 
    # Unique identifier that identifies the IdP to the SP. 
    # Must be URL or URN. 
    default "https://sts.windows.net/8807dced-9637-4205-a520-423077750c60/"; 
} 

map $host $saml_idp_sso_url { 
    # IdP endpoint that the SP will send the SAML AuthnRequest to initiate 
    # an authentication process. 
    default "https://login.microsoftonline.com/8807dced-9637-4205-a520-423077750c60/saml2"; 
} 

map $host $saml_idp_verification_certificate { 
    # Certificate file that will be used to verify the digital signature 
    # on the SAML Response, LogoutRequest or LogoutResponse received from IdP. 
    # Must be public key in PKCS#1 format. See documentation on how to convert 
    # X.509 PEM to DER format. 
    default "/etc/nginx/conf.d/demonginx.spki"; 
} 

######### Single Logout (SLO) ######### 

map $host $saml_sp_slo_url { 
    # SP endpoint that the IdP will send the SAML LogoutRequest to initiate 
    # a logout process or LogoutResponse to confirm the logout. 
    default "https://dev.sports.com/saml/sls"; 
} 

map $host $saml_sp_slo_binding { 
    # Refers to the method by which a LogoutRequest or LogoutResponse 
    # is sent from the SP to an IdP during the Single Logout (SLO) process. 
    # Only HTTP-POST or HTTP-Redirect methods are allowed. 
    default 'HTTP-POST'; 
} 

map $host $saml_sp_sign_slo { 
    # Whether the SP must sign the LogoutRequest or LogoutResponse 
    # sent to the IdP. 
    default "false"; 
} 

map $host $saml_idp_slo_url { 
    # IdP endpoint that the SP will send the LogoutRequest to initiate 
    # a logout process or LogoutResponse to confirm the logout. 
    # If not set, the SAML Single Logout (SLO) feature is DISABLED and 
    # requests to the 'logout' location will result in the termination 
    # of the user session and a redirect to the logout landing page. 
    default "https://login.microsoftonline.com/8807dced-9637-4205-a520-423077750c60/saml2"; 
} 

map $host $saml_sp_want_signed_slo { 
    # Whether the SP wants the SAML LogoutRequest or LogoutResponse from the IdP 
    # to be digitally signed. 
    default "true"; 
} 

map $host $saml_logout_landing_page { 
    # Where to redirect user after requesting /logout location. This can be 
    # replaced with a custom logout page, or complete URL. 
    default "/_logout"; # Built-in, simple logout page 
} 

map $proto $saml_cookie_flags { 
    http  "Path=/; SameSite=lax;"; # For HTTP/plaintext testing 
    https "Path=/; SameSite=lax; HttpOnly; Secure;"; # Production recommendation 
} 

map $http_x_forwarded_port $redirect_base { 
    ""      $proto://$host:$server_port; 
    default $proto://$host:$http_x_forwarded_port; 
} 

map $http_x_forwarded_proto $proto { 
    ""      $scheme; 
    default $http_x_forwarded_proto; 
} 
# ADVANCED CONFIGURATION BELOW THIS LINE 
# Additional advanced configuration (server context) in saml_sp.server_conf 

######### Shared memory zones that keep the SAML-related key-value databases 

# Zone for storing AuthnRequest and LogoutRequest message identifiers (ID) 
# to prevent replay attacks. (REQUIRED) 
# Timeout determines how long the SP waits for a response from the IDP, 
# i.e. how long the user authentication process can take. 
keyval_zone zone=saml_request_id:1M                 state=/var/lib/nginx/state/saml_request_id.json                  timeout=5m; 

# Zone for storing SAML Response message identifiers (ID) to prevent replay attacks. (REQUIRED) 
# Timeout determines how long the SP keeps IDs to prevent reuse. 
keyval_zone zone=saml_response_id:1M                state=/var/lib/nginx/state/saml_response_id.json                 timeout=1h; 

# Zone for storing SAML session access information. (REQUIRED) 
# Timeout determines how long the SP keeps session access decision (the session lifetime). 
keyval_zone zone=saml_session_access:1M             state=/var/lib/nginx/state/saml_session_access.json              timeout=1h; 

# Zone for storing SAML NameID values. (REQUIRED) 
# Timeout determines how long the SP keeps NameID values. Must be equal to session lifetime. 
keyval_zone zone=saml_name_id:1M                    state=/var/lib/nginx/state/saml_name_id.json                     timeout=1h; 

# Zone for storing SAML NameID format values. (REQUIRED) 
# Timeout determines how long the SP keeps NameID format values. Must be equal to session lifetime. 
keyval_zone zone=saml_name_id_format:1M             state=/var/lib/nginx/state/saml_name_id_format.json              timeout=1h; 

# Zone for storing SAML SessionIndex values. (REQUIRED) 
# Timeout determines how long the SP keeps SessionIndex values. Must be equal to session lifetime. 
keyval_zone zone=saml_session_index:1M              state=/var/lib/nginx/state/saml_session_index.json               timeout=1h; 
  
# Zone for storing SAML AuthnContextClassRef values. (REQUIRED) 
# Timeout determines how long the SP keeps AuthnContextClassRef values. Must be equal to session lifetime. 
keyval_zone zone=saml_authn_context_class_ref:1M    state=/var/lib/nginx/state/saml_authn_context_class_ref.json     timeout=1h; 

# Zones for storing SAML attributes values. (OPTIONAL) 
# Timeout determines how long the SP keeps attributes values. Must be equal to session lifetime. 
keyval_zone zone=saml_attrib_uid:1M                 state=/var/lib/nginx/state/saml_attrib_uid.json                  timeout=1h; 
keyval_zone zone=saml_attrib_name:1M                state=/var/lib/nginx/state/saml_attrib_name.json                 timeout=1h; 
keyval_zone zone=saml_attrib_memberOf:1M            state=/var/lib/nginx/state/saml_attrib_memberOf.json             timeout=1h; 

######### SAML-related variables whose value is looked up by the key (session cookie) in the key-value database. 

# Required: 
keyval $saml_request_id     $saml_request_redeemed          zone=saml_request_id;               # SAML Request ID 
keyval $saml_response_id    $saml_response_redeemed         zone=saml_response_id;              # SAML Response ID 
keyval $cookie_auth_token   $saml_access_granted            zone=saml_session_access;           # SAML Access decision 
keyval $cookie_auth_token   $saml_name_id                   zone=saml_name_id;                  # SAML NameID 
keyval $cookie_auth_token   $saml_name_id_format            zone=saml_name_id_format;           # SAML NameIDFormat 
keyval $cookie_auth_token   $saml_session_index             zone=saml_session_index;            # SAML SessionIndex 
keyval $cookie_auth_token   $saml_authn_context_class_ref   zone=saml_authn_context_class_ref;  # SAML AuthnContextClassRef 

# Optional: 
keyval $cookie_auth_token   $saml_attrib_uid                zone=saml_attrib_uid; 
keyval $cookie_auth_token   $saml_attrib_name               zone=saml_attrib_name; 
keyval $cookie_auth_token   $saml_attrib_memberOf           zone=saml_attrib_memberOf; 
 

keyval_zone    zone=saml_attrib_mail:1M                state=/var/lib/nginx/state/saml_attrib_mail.json   timeout=1h; 
keyval         $cookie_auth_token $saml_attrib_mail    zone=saml_attrib_mail; 
  
keyval $cookie_auth_token   $saml_attrib_objectid           zone=saml_attrib_objectid; 
keyval_zone zone=saml_attrib_objectid:1M            state=/var/lib/nginx/state/saml_attrib_objectid.json             timeout=1h; 
  

######### Imports a module that implements SAML SSO and SLO functionality 
js_import samlsp from conf.d/saml_sp.js; 

Schritt 3: Testen der Konfiguration

Zum Testen der Konfiguration sind zwei Teile erforderlich:

  1. Überprüfen des SAML-Flusses
  2. Testen der SP-initiierten Abmeldefunktion

Überprüfen des SAML-Flusses

Nachdem Sie den SAML-SP mit NGINX Plus und den IdP mit Microsoft Entra ID eingerichtet haben, prüfen Sie unbedingt den SAML-Ablauf. So stellen Sie sicher, dass die Benutzerauthentifizierung über den IdP klappt und Sie Zugriff auf die durch den SP geschützten Ressourcen erhalten.

Um den vom SP initiierten SAML-Fluss zu überprüfen, öffnen Sie Ihren bevorzugten Browser und geben Sie https://dev.sports.com in die Adressleiste ein. Sie werden zur IdP-Anmeldeseite weitergeleitet.

Abbildung 8: Die IdP-Anmeldeseite

Geben Sie die Anmeldeinformationen eines Benutzers ein, der auf der Anmeldeseite des IdP konfiguriert ist. Der IdP authentifiziert den Benutzer beim Absenden.

Abbildung 9: Eingabe der Anmeldeinformationen des konfigurierten Benutzers

Sie erhalten Zugriff auf die zuvor angeforderte geschützte Ressource, sobald Sie eine Sitzung erfolgreich aufgebaut haben. Danach zeigt Ihr Browser die Ressource an.

Abbildung 10: Die erfolgreich geladene Anwendungsseite

Wertvolle Informationen zum SAML-Fluss können durch Überprüfen der SP- und IdP-Protokolle erhalten werden. Stellen Sie auf der SP-Seite (NGINX Plus) sicher, dass die Auth_token-Cookies richtig gesetzt sind. Stellen Sie auf der IdP-Seite (Microsoft Entra ID) sicher, dass der Authentifizierungsprozess ohne Fehler abgeschlossen wird und die SAML-Assertion an den SP gesendet wird.

Das NGINX access.log sollte folgendermaßen aussehen:

127.0.0.1 - - [14/Aug/2023:21:25:49 +0000] "GET / HTTP/1.0" 200 127 "https://login.microsoftonline.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15" "-" 

99.187.244.63 - Akash Ananthanarayanan [14/Aug/2023:21:25:49 +0000] "GET / HTTP/1.1" "dev.sports.com" 200 127 "https://login.microsoftonline.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15" "- 

Während das NGINX- Debug.log folgendermaßen aussieht:

2023/08/14 21:25:49 [info] 27513#27513: *399 js: SAML SP success, creating session _d4db9b93c415ee7b4e057a4bb195df6cd0be7e4d 

Testen der SP-initiierten Abmeldefunktion

Mit SAML Single Logout (SLO) können sich Benutzer mit einer Aktion von allen beteiligten IdPs und SPs abmelden. NGINX Plus unterstützt SP- und IdP-initiierte Abmeldeszenarien und verbessert so die Sicherheit und das Benutzererlebnis in SSO-Umgebungen. In diesem Beispiel verwenden wir ein SP-initiiertes Abmeldeszenario.

Abbildung 11: SAML SP-initiiertes SLO mit POST/Redirect-Bindungen für LogoutRequest und LogoutResponse

Melden Sie sich nach der Authentifizierung Ihrer Sitzung ab, indem Sie auf die in Ihrem SP konfigurierte Abmelde-URL zugreifen. Wenn Sie beispielsweise https://dev.sports.com/logout als Abmelde-URL in NGINX Plus eingerichtet haben, geben Sie diese URL in die Adressleiste Ihres Browsers ein.

Abbildung 12: Erfolgreiche Abmeldung von der Sitzung

Um eine sichere Abmeldung zu gewährleisten, muss der SP eine SAML-Anfrage initiieren, die dann vom IdP überprüft und verarbeitet wird. Durch diese Aktion wird die Benutzersitzung effektiv beendet und der IdP sendet dann eine SAML-Antwort, um den Browser des Benutzers zurück zum SP umzuleiten.

Abschluss

Glückwunsch! NGINX Plus kann jetzt als SAML SP dienen und dem Authentifizierungsprozess eine weitere Sicherheitsebene und mehr Komfort bieten. Diese neue Funktion stellt einen bedeutenden Fortschritt für NGINX Plus dar und macht es zu einer robusteren und vielseitigeren Lösung für Unternehmen, bei denen Sicherheit und Effizienz im Vordergrund stehen. 

Erfahren Sie mehr über die Verwendung von SAML mit NGINX Plus

Sie können noch heute mit der Verwendung von SAML mit NGINX Plus beginnen, indem Sie eine 30-tägige kostenlose Testversion von NGINX Plus starten. Wir hoffen, Sie finden es nützlich und freuen uns über Ihr Feedback.

Ausführlichere Informationen zu NGINX Plus mit SAML stellen wir Ihnen in den folgenden Ressourcen bereit.


„Dieser Blogbeitrag kann auf Produkte verweisen, die nicht mehr verfügbar und/oder nicht mehr unterstützt werden. Die aktuellsten Informationen zu verfügbaren F5 NGINX-Produkten und -Lösungen finden Sie in unserer NGINX-Produktfamilie . NGINX ist jetzt Teil von F5. Alle vorherigen NGINX.com-Links werden auf ähnliche NGINX-Inhalte auf F5.com umgeleitet."