SAP Private Link Service: On-Premise Systeme sicher anbinden

kategorie
Integration
Veröffentlicht
autor
Johannes

Der SAP Private Link Service ermoeglicht eine direkte, private Netzwerkverbindung zwischen SAP BTP und Cloud-Infrastrukturen wie Microsoft Azure oder Amazon AWS. Im Gegensatz zum Cloud Connector erfolgt die Kommunikation komplett ueber private IP-Adressen, ohne das oeffentliche Internet zu nutzen.

Beide Technologien loesen das gleiche Problem – die sichere Anbindung von On-Premise-Systemen – aber auf unterschiedliche Weise.

Architekturvergleich

AspektCloud ConnectorPrivate Link Service
VerbindungsartTunnel ueber InternetPrivate Netzwerkverbindung
NetzwerkOeffentliches Internet mit TLSKomplett privat (keine Internet-Exposition)
LatenzHoeher (Internet-Routing)Niedriger (direktes Peering)
BandbreiteAbhaengig von Internet-AnbindungDedizierte Kapazitaet
On-Premise-SoftwareCloud Connector installierenKeine Software noetig
Cloud-ProviderAlleAzure, AWS
KostenCloud Connector-LizenzPrivate Link Gebuehren

Private Link ist ideal fuer:

  • Strenge Compliance-Anforderungen: Daten duerfen das private Netzwerk nie verlassen
  • Hohe Bandbreitenanforderungen: Grosse Datenmengen transferieren
  • Niedrige Latenz: Echtzeitanwendungen, interaktive UIs
  • Azure/AWS-basierte Infrastruktur: On-Premise-Workloads in der Cloud

Wann Cloud Connector verwenden?

Cloud Connector bleibt die richtige Wahl fuer:

  • Klassische On-Premise-Rechenzentren: Physische Server im eigenen Datacenter
  • Multi-Cloud-Szenarien: Verschiedene Cloud-Provider anbinden
  • Einfache Setups: Schneller Start ohne Netzwerk-Peering
  • Kostenoptimierung: Bei geringem Datenvolumen

Architektur und Netzwerk-Topologie

┌─────────────────────────────────────────────────────────────────────────────┐
│ SAP BTP (Cloud Foundry) │
│ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ │
│ │ ABAP Cloud │───>│ SAP Private Link Service │ │
│ │ Application │ │ │ │
│ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ │
│ │ │ Private Endpoint │ │ │
│ │ │ (Private IP: 10.0.0.5) │ │ │
│ │ └──────────────┬──────────────────────┘ │ │
│ └─────────────────│───────────────────────────┘ │
└─────────────────────────────────────────────│───────────────────────────────┘
Azure Private Link │ (Private Backbone)
(Kein Internet!) │
┌─────────────────────────────────────────────│───────────────────────────────┐
│ Azure Virtual Network │
│ ┌─────────────────────────────────────────┴────────────────────────────┐ │
│ │ Azure Private Link Service │ │
│ │ (Frontend IP: 10.1.0.10) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────────┴──────────────────────────────────┐ │
│ │ Azure Load Balancer (Standard) │ │
│ │ (Backend: SAP VMs, Gateway Server) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ │
│ │ SAP S/4HANA │ │ SAP Gateway │ │ Andere Azure Services │ │
│ │ (VM) │ │ (VM) │ │ (App Service, SQL, ...) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ SAP BTP (Cloud Foundry) │
│ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ │
│ │ ABAP Cloud │───>│ SAP Private Link Service │ │
│ │ Application │ │ │ │
│ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ │
│ │ │ VPC Endpoint │ │ │
│ │ │ (ENI: 10.0.1.50) │ │ │
│ │ └──────────────┬──────────────────────┘ │ │
│ └─────────────────│───────────────────────────┘ │
└─────────────────────────────────────────────│───────────────────────────────┘
AWS PrivateLink │ (AWS Backbone)
(Kein Internet!) │
┌─────────────────────────────────────────────│───────────────────────────────┐
│ AWS VPC │
│ ┌─────────────────────────────────────────┴────────────────────────────┐ │
│ │ VPC Endpoint Service │ │
│ │ (com.amazonaws.vpce.eu-central-1.vpce-svc-xxx) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────────┴──────────────────────────────────┐ │
│ │ Network Load Balancer │ │
│ │ (Target Group: SAP EC2 Instances) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ │
│ │ SAP S/4HANA │ │ SAP Gateway │ │ Andere AWS Services │ │
│ │ (EC2) │ │ (EC2) │ │ (RDS, Lambda, ...) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘

