SAP Private Link Service : Connexion sécurisée aux systèmes on-premise

Catégorie
Integration
Publié
Auteur
Johannes

Le SAP Private Link Service permet une connexion réseau directe et privée entre SAP BTP et les infrastructures cloud comme Microsoft Azure ou Amazon AWS. Contrairement au Cloud Connector, la communication s’effectue entièrement via des adresses IP privées, sans utiliser l’Internet public.

Les deux technologies résolvent le même problème – la connexion sécurisée des systèmes on-premise – mais de manière différente.

Comparaison architecturale

AspectCloud ConnectorPrivate Link Service
Type de connexionTunnel via InternetConnexion réseau privée
RéseauInternet public avec TLSComplètement privé (aucune exposition Internet)
LatencePlus élevée (routage Internet)Plus faible (peering direct)
Bande passanteDépend de la connexion InternetCapacité dédiée
Logiciel on-premiseInstaller Cloud ConnectorAucun logiciel nécessaire
Fournisseur cloudTousAzure, AWS
CoûtsLicence Cloud ConnectorFrais Private Link

Private Link est idéal pour :

  • Exigences de conformité strictes : Les données ne doivent jamais quitter le réseau privé
  • Besoins en bande passante élevés : Transfert de grandes quantités de données
  • Faible latence : Applications temps réel, interfaces utilisateur interactives
  • Infrastructure basée sur Azure/AWS : Charges de travail on-premise dans le cloud

Quand utiliser Cloud Connector ?

Cloud Connector reste le bon choix pour :

  • Centres de données on-premise classiques : Serveurs physiques dans votre propre datacenter
  • Scénarios multi-cloud : Connexion de différents fournisseurs cloud
  • Configurations simples : Démarrage rapide sans peering réseau
  • Optimisation des coûts : Avec un faible volume de données

Architecture et topologie réseau

┌─────────────────────────────────────────────────────────────────────────────┐
│ SAP BTP (Cloud Foundry) │
│ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ │
│ │ Application │───>│ SAP Private Link Service │ │
│ │ ABAP Cloud │ │ │ │
│ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ │
│ │ │ Private Endpoint │ │ │
│ │ │ (IP privée : 10.0.0.5) │ │ │
│ │ └──────────────┬──────────────────────┘ │ │
│ └─────────────────│───────────────────────────┘ │
└─────────────────────────────────────────────│───────────────────────────────┘
Azure Private Link │ (Backbone privé)
(Pas d'Internet !) │
┌─────────────────────────────────────────────│───────────────────────────────┐
│ Azure Virtual Network │
│ ┌─────────────────────────────────────────┴────────────────────────────┐ │
│ │ Azure Private Link Service │ │
│ │ (IP frontend : 10.1.0.10) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────────┴──────────────────────────────────┐ │
│ │ Azure Load Balancer (Standard) │ │
│ │ (Backend : VM SAP, serveur Gateway) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ │
│ │ SAP S/4HANA │ │ SAP Gateway │ │ Autres services Azure │ │
│ │ (VM) │ │ (VM) │ │ (App Service, SQL, ...) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ SAP BTP (Cloud Foundry) │
│ ┌──────────────────┐ ┌─────────────────────────────────────────────┐ │
│ │ Application │───>│ SAP Private Link Service │ │
│ │ ABAP Cloud │ │ │ │
│ └──────────────────┘ │ ┌─────────────────────────────────────┐ │ │
│ │ │ VPC Endpoint │ │ │
│ │ │ (ENI : 10.0.1.50) │ │ │
│ │ └──────────────┬──────────────────────┘ │ │
│ └─────────────────│───────────────────────────┘ │
└─────────────────────────────────────────────│───────────────────────────────┘
AWS PrivateLink │ (Backbone AWS)
(Pas d'Internet !) │
┌─────────────────────────────────────────────│───────────────────────────────┐
│ AWS VPC │
│ ┌─────────────────────────────────────────┴────────────────────────────┐ │
│ │ VPC Endpoint Service │ │
│ │ (com.amazonaws.vpce.eu-central-1.vpce-svc-xxx) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────────────┴──────────────────────────────────┐ │
│ │ Network Load Balancer │ │
│ │ (Target Group : instances EC2 SAP) │ │
│ └───────────────────────────────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────────────┐ │
│ │ SAP S/4HANA │ │ SAP Gateway │ │ Autres services AWS │ │
│ │ (EC2) │ │ (EC2) │ │ (RDS, Lambda, ...) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘

Étape 1 : Créer les ressources Azure

# 1. Créer un groupe de ressources
az group create \
--name rg-sap-privatelink \
--location westeurope
# 2. Créer un réseau virtuel
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. Créer un sous-réseau pour Private Link Service
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

Étape 2 : Configurer le Load Balancer

# Créer un Load Balancer Standard
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
# Ajouter une sonde de santé
az network lb probe create \
--resource-group rg-sap-privatelink \
--lb-name lb-sap-gateway \
--name probe-https \
--protocol Tcp \
--port 443
# Créer une règle de load balancing
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
# Créer le Private Link Service
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
# Récupérer l'ID du Private Link Service (pour SAP BTP)
az network private-link-service show \
--resource-group rg-sap-privatelink \
--name pls-sap-gateway \
--query 'alias' -o tsv

Dans le cockpit SAP BTP :

  1. Ouvrir le Subaccount
  2. Entitlements > Configure Entitlements > Add Service Plans
  3. Ajouter Private Link Service
  4. Service Instances > Create
  5. Saisir l’alias Azure Private Link
{
"resourceId": "/subscriptions/{subscription-id}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway"
}

Étape 1 : Créer le VPC et les sous-réseaux

# Créer un VPC
aws ec2 create-vpc \
--cidr-block 10.2.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=vpc-sap-privatelink}]"
# Créer un sous-réseau
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}]"

