Table of Contents
Bei einem meiner letzten Einsätze musste ich einen externen Zugriff mittels NetScaler auf eine Intern gehostete Web-Anwendung (Grafana) einrichten.
Grafana ist eine plattformübergreifende Open Source-Anwendung zur grafischen Darstellung von Daten aus verschiedenen Datenquellen wie z.B. InfluxDB, MySQL, PostgreeSQL, Prometheus und Graphite.
Die Herausforderung dabei war, dass der Kunde eine Authentifizierung am NetScaler vorschalten wollte, die User allerdings nur der Web-Anwendung selbst bekannt sind.
Die Frage, die sich mir daher stellte, war:
Wie kann ich den User der Web-Anwendung überprüfen, wenn nur die Web-Anwendung selbst Zugriff auf die Userdaten hat?
Ich hatte bisher nur Standards wie LDAP, RADIUS, CERT, SAML usw. genutzt für eine User-Authentifizierung am NetScaler, aber diese waren hier nicht Zielführend da das Zielsystem nicht verändert werden sollte.
Es folgte eine kleine Recherche, bei der ich getreu dem Motto „Lies das verdammte Handbuch“ in eben diesem fündig geworden bin.
Web Authentication
“Authentication, authorization, and auditing is now able to authenticate a user to a web server, providing the credentials that the web server requires in an HTTP request and analyzing the web server response to determine that user authentication was successful.”
Web authentication | Authentication, authorization, and auditing application traffic (citrix.com)
Das klang für mich erst einmal positiv. Jetzt musste ich als nicht Web-Programmierer nur noch herausfinden, wie das mit dem http funktioniert und was ich dafür am NetScaler alles machen muss. Bisher hatte ich nur rudimentäre Rewrite oder Responder Policies zum Umleiten auf einen bestimmten URL-Pfad oder eine komplett andere URL oder einen http zu https Redirect umgesetzt.
Voraussetzungen
Für die Erstellung einer Web authentication action werden folgende Informationen benötigt:
- Name
- Für die Web authentication action
- IP-Adresse
- Des Webservers, der für die Authentifizierung verwendet werden soll
- Port
- Auf dem der Webserver Verbindungen annimmt
- Protokoll
- Für den Zugriff auf den Webserver
- HTTP Request Expression
- HTTP-Anfrage (Expression), die an den Webservers gesendet werden soll
- Expression to validate the Authentication
- Expression zur Überprüfung, ob die Authentifizierung erfolgreich war
Ablauf der Web Authentication
- Der Benutzer ruft den FQDN (z.B. grafana.deyda.net) des Webserver auf
- Der Benutzer wird an den AAA vServer weitergeleitet, um sich dort zu authentifizieren
- Der Benutzer gibt seine Zugangsdaten am AAA vServer ein
- Die Zugangsdaten werden vom NetScaler mit Hilfe der Web Authentication Action an den Webserver gesendet und dort überprüft
- Das vom Webserver erstellte Session Cookie wird an den NetScaler übermittelt
- Das Session Cookie wird vom NetScaler an den Benutzer übermittelt und dieser wird an die Webseite weitergeleitet
Fiddler
Zur Analyse der http Requests und Responses habe ich das Tool Fiddler Classic (LINK) gefunden und verwendet. Fiddler kann als Proxy für jeden Browser verwendet werden und bei entsprechender Konfiguration auch den HTTPS -Traffic entschlüsseln.
Einrichtung
Damit man mit Fiddler auch in den HTTPS-Traffic hineinschauen kann, muss dieser als Man-in-the-Middle-Proxy den HTTPS-Traffic abfangen und entschlüsseln. Dafür muss die entsprechende Einstellung (Decrypt HTTPS traffic) aktiviert und das Fiddler-Root-Zertifikat installiert werden.
- Ruft dazu Fiddler auf und öffnet die Optionen unter Tools > Options
- Wechselt dort auf den Tab HTTPS, aktiviert die Checkbox Decrypt HTTPS traffic und bestätigt die Installation des Fiddler Classic Root certificate
- Um nicht alles durch Fiddler entschlüsseln zu lassen habe ich nach dem Import des Zertifikats noch im DropDown auf …from browsers only eingeschränkt
Erstellen eines Mitschnittes (Trace)
In der Status-Leiste sieht man links das Fiddler aktiv ist durch die Anzeige Capturing. Daneben bei All Processes kann man den Mitschnitt auf Web Browsers beschränken.
- Klickt dazu in der Statusleiste auf All Processes und wählt dann Web Browsers aus
Da Fiddler schon die ganze Zeit aktiv war, habe ich vor dem eigentlichen Aufruf der Web-Anwendung (Grafana) den Mitschnitt noch einmal geleert.
- Klickt dazu im oberen Action-Bereich auf das X und wählt dann Remove all aus
Danach habe ich Grafana im Browser aufgerufen und mich angemeldet und nach erfolgreichem Login auch direkt wieder abgemeldet.
Nicht vergessen den Mitschnitt zu stoppen (Fiddler anzuhalten). Das geht am einfachsten durch einen Klick auf Capturing in der Status-Leiste.
Analyse des Mitschnittes (Trace)
Dadurch das Fiddler den HTTPS-Traffic entschlüsselt hat sind nun auch die Details und nicht nur die Aufrufe sichtbar. Der markierte Eintrag zeigt den POST-Request der beim Login vom Browser aus an Grafana gesendet wurde.
Im Inspectors Tab kann man den Raw Inhalt des Requests einsehen welcher vom Browser an Grafana gesendet wurde.
Die Login-Daten werden also im JSON-Format per POST-Request an die URL https://grafana.deyda.net/grafana/login gesendet.
Dank entschlüsseltem HTTPS-Traffic ist der Inhalt im Klartext sichtbar.
So weit so gut, damit waren schon alle Infos für die HTTP Request Expression der Web Authentication Action gefunden.
Das Ganze nun noch ein wenig mit Variablen verallgemeinert und auf das nötigste runtergebrochen sieht dann für den NetScaler (HTTP Request Expression) wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 |
"POST https://" + HTTP.REQ.HOSTNAME + "/grafana/login HTTP/1.1 Host: " + HTTP.REQ.HOSTNAME + " Connection: keep-alive Content-Length: " + HTTP.REQ.CONTENT_LENGTH + " Accept: application/json User-Agent: Citrix ADC/13.1 Content-Type: application/json Origin: https://" + HTTP.REQ.HOSTNAME + " Referer: https://" + HTTP.REQ.HOSTNAME + "/grafana/login {\"user\":\"" + AAA.LOGIN.USERNAME + "\",\"password\":\"" + AAA.LOGIN.PASSWORD + "\"}" |
Weiter geht’s mit den Infos für die Expression to validate the Authentication.
Dazu müssen wir die Antwort von Grafana im Fiddler Mitschnitt suchen und anschauen.
Auch die http-Response von Grafana kommt im JSON-Format und präsentiert den Text Logged in. Außerdem werden noch zwei Cookies (grafana_session und redirect_to) gesetzt.
Da in der Web Authentication Action nur eine Expression to validate the Authentication gebaut werden muss, war es mir egal was in der http-Response steht, wenn der User keinen Zugriff hat.
Die Expression, die ich auf Basis der http-Response gebaut habe, sieht wie folgt aus:
1 |
HTTP.RES.STATUS.EQ(200) && HTTP.RES.BODY(100).SET_TEXT_MODE(IGNORECASE).CONTAINS("Logged in") |
Ich schätze mit ein wenig mehr Wissen im Bereich HTTP-Kommunikation wäre mir schon von vornherein klar gewesen, dass ich das Cookie welches Grafana zusammen mit der „Logged in“ Meldung schickt wahrscheinlich nicht für Spaß von Grafana erstellt wird. Da ich das Cookie anfangs ignoriert hatte, hat es mich ein wenig Troubleshooting gekostet, bis ich dann bei der folgenden Expression angekommen bin welche noch zusätzlich in der Web Authentication Action unter Attribute 1 konfiguriert werden muss, um den Wert des Cookies aus der Response von Grafana verwenden zu können:
1 |
HTTP.RES.SET_COOKIE.COOKIE("grafana_session").VALUE(0) |
Die Verwendung erfolgt dann einfach mittels AAA.USER.ATTRIBUTE(1). In meinem Fall in einer Rewrite Action die das Cookie setzt.
NetScaler
Im Folgenden wird der NetScaler konfiguriert, sodass der User sich am AAA vServer anmelden muss um auf die Web-Anwendung (Grafana) zugreifen zu können
Authentication Web Server
Mit Hilfe der durch Fiddler gefundenen Expressions können wir den benötigten Authentication Web Server erstellen.
- Navigiert dazu nach Security > AAA – Application Traffic > Policies > Authentication > Advanced Policies > Actions > WEBAUTH
- Klickt dort auf Add und gebt folgendes ein:
- Name
- Name für den Authentication Web Server, z.B. webAuthAction_grafana
- Web Server IP Address
- IP Adresse des späteren Content Switches, z.B. 10.2.0.150
- Port
- Port auf dem der Content Switch erreichbar ist, z.B. 443
- Protocol
- HTTPS
- HTTP Request Expression
- HTTP-Anfrage, die an den Webserver gesendet wird
- Name
1 2 3 4 5 6 7 8 9 10 11 |
"POST https://" + HTTP.REQ.HOSTNAME + "/grafana/login HTTP/1.1 Host: " + HTTP.REQ.HOSTNAME + " Connection: keep-alive Content-Length: " + HTTP.REQ.CONTENT_LENGTH + " Accept: application/json User-Agent: Citrix ADC/13.1 Content-Type: application/json Origin: https://" + HTTP.REQ.HOSTNAME + " Referer: https://" + HTTP.REQ.HOSTNAME + "/grafana/login {\"user\":\"" + AAA.LOGIN.USERNAME + "\",\"password\":\"" + AAA.LOGIN.PASSWORD + "\"}" |
- Expression to validate the Authentication (Ausdruck, der prüft, ob die Authentifizierung erfolgreich war)
1 |
HTTP.RES.STATUS.EQ(200) && HTTP.RES.BODY(100).SET_TEXT_MODE(IGNORECASE).CONTAINS("Logged in") |
- Klickt dann auf > More und gebt unter Attribute 1 folgendes ein:
1 |
HTTP.RES.SET_COOKIE.COOKIE("grafana_session").VALUE(0) |
- Bestätigt alles mit Create
- Navigiert jetzt nach Security > AAA – Application Traffic > Policies > Authentication > Advanced Policies > Policy
- Klickt dort auf Add und gebt folgendes ein:
- Name
- Name für die Policy, z.B. webAuthPol_grafana
- Action Type
- WEBAUTH
- Action
- webAuthAction_grafana
- Expression
- true
- Name
- Bestätigt mit Create
SSL Zertifikate
- Ruft dazu die Admin Weboberfläche des NetScaler auf und navigiert zu Traffic Management > SSL > Certificates > Server Certificates
- Klickt dort auf Install, um das benötigte Zertifikat zu importieren
- Gebt folgendes ein und bestätigt die Eingabe mit Install:
- Certificate-Key Pair Name
- Eindeutiger Name für das Zertifikat, z.B. Wildcard.deyda.net
- Certificate File Name
- Zertifikatsdatei auswählen, z.B. deyda.net_ssl_certificate.cer
- Key File Name
- Privaten Schlüssel auswählen, z.B. deyda.net_private_key.key
- Certificate-Key Pair Name
- Wiederholt den Vorgang für die zugehörigen Zwischenzertifikate des Zertifizierungspfades unter Traffic Management > SSL > Certificates > CA Certificates
- Wählt anschließend das Installierte Server Zertifikat nochmals aus und klickt auf Select Action und dann auf Link um das Zertifikat mit dem passenden Zwischenzertifikat zu verlinken.
Load Balancing
Als nächstes werden zwei Load Balancing Virtual Servers erstellt. Einer für den User-Zugriff und einer für den Zugriff des NetScaler selbst. Hierdurch sorgen wir später dafür, dass der NetScaler selbst ohne Authentifizierung auf den Grafana Server zugreifen kann, User aber nicht.
- Navigiert nach Traffic Management > Load Balancing > Servers
- Klickt dort auf Add und gebt folgendes ein:
- Name
- Name für das Server Objekt, z.B. grafana.deyda.net
- IP Address
- IP Adresse des Grafana Server, z.B. 10.2.0.100
- Name
- Wechselt unter Traffic Management > Load Balancing zu den Services
- Klickt dort auf Add und gebt folgendes ein bzw. wählt es entsprechend aus:
- Service Name
- Name für den Service, z.B. svc_grafana
- Existing Server -> Server
- grafana.deyda.net
- Protocol
- SSL
- Port
- Port auf dem der Server erreichbar ist, z.B. 443
- Service Name
- Wechselt unter Traffic Management > Load Balancing zu den Virtual Servers
- Klickt dort auf Add und gebt folgendes ein, um den Load Balancing Virtual Server für den User-Zugriff zu erstellen:
- Name
- Name des vServers, z.B. lbvs_grafana
- Protocol
- SSL
- IP Address Type
- Non Addressable
- Name
- Im folgenden Wizard klickt auf No Load Balancing Virtual Server Service Binding und dann auf Click to select
- Wählt den grafana Service (svc_grafana) aus klickt auf Select und anschließend auf Bind
- Wenn der Service gebunden ist (1 Load Balancing Virtual Server Service Binding) klickt Continue
- Klickt auf No Server Certificate und dann auf Click to select
- Wählt das Server Zertifikat aus und klickt auf Select und anschließend auf Bind
- Wenn das Zertifikat gebunden ist (1 Server Certificate) klickt Continue
- Klickt ganz unten links auf Done um zur Übersicht der Load Balancing Virtual Server zurückzukehren
- Klickt auf der Übersicht der Load Balancing Virtual Server erneut auf Add um einen zweiten Load Balancing Virtual Server zur Verwendung in der Web authentication policy zu erstellen. Auch dieser zweite vServer wird ohne eigene IP Adresse erstellt, da der Zugriff über einen Content Switch erfolgt.
- Name
- Name des vServers, z.B. lbvs_grafana_noauth
- Protocol
- SSL
- IP Address Type
- Non Addressable
- Name
- Im folgenden Wizard klickt auf No Load Balancing Virtual Server Service Binding und dann auf Click to select
- Wählt den grafana Service (svc_grafana) aus klickt auf Select und anschließend auf Bind
- Wenn der Service gebunden ist (1 Load Balancing Virtual Server Service Binding) klickt Continue
- Klickt auf No Server Certificate und dann auf Click to select
- Wählt das Server Zertifikat aus und klickt auf Select und anschließend auf Bind
- Wenn das Zertifikat gebunden ist (1 Server Certificate) klickt Continue
- Klickt ganz unten links auf Done
Authentication Virtual Server (AAA)
Auch wenn die Authentifizierung vom Grafana Server selbst durchgeführt wird, muss ein AAA vServer genutzt werden, um die Web authentication policy am Load Balancer nutzen zu können.
- Navigiert nach Security > AAA – Application Traffic > Virtual Servers
- Unter Authentication Virtual Servers, klickt auf Add um einen neuen vServer zu erstellen
- Hier gebt folgendes ein:
- Name
- Name des vServers, z.B. AAA_grafana
- IP Address Type
- Non Addressable
- Name
- Klickt auf OK
- Klickt auf No Server Certificate und dann auf Click to select
- Wählt das Server Zertifikat aus und klickt auf Select und anschließend auf Bind
- Wenn das Zertifikat gebunden ist (1 Server Certificate) klickt Continue
- Klickt unter Advanced Authentication Policies auf No Authentication Policy
- Klickt auf Click to select
- Wählt die Authentication Policy aus und klickt auf Select
- Die Binding Details werden wie folgt eingestellt und dann mittels Bind bestätigt
- Priority
- 100
- Goto Expression
- END
- Select Next Factor
- Click to select
- Priority
- Wenn die Policy gebunden ist (1 Authentication Policy) klickt Continue
- Klickt unter Form Based Virtual Servers auf No Load Balancing Virtual Server
- Gebt folgendes ein:
- Authentication FQDN
- FQDN des Authentication vServers, z.B. grafana.deyda.net
- Authentication FQDN
- Und klickt dann auf Click to select
- Wählt den Load Balancing Virtual Server aus, der mit AAA abgesichert werden soll und klickt auf Select
- Klickt auf Bind
- Klickt ganz unten links auf Done
Content Switching Virtual Server
Der Content Switching Virtual Server nimmt alle Anfragen für unsere Web-Anwendung (Grafana) entgegen und verteilt entsprechend der Content Switching Policies auf den Authentication Virtual Server und die beiden Load Balancing Virtual Server.
- Navigiert nach Traffic Management > Content Switching > Actions
- Klickt auf Add und gebt folgendes ein:
- Name
- Name der Action, z.B. cswAct_AAA_grafana
- Choose Virtual Server or Expression
- Authentication Virtual Server
- Name
- Klickt auf Click to select
- Wählt den Authentication Virtual Server aus und klickt auf Select
- Klickt auf Create
- Klickt nochmals auf Add und gebt folgendes ein:
- Name
- Name der Action, z.B. cswAct_lbvs_grafana
- Choose Virtual Server or Expression
- Loadbalancing Virtual Server
- Name
- Klickt auf Click to select
- Wählt den Load Balancing Virtual Server aus, der mit AAA abgesichert werden soll und klickt auf Select
- Klickt auf Create
- Klickt nochmals auf Add und gebt folgendes ein:
- Name
- Name der Action, z.B. cswAct_lbvs_grafana_noauth
- Choose Virtual Server or Expression
- Loadbalancing Virtual Server
- Name
- Klickt auf Click to select
- Wählt den Load Balancing Virtual Server aus, der mit AAA abgesichert werden soll und klickt auf Select
- Klickt auf Create
- Wechselt nun unter Traffic Management > Content Switching zu Policies
- Klickt auf Add und gebt folgendes ein:
- Name
- Name der Policy, z.B. cswPol_AAA_grafana
- Action
- cswAct_AAA_grafana
- Expression:
- Name
1 |
HTTP.REQ.URL.EQ("/").NOT && (is_vpn_url || HTTP.REQ.URL.STARTSWITH("/nf/auth/")) |
- Klickt auf Create
- Klickt nochmals auf Add und gebt folgendes ein:
- Name
- Name der Policy, z.B. cswPol_lbvs_grafana
- Action
- cswAct_lbvs_grafana
- Expression:
- Name
1 |
HTTP.REQ.HOSTNAME.SET_TEXT_MODE(IGNORECASE).EQ("grafana.deyda.net") && CLIENT.IP.SRC.EQ(10.2.0.201).NOT |
- Wenn der Content Switch ausschließlich für Grafana verwendet wird, kann die Expression auch einfach auf TRUE gesetzt werden
- Bei der IP Adresse handelt es sich um die Subnet IP des NetScaler
- Klickt auf Create
- Klickt ein drittes Mal auf Add und gebt folgendes ein:
- Name
- Name der Policy, z.B. cswPol_lbvs_grafana_noauth
- Action
- cswAct_lbvs_grafana_noauth
- Expression:
- Name
1 |
CLIENT.IP.SRC.EQ(10.2.0.201) |
- Bei der IP Adresse handelt es sich um die Subnet IP NetScaler
- Klickt auf Create
- Navigiert nach Traffic Management > Content Switching > Virtual Servers
- Klickt auf Add und gebt folgendes ein:
- Name
- Name des vServer, z.B. csvs_grafana.deyda.net
- Protocol
- SSL
- IP Address Type
- IP Address
- IP Address
- IP Adresse des vServer, z.B. 10.2.0.150
- Diese IP Adresse muss mit der in der Web authentication action übereinstimmen!
- IP Adresse des vServer, z.B. 10.2.0.150
- Port
- Port auf dem der Content Switch erreichbar ist, z.B. 443
- Name
- Klickt auf OK
- Klickt unter Content Switching Policy Binding auf No Content Switching Policy Bound
- Klickt auf Click to select
- Wählt die Content Switching Policy cswPol_lbvs_grafana_noauth aus und klickt auf Select
- Gebt folgendes ein:
- Priority
- 10
- Priority
- Klickt auf Bind
- Wenn die Policy gebunden ist (1 Content Switching Policy) klickt auf 1 Content Switching Policy
- Klickt auf Add Binding
- Klickt auf Click to select
- Wählt die zweite Content Switching Policy cswPol_AAA_grafana aus und klickt auf Select
- Gebt folgendes ein:
- Priority
- 20
- Priority
- Klickt auf Bind
- Klickt nochmals auf Add Binding und klickt auf Click to select
- Wählt die dritte Content Switching Policy cswPol_lbvs_grafana aus und klickt auf Select
- Gebt folgendes ein:
- Priority
- 100
- Priority
- Klickt auf Bind und dann auf Close
- Wenn die Policy gebunden ist (3 Content Switching Policies) klickt auf OK
- Wählt nun im Advanced Settings Menü auf der rechten Seite Certificate aus
- Im dadurch hinzugefügten Abschnitt Certificate klickt auf No Server Certificate und dann auf Click to select, um ein Server Zertifikat zu binden
- Wählt das Server Zertifikat aus und klickt auf Select und anschließend auf Bind
- Wenn das Zertifikat gebunden ist (1 Server Certificate) klickt Continue und dann auf Done
Responder
Zum Abschluss nutzen wir noch einen Responder um den Request des Users von der Login-Seite der Web-Anwendung (Grafana) auf die Hauptseite umzuleiten. Das ist nötig da der NetScaler die Authentifizierung übernimmt und der User sonst in einem Login-Loop hängen bleiben würde.
- Navigiert nach AppExpert > Responder > Actions und klickt auf Add
- Hier gebt folgendes ein:
- Name
- Name der Action, z.B. respAct_grafana_subdir
- Type
- Redirect
- Expression:
- Name
1 |
"/grafana" |
- Response Status Code
- Status Code der an den Browser übermittelt wird, z.B. 302
- Klickt auf Create und wechselt dann nach AppExpert > Responder > Policies und klickt dort ebenfalls auf Add
- Hier gebt folgendes ein:
- Name
- Name der Policy, z.B. respPol_grafana_subdir
- Action
- respAct_grafana_subdir
- Expression:
- Name
1 |
HTTP.REQ.URL.PATH.EQ("/grafana/login") |
- Klickt auf Create
Rewrite
Um das Cookie, welches beim Login vom NetScaler an der Web-Anwendung generiert wird auch dem User zur Verfügung zu stellen, nutzen wir einen Rewrite der Response die an den User geschickt wird.
- Navigiert zum Abschnitt AppExpert > Rewrite > Actions und klickt auf Add
- Gebt folgendes ein:
- Name
- Name der Action, z.B. rwAct_grafana_add_cookie
- Type
- INSERT_HTTP_HEADER
- Header Name
- Name des Header der eingefügt werden soll, z.B. Set-Cookie
- Expression:
- Name
1 |
"grafana_session=" + AAA.USER.ATTRIBUTE(1) + "; path=/grafana; Max-Age=2595600; HttpOnly; SameSite=Lax" |
- Klickt auf Create
Und als letztes Gimmick nutzen wir einen weiteren Rewrite der Response für das Entfernen des NetScaler Cookie um einen sauberen Logout der Web-Anwendung hinzubekommen. Hierdurch wird der User nicht nur von der Web-Anwendung selbst, sondern auch vom AAA vServer am NetScaler ausgeloggt.
- Klickt nochmals auf Add um eine weitere Rewrite Action zu erstellen
- Gebt nun folgendes ein:
- Name
- Name der Action, z.B. rwAct_grafana_remove_AAA_cookie
- Type
- INSERT_HTTP_HEADER
- Header Name
- Name des Header der eingefügt werden soll, z.B. Set-Cookie
- Expression:
- Name
1 |
"NSC_TMAS=; path=/; Max-Age=-1" |
- Klickt auf Create
- Wechselt zum Abschnitt AppExpert > Rewrite > Policies
- Klickt auf Add und gebt folgendes ein:
- Name
- Name der Policy, z.B. rwPol_grafana_add_cookie
- Action
- rwAct_grafana_add_cookie
- Expression:
- Name
1 |
HTTP.REQ.COOKIE.CONTAINS("grafana_session").NOT |
- Klickt auf Create
- Klickt dann nochmals auf Add um eine weitere Rewrite Policy zu erstellen
- Gebt nun folgendes ein:
- Name
- Name der Policy, z.B. rwPol_grafana_remove_AAA_cookie
- Action
- rwAct_grafana_remove_AAA_cookie
- Expression:
- Name
1 |
HTTP.REQ.URL.TO_LOWER.STARTSWITH("/grafana/logout") && HTTP.REQ.COOKIE.CONTAINS("grafana_session") |
- Klickt auf Create
Anpassung des Load Balancing Virtual Servers
Als letztes müssen die Responder und Rewrite Policies noch an den Load Balancing Virtual Server gebunden werden.
- Navigiert dazu nach Traffic Management > Load Balancing > Virtual Servers
- Klickt auf den Load Balancing Virtual Server lbvs_grafana um diesen zu bearbeiten
- Klickt im Menü (Advanced Settings) auf der rechten Seite auf Policies
- Dann klickt im Policies Abschnitt auf To add, please click on the + icon
- Wählt dann folgendes aus:
- Choose Policy
- Responder
- Choose Type
- Request
- Choose Policy
- Klickt auf Continue und dann auf Click to select
- Wählt die Responder Policy aus und klickt auf Select
- Bestätigt das Policy Binding mit einem Klick auf Bind
- Wenn die Policy gebunden ist (1 Responder Policy) klickt auf das + rechts bei Policies
- Wählt nun folgendes aus:
- Choose Policy
- Rewrite
- Choose Type
- Response
- Choose Policy
- Klickt auf Continue und dann auf Click to select
- Wählt die Policy (rwPol_grafana_add_cookie) aus und klickt auf Select
- Bestätigt das Policy Binding mit einem Klick auf Bind
- Wenn die Policy gebunden ist (1 Rewrite Policy) klickt im Abschnitt Policies auf 1 Rewrite Policy
- Klickt auf Add Binding
- Klickt auf Click to select
- Wählt die Policy (rwPol_grafana_remove_AAA_cookie) aus und klickt auf Select
- Bestätigt das Policy Binding mit einem Klick auf Bind
- Klickt auf Close
- Wenn die Policies gebunden sind (2 Rewrite Policies) klickt auf Done
CLI Befehle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
add ssl certKey grafana.deyda.net -cert deyda.net_ssl_certificate.cer -key deyda.net_private_key.key -inform PEM add ssl certKey deyda.net_ssl_INTERMEDIATE -cert deyda.net_ssl_INTERMEDIATE.cer -inform PEM link ssl certKey grafana.deyda.net deyda.net_ssl_INTERMEDIATE add server grafana.deyda.net 10.2.0.100 add service svc_grafana grafana.deyda.net SSL 443 add lb vserver lbvs_grafana SSL 0.0.0.0 0 bind lb vserver lbvs_grafana svc_grafana bind ssl vserver lbvs_grafana -certkeyName grafana.deyda.net add lb vserver lbvs_grafana_noauth SSL 0.0.0.0 0 bind lb vserver lbvs_grafana_noauth svc_grafana bind ssl vserver lbvs_grafana_noauth -certkeyName grafana.deyda.net add authentication webAuthAction webAuthAction_grafana -serverIP 10.2.0.150 -serverPort 443 -fullReqExpr "\"POST https://\" + HTTP.REQ.HOSTNAME + \"/grafana/login HTTP/1.1\nHost: \" + HTTP.REQ.HOSTNAME + \"\nConnection: keep-alive\nContent-Length: \" + HTTP.REQ.CONTENT_LENGTH + \"\nAccept: application/json\nUser-Agent: Citrix ADC/13.1\nContent-Type: application/json\nOrigin: https://\" + HTTP.REQ.HOSTNAME + \"\n\n{\\\"user\\\":\\\"\" + AAA.LOGIN.USERNAME + \"\\\",\\\"password\\\":\\\"\" + AAA.LOGIN.PASSWORD + \"\\\",\\\"email\\\":\\\"\\\"}\"" -scheme https -successRule "HTTP.RES.STATUS.EQ(200) && HTTP.RES.BODY(100).SET_TEXT_MODE(IGNORECASE).CONTAINS(\"Logged in\")" -Attribute1 "HTTP.RES.SET_COOKIE.COOKIE(\"grafana_session\").VALUE(0)" add authentication Policy webAuthPol_grafana -rule true -action webAuthAction_grafana add authentication vserver AAA_grafana SSL 0.0.0.0 bind ssl vserver AAA_grafana -certkeyName grafana.deyda.net bind authentication vserver AAA_grafana -policy webAuthPol_grafana -priority 100 -gotoPriorityExpression END set lb vserver lbvs_grafana -AuthenticationHost grafana.deyda.net -Authentication ON -authnVsName AAA_grafana add cs action cswAct_AAA_grafana -targetVserver AAA_grafana add cs action cswAct_lbvs_grafana -targetLBVserver lbvs_grafana add cs action cswAct_lbvs_grafana_noauth -targetLBVserver lbvs_grafana_noauth add cs policy cswPol_AAA_grafana -rule "HTTP.REQ.URL.EQ(\"/\").NOT && (is_vpn_url || HTTP.REQ.URL.STARTSWITH(\"/nf/auth/\"))" -action cswAct_AAA_grafana add cs policy cswPol_lbvs_grafana -rule "HTTP.REQ.HOSTNAME.SET_TEXT_MODE(IGNORECASE).EQ(\"grafana.deyda.net\") && CLIENT.IP.SRC.EQ(10.2.0.201).NOT" -action cswAct_lbvs_grafana add cs policy cswPol_lbvs_grafana_noauth -rule "CLIENT.IP.SRC.EQ(10.2.0.201)" -action cswAct_lbvs_grafana_noauth add cs vserver csvs_grafana.deyda.net SSL 10.2.0.150 443 bind ssl vserver csvs_grafana.deyda.net -certkeyName grafana.deyda.net bind cs vserver csvs_grafana.deyda.net -policyName cswPol_lbvs_grafana_noauth -priority 10 bind cs vserver csvs_grafana.deyda.net -policyName cswPol_AAA_grafana -priority 20 bind cs vserver csvs_grafana.deyda.net -policyName cswPol_lbvs_grafana -priority 100 add responder action respAct_grafana_subdir redirect "\"/grafana\"" -responseStatusCode 302 add responder policy respPol_grafana_subdir "HTTP.REQ.URL.PATH.EQ(\"/grafana/login\")" respAct_grafana_subdir bind lb vserver lbvs_grafana -policyName respPol_grafana_subdir -priority 100 -gotoPriorityExpression END -type REQUEST add rewrite action rwAct_grafana_add_cookie insert_http_header Set-Cookie "\"grafana_session=\" + AAA.USER.ATTRIBUTE(1) + \"; path=/grafana; Max-Age=2595600; HttpOnly; SameSite=Lax\"" add rewrite action rwAct_grafana_remove_AAA_cookie insert_http_header Set-Cookie "\"NSC_TMAS=; path=/; Max-Age=-1\"" add rewrite policy rwPol_grafana_add_cookie "HTTP.REQ.COOKIE.CONTAINS(\"grafana_session\").NOT" rwAct_grafana_add_cookie add rewrite policy rwPol_grafana_remove_AAA_cookie "HTTP.REQ.URL.TO_LOWER.STARTSWITH(\"/grafana/logout\") && HTTP.REQ.COOKIE.CONTAINS(\"grafana_session\")" rwAct_grafana_remove_AAA_cookie bind lb vserver lbvs_grafana -policyName rwPol_grafana_remove_AAA_cookie -priority 110 -gotoPriorityExpression END -type RESPONSE bind lb vserver lbvs_grafana -policyName rwPol_grafana_add_cookie -priority 100 -gotoPriorityExpression END -type RESPONSE |