Schritt 1: Azure-Ressourcen erstellen

# 1. Resource Group erstellen
az group create \
--name rg-sap-privatelink \
--location westeurope
# 2. Virtual Network erstellen
az network vnet create \
--resource-group rg-sap-privatelink \
--name vnet-sap \
--address-prefix 10.1.0.0/16 \
--subnet-name subnet-sap \
--subnet-prefix 10.1.1.0/24
# 3. Subnet fuer Private Link Service erstellen
az network vnet subnet create \
--resource-group rg-sap-privatelink \
--vnet-name vnet-sap \
--name subnet-privatelink \
--address-prefix 10.1.2.0/24 \
--disable-private-link-service-network-policies true

Schritt 2: Load Balancer konfigurieren

# Standard Load Balancer erstellen
az network lb create \
--resource-group rg-sap-privatelink \
--name lb-sap-gateway \
--sku Standard \
--frontend-ip-name frontend-sap \
--backend-pool-name backend-sap \
--vnet-name vnet-sap \
--subnet subnet-sap
# Health Probe hinzufuegen
az network lb probe create \
--resource-group rg-sap-privatelink \
--lb-name lb-sap-gateway \
--name probe-https \
--protocol Tcp \
--port 443
# Load Balancing Rule erstellen
az network lb rule create \
--resource-group rg-sap-privatelink \
--lb-name lb-sap-gateway \
--name rule-https \
--protocol Tcp \
--frontend-port 443 \
--backend-port 443 \
--frontend-ip-name frontend-sap \
--backend-pool-name backend-sap \
--probe-name probe-https
# Private Link Service erstellen
az network private-link-service create \
--resource-group rg-sap-privatelink \
--name pls-sap-gateway \
--vnet-name vnet-sap \
--subnet subnet-privatelink \
--lb-name lb-sap-gateway \
--lb-frontend-ip-configs frontend-sap \
--location westeurope
# Private Link Service ID abrufen (fuer SAP BTP)
az network private-link-service show \
--resource-group rg-sap-privatelink \
--name pls-sap-gateway \
--query 'alias' -o tsv

Im SAP BTP Cockpit:

  1. Subaccount oeffnen
  2. Entitlements > Configure Entitlements > Add Service Plans
  3. Private Link Service hinzufuegen
  4. Service Instances > Create
  5. Azure Private Link Alias eingeben
{
"resourceId": "/subscriptions/{subscription-id}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway"
}

Schritt 1: VPC und Subnets erstellen

# VPC erstellen
aws ec2 create-vpc \
--cidr-block 10.2.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=vpc-sap-privatelink}]'
# Subnet erstellen
aws ec2 create-subnet \
--vpc-id vpc-xxxxxxxxx \
--cidr-block 10.2.1.0/24 \
--availability-zone eu-central-1a \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=subnet-sap}]'

Schritt 2: Network Load Balancer erstellen

# NLB erstellen
aws elbv2 create-load-balancer \
--name nlb-sap-gateway \
--type network \
--subnets subnet-xxxxxxxxx \
--scheme internal
# Target Group erstellen
aws elbv2 create-target-group \
--name tg-sap-gateway \
--protocol TCP \
--port 443 \
--vpc-id vpc-xxxxxxxxx \
--target-type ip
# SAP-Server als Targets registrieren
aws elbv2 register-targets \
--target-group-arn arn:aws:elasticloadbalancing:... \
--targets Id=10.2.1.10,Port=443
# Listener erstellen
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:... \
--protocol TCP \
--port 443 \
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:...

Schritt 3: VPC Endpoint Service erstellen

# Endpoint Service erstellen
aws ec2 create-vpc-endpoint-service-configuration \
--network-load-balancer-arns arn:aws:elasticloadbalancing:... \
--acceptance-required \
--tag-specifications 'ResourceType=vpc-endpoint-service,Tags=[{Key=Name,Value=vpce-svc-sap}]'
# Service Name abrufen (fuer SAP BTP)
aws ec2 describe-vpc-endpoint-service-configurations \
--query 'ServiceConfigurations[0].ServiceName' \
--output text

Schritt 4: SAP BTP konfigurieren

