WAF Portal
Ein Windows Client hat sein "Startmenü" mit Symbolen für die lokal installierten Programme. Da immer mehr Dienste eigentlich Webseiten sind, habe ich nach einer Lösung für ein "App Portal" gesucht. Für Microsoft 365 gab es in der Zeit vor Copilot unter "https://portal.office.com" ein entsprechendes Portal. Aber hilft mir nichts im Intranet. Kommerzielle Portal-Lösung gibt es natürlich auch, insbesondere wenn es um die Veröffentlichung von Webseiten zum Zugriff aus dem Internet gibt. Ich habe aber mal nach einer einfachen internen Variante gesucht, die mit einem beliebigen Web Application Firewall (WAF)/WAP - Web Application Proxy als auch intern genutzt werden kann.
Planung
Ich habe mir vorgestellt, dass Anwender von überall auf eine Webseite wie z.B. https://portal.<firmemdonain> zugreifen und intern per Kerberos automatische angemeldet werden. Aus dem Internet kann eine Web Application Firewall eine Pre-Authentifizierung machen und dann per Kerberos - Constraint Delegation den Zugriff ermöglichen. Die Webapplikation ermittelt zum dem angemeldeten Benutzer die Gruppenmitgliedschaften und erstellt aus einer Konfigurationsdatei XML/JSON) eine Liste der Applikationen für den Anwender.
Der Anwender soll dann eine HTML-Seite sehen, welche am oberen Rand z.B. ein "Hamburger-Menü" zum Start der Apps hat, vielleicht noch ein Firmenlogo und einen Nachrichtenbereit anzeigt. Zur Fehlersuche kann auch der aktuelle Benutzer angezeigt werden. Wichtig ist aber rechts der "Logout-Button", der insbesondere bei Veröffentlichen über eine Web Application Firewall von extern eine Abmeldung signalisiert.

Eine Portalseite hat natürlich noch mehr Potential, z.B. könnten Sie noch Systemmeldungen einblenden lassen, eine Hilfe integrieren oder per JavaScript auf dem Client bei Inaktivität eine Abmeldung anfordern. Mit etwas JavaScript könne die Hauptseite auch regelmäßig ans Backend die Aktivität melden oder auf neue Meldungen prüfen und diese Nachladen. So könnten Sie dieses Portal auch zur Kommunikation zu den Mitarbeitern nutzen. Der Code ist ja "offen" und es bleibt ihnen überlassen, eigene Funktionen zu addieren.
Mein Ziel war es erst einmal eine Art "Startmenü im Web" bereitzustellen und vor allem oben rechts einen LOGOUT-Button zu haben, der von einer Web Application Firewall problemlos
Technisch habe ich mir den IIS ausgesucht, welcher sehr einfach eine Konfiguration mit Kerberos unterstützt und die ASPX-Seite hostet. Die ASPX-Seite liest die Gruppenmitgliedschaften des Benutzers und wertet dann eine CSV-Datei-Datei mit der Liste der Programme aus.

