MSXFAQ MeetNow aktiv: Komm doch einfach dazu.

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 Memberserver

Zuerst 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:

  • Security : Windows Authentication
  • Application Development: ASP-NET 4.7

Zudem sollten Sie nicht die Management Tools vergessen, wenn Sie den IIS nicht allein über Textdateien verwalten wollen.

 

IIS mit Windows Authentication konfigurieren

Auf 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:


Unter "Providers" entfernen Sie NTLM und  Negotiate und addieren nur "Negotiate:Kerberos"

 

Portal-Code auspacken

Nun extrahieren wir einfach den Code aus dem ZIP-Archiv samt Unterverzeichnis in das Basisverzeichnis der Webseite.

waf_portal.zip

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.

 

Konfiguration

Ich 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:

  • GroupName
    Das ist der Name der Windows Sicherheitsgruppe des Benutzers mit der Domain. Wenn es die Gruppe nicht gibt, passiert nicht und ein "*" wird für alle Benutzer verfügbar gemacht.
  • Appname
    Der Name der Applikation, der als Name des Links erscheint
  • Url
    Die absolute oder relative URL, die dann im IFRAME geöffnet wird
  • Icon
    Ein Icon, welches vor dem Link angezeigt wird

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.

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