{
"serviceName": "com.amazonaws.vpce.eu-central-1.vpce-svc-xxxxxxxxx"
}

Destination Service Konfiguration

Nach erfolgreicher Einrichtung des Private Link Service erstellen Sie eine Destination in SAP BTP:

{
"Name": "PRIVATE_LINK_S4HANA",
"Type": "HTTP",
"URL": "https://private-endpoint-url:443",
"ProxyType": "PrivateLink",
"Authentication": "BasicAuthentication",
"User": "ABAP_USER",
"Password": "xxxxxxxx",
"sap.applicationdevelopment.actions.enabled": "true",
"sap.processautomation.enabled": "true",
"HTML5.ForwardAuthToken": "true"
}
CLASS zcl_private_link_demo DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS zcl_private_link_demo IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
" Destination mit Private Link verwenden
TRY.
DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination(
i_name = 'PRIVATE_LINK_S4HANA'
i_authn_mode = if_a4c_cp_service=>user_propagation
).
DATA(lo_http_client) = cl_web_http_client_manager=>create_by_http_destination(
i_destination = lo_destination
).
" OData-Service aufrufen
DATA(lo_request) = lo_http_client->get_http_request( ).
lo_request->set_uri_path( '/sap/opu/odata/sap/API_BUSINESS_PARTNER/A_BusinessPartner' ).
lo_request->set_header_field(
i_name = 'Accept'
i_value = 'application/json'
).
DATA(lo_response) = lo_http_client->execute( if_web_http_client=>get ).
DATA(lv_status) = lo_response->get_status( ).
DATA(lv_body) = lo_response->get_text( ).
IF lv_status-code = 200.
out->write( |Erfolg! Antwort: { lv_body }| ).
ELSE.
out->write( |Fehler: { lv_status-code } - { lv_status-reason }| ).
ENDIF.
lo_http_client->close( ).
CATCH cx_http_dest_provider_error INTO DATA(lx_dest).
out->write( |Destination-Fehler: { lx_dest->get_text( ) }| ).
CATCH cx_web_http_client_error INTO DATA(lx_http).
out->write( |HTTP-Fehler: { lx_http->get_text( ) }| ).
ENDTRY.
ENDMETHOD.
ENDCLASS.
CLASS zcl_multi_backend_demo DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_backend_result,
system_name TYPE string,
status TYPE i,
data TYPE string,
END OF ty_backend_result,
tt_backend_results TYPE STANDARD TABLE OF ty_backend_result WITH EMPTY KEY.
METHODS:
call_all_backends
RETURNING VALUE(rt_results) TYPE tt_backend_results.
ENDCLASS.
CLASS zcl_multi_backend_demo IMPLEMENTATION.
METHOD call_all_backends.
" Verschiedene Backend-Systeme ueber Private Link
DATA(lt_destinations) = VALUE string_table(
( `PRIVATE_LINK_S4HANA` )
( `PRIVATE_LINK_ECC` )
( `PRIVATE_LINK_CRM` )
).
LOOP AT lt_destinations INTO DATA(lv_destination).
DATA(ls_result) = VALUE ty_backend_result( system_name = lv_destination ).
TRY.
DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination(
i_name = lv_destination
).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination(
lo_destination
).
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
ls_result-status = lo_response->get_status( )-code.
ls_result-data = lo_response->get_text( ).
lo_client->close( ).
CATCH cx_root INTO DATA(lx_error).
ls_result-status = 500.
ls_result-data = lx_error->get_text( ).
ENDTRY.
APPEND ls_result TO rt_results.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

Security-Aspekte und Compliance

AspektBeschreibung
Keine Internet-ExpositionDaten verlassen nie das private Netzwerk
DDoS-SchutzKeine oeffentlichen Endpunkte angreifbar
Daten-SouveraenitaetDaten bleiben in definierten Regionen
ComplianceGDPR, HIPAA, PCI-DSS konform
Audit-TrailVollstaendige Protokollierung im Cloud-Provider

Verschluesselung

┌─────────────────────────────────────────────────────────────────┐
│ Verschluesselungsebenen bei Private Link │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Transport Layer Security (TLS 1.3) │
│ - Ende-zu-Ende zwischen ABAP Cloud und Backend │
│ - Zertifikatsvalidierung auf beiden Seiten │
│ │
│ 2. Private Link Backbone │
│ - Azure/AWS interne Verschluesselung │
│ - Keine Moeglichkeit fuer Man-in-the-Middle │
│ │
│ 3. Optional: mTLS (Mutual TLS) │
│ - Client-Zertifikate fuer zusaetzliche Authentifizierung │
│ │
└─────────────────────────────────────────────────────────────────┘

