Firewall, IP-Freigabe und mTLS
Die S/4HANA-Netzwerkanbindung über Azure Application Gateway mit HTTPS, fester kontori-IP, Client-Zertifikat und API-Allowlist absichern.
Für welche Anbindung gilt diese Anleitung?
Diese Anleitung beschreibt die im Kunden-Runbook vorgesehene Anbindung Azure Application Gateway WAF v2 → SAP Web Dispatcher → SAP S/4HANA. Sie richtet sich an das Azure- und Netzwerkteam sowie SAP Security. Die SAP-Dienste, Rollen und Verbindung in kontori werden separat eingerichtet.
Für eine direkt bereitgestellte S/4HANA Public Cloud wird diese Architektur nicht vorausgesetzt. Wendet die Schritte an, wenn der vereinbarte Integrationsweg tatsächlich über ein kundenseitiges Application Gateway und einen privaten Web Dispatcher führt.
So wird der Zugang geschützt
Nur ein dedizierter HTTPS-Endpunkt ist öffentlich erreichbar. Das Gateway prüft die feste Ausgangs-IP von kontori, das Client-Zertifikat und die erlaubten API-Pfade und HTTP-Methoden. SAP prüft anschließend zusätzlich den technischen Zugang und dessen Berechtigungen.
Am öffentlichen Eingang gelten IP-Freigabe, mTLS und API-Allowlist gemeinsam. Der Web Dispatcher und das SAP-System bleiben im privaten Netz.
mTLS bedeutet, dass auch kontori sich beim HTTPS-Verbindungsaufbau mit einem Zertifikat ausweist. Dieses Client-Zertifikat ergänzt die SAP-Anmeldung. Es ersetzt weder Benutzerrechte noch OAuth.
Angaben und Zuständigkeiten
Alle Werte in eckigen Klammern sind Platzhalter. Tragt vor der Einrichtung die tatsächlich abgestimmten Werte ein.
| Zuständig | Benötigte Angaben |
|---|---|
| kontori | Statische öffentliche IPv4-Ausgangsadresse [kontori_egress_ip]/32 und dedizierte Client-CA-Kette kontori-client-ca-chain.pem |
| kontori und SAP Basis | Kanonische API-Präfixe [API_PREFIX_1/], zulässige HTTP-Methoden, maximale Request-Größe [MAX_REQUEST_KB] und Backend-Timeout [BACKEND_TIMEOUT_SECONDS] |
| Azure-/Netzwerkteam | Region, dediziertes Gateway-Subnetz [APPGW_SUBNET_CIDR], statische Standard Public IPv4 und öffentlicher DNS-Name [PUBLIC_FQDN] |
| Azure-/Netzwerkteam | Serverzertifikat [FRONTEND_CERTIFICATE_PFX] für den öffentlichen DNS-Namen, einschließlich privatem Schlüssel und vollständiger Kette |
| SAP Basis | Privater DNS-Name [WD_PRIVATE_FQDN], HTTPS-Port [WD_HTTPS_PORT] und bei privater CA deren Root-Zertifikat [BACKEND_CA_CER] |
| SAP Security | Vereinbartes SAP-Anmeldeverfahren; bei OAuth zusätzlich Token-Endpunkt und die dafür benötigte Freigabe |
Das Client-Zertifikat und sein privater Schlüssel bleiben auf der kontori-Seite. Für das Azure-mTLS-Profil wird ausschließlich die CA-Kette übergeben. Zertifikate für den öffentlichen Listener, für den Web Dispatcher und für den kontori-Client haben unterschiedliche Aufgaben.
1. Gateway und WAF-Policy vorbereiten
- Stelle ein Application Gateway mit Tier/SKU: WAF_v2 bereit. Auch bei einem vorhandenen Gateway bekommt diese Integration einen eigenen Listener, eigene Backend-Einstellungen und eine eigene WAF-Policy.
- Verwende ein dediziertes Application-Gateway-Subnetz. Im Runbook ist
/24für Autoscaling und Wartung empfohlen; andere Ressourcentypen gehören nicht in dieses Subnetz. - Konfiguriere Zone Redundancy und Autoscaling mit mindestens 2 Instanzen und dem abgestimmten Maximum.
- Lege die WAF-Policy
waf-kontori-s4mit DRS 2.2 zunächst im Detection-Modus an. Aktiviere Request body inspection und setze die Request-Grenze auf[MAX_REQUEST_KB]. Sie muss auch$batchund die größte freigegebene Payload abdecken. - Aktiviere über Diagnostic settings die Kategorien ApplicationGatewayAccessLog und ApplicationGatewayFirewallLog. Sende die Logs an den vereinbarten Log Analytics Workspace beziehungsweise das SIEM und bestätige den Empfang mit einer Testabfrage.
Die verwalteten Regeln dokumentiert Microsoft unter DRS- und CRS-Regelgruppen.
2. DNS, HTTPS-Listener und mTLS einrichten
Öffentlicher Endpunkt
- Binde den kontori-Listener an eine statische Standard Public IPv4. Konfiguriere für diesen Integrationsweg keinen öffentlichen IPv6-Zugang.
- Richte für
[PUBLIC_FQDN]einen A-/Alias-Record auf diese Adresse ein. Ein CNAME ist nur geeignet, wenn die Public-IP-Ressource einen eigenen DNS-Namen besitzt; er zeigt dann auf diesen Namen. - Lege unter Listeners → Add listener den HTTPS-Listener
listener-kontori-s4-httpsauf Port 443 an. Ordne ihm den dedizierten Hostnamen[PUBLIC_FQDN]zu. - Hinterlege
[FRONTEND_CERTIFICATE_PFX]als Frontend TLS certificate. Die Zertifikatskette muss gültig sein und zum öffentlichen DNS-Namen passen. - Wähle eine TLS-Richtlinie mit TLS 1.2 oder höher. TLS 1.0/1.1 und schwache Cipher werden nicht zugelassen.
Platziert für diesen Listener keine zusätzliche CDN- oder Reverse-Proxy-Schicht vor dem Gateway. Die IP-Regel soll die tatsächliche kontori-Ausgangsadresse in RemoteAddr prüfen.
Client-Zertifikat im Strict-Modus prüfen
- Öffne am Gateway SSL profiles → Add und lege
kontori-s4-mtlsan. - Wähle für Client Authentication den Modus Strict und deaktiviere Passthrough.
- Lade
kontori-client-ca-chain.pemals Trusted Client CA Chain hoch. Die Datei enthält genau eine Kette mit genau einer Root-CA und allen benötigten Intermediate-CAs; sie ist höchstens 25 KB groß. Client-Leaf-Zertifikat und privater Schlüssel werden hier nicht hochgeladen. - Verwende ausschließlich die dedizierte kontori-Client-CA-Kette und aktiviere Verify client certificate issuer DN.
- Ordne das SSL-Profil dem Listener
listener-kontori-s4-httpszu.
Abbildung aus dem Referenz-Runbook: Links werden CA-Kette und Ausstellerprüfung eingerichtet, rechts wird das Profil am Listener aktiviert. Die ältere Ansicht zeigt noch keine Modusauswahl. Verwendet die oben genannten kontori-Namen und Strict; die Bildwerte sind Beispiele.
Aktiviere die Zertifikats-Sperrprüfung OCSP, wenn das Client-Zertifikat einen erreichbaren OCSP-Responder in seiner AIA-Erweiterung enthält. Das Azure-Team stellt dafür DNS und Netzwerkzugriff vom Gateway zum Responder sicher. Die Konfiguration erfolgt über die freigegebene Infrastrukturverwaltung, CLI oder PowerShell; im Azure Portal wird sie derzeit nicht angeboten. Fehlt OCSP, verlangt das Referenz-Runbook vor dem Produktivstart eine dokumentierte Security-Ausnahme. Die Microsoft-Anleitung zu mTLS und OCSP beschreibt die Optionen.
Für ein bereits angelegtes SSL-Profil lautet das PowerShell-Muster:
$AppGw = Get-AzApplicationGateway -Name "[APPGW_NAME]" -ResourceGroupName "[RESOURCE_GROUP]"
$Profile = Get-AzApplicationGatewaySslProfile -Name "kontori-s4-mtls" -ApplicationGateway $AppGw
Set-AzApplicationGatewayClientAuthConfiguration -SslProfile $Profile -VerifyClientCertIssuerDN -VerifyClientRevocation OCSP
Set-AzApplicationGateway -ApplicationGateway $AppGw
Client-Zertifikat in kontori hinterlegen
Für den geschützten Endpunkt wird auf der kontori-Seite zusätzlich der Abschnitt Client Certificate der S/4HANA-Verbindung befüllt. Unter Client certificate chain wird die PEM-Kette des kontori-Client-Zertifikats, unter Client certificate private key dessen zugehöriger Schlüssel hinterlegt. Diese Einrichtung erfolgt durch die zuständige kontori-Administration; der Schlüssel wird nicht an das Kundengateway weitergegeben.
CA bundle dient einem anderen Zweck: Es ergänzt auf der kontori-Seite das Vertrauen zum Serverzertifikat des Endpunkts, falls dieses von einer privaten CA ausgestellt wurde. Bei einem öffentlich vertrauenswürdigen Serverzertifikat bleibt das Feld leer.
3. Privates Backend und Firewall anbinden
Netzwerkfreigabe zum Web Dispatcher
SAP Basis stellt den Web Dispatcher unter [WD_PRIVATE_FQDN]:[WD_HTTPS_PORT] bereit. Netzwerk und Firewall lassen auf diesem Port ausschließlich das Application-Gateway-Subnetz als Quelle zu. Der private DNS-Name muss vom Gateway auflösbar sein; der Netzwerkweg zum Backend muss funktionieren.
Web Administration und Admin Handler werden über diesen Integrationsendpunkt nicht veröffentlicht. Auch das SAP-System selbst erhält keinen direkten öffentlichen Zugang für diese Integration.
Backend-Pool und HTTPS-Einstellungen
Lege unter Backend pools den Pool pool-sap-web-dispatcher mit Target type: FQDN und Target: [WD_PRIVATE_FQDN] an. Erstelle anschließend unter Backend settings die Einstellungen bhs-sap-web-dispatcher-https.
| Einstellung | Wert |
|---|---|
| Backend protocol / port | HTTPS / [WD_HTTPS_PORT] |
| Cookie-based affinity | Disabled |
| Request timeout | [BACKEND_TIMEOUT_SECONDS] Sekunden |
| TLS validation | Complete validation, Zertifikatskette/Ablauf und SNI prüfen |
| SNI name | [WD_PRIVATE_FQDN], passend zum Web-Dispatcher-Zertifikat |
| Host header | Öffentlichen Original-Host beibehalten, keinen Host-Override setzen |
| Private CA | Bei privater Backend-CA deren Root-Zertifikat als CER hinterlegen |
| Custom probe | probe-kontori-s4 zuordnen |
Die Referenzabbildung zeigt HTTPS und Complete validation. Name und Port werden durch eure Werte ersetzt. Bei einer privaten Backend-CA wird Private CA statt der im Beispiel gewählten Public CA verwendet. SNI und Host-Header werden nach der Tabelle eingerichtet.
Das Gateway verwendet zum Web Dispatcher HTTPS mit Serverzertifikatsprüfung. Das kontori-Client-Zertifikat wird am öffentlichen Listener geprüft; die SAP-Anmeldung bleibt zusätzlich aktiv. Die Microsoft-Dokumentation zu Backend-Einstellungen erläutert TLS-Prüfung und SNI.
Health Probe vorbereiten
SAP Basis aktiviert und testet intern den Ping-Pfad /sap/public/icman/ping. Er wird nur vom Gateway zum privaten Backend aufgerufen und gehört nicht in die öffentliche API-Allowlist.
| Einstellung | Wert |
|---|---|
| Name | probe-kontori-s4 |
| Protocol | HTTPS |
| Host / SNI | [WD_PRIVATE_FQDN] |
| Port | Aus den Backend-Einstellungen / [WD_HTTPS_PORT] |
| Path | /sap/public/icman/ping |
| Interval / Timeout | 30 s / 30 s |
| Unhealthy threshold | 3 |
| Healthy status | 200–399 |
Die Probe wird den Backend-Einstellungen zugeordnet. Ihre regelmäßige Prüfung wird mit der vollständigen Routing-Zuordnung im fünften Schritt wirksam.
4. IP-, API- und Methoden-Allowlist konfigurieren
Lege in waf-kontori-s4 unter Custom rules → Add custom rule drei getrennte Regeln an. Jede Regel ist eine Match rule, hat eine eigene Priorität und blockiert mit einer negierten Bedingung alles außerhalb der jeweiligen Freigabe.
Feste kontori-IP
| Feld | Wert |
|---|---|
| Name / Priority | Block-Non-kontori-IP / 10 |
| Match variable | RemoteAddr |
| Operator | IPMatch |
| Match value | [kontori_egress_ip]/32 |
| Negate condition | Yes |
| Action | Block |
Damit werden Anfragen anderer Quelladressen blockiert, sobald Prevention aktiv ist. Eine einzelne IPv4 wird mit /32 eingetragen. Für IPMatch mit RemoteAddr beschreibt Microsoft nur IPv4-Unterstützung; deshalb bleibt dieser Integrationsweg ausschließlich über IPv4 erreichbar.
Freigegebene API-Pfade
| Feld | Wert |
|---|---|
| Name / Priority | Block-Non-Allowed-SAP-Paths / 20 |
| Match variable | RequestUri |
| Operator | BeginsWith |
| Match values | [API_PREFIX_1/], [API_PREFIX_2/], … |
| Negate condition | Yes |
| Transform | UrlDecode |
| Action | Block |
Übernehmt die vollständigen, kanonischen Service-Präfixe mit abschließendem / aus der abgestimmten API-Liste. Mehrere Match Values innerhalb dieser Bedingung sind Alternativen. Die Liste richtet sich nach den auf der SAP-Seite beschriebenen Datenbereichen und den tatsächlich verwendeten Service-Adressen.
Beispiele für einzelne Dienste, keine pauschale Freigabeliste:
/sap/opu/odata/sap/API_BUSINESS_PARTNER/
/sap/opu/odata4/sap/api_product/srvd_a2x/sap/product/0002/
/sap/opu/odata4/sap/api_cost_center/srvd_a2x/sap/costcenter/0001/
Gebt weder /sap/* noch /sap/opu/odata/* allgemein frei. Der Probe-Pfad bleibt privat. Ein OAuth-Token-Endpunkt bekommt nur dann eine eigene, eng begrenzte Freigabe, wenn kontori ihn über denselben öffentlichen Host aufruft; ein separater Identity Provider wird unabhängig behandelt.
Zulässige HTTP-Methoden
| Feld | Wert |
|---|---|
| Name / Priority | Block-Non-Allowed-Methods / 30 |
| Match variable | RequestMethod |
| Operator | Equal |
| Match values | Die von kontori vorgegebenen Methoden, jeweils als eigener Wert |
| Negate condition | Yes |
| Action | Block |
Stimmt die Methoden mit dem tatsächlichen Datenumfang ab. Auch $batch, Metadatenabrufe und vereinbarte Schreiboperationen müssen berücksichtigt werden.
Verwendet für diese Freigaben keine Custom Rule mit Action: Allow: Sie kann nachgelagerte WAF-Prüfungen überspringen. Die Regellogik und den Unterschied zwischen Detection und Prevention beschreibt Microsoft unter WAF Custom Rules. Ändert API-Liste und Methoden bei funktionalen Erweiterungen kontrolliert und versioniert.
5. Routing und Backend Health prüfen
Lege die Request-Routing-Regel erst an, wenn HTTPS, das Strict-mTLS-Profil und die drei WAF-Regeln vorbereitet sind.
| Zuordnung | Wert |
|---|---|
| Rule name / Priority | rr-kontori-s4 / 100, sofern am Gateway verfügbar; sonst eine freie Routing-Priorität festlegen |
| Rule type | Basic |
| Listener | listener-kontori-s4-https |
| Backend pool | pool-sap-web-dispatcher |
| Backend settings | bhs-sap-web-dispatcher-https einschließlich probe-kontori-s4 |
| WAF association | waf-kontori-s4 direkt am kontori-Listener (per-site) |
Bei einem gemeinsam genutzten Gateway überschreibt die Listener-Policy für diesen Listener die globale Policy. Prüft deshalb, dass alle für kontori erforderlichen Regeln in seiner Policy enthalten sind. Andere Listener behalten ihre Konfiguration.
Unter Backend health muss der Web Dispatcher Healthy melden. Prüft andernfalls zuerst private DNS-Auflösung, Firewall, HTTPS-Port, Zertifikatskette, SNI und den Probe-Pfad. Ein gesunder Probe-Status bestätigt die Backend-Erreichbarkeit; SAP-Anmeldung und API-Berechtigungen werden zusätzlich geprüft.
Abnahme vor dem Produktivbetrieb
Im Detection-Modus wird zunächst geprüft, ob die geplanten WAF-Regeln in den Logs treffen und der vereinbarte API-Verkehr funktioniert. Danach wird die Policy auf Prevention umgestellt und die Blockwirkung anhand der folgenden Fälle bestätigt.
| Testfall | Erwartetes Ergebnis |
|---|---|
| DNS und Server-TLS | Öffentlicher Name zeigt auf die Gateway-IP; gültiges Serverzertifikat für diesen Namen |
| Ohne Client-Zertifikat, mit unbekanntem oder abgelaufenem Zertifikat | Anfrage wird am Gateway abgewiesen und erreicht SAP nicht |
| Widerrufenes Client-Zertifikat bei aktiviertem OCSP | Anfrage wird abgewiesen; Sperrprüfung ist im Access Log nachvollziehbar |
| Gültiges Client-Zertifikat, andere Quell-IP | HTTP 403 durch die IP-Regel im Prevention-Modus |
| Richtige IP und Zertifikat, nicht erlaubter Pfad oder nicht erlaubte Methode | HTTP 403, keine Weiterleitung an SAP |
| Ähnlicher Präfix und URL-kodierte Pfadvarianten außerhalb der Freigabe | Werden ebenfalls blockiert; kein Treffer im Web-Dispatcher-Access-Log |
| Richtige IP, Zertifikat, API und Methode; ungültiger SAP-Zugang | Ablehnung durch die SAP-Authentifizierung |
| Vollständig zulässiger Zugriff | Vereinbarter Lesezugriff erfolgreich; Schreibtest nur für freigegebene Operationen mit geeigneten Testdaten |
Prüft bei jedem Fall die Gateway- und WAF-Logs sowie bei zulässiger Weiterleitung die SAP-Protokolle. Haltet den getesteten API-Umfang und das Ergebnis fest. Erst nach erfolgreicher Abnahme bleibt Prevention für den Produktivverkehr aktiv.
Betrieb und Änderungen
Hinterlegt Verantwortliche und Ablaufdaten für Listener-, Backend- und Client-Zertifikate. Eine Erneuerung wird vor Ablauf einschließlich CA-Kette, Ausstellerprüfung und gegebenenfalls OCSP getestet. Private Schlüssel verbleiben beim jeweiligen Betreiber.
Bei einer Änderung der kontori-Ausgangs-IP wird die /32-Freigabe abgestimmt aktualisiert. Werden neue Datenbereiche oder Rückschreiboperationen aktiviert, prüfen kontori, SAP Basis und das Netzwerkteam gemeinsam SAP-Rollen, API-Präfixe, Methoden, Request-Grenzen und Timeouts.
Bei Fehlern helfen die beteiligten Schichten bei der Eingrenzung: TLS-/Client-Zertifikatsfehler am Listener, IP-/Pfad-/Methodenblock im WAF-Log, Backend-Verbindungsfehler unter Backend health und SAP-Berechtigungsfehler in SAP. Anschließend wird die erste Synchronisierung in kontori geprüft.