Table of Contents
In diesem Beitrag geht es darum einen AD FS Proxy zur Authentifizierung von z.B. SaaS Anwendungen oder Webseiten über Citrix ADC (Version 12) von extern bereit zu stellen. Hierbei soll durch den AD FS Proxy folgendes erreicht werden:
- URL / DoS Schutz
- Passende Authentifizierung nach extern (MFA, Forms statt Kerberos)
- Account Lockout Schutz
- Verfügbarkeit (LoadBalancing)
Was ist AD FS ?
Active Directory Federation Services (AD FS) ist eine Funktion im Windows Server Betriebssystem, mit dem Identitätsinformationen außerhalb des Unternehmensnetzwerks gemeinsam genutzt werden können. Benutzer können auf Anwendungen (z.B. Office365, Salesforce.com usw.) zugreifen, ohne dass Sie erneut aufgefordert werden, Anmeldeinformationen anzugeben. Diese Anwendungen können lokal, in der Cloud oder sogar von anderen Unternehmen gehostet werden. Die Benutzerkonten können vom Administrator an einem einzigen Ort, nämlich der Active Directory, verwaltet werden.
Eine normale Bereitstellung von AD FS für externe Clients besteht aus AD FS Proxy und AD FS Server. Der AD FS Server ist dabei Mitglied der Domäne, um die Authentifizierung durchzuführen. Der AD FS Proxy steht in der Regel in einer gesonderten Netzwerkzone (DMZ), damit er von extern erreichbar ist und die Anfragen nach innen weiter gibt.
Anforderung an einen 3rd Party AD FS Proxy
Microsoft beschreibt die Anforderungen an einen 3rd Party AD FS Proxy wie folgt:
- Body
Darf den Body nicht verändern - Request Header
Alle Header müssen 1:1 zum Backend gegeben werden. Eigene Header dürfen addiert werden - Kein 302 Redirect
- URL /adfs/services/trust
Alle Antworten auf diese URL müssen 1:1 zurückgegeben werden - URL /adfs/services/trust/mex
Anfragen an diese URL müssen auf die URL /adfs/services/trust/proxymex im Backend weiter gegeben werden - NTLM
Wenn auch über den Proxy die NTLM-Anmeldung genutzt werden soll, muss eine Affinität gewahrt bleiben, so dass folgende Anfragen zum gleichen Backend Server gehen - HTTP Header (“X-MS-Proxy”)
Bei jeder Anfrage muss dieser Header addiert werden, damit das Backend erkennen kann, dass die Anfrage über einen Proxy gekommen sind und die Extranet Konfiguration genutzt werden muss. Dies ist für die Nutzung des Account Lockout Schutz erforderlich.
Ablauf einer AD FS Authentifizierung
Um zu verstehen, wie AD FS funktioniert, schauen wir uns an, was passiert, wenn ein angebundener Benutzer versucht, sich bei Office365 anzumelden:
- Ein Benutzer versucht, sich mit seinem User Principal Name(UPN) bei Office365 anzumelden
- Die Authentifizierungsplattform überprüft den UPN und stellt fest, dass der Benutzer eine Federation Identität ist. Der Authentication Request wird an den AD FS Server des Benutzers umgeleitet. Die Plattform kennt die URL, da zuvor eine Vertrauensstellung zwischen der AD FS Infrastruktur und Office365 eingerichtet wurde (Federation Trust).
- Der Client stellt eine Verbindung zum AD FS Proxy her und stellt Anmeldeinformationen bereit.
- Der AD FS Proxy leitet den Authentication Request an den AD FS Server weiter.
- Der AD FS Server überprüft die Anmeldeinformationen über die lokale Active Directory.
- Wenn die Anmeldeinformationen überprüft wurden, gibt ein Domänen Controller ein Kerberos Token an den AD FS Server zurück.
- Der AD FS Server ignoriert das Kerberos Token und erstellt ein neues AD FS Token, das er an den AD FS Proxy weiterleitet.
- Der AD FS Proxy leitet das AD FS Token an den Client weiter.
- Der Client übergibt das AD FS Token an Office365 und wird authentifiziert.
Einrichtung AD FS Proxy
Ich konfiguriere in meiner Anleitung einen Citrix ADC (Version 12), als AD FS Proxy für externe Authentifizierung.
Voraussetzungen
Ich setze die folgenden Dinge voraus und gehe nicht im Detail auf diese ein:
- Citrix ADC mit erfolgreicher Basis Konfiguration
- Interne und externe DNS Einträge für AD FS
- Zertifikate für die DNS Einträge (Wildcard Zertifikate sind am einfachsten)
- Konfigurierte AD FS Infrastruktur
Load Balancing
Als erstes erstellt ihr eine Service Group für eure bestehenden AD FS Server.
- Im Citrix ADC Navigation Panel auf Traffic Management > Load Balancing > Service Groups klicken
- Auf Add klicken, um eine neue Service Group zu erzeugen
- Gebt der Service Group einen Namen (z.B. ADFS_SvcGroup) und wählt bei Protocol SSL aus.
- Mit OK bestätigt ihr die Eingaben
- Im folgenden Fenster klickt ihr auf No Service Group Member und fügt die ADFS Server über Select hinzu (Per IP oder FQDN)
- Im Load Balancing Service Group Fenster auf das Stift Icon bei Settings klicken und folgendes konfigurieren
- Surge Protection (Ausgewählt)
- Use Proxy Port (Ausgewählt)
- Down State Flush (Ausgewählt)
- HTTP Compression (Ausgewählt)
- Client IP (Ausgewählt)
- Header (X-MS-Forwarded-Client-IP)
Nun wird ein Load Balancing vServer für den AD FS Proxy erstellt.
- Hierfür navigiert ihr nach Traffic Management > Load Balancing > Virtual Servers
- Über Add fügt ihr einen neuen Virtual Server hinzu und konfiguriert im folgenden Fenster die Basic Settings
- Name (z.B. ADFS_LB_Server)
- Protocol (SSL)
- IP Address Type (Non Addressable)
- Über No Load Balancing Virtual Server Service Binding bindet ihr die vorher erzeugt Service Group (ADFS_SvcGroup) an
- Über No Server Certificate bindet ihr euer Zertifikat für den AD FS Proxy an (am einfachsten ist ein Wildcard Zertifikat)
Content Switching
Als nächstes erstellt ihr die passenden Content Switching Komponenten. Zuerst die Content Switching Policies. Hier ist zu beachten das die angegebene Adresse (adfs.deyda.net), dem externen DNS-Eintrag entspricht.
- Im Citrix ADC Navigation Panel auf Traffic Management > Content Switching > Policies klicken
- Auf Add klicken, um eine neue Content Switching Policy zu erzeugen
- Name (z.B. ADFS_CS_Policy_ADFS)
- Expression (HTTP.REQ.HOSTNAME.SET_TEXT_MODE(IGNORECASE).EQ(„adfs.deyda.net“)&&HTTP.REQ.URL.SET_TEXT_MODE(IGNORECASE).CONTAINS(„/adfs“))
- Mit Create bestätigt ihr die Eingaben
- Nochmals auf Add klicken, um eine weitere Content Switching Policy zu erzeugen
- Name (z.B. ADFS_CS_Policy_Metadata)
- Expression (HTTP.REQ.HOSTNAME.SET_TEXT_MODE(IGNORECASE).EQ(„adfs.deyda.net“)&&HTTP.REQ.URL.SET_TEXT_MODE(IGNORECASE).CONTAINS(„/FederationMetadata“))
- Mit Create bestätigt ihr die Eingaben
Jetzt wird der Content Switching vServer erstellt, an den die IP Adresse gebunden wird, die im externen DNS-Eintrag (z.B. adfs.deyda.net) eingetragen ist.
- Im Citrix ADC Navigation Panel auf Traffic Management > Content Switching > Virtual Servers klicken
- Auf Add klicken, um einen neuen Content Switching Virtual Server zu erzeugen
- Name (z.B. ADFS_CS_Server)
- Protocol (SSL)
- Target Type (NONE)
- IP Address Type (IP Address)
- IP Address (externe IP Adresse für den DNS-Eintrag)
- Port (443)
- Mit OK bestätigt ihr die Eingaben
Jetzt werden die vorher erstellten Content Switching Policies (ADFS_CS_Policy_ADFS / ADFS_CS_Policy_Metadata) an den gerade erstellten Virtual Server (ADFS_CS_Server) gebunden.
- Im geöffneten Content Switching Virtual Server klickt auf No Content Switching Policy Bound
- Im Fenster Policy Binding klickt auf Add Binding
- Select Policy (ADFS_CS_Policy_ADFS)
- Priority (100)
- Goto Expression (END)
- Invoke LabelType (None)
- Target Load Balancing Virtual Server (ADFS_LB_Server)
- Klickt auf Bind um es zu Bestätigen
- Im Fenster Policy Binding klickt nochmals auf Add Binding um die zweite Policy anzubinden
- Select Policy (ADFS_CS_Policy_Metadata)
- Priority (110)
- Goto Expression (END)
- Invoke LabelType (None)
- Target Load Balancing Virtual Server (ADFS_LB_Server)
- Klickt auf Bind um es zu Bestätigen
Rewrite
Nun müssen noch Rewrite Policies und Actions erstellt werden, die später an den Load Balancer Virtual Server angebunden werden müssen.
- Im Citrix ADC Navigation Panel auf App Expert > Rewrite > Actions klicken
- Auf Add klicken, um eine neue Rewrite Action zu erzeugen
- Name (z.B. ADFS_Rewrite_ProxyHeader)
- Type (INSERT_HTTP_HEADER)
- Header Name (X-MS-Proxy)
- Expression („NETSCALER“)
- Mit Create bestätigt ihr die Eingaben
- Nochmals auf Add klicken, um eine neue weitere Rewrite Action zu erzeugen
- Name (z.B. ADFS_Rewrite_Mex)
- Type (REPLACE)
- Expression to choose target location (HTTP.REQ.URL.PATH_AND_QUERY)
- Expression („/adfs/services/trust/proxymex“ + HTTP.REQ.URL.SET_TEXT_MODE(IGNORECASE).PATH_AND_QUERY.STRIP_START_CHARS(„/adfs/services/trust/mex“).HTTP_URL_SAFE)
- Mit Create bestätigt ihr die Eingaben
- Im Citrix ADC Navigation Panel auf App Expert > Rewrite > Policies klicken
- Auf Add klicken, um eine neue Rewrite Policy zu erzeugen
- Name (z.B. ADFS_Rewrite_Policy_ProxyHeader)
- Action (ADFS_Rewrite_ProxyHeader)
- Expression (HTTP.REQ.URL.TO_LOWER.STARTSWITH(„/adfs“)
- Mit Create bestätigt ihr die Eingaben
- Nochmals auf Add klicken, um eine weitere Rewrite Policy zu erzeugen
- Name (z.B. ADFS_Rewrite_Policy_Mex)
- Action (ADFS_Rewrite_Mex)
- Expression (HTTP.REQ.URL.TO_LOWER.STARTSWITH(„/adfs/services/trust/mex“)
- Mit Create bestätigt ihr die Eingaben
Um nun die Rewrite Policies an den Load Balancer zu binden öffnet ihr den erstellten Load Balancer (ADFS_LB_Server) und klickt auf der rechten Seite auf Policies.
Im neuen Reiter Policies auf das + Icon klicken.
Daraufhin konfiguriert ihr den Policy Type.
- Choose Policy (Rewrite)
- Choose Type (Request)
- Mit Continue bestätigen
- Select Policy (ADFS_Rewrite_Policy_ProxyHeader)
- Priority (100)
- Goto Expression (NEXT)
- Invoke LabelType (None)
- Mit Bind fortsetzen
- Select Policy (ADFS_Rewrite_Policy_Mex)
- Priority (110)
- Goto Expression (END)
- Invoke LabelType (None)
- Mit Bind fortsetzen
Test des AD FS Proxy
Über die folgenden Adressen könnt ihr den AD FS Proxy testen.
https://adfs.deyda.net/adfs/ls/idpinitiatedsignon.htm
https://adfs.deyda.net/FederationMetadata/2007-06/FederationMetadata.xml
Troubleshooting
Wenn sich die Seiten nicht von außen öffnen lassen, ist meiner Erfahrung nach, der häufigste Fehler das binding der Zertifikate.
Um dies zu korrigieren öffnet ihr ein PowerShell Fenster als Administrator auf einer ADFS Maschine und gebt den folgenden Befehl ein:
1 |
netsh http show sslcert |
Aus der Anzeige der SSL Certificate bindings kopiert ihr euch die folgenden Zeilen raus:
- Certificate Hash
- Application ID
- Certificate Store Name
Dann gebt ihr den folgenden Befehl ein, um das vorhandene Zertifikat an alle Adressen des Servers zu binden (Die eckigen Klammern werden komplett mit dem jeweiligen Wert ersetzt):
1 |
netsh http add sslcert ipport=0.0.0.0:443 certhash=[Certificate Hash] appid=[Application ID] certstorename=[Certificate Store Name] |
Beispiel:
1 |
netsh http add sslcert ipport=0.0.0.0:443 certhash=a54564146545e454f484f48eb4 appid='(58784354-beb4-8795-4548a6e4a)' certstorename=MY |
Dieser Befehl muss dann auf allen ADFS Maschinen ausgeführt werden.