Network Security Groups (NSG)

# Azure: NSG Rules fuer Private Link
az network nsg rule create \
--resource-group rg-sap-privatelink \
--nsg-name nsg-sap \
--name allow-privatelink-inbound \
--priority 100 \
--direction Inbound \
--source-address-prefixes 10.0.0.0/8 \
--destination-port-ranges 443 \
--access Allow \
--protocol Tcp
# Alle anderen eingehenden Verbindungen blockieren
az network nsg rule create \
--resource-group rg-sap-privatelink \
--nsg-name nsg-sap \
--name deny-internet-inbound \
--priority 4096 \
--direction Inbound \
--source-address-prefixes Internet \
--destination-port-ranges '*' \
--access Deny \
--protocol '*'

Compliance-Checkliste

AnforderungPrivate Link Erfuellung
GDPR Art. 32Technische Massnahmen durch Netzwerkisolation
ISO 27001Zugriffskontrolle und Netzwerksegmentierung
SOC 2 Type IIAuditierbare Konfiguration
PCI-DSSKeine Daten ueber oeffentliches Netzwerk
HIPAAEnde-zu-Ende-Verschluesselung

Kostenuebersicht und Sizing-Empfehlungen

KomponentePreis (ca.)
Private Endpoint (pro Stunde)~0,01 EUR
Datenverarbeitung (pro GB)~0,01 EUR
Standard Load Balancer~0,025 EUR/Stunde + Regeln

Monatliche Schaetzung (mittlere Last):

  • Private Endpoint: ~7 EUR
  • 100 GB Datentransfer: ~1 EUR
  • Load Balancer: ~25 EUR
  • Gesamt: ~33 EUR/Monat
KomponentePreis (ca.)
VPC Endpoint (pro Stunde)~0,01 EUR
Datenverarbeitung (pro GB)~0,01 EUR
Network Load Balancer~0,02 EUR/Stunde + LCU

Monatliche Schaetzung (mittlere Last):

  • VPC Endpoint: ~7 EUR
  • 100 GB Datentransfer: ~1 EUR
  • NLB: ~20 EUR
  • Gesamt: ~28 EUR/Monat

Sizing-Empfehlungen

SzenarioLoad Balancer GroesseErwartete Performance
Entwicklung/TestBasic< 100 Requests/Sek
Kleine ProduktionStandard (1 LCU)~100-500 Requests/Sek
Mittlere ProduktionStandard (5 LCU)~500-2000 Requests/Sek
EnterpriseStandard (20+ LCU)> 2000 Requests/Sek

Bandbreitenplanung

┌─────────────────────────────────────────────────────────────────┐
│ Bandbreiten-Kalkulation │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Annahmen: │
│ - 1000 OData-Aufrufe pro Stunde │
│ - Durchschnittliche Antwortgroesse: 50 KB │
│ - Peak-Faktor: 3x │
│ │
│ Berechnung: │
│ - Durchschnitt: 1000 x 50 KB = 50 MB/Stunde │
│ - Peak: 50 MB x 3 = 150 MB/Stunde │
│ - Taeglich (8 Std): 8 x 50 MB = 400 MB │
│ - Monatlich: 400 MB x 22 = ~9 GB │
│ │
│ Empfehlung: Standard Load Balancer mit Auto-Scaling │
│ │
└─────────────────────────────────────────────────────────────────┘

Monitoring und Troubleshooting

Azure Monitoring

# Metriken fuer Private Link Service abrufen
az monitor metrics list \
--resource /subscriptions/{sub}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway \
--metric BytesIn,BytesOut,ConnectionCount \
--interval PT1H
# Diagnose-Logs aktivieren
az monitor diagnostic-settings create \
--name pls-diagnostics \
--resource /subscriptions/{sub}/resourceGroups/.../pls-sap-gateway \
--logs '[{"category": "PrivateLinkServiceLogs", "enabled": true}]' \
--workspace /subscriptions/{sub}/resourceGroups/.../workspaces/log-analytics

Haeufige Probleme und Loesungen