Étape 2 : Créer un Network Load Balancer

# Créer un NLB
aws elbv2 create-load-balancer \
--name nlb-sap-gateway \
--type network \
--subnets subnet-xxxxxxxxx \
--scheme internal
# Créer un groupe cible
aws elbv2 create-target-group \
--name tg-sap-gateway \
--protocol TCP \
--port 443 \
--vpc-id vpc-xxxxxxxxx \
--target-type ip
# Enregistrer les serveurs SAP comme cibles
aws elbv2 register-targets \
--target-group-arn arn:aws:elasticloadbalancing:... \
--targets Id=10.2.1.10,Port=443
# Créer un listener
aws elbv2 create-listener \
--load-balancer-arn arn:aws:elasticloadbalancing:... \
--protocol TCP \
--port 443 \
--default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:...

Étape 3 : Créer le VPC Endpoint Service

# Créer le service de point de terminaison
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}]"
# Récupérer le nom du service (pour SAP BTP)
aws ec2 describe-vpc-endpoint-service-configurations \
--query 'ServiceConfigurations[0].ServiceName' \
--output text

Étape 4 : Configurer SAP BTP

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

Configuration du Destination Service

Après avoir configuré avec succès le Private Link Service, créez une destination dans 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.
" Utiliser une destination avec Private Link
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
).
" Appeler le service OData
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( |Succès ! Réponse : { lv_body }| ).
ELSE.
out->write( |Erreur : { lv_status-code } - { lv_status-reason }| ).
ENDIF.
lo_http_client->close( ).
CATCH cx_http_dest_provider_error INTO DATA(lx_dest).
out->write( |Erreur de destination : { lx_dest->get_text( ) }| ).
CATCH cx_web_http_client_error INTO DATA(lx_http).
out->write( |Erreur HTTP : { 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.
" Différents systèmes backend via 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.

Aspects sécurité et conformité

AspectDescription
Aucune exposition InternetLes données ne quittent jamais le réseau privé
Protection DDoSAucun point de terminaison public attaquable
Souveraineté des donnéesLes données restent dans des régions définies
ConformitéConforme RGPD, HIPAA, PCI-DSS
Piste d’auditJournalisation complète dans le fournisseur cloud

Chiffrement

┌─────────────────────────────────────────────────────────────────┐
│ Niveaux de chiffrement avec Private Link │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Transport Layer Security (TLS 1.3) │
│ - Bout en bout entre ABAP Cloud et backend │
│ - Validation de certificat des deux côtés │
│ │
│ 2. Backbone Private Link │
│ - Chiffrement interne Azure/AWS │
│ - Aucune possibilité de Man-in-the-Middle │
│ │
│ 3. Optionnel : mTLS (Mutual TLS) │
│ - Certificats client pour authentification supplémentaire │
│ │
└─────────────────────────────────────────────────────────────────┘

Groupes de sécurité réseau (NSG)

# Azure : Règles NSG pour 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
# Bloquer toutes les autres connexions entrantes
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 '*"

Liste de contrôle de conformité

ExigenceRéponse Private Link
RGPD Art. 32Mesures techniques par isolation réseau
ISO 27001Contrôle d’accès et segmentation réseau
SOC 2 Type IIConfiguration auditable
PCI-DSSAucune donnée sur réseau public
HIPAAChiffrement de bout en bout

Aperçu des coûts et recommandations de dimensionnement

ComposantPrix (approx.)
Private Endpoint (par heure)~0,01 EUR
Traitement de données (par GB)~0,01 EUR
Standard Load Balancer~0,025 EUR/heure + règles

Estimation mensuelle (charge moyenne) :

  • Private Endpoint : ~7 EUR
  • 100 GB de transfert de données : ~1 EUR
  • Load Balancer : ~25 EUR
  • Total : ~33 EUR/mois
ComposantPrix (approx.)
VPC Endpoint (par heure)~0,01 EUR
Traitement de données (par GB)~0,01 EUR
Network Load Balancer~0,02 EUR/heure + LCU

Estimation mensuelle (charge moyenne) :

  • VPC Endpoint : ~7 EUR
  • 100 GB de transfert de données : ~1 EUR
  • NLB : ~20 EUR
  • Total : ~28 EUR/mois

Recommandations de dimensionnement

ScénarioTaille Load BalancerPerformance attendue
Développement/TestBasic< 100 requêtes/sec
Petite productionStandard (1 LCU)~100-500 requêtes/sec
Production moyenneStandard (5 LCU)~500-2000 requêtes/sec
EntrepriseStandard (20+ LCU)> 2000 requêtes/sec

Planification de la bande passante

┌─────────────────────────────────────────────────────────────────┐
│ Calcul de la bande passante │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Hypothèses : │
│ - 1000 appels OData par heure │
│ - Taille moyenne de réponse : 50 KB │
│ - Facteur de pointe : 3x │
│ │
│ Calcul : │
│ - Moyenne : 1000 x 50 KB = 50 MB/heure │
│ - Pointe : 50 MB x 3 = 150 MB/heure │
│ - Quotidien (8 h) : 8 x 50 MB = 400 MB │
│ - Mensuel : 400 MB x 22 = ~9 GB │
│ │
│ Recommandation : Standard Load Balancer avec Auto-Scaling │
│ │
└─────────────────────────────────────────────────────────────────┘

Surveillance et dépannage

Surveillance Azure

# Récupérer les métriques pour Private Link Service
az monitor metrics list \
--resource /subscriptions/{sub}/resourceGroups/rg-sap-privatelink/providers/Microsoft.Network/privateLinkServices/pls-sap-gateway \
--metric BytesIn,BytesOut,ConnectionCount \
--interval PT1H
# Activer les journaux de diagnostic
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

Problèmes courants et solutions

ProblèmeCauseSolution
Connexion timeoutNSG bloqueVérifier les règles NSG
Échec de résolution DNSZone DNS privée manquanteConfigurer la zone DNS
403 ForbiddenApprobation de point de terminaison en attenteActiver l’approbation automatique ou approuver manuellement
Latence élevéeMauvaise régionAligner les régions
Interruptions de connexionHealth Check du Load BalancerVérifier les serveurs backend

Gestion des erreurs ABAP Cloud

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
).
" Définir explicitement le timeout
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 introuvable ou inaccessible
CASE lx_dest->error_code.
WHEN 'DESTINATION_NOT_FOUND'.
" Vérifier la destination dans le cockpit BTP
RAISE EXCEPTION TYPE zcx_config_error
EXPORTING text = 'Destination Private Link non configurée'.
WHEN 'CONNECTION_FAILED'.
" Vérifier la connexion Private Link
RAISE EXCEPTION TYPE zcx_network_error
EXPORTING text = 'Échec de la connexion Private Link'.
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).
" Erreur au niveau HTTP
RAISE EXCEPTION TYPE zcx_http_error
EXPORTING text = lx_http->get_text( ).
ENDTRY.
ENDMETHOD.

