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.