ProblemUrsacheLoesung
Verbindung timeoutNSG blockiertNSG-Regeln pruefen
DNS-Aufloesung fehlgeschlagenPrivate DNS Zone fehltDNS-Zone konfigurieren
403 ForbiddenEndpoint-Genehmigung ausstehendAuto-Approval aktivieren oder manuell genehmigen
Hohe LatenzFalsche RegionRegionen angleichen
VerbindungsabbruecheLoad Balancer Health CheckBackend-Server pruefen

ABAP Cloud Fehlerbehandlung

METHOD handle_private_link_errors.
TRY.
DATA(lo_destination) = cl_http_destination_provider=>create_by_cloud_destination(
i_name = 'PRIVATE_LINK_S4HANA'
).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination(
lo_destination
).
" Timeout explizit setzen
lo_client->set_timeout( 30 ).
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
CATCH cx_http_dest_provider_error INTO DATA(lx_dest).
" Destination nicht gefunden oder nicht erreichbar
CASE lx_dest->error_code.
WHEN 'DESTINATION_NOT_FOUND'.
" Destination im BTP Cockpit pruefen
RAISE EXCEPTION TYPE zcx_config_error
EXPORTING text = 'Private Link Destination nicht konfiguriert'.
WHEN 'CONNECTION_FAILED'.
" Private Link Verbindung pruefen
RAISE EXCEPTION TYPE zcx_network_error
EXPORTING text = 'Private Link Verbindung fehlgeschlagen'.
WHEN OTHERS.
RAISE EXCEPTION TYPE zcx_unknown_error
EXPORTING text = lx_dest->get_text( ).
ENDCASE.
CATCH cx_web_http_client_error INTO DATA(lx_http).
" HTTP-Level Fehler
RAISE EXCEPTION TYPE zcx_http_error
EXPORTING text = lx_http->get_text( ).
ENDTRY.
ENDMETHOD.

Schrittweise Migration

┌─────────────────────────────────────────────────────────────────┐
│ Migrationsplan: Cloud Connector → Private Link │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Phase 1: Vorbereitung (2-4 Wochen) │
│ - Azure/AWS Infrastruktur aufbauen │
│ - Private Link Service einrichten │
│ - Parallelbetrieb konfigurieren │
│ │
│ Phase 2: Test (1-2 Wochen) │
│ - Entwicklungssystem ueber Private Link │
│ - Performance-Tests durchfuehren │
│ - Monitoring etablieren │
│ │
│ Phase 3: Qualitaetssicherung (1 Woche) │
│ - QA-System migrieren │
│ - End-to-End Tests │
│ - Rollback-Plan validieren │
│ │
│ Phase 4: Produktion (1 Woche) │
│ - Produktivsystem umstellen │
│ - Cloud Connector als Fallback behalten │
│ - Ueberwachungsphase │
│ │
│ Phase 5: Dekommissionierung (2 Wochen) │
│ - Cloud Connector entfernen │
│ - Dokumentation aktualisieren │
│ │
└─────────────────────────────────────────────────────────────────┘

Destination-Umstellung

{
"_comment": "Vorher: Cloud Connector",
"Name": "S4HANA_BACKEND",
"Type": "HTTP",
"URL": "http://virtual-host:443",
"ProxyType": "OnPremise",
"CloudConnectorLocationId": "LOC1"
}
{
"_comment": "Nachher: Private Link",
"Name": "S4HANA_BACKEND",
"Type": "HTTP",
"URL": "https://private-endpoint-url:443",
"ProxyType": "PrivateLink"
}

Best Practices

Empfehlungen fuer den Betrieb

  1. Redundanz: Mehrere Availability Zones nutzen
  2. Monitoring: CloudWatch/Azure Monitor einrichten
  3. Alerting: Schwellwerte fuer Latenz und Fehlerrate
  4. Dokumentation: Netzwerk-Topologie aktuell halten
  5. Security: Regelmaessige Audits der NSG-Regeln
  6. Backup: Fallback ueber Cloud Connector bereithalten

Zusammenfassung

AspektEmpfehlung
RegionBTP und Backend in gleicher Region
AuthentifizierungOAuth2/SAML fuer User Propagation
VerschluesselungTLS 1.3 erzwingen
MonitoringEnd-to-End Latenz messen
KostenDatentransfer-Volumen ueberwachen

Verwandte Themen