Migration progressive

┌─────────────────────────────────────────────────────────────────┐
│ Plan de migration : Cloud Connector → Private Link │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Phase 1 : Préparation (2-4 semaines) │
│ - Construire l'infrastructure Azure/AWS │
│ - Configurer le Private Link Service │
│ - Configurer le fonctionnement parallèle │
│ │
│ Phase 2 : Test (1-2 semaines) │
│ - Système de développement via Private Link │
│ - Effectuer des tests de performance │
│ - Établir la surveillance │
│ │
│ Phase 3 : Assurance qualité (1 semaine) │
│ - Migrer le système QA │
│ - Tests de bout en bout │
│ - Valider le plan de rollback │
│ │
│ Phase 4 : Production (1 semaine) │
│ - Basculer le système de production │
│ - Conserver Cloud Connector comme solution de secours │
│ - Phase de surveillance │
│ │
│ Phase 5 : Décommissionnement (2 semaines) │
│ - Supprimer Cloud Connector │
│ - Mettre à jour la documentation │
│ │
└─────────────────────────────────────────────────────────────────┘

Changement de destination

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

Bonnes pratiques

Recommandations pour l’exploitation

  1. Redondance : Utiliser plusieurs zones de disponibilité
  2. Surveillance : Configurer CloudWatch/Azure Monitor
  3. Alertes : Seuils pour la latence et le taux d’erreur
  4. Documentation : Maintenir la topologie réseau à jour
  5. Sécurité : Audits réguliers des règles NSG
  6. Sauvegarde : Maintenir une solution de secours via Cloud Connector

Résumé

AspectRecommandation
RégionBTP et backend dans la même région
AuthentificationOAuth2/SAML pour la propagation utilisateur
ChiffrementImposer TLS 1.3
SurveillanceMesurer la latence de bout en bout
CoûtsSurveiller le volume de transfert de données

Sujets connexes