Einrichtung
Ich habe keinen "Installer" geschrieben, sondern nutze folgende Checkliste, mit der jeder Administrator das Portal bereitstellen könnte:
| Schritt | Erledigt |
|---|---|
IIS auf MemberserverZuerst brauchen wir einen IIS. Technisch kann er überall laufen. Ein Domaincontroller ist aber keine gute Option, damit sich keine Benutzer "auf dem DC" authentifizieren. Ein Member-Server ist hierfür besser geeignet. Es ist aber durchaus ein Exchange Server denkbar, auf dem die Funktionen schon installiert sind. Ansonsten installieren Sie die IIS-Rolle und erweitere die Standardeinstellungen um zwei Rollendienste:
Zudem sollten Sie nicht die Management Tools vergessen, wenn Sie den IIS nicht allein über Textdateien verwalten wollen. |
|
IIS mit Windows Authentication konfigurierenAuf einem dedizierten IIS können Sie nun einfach die Default Webseite konfigurieren. Wenn Sie das Portal auf einem bestehenden Server mit installieren wollen, dann würde ich eine eigene Webseite dafür anlegen. Das geht einfach mit der UI. Das Portal soll nicht anonym erreichbar sein. Daher schalte ich den anonymen Zugriff komplett ab und aktiviere "Windows Authentication". damit später auch Kerberos - Constraint Delegation möglich ist.:
Wer es noch etwas "Strenger" haben möchte, kann NTLM in den Authentifizierungseinstellungen explizit abschalten:
|
|
Portal-Code auspackenNun extrahieren wir einfach den Code aus dem ZIP-Archiv samt Unterverzeichnis in das Basisverzeichnis der Webseite. Im wesentlichen sind es die folgenden Dateien und Pfade: /default.aspx Der eigentliche Code
/apps.css Das Stylesheet für die Formatierung
/apps.jpg Das Logo (kann getauscht werden)
/meldung.txt Inhalt wird oben als Systemmeldung eingeblendet
/iframe.htm Startseite, die im IFRAME am Anfang angezeigt wird
/hilfe/index.htm Musterseite für die Hilfe
Sie können jederzeit alle Dateien nach ihren Anforderungen tauschen und anpassen. |
|
KonfigurationIch habe eine CSV-Datei mitgeliefert, die sie natürlich mit ihren Einstellungen anpassen müssen. GroupName ;Appname ;Url ;Icon MSXFAQ/App_prtg ;Monitoring ;https://prtg.msxfaq.de ;monitor.png MSXFAQ/App_OWA ;Webmail ;https://mail.msxfaq.de ;owar.png * ;Hilfe ;https://hilfe ;help.png Die Spalten sind schnell erklärt:
Der Header muss nicht enthalten sein, da die ASPX-Seite die komplette Datei einliest und Zeile für Zeile auftrennt. Wenn es nicht gerade eine Gruppe "Groupname" gibt, passiert nicht. |
|
Beispielausgaben
Wenn ich die Dateien aus dem Archive in meiner Demo-Umgebung anschaue, dann sehe ich folgendes Bild:
Oben ist der Bereich mit fünf Blöcken zur Anzeige des Logos, der Apps (Auf/Zuklappbar), dem Bereich für Meldungen, dem Block mit dem aktuellen Benutzer und der letzte Block mit dem "Logout"-Button, der die URl "/logoff" aufruft. Darunter ist das IFRAME, welches beim Start den Inhalt aus "iframe.htm" anzeigt.
Natürlich könnten Sie in dem IFRAME auch eine Seite mit den verfügbaren Apps anzeigen lassen.
Der Anwender kann unter Apps all die Links anklicken, die er über die Gruppenmitgliedschaften sehen kann. Die Hyperlinks haben als Target das "IFRAME" im unteren Bereich. Das kleine "D" neben dem Logo ist ein Link auf die Debug-Seite und können Sie natürlich im Quellcode entfernen.
Debugging mit /?debug=1
Die Debug-Funktion ist im Code enthalten und gibt die Verarbeitung vor der eigentlichen Seite aus. So kann ich sehen, welchen Usernamen ich ermittelt habe, wie die Anmeldung erfolgte und in welchen Gruppen ich drin bin. Zudem sehe ich der Verarbeitung der CSV-Datei zur Auswertung der anzuzeigenden Links.
Damit sollten Sie ggfls. Fehler in den Gruppennamen, Mitgliedschaften oder Code bei den Anpassungen verifizieren können
Zugriff mit Kerberos
Ehe wir im übernächsten Schritt die externe Erreichbarkeit ermöglichen, sollten Sie hier die generelle interne Funktion prüfen. Nutzen Sie einen Client, melden Sie sich mit den unterschiedlichen Benutzern an und schauen Sie, ob die richtigen Informationen angezeigt werden, die korrekt Liste der Apps anhand der Gruppenmitgliedschaften erstellt werden und vor allem die Links auch die entsprechende App in den IFRAME anzeigen. Wir wollen die Seite später ja per Kerberos - Constraint Delegation von extern über eine Web Application Firewall o.ä. erreichbar machen und dazu müssen alle Applikationen die "integrierte Authentifizierung" per Kerberos unterstützen. In der der ASPX-Seite zwar ich den Anmeldetype erkennen und hier gibt es "KERBEROS" als String. Aber hinter "Negotiate" verbirgt sich GSSAPI und darin ist ebenfalls NTLM und Kerberos nebeneinander vorhanden und ein String-Vergleich oder Längen-Auswertung ist meiner Ansicht nach nicht zuverlässig.
Greifen Sie auf die Webseite zu und schauen Sie dann mit KLIST nach, ob sie ein Kerberos-Ticket bekommen haben oder nutzen Sie den Client-Debugger oder das Windows Anmeldeeventlog, um die verwendete Methode zu ermitteln.
In Zukunft wird Kerberos oder SAML weiter zunehmen und eine NTLM Deaktivierung erfolgen.
Hier gibt es zwei Dinge besonders zu beachten, denn die Seite wurde für den externen Zugriff entwickelt.
- Logout-Button funktioniert NICHT
Bei einer Nutzung von Kerberos und "Integrierter Anmeldung" gibt es gerade nicht die Möglichkeit einer Abmeldung, denn es ist in der Natur der Dinge, dass ein Anwender die URL erneut aufrufen kann und auch wieder direkt "angemeldet" ist. Der Link hinter dem Button ist für die Web Application Firewall gedacht , welche anhand der URL erkennt, dass sie die Session entfernen soll. - Content Security "SAMEORIGIN" und IFRAME
Einige Webseiten prüfen, ob ihr Inhalt in eine andere Seite eingebunden wurden. Der Browser sendet beim Zugriff auf eine URL im Header ein "REFERER" mit, den ein Webserver auswerten kann. Umgekehrt können Webserver auch ein "SAMEORIGIN"-Policy mitliefern, damit Webbrowser keine URLs von fremden Webseiten einbinden. Das nutze ich auch, um z.B. das Einbinden von Bildern der MSXFAQ in fremden Webseiten zu erschweren. Siehe Content-Security-Policy.
Solche Seiten erscheinen dann nicht im IFRAME, wenn Sie im Browser diesen im Grunde sinnvollen Schutz, temporär abschalten.
Das ist zwar erst einmal unschön aber kein Problem, wenn Sie die verschiedenen Dienste sowieso über eine Web Application Firewall oder Reverse Proxy veröffentlichen. Dann greifen die Clients mit z.B. einer URL "https://portal.<kundendomain>" auf den Reverse Proxy zu, der dann mittels Kerberos - Constraint Delegation sich zur eigentlichen Webseite verbindet und entweder die URLs umschreibt oder den Content Security Header entsprechend anpassen kann.
- Content-Security-Policy
- Kerberos - Constraint Delegation
- Troubleshoot Kerberos failures in Internet Explorer - Determine whether
Kerberos is used
https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/iis/www-authentication-authorization/troubleshoot-kerberos-failures-ie#determine-whether-kerberos-is-used - Disable same origin policy for dev
purposes
https://discourse.gnome.org/t/disable-same-origin-policy-for-dev-purposes/8026
Reverse Proxy/WAF/Loadbalancer
Das ganzen Projekt dieser Seite mit einer Portalseite habe ich nur gestartet, weil Exchange bei der Nutzung der integrierten Abmeldung keinen brauchbaren "LOGOUT"-Button liefert. Wenn Sie bei Exchange OWA per "Form Based-Authentication" sich an Exchange anmelden, dann funktioniert der Logout-Link derart, dass damit die Session-Cookies gelöscht werden und sie richtig abgemeldet sind. Ein "Zurück" auf dem Browser bringt sich nicht mehr ins Postfach zurück. Bei einer Anmeldung mit NTLM/Kerberos liefert der Logout-Button nur ein Popup-Fenster, welche den Anwender bietet den Browser zu schließen. Das ist ist aber nicht sicher, wenn es noch andere Sitzungen gibt oder der Client nicht vertrauenswürdig ist.
Daher habe diese Portal-Seite entwickelt, bei der sich der Anwender von Extern an einer Web Application Firewall anmeldet. Die WAF kann dabei auch Angriffe erkennen, URLs prüfen und Muti Faktor überprüfen oder, wie in meinem Fall, sogar eine Anmeldung per Entra ID, ähnlich zu Hybrid Modern Authentication (HMA), durchführen. Die WAF "kennt" danach den Benutzer aber sie hat natürlich weder das Kennwort noch den NTLM-Hash. Die WAF muss für Zugriffe zu Backend-Servern dann entweder noch mal nach Anmeldedaten fragen oder über Kerberos - Constraint Delegation arbeiten.
Wenn ich den Anwender nach der Anmeldung an der WAF auf die Portalseite mit dem IFRAME leite. dann kann ich ihm dort auch einen LOGOUT-Button anbieten. In der WAF müssen wir nun natürlich einiges konfigurieren.
-> https://portal.<domain>/ Wenn Anonym, dann erst authentifizieren durch die WAF-eigenen Formulare -> https://portal.<domain>/ Wenn authentifiziert, dann Kerberos Ticket holen und auf interne Portalseite gehen -> https://portal.<domain>/OWA Anonym -> umleiten auf Anmeldseite -> https://portal.<domain>/OWA PreAuth-> Kerberos Ticket holen und Daten von auf https://exchange/owa gehen Gleiches dann mit anderen URL
Einige WAFs erlauben auch die Nutzung mehrere Domainnamen, z.B. https://portal.<kundendomain> und parallel noch https://mail.<kundendomain>. Das ist durchaus möglich, wenn die WAF dann die Authentifizierung des Clients über den Zugriff auf das Portal dann auch beim Zugriff auf den anderen Service wiedererkennt, z.B. durch einen SessionCookie, den der Client an mehrere Hosts sendet. So ein Verfahren hätte sogar den Vorteil, dass Sie über den "Referer"-Header erkennen könnten, ob z.B. OWA auf "https://mail.<kundendomain>" immer noch im IFRAME von "https://portal.<kundendomain>" eingebettet ist oder der Anwender versucht das Portal mit dem Logout-Button zu umgehen.
Es gibt sehr viele WAFs, z.B. F5 Big IP, Citrix ADC, Cisco Secure WAF, Progress/Kemp Loadmaster mit ESP, Entra ID App Proxy etc. Jede Konfiguration unterscheidet sich etwas und ob all ihre Applikationen auch "portaltauglich sind", ist zu prüfen. Einige dieser Produkte haben selbst schon ein Portal "eingebaut", so dass sie diesen Code gar nicht brauchen.
Letztlich geht es wie immer um die sichere Veröffentlichung von Webseiten und Webdiensten mit vorgeschalteter Authentifizierung. Die kleine Lösung versucht einfach nur einen Weg aufzuzeigen, wie Sie die fehlende "Logout"-Funktion bei einem Exchange mit integrierter Anmeldung wieder einbauen können.
Weiterentwicklung
Schon die Beispielbilder zeigen, dass mein Code erst mal ein PoC oder "Minimum Viable Product (MVP)" ist, mit dem Sie grundlegende Funktion mit ihrem Loadbalancer testen können. Wenn dies aber dann erfolgt ist, dann ist natürlich viel Raum für eine Weiterentwicklung.
- Layout und Design
Der PoC ist nicht hübsch. Aber mit wenig CSS-Kenntnissen, einem passenden Logo und etwas ASPX können Sie das Layout an ihren Firmenstandard anpassen - Externe Links
Sie haben anderen Webseiten, die nicht im IFRAME oder in einem eigenen Fenster angezeigt werden sollen? Erweitern Sie einfach die CSV-Datei um eine Spalte und legen Sie im ASPX-Code das Target anders. - JavaScript für Hintergrundtasks
Mein Code hat kein JavaScript. Da auf dem Browser des Clients aber immer die Portalseite als "Rahmen um das IFRAME" mit dem Logout-Button vorhanden ist, können sie hier auch ein JavaScript einbinden, welches auf dem Client per Timer regelmäßige Aktionen ausführt, z.B. für die folgenden Erweiterungen - Uhrzeit und Status
Sie könnten eine Uhrzeit im Bereich der Kopfzeile aktualisieren. Auch eine "Service Status" durch Zugriff auf ihr Monitoring-System könnte helfen - Kommunikationskanal
Das JavaScript könnte auch eine Statusinformation lesen oder per Websockets überwachen und Änderungen in einem eigenen Fenster anzeigen. So könnten Sie Probleme proaktiv an ihre Mitarbeiter melden um Anrufe beim Helpdesk zu reduzieren. Über ein Formular könnte die Kommunikation auch bidirektional sein. - AutoLogout
Sie könnten überwachen, ob der Anwender noch aktiv ist und ggfls. per Skript den "Logout"-Button drücken oder kurz vorher per Dialogbox eine Aktivität anfordern. Sie kennen so etwas sicher auch von Banken,
Am Ende haben Sie sich dann ihr eigenes "Applikationsportal" gebaut.
Weitere Links
- Kerberos - Constraint Delegation und Double Hop
- Exchange OWA Anmeldung und Logout
- Kerberos Debugging
- Kerberos Cross Forest
- Exchange extern absichern
- EXO Hybrid mit Preauth
- Azure AD Application Proxy
- WAP - Web Application Proxy
- Troubleshoot Kerberos failures in
Internet Explorer - Determine whether
Kerberos is used
https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/iis/www-authentication-authorization/troubleshoot-kerberos-failures-ie#determine-whether-kerberos-is-used - Kerberos unconstrained double-hop authentication with Microsoft Edge (Chromium)
https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/iis/www-authentication-authorization/kerberos-double-hop-authentication-edge-chromium - Mitigating framesniffing with the X-Frame-Options header
https://support.microsoft.com/de-de/office/mitigating-framesniffing-with-the-x-frame-options-header-1911411b-b51e-49fd-9441-e8301dcdcd79 - SelfHTLM Sicherheitskonzepte Content Policies
https://wiki.selfhtml.org/wiki/JavaScript/Tutorials/Sicherheitskonzepte
https://wiki.selfhtml.org/wiki/Sicherheit/Content_Security_Policy


















