WAF und Custom Domain¶
Diese Seite richtet sich an das Plattform-Team. Sie beschreibt, wie du das Portal hinter ein Application Gateway mit Web Application Firewall (WAF) stellst und unter einer Custom Domain bereitstellst. Sie ist ein Referenzdesign: Die folgenden Einstellungen funktionieren für das Portal, aber dein Gateway-module, deine Namen und Prioritäten werden abweichen. Die WAF ist optional und wird vor Beginn des Deployments geklärt (Voraussetzungen).
flowchart LR
user[User] -->|HTTPS, custom domain| agw[Application Gateway<br/>WAF policy, HTTPS listener]
agw -->|HTTPS, rewrite headers| app[Portal web app<br/>private endpoint]
agw -.->|probe| h[/.backstage/health/v1/liveness/]
Custom Domain¶
- Entra-App-Registration. Füge die Redirect-URI
https://<portal-domain>/api/auth/microsoft/handler/framezur App-Registration der Umgebung hinzu. - Terraform. Setze die Variable
domain_namedes modulesbackstageim Umgebungs-root. Das module setzt dann die App-EinstellungenAPP_CONFIG_app_baseUrlundAPP_CONFIG_backend_baseUrl, sodass das Backend die URL kennt, die Benutzer verwenden.
module "backstage" {
source = "../../modules/backstage"
# ...
domain_name = "portal.contoso.example"
}
- DNS und Zertifikat. Der Kunde stellt den DNS-Eintrag bereit, der auf das Gateway (oder die Web App) zeigt, sowie ein TLS-Zertifikat. Siehe Voraussetzungen.
WAF-Policy¶
Verwende pro Umgebung eine WAF-Policy, die an den HTTPS-Listener des Portals gebunden ist. Das Default Rule Set 2.1 (DRS 2.1) von Microsoft funktioniert mit dem Portal am besten, wenn du zusätzlich die Fine-Tuning-Hinweise von Microsoft dafür anwendest.
| Einstellung | Wert |
|---|---|
| Modus | Prevention |
| Rule Set | Microsoft_DefaultRuleSet 2.1 |
| Prüfung des Request Body | Im Beispiel aus (maximale Body-Größe 128 KB, Limit für Datei-Uploads 100 MB) |
| Log Scrubbing | An |
Rule-Overrides in der Beispiel-Policy:
| Rule-Gruppe | Regel | Einstellung | Grund |
|---|---|---|---|
| SQLI | 942110, 942150, 942260, 942430, 942440 | Deaktiviert | Fine-Tuning-Hinweise von Microsoft für DRS 2.1 |
| LFI | 930120 | Aktiviert, Aktion Log | Das Portal kann Requests erzeugen, die False Positives auslösen |
| PROTOCOL-ENFORCEMENT | 920440 | Aktiviert, Aktion Log | Dasselbe |
Zuerst im Log-Modus abstimmen
Siehst du blockierte Requests, die du dir nicht erklären kannst, stelle die Regel auf Log, finde den Request in den WAF-Logs und stimme von dort aus ab.
Application Gateway¶
Erstelle die folgenden Elemente für das Portal. Die Namen sind Beispiele.
| Element | Konfiguration |
|---|---|
| Backend Pool | FQDN der Web App, <app-service-name>.azurewebsites.net |
| Backend-Einstellung | HTTPS auf Port 443, Host-Name auf den FQDN der Web App gesetzt, Request-Timeout 30 Sekunden, Cookie-basierte Affinität deaktiviert |
| HTTPS-Listener | Host-Name <portal-domain>, SNI erforderlich, Zertifikat aus dem Key Vault, WAF-Policy angebunden |
| HTTP-Listener | Leitet auf den HTTPS-Listener um (permanent, Pfad und Query beibehalten), sodass eine ohne Protokoll eingefügte URL funktioniert |
| Routing-Regeln | Eine für den HTTPS-Listener (Backend Pool, Backend-Einstellung, Rewrite Rule Set), eine für den HTTP-Listener (Redirect) |
| Rewrite Rule Set | Fügt die Request-Header X-Forwarded-Host mit {var_host} und X-Original-URL mit {var_uri_path} hinzu |
| Health Probe | HTTPS, Host auf den FQDN der Web App gesetzt, Intervall 30 s, Timeout 30 s, Unhealthy-Schwelle 3, erwartet Status 200 |
Endpoint der Health Probe¶
Das Portal hat zwei Health-Endpoints.
| Endpoint | Verhalten |
|---|---|
/.backstage/health/v1/liveness |
Liefert 200, solange der Prozess läuft |
/.backstage/health/v1/readiness |
Liefert zusätzlich 503, bevor das Backend den Start abgeschlossen hat, während es herunterfährt und solange die Credential des Microsoft-Auth-Providers die Validierung nicht besteht |
Die Beispiel-Probe verwendet liveness. Damit bleibt das Portal erreichbar, während eine fehlerhafte Credential behoben wird. Verwende readiness, wenn das Gateway eine Instanz beim Start, beim Herunterfahren oder bei einem Credential-Fehler aus dem Pool nehmen soll.
Zugriff auf die Web App¶
Entscheide, ob die Web App nur über das Gateway erreichbar ist. Das module backstage hat eine Einstellung für den öffentlichen Netzwerkzugriff mit drei Werten: none, full (der Standard) und ein eingeschränkter Wert für den Azure AI Agent Service. Siehe Architektur. Wenn du das Gateway als einzigen Eingang verwendest, beschränke den direkten Zugriff auf die Web App.