Solution Design — Plateforme Digitale CLS sur Azure

ReferenceCLS-DIT-CP-26-0012
AuteurChristophe Kersuzan — Digital Manager — DSI CLS
DateAvril 2026
Version1.0
ClassificationInterne — Diffusion restreinte
DestinatairesRSSI, Equipe Securite SI, DSI
Document lieCLS-DIT-CP-25-0045 — Architecture Sandbox IA (dec. 2025)

Sommaire

  1. Objet du document
  2. Perimetre fonctionnel
  3. Architecture technique
  4. Matrice des flux reseau
  5. Securite — Authentification et autorisation
  6. Securite — Protection des donnees
  7. Securite — Isolation et surface d'attaque
  8. Conformite et certifications
  9. Choix technologiques — Azure AI Foundry vs alternatives
  10. Sauvegarde, continuite et MCO
  11. Gouvernance et audit
  12. Synthese des risques

1. Objet du document

Ce document decrit l'architecture de securite de la Plateforme Digitale CLS, un ensemble d'applications web metier hebergees dans le tenant Azure CLS existant. Il s'adresse a l'equipe securite SI et au RSSI pour valider la conformite de cette architecture avec la politique de securite CLS.

La plateforme repond au besoin exprime dans le document CLS-DIT-CP-25-0045 (Architecture Sandbox IA, decembre 2025) avec une approche differente : au lieu d'exposer des services internes via une DMZ, les services sont heberges nativement dans Azure, isoles du reseau CLS.

Principe directeur : zero flux entre la plateforme Azure et le reseau interne CLS. L'architecture elimine les problemes de securite reseau au lieu de les gerer.

2. Perimetre fonctionnel

La plateforme couvre 6 applications web metier et un moteur d'orchestration :

ApplicationFonctionUtilisateursDonnees traiteesStatut
Hub CLSPortail central d'acces aux outils digitauxEquipe DSIAucune donnee (portail statique)Prod
Pause CafeGestion des demandes de pauses cafe (4 roles)Hotesses, EADM, directionsDemandes, noms, emails CLSProd
Checklist SallesControle quotidien des salles de reunionService DeskControles, etats des sallesProd
Flotte MobileDashboard lignes mobiles (consolidation ADP/Intune)EADM, DSINumeros, operateurs, collaborateursProd
VMS IndonesiaSuivi commandes VMS (pipeline Zoho/OCR/PostgreSQL)Equipe VMSCommandes, clients indonesiensProd
Transcript CRGeneration de comptes-rendus par IA (audio/texte)Equipe DigitalTranscriptions, comptes-rendusProd
n8n LabsOrchestration workflows (webhooks, ETL, veille, emails)Admin uniquementDonnees de transit (non persistees)Prod
Donnees exclues du perimetre : aucune donnee classifiee defense, aucune donnee RH (salaires, evaluations), aucune donnee medicale, aucune donnee bancaire. Les donnees traitees sont exclusivement des donnees metier courantes.

3. Architecture technique

3.1 Vue d'ensemble

graph TB subgraph Users["Utilisateurs"] U1["Collaborateur CLS
(navigateur + MFA)"] end subgraph Azure["Tenant Azure CLS — Souscription existante"] subgraph SWAs["Azure Static Web Apps"] HUB["Hub CLS"] PC["Pause Cafe"] CK["Checklist Salles"] FM["Flotte Mobile"] VMS["VMS Dashboard"] TR["Transcript CR"] end AUTH["Azure AD
SSO + MFA
(provider integre)"] subgraph Compute["Compute"] FN["Azure Functions
(managed dans SWA)
Node.js 18"] ACA["Azure Container Apps
(Consumption plan)
n8n orchestration"] end subgraph Data["Stockage"] COSMOS[("Azure Cosmos DB
NoSQL — free tier
Chiffrement AES-256")] PG[("Azure PostgreSQL
Flexible Server B1ms
SSL obligatoire")] end subgraph AI["IA"] FOUNDRY["Azure AI Foundry
GPT-4.1-mini / Grok
Region France Central"] end KV["Azure Key Vault
(secrets)"] MON["Azure Monitor
+ Log Analytics"] end subgraph External["Services externes"] GRAPH["Microsoft Graph API
Mail.Send"] ZOHO["Zoho Creator / Desk
API REST"] RSS["Flux RSS publics"] end U1 -->|"HTTPS 443
SSO Azure AD + MFA"| SWAs SWAs --> AUTH SWAs -->|"API interne"| FN FN --> COSMOS FN --> PG ACA --> PG ACA --> FOUNDRY ACA -->|"OAuth2 client_credentials"| GRAPH ACA -->|"OAuth2"| ZOHO ACA --> RSS SWAs -.->|"webhooks API key"| ACA FN -.-> KV ACA -.-> MON style Azure fill:#eff6ff,stroke:#1e3a5f,stroke-width:2px style SWAs fill:#dbeafe,stroke:#3b82f6,stroke-width:1px style Compute fill:#e0f2fe,stroke:#0284c7,stroke-width:1px style Data fill:#f0fdf4,stroke:#22c55e,stroke-width:1px style AI fill:#fef3c7,stroke:#f59e0b,stroke-width:1px style External fill:#f1f5f9,stroke:#94a3b8,stroke-width:1px style Users fill:#fff,stroke:#94a3b8,stroke-width:1px

3.2 Services Azure utilises

ServiceRoleTierRegionCertifications
Azure Static Web AppsHebergement des 6 frontends + APIs serverlessFreeWest EuropeISO 27001, SOC 2, GDPR
Azure FunctionsAPIs backend (managed dans SWA)Inclus dans SWAWest EuropeISO 27001, SOC 2, GDPR
Azure Container Appsn8n (orchestration workflows)ConsumptionFrance CentralISO 27001, SOC 2, GDPR
Azure Cosmos DBBase NoSQL (PauseCafe, Checklist)Free (400 RU/s)France CentralISO 27001, SOC 2, GDPR, HIPAA
Azure PostgreSQL FlexibleBase relationnelle (n8n, VMS, Flotte)Burstable B1msFrance CentralISO 27001, SOC 2, GDPR
Azure AI FoundryInference LLM (GPT-4.1-mini, Grok)Pay-per-tokenFrance CentralISO 27001, SOC 2, GDPR
Microsoft Graph APIEnvoi emails (CLSWorkflow@)Inclus M365EU Data BoundaryISO 27001, SOC 2, GDPR
Tous les services sont dans le tenant Azure CLS existant, visibles dans le portail Azure, geres par la meme souscription et les memes politiques de gouvernance. Aucun compte cloud externe.

4. Matrice des flux reseau

4.1 Flux entrants (Utilisateurs / Services externes → Azure)

IDSourceDestinationPortProtoDescriptionAuthentificationImpact LAN
IN-01Navigateurs CLSAzure Static Web Apps443HTTPSAcces aux 6 webapps metierAzure AD SSO + MFAAUCUN
IN-02Azure SWAAzure Functions443HTTPSAppels API (CRUD donnees metier)x-ms-client-principal (SSO)AUCUN
IN-03Zoho Creator (SaaS)n8n (Container Apps)443HTTPSWebhooks formulaires VMS IndonesieSecret partage (header)AUCUN
IN-04Azure SWAn8n (Container Apps)443HTTPSWebhooks alertes M42, envoi CRAPI Key (header)AUCUN
IN-05Admin (navigateur)n8n (Container Apps)443HTTPSInterface admin n8nLogin/password n8nAUCUN

4.2 Flux sortants (Azure → Services externes)

IDSourceDestinationPortProtoDescriptionAuthentificationImpact LAN
OUT-01Azure FunctionsMicrosoft Graph API443HTTPSEnvoi emails (clsworkflow@groupcls.com)OAuth2 client_credentialsAUCUN
OUT-02n8n (Container Apps)Azure AI Foundry443HTTPSInference LLM (GPT, Grok)API Key AzureAUCUN
OUT-03n8n (Container Apps)desk.zoho.eu443HTTPSAPI Zoho Desk (synchro tickets)OAuth2AUCUN
OUT-04n8n (Container Apps)Flux RSS publics443HTTPSVeille automatisee (6 flux)Aucune (publics)AUCUN

4.3 Flux intra-Azure (internes au tenant)

IDSourceDestinationDescriptionSecurite
INT-01Static Web AppsAzure ADAuthentification SSO (redirection OpenID Connect)OAuth2 / OIDC / TLS
INT-02Azure FunctionsCosmos DBLecture/ecriture donnees applicativesConnection string + TLS
INT-03Container AppsPostgreSQL FlexibleBase de donnees n8n, VMS, FlotteSSL obligatoire
INT-04Container AppsAI FoundryInference LLMAPI Key + TLS

4.4 Schema des flux

graph TB subgraph IN["Flux entrants (Internet → Azure)"] direction TB I1["IN-01 : Navigateurs CLS → SWA (SSO+MFA)"] I2["IN-02 : SWA → Azure Functions (header SSO)"] I3["IN-03 : Zoho → n8n (secret partage)"] I4["IN-04 : SWA → n8n (API key)"] I5["IN-05 : Admin → n8n (login)"] end subgraph OUT["Flux sortants (Azure → SaaS)"] direction TB O1["OUT-01 : Functions → Graph API (OAuth2)"] O2["OUT-02 : n8n → AI Foundry (API key)"] O3["OUT-03 : n8n → Zoho API (OAuth2)"] O4["OUT-04 : n8n → RSS publics"] end subgraph LAN["Reseau LAN CLS"] NONE["AUCUN FLUX
Zero connexion entrante ou sortante
Pas de VPN, peering, tunnel ou DMZ"] end style IN fill:#dbeafe,stroke:#2563eb style OUT fill:#f0fdf4,stroke:#22c55e style LAN fill:#fef2f2,stroke:#ef4444,stroke-width:2px style NONE fill:#fee2e2,stroke:#ef4444,color:#dc2626
Resultat : ZERO flux vers/depuis le LAN CLS
Aucune ouverture de port, aucune modification firewall, aucune DMZ, aucun reverse proxy, aucun VPN. Le reseau interne CLS est strictement inchange.

5. Securite — Authentification et autorisation

5.1 Authentification des utilisateurs

ComposantMecanismeDetail
Frontends (6 SWA)Azure AD SSO (provider integre)Redirection automatique vers login.microsoftonline.com. Le collaborateur CLS se connecte avec son compte Microsoft habituel. MFA appliquee par la politique Azure AD CLS existante.
APIs (Azure Functions)Header x-ms-client-principalInjecte par Azure apres authentification SSO. Contient l'identite du principal (email, roles). Impossible a falsifier cote client car injecte par le reverse proxy Azure.
n8n (admin)Login/password n8nCompte admin unique. Interface d'edition des workflows. Acces restreint a l'equipe Digital.
Webhooks (n8n)API Key / Secret partageChaque webhook valide un secret dans le header. Aucun webhook ouvert sans authentification.

5.2 Parcours d'authentification

sequenceDiagram participant U as Collaborateur CLS participant SWA as Azure Static Web App participant AAD as Azure AD (tenant CLS) participant FN as Azure Function (API) participant DB as Base de donnees U->>SWA: GET https://pausecafe.groupcls.com SWA->>SWA: Pas de cookie de session SWA->>U: 302 Redirect /.auth/login/aad U->>AAD: Login Microsoft AAD->>AAD: Verification identite + MFA AAD->>SWA: Token OpenID Connect SWA->>U: Cookie de session + page HTML U->>FN: POST /api/demandes (avec cookie) SWA->>FN: Injecte header x-ms-client-principal FN->>FN: Decode header → email, roles FN->>FN: Verifie autorisation (role admin/hotesse/eadm/user) FN->>DB: Operation autorisee FN-->>U: 200 OK

5.3 Gestion des roles applicatifs

RoleComptes associesDroits
Adminckersuzan@, ltallieu@, jpoullaouec@Tout : lecture, creation, modification, suppression
Hotesseaccueil@groupcls.comModification statut, date/heure/salle, commentaire, suppression
EADMadmin-pause-cafe@groupcls.comModification date/heure/salle, suppression
UserTout @groupcls.comCreation de demande uniquement
Les roles sont definis dans le code de l'API (liste d'emails autorises), pas dans Azure AD. Cela permet de gerer les roles sans intervention sur le tenant Azure AD.

6. Securite — Protection des donnees

ExigenceImplementation
Chiffrement en transitTLS 1.2+ sur tous les flux (entrants, sortants, intra-Azure). Certificats geres automatiquement par Azure (Let's Encrypt). HTTPS obligatoire, pas de HTTP.
Chiffrement au reposCosmos DB : AES-256 par defaut (Microsoft-managed keys). PostgreSQL Flexible : chiffrement disque active par defaut. Credentials n8n : AES-256-GCM dans la base PostgreSQL.
Localisation des donneesFrance Central pour PostgreSQL, Cosmos DB, Container Apps, AI Foundry. West Europe (Pays-Bas) pour les Static Web Apps. Aucune donnee hors UE.
Donnees en transit vers l'IAAzure AI Foundry dans le meme tenant CLS, region France Central. Les prompts et reponses ne quittent pas l'infrastructure Azure CLS. Pas de training sur les donnees client (opt-out par defaut sur Azure AI).
Secrets et credentialsConnection strings et API keys dans les Application Settings des SWA et Container Apps (chiffrees au repos). Jamais dans le code source.
Donnees sensibles excluesAucune donnee RH, medicale, bancaire ou classifiee defense n'est traitee sur cette plateforme. Les donnees sont des commandes VMS, lignes mobiles, demandes pause-cafe, controles salles, veille publique.

7. Securite — Isolation et surface d'attaque

7.1 Isolation reseau

QuestionReponse
La plateforme a-t-elle acces au LAN CLS ?Non. Aucun VPN, aucun peering reseau, aucun tunnel, aucune DMZ. Les services Azure sont 100% isoles du reseau interne.
Un attaquant qui compromet un conteneur peut-il atteindre le LAN ?Non. Il n'existe aucun chemin reseau entre Azure Container Apps et le reseau CLS. Meme avec un acces root sur le conteneur, l'attaquant reste confine dans l'environnement Azure.
Les webapps exposent-elles des ports non standard ?Non. Seul le port 443 (HTTPS) est expose. Aucun port SSH, FTP ou base de donnees n'est accessible depuis Internet.
Les bases de donnees sont-elles accessibles depuis Internet ?Non. Cosmos DB et PostgreSQL sont accessibles uniquement depuis les services Azure autorises (Azure Functions, Container Apps) via connection string. Pas d'endpoint public expose.

7.2 Surface d'attaque comparee

VecteurOption DMZ (doc original)Option Azure (actuelle)
Port expose sur le LAN443 (reverse proxy DMZ)Aucun
Mouvement lateralPossible si DMZ compromiseImpossible (aucune connexion reseau)
WAF / Firewall requisOui (a deployer et maintenir)Non (isole par design)
Maintenance securitePatching OS, WAF, reverse proxyGeree par Microsoft (PaaS)
Surface d'attaqueLAN CLS + DMZ + services exposesIdentique a un App Service Azure

7.3 En-tetes de securite HTTP

Chaque application configure les en-tetes suivants dans staticwebapp.config.json :

En-teteValeurProtection
X-Frame-OptionsDENYClickjacking
X-Content-Type-OptionsnosniffMIME sniffing
Strict-Transport-SecurityGere par AzureDowngrade HTTPS

8. Conformite et certifications

CertificationServices couvertsPertinence CLS
ISO 27001Tous les services Azure utilisesAlignement avec la politique SMSI CLS
SOC 2 Type IITous les services Azure utilisesControles de securite audites par un tiers
GDPRTous les services Azure utilisesDonnees en UE (France Central / West Europe)
CSA STARAzure globalTransparence sur les pratiques cloud
EU Data BoundaryMicrosoft Graph, Azure ADDonnees d'identite et emails traites en UE
Microsoft publie ses rapports d'audit sur le Service Trust Portal (servicetrust.microsoft.com). Les certifications sont verifiables par le RSSI.

9. Choix technologiques — Azure AI Foundry vs alternatives

L'equipe securite peut questionner le choix d'Azure AI Foundry pour l'inference IA. Voici la justification par rapport aux alternatives.

9.1 Pourquoi Azure AI Foundry

Azure AI Foundry (retenu)

  • Meme tenant, meme gouvernance — le service est dans la souscription Azure CLS. Pas de compte cloud supplementaire a creer, auditer ou gouverner
  • Meme Azure AD — l'acces aux modeles IA est controle par le meme IAM que le reste de l'infra CLS
  • Region France Central — les prompts et reponses restent en France. Pas de transfert transatlantique
  • Pas de training sur les donnees — opt-out par defaut sur Azure AI. Les donnees CLS ne sont pas utilisees pour entrainer les modeles
  • Facturation unifiee — meme facture Azure, meme centre de cout, meme reporting
  • Modeles disponibles — GPT-4.1-mini (classification, resume, generation), Grok (raisonnement complexe) couvrent 100% des cas d'usage actuels
  • Audit trail unifie — Azure Monitor + Log Analytics pour toutes les requetes IA

AWS Bedrock (ecarte)

  • Compte AWS supplementaire — necessite un compte AWS CLS separe, avec son propre IAM, ses propres politiques, son propre audit
  • Double gouvernance — deux consoles cloud a surveiller, deux jeux de credentials, deux facturations
  • Transfert cross-cloud — les donnees transitent entre Azure (ou les apps vivent) et AWS (ou l'IA traite). Complexite reseau et conformite
  • Pas d'integration Azure AD — authentification separee (IAM AWS), pas de SSO avec le tenant CLS
  • Region — Bedrock disponible en eu-west-1 (Irlande), pas en France. Les prompts quittent la France
  • Modeles disponibles : Claude, Llama, Mistral (bons modeles, mais necessitent l'infrastructure AWS)

9.2 Comparatif securite detaille

Critere securiteAzure AI FoundryAWS Bedrock
Perimetre de gouvernanceMeme tenant Azure CLSNouveau compte AWS a creer
AuthentificationAzure AD existant (SSO CLS)AWS IAM separe
Localisation donneesFrance Centraleu-west-1 (Irlande)
Transfert inter-cloudAucun (tout dans Azure)Azure → AWS → Azure
AuditAzure Monitor (unifie)CloudTrail (separe) + Azure Monitor
FacturationSouscription CLS existanteNouveau compte de facturation
Opt-out trainingPar defautPar defaut
CertificationsISO 27001, SOC 2, GDPRISO 27001, SOC 2, GDPR
Surface d'attaque ajouteeNulle (service existant)+1 cloud provider a securiser

9.3 Autres alternatives evaluees

AlternativeRaison de l'ecart
OpenAI API directeDonnees transitent vers l'infrastructure OpenAI (US). Pas de garantie de localisation UE. Pas d'integration Azure AD. Aucune certification partagee avec le tenant CLS.
Google Vertex AIMeme probleme qu'AWS : nouveau compte cloud GCP, double gouvernance, transfert cross-cloud. Region europe-west1 (Belgique) acceptable, mais complexite injustifiee.
IA locale (Llama / Ollama)Pertinent pour les donnees hautement confidentielles (RH, Legal). Hors perimetre de ce document. Complementaire, non concurrent.
Azure OpenAI (ancien nom)Renomme Azure AI Foundry. C'est le meme service. Le nom a change en 2025.
Principe : un seul cloud, un seul perimetre de gouvernance. Ajouter un second cloud provider (AWS, GCP) pour un seul service (IA) doublerait la surface d'attaque a gouverner sans apporter d'avantage fonctionnel. Azure AI Foundry couvre 100% des cas d'usage IA actuels de CLS.

10. Sauvegarde, continuite et MCO

ComposantStrategie de sauvegardeRPORTO
Azure PostgreSQLBackup automatique Azure (snapshots incrementaux)5 min (point-in-time restore)< 1h
Cosmos DBBackup continu Azure (point-in-time restore)Dernieres 30 secondes< 1h
Code source (6 apps)GitHub (repos prives CLS), historique completDernier commit< 5 min (redeploy)
Workflows n8nExport JSON dans le repo GitHub + backup PostgreSQLDernier export< 30 min (reimport)
Secrets / credentialsSauvegarde chiffree des Application Settings (fichiers JSON)Derniere sauvegarde manuelle< 15 min
Cle de chiffrement n8nDocumentee et sauvegardee hors-ligneN/A (statique)Disponible immediatement

Mise a jour et maintenance

ComposantStrategieFrequence
Static Web AppsDeploiement automatique via GitHub Actions (CI/CD)A chaque push
Azure FunctionsDeploiees avec les SWA (meme pipeline)A chaque push
n8n (conteneur)Mise a jour image Docker via Container Apps revisionMensuelle (patch securite)
PostgreSQL / Cosmos DBPatches geres par Microsoft (PaaS)Automatique
Certificats TLSGeres automatiquement par Azure (Let's Encrypt)Renouvellement auto

11. Gouvernance et audit

ExigenceImplementation
VisibiliteToutes les ressources sont dans le portail Azure CLS, Resource Group rg-checklist-salles. Visible par tout administrateur Azure CLS.
Logs d'accesAzure AD sign-in logs pour les connexions SSO. Azure Monitor pour les requetes API.
Logs d'executionn8n conserve l'historique des executions (30 jours). Azure Container Apps logs disponibles dans Log Analytics.
Historique des deploymentsGitHub Actions : historique complet de chaque deploiement avec diff du code, auteur, date.
Versionning du codeGit (GitHub repos prives CLS). Chaque modification est tracee, reversible, auditable.
ResponsableChristophe Kersuzan — Digital Manager — DSI CLS
Reprise en cas de departCode en HTML/CSS/JS standard (pas de framework proprietaire). Workflows n8n en interface visuelle (drag & drop). Documentation INFRA.md dans chaque repo. Plus facile a reprendre qu'un Power Automate complexe.

12. Synthese des risques

IDRisqueProbabiliteImpactMitigation
R1 Compromission d'un conteneur Azure Faible Moyen Conteneur isole (Azure Container Apps). Aucun acces au LAN CLS. Aucun mouvement lateral possible. Image Docker reconstruite a chaque mise a jour.
R2 Fuite de donnees via l'IA Faible Moyen Azure AI Foundry dans le meme tenant, region France Central. Opt-out training par defaut. Aucune donnee classifiee traitee. Donnees metier courantes uniquement.
R3 Perte de donnees Tres faible Moyen Backup automatique Azure (PostgreSQL 7j, Cosmos DB 30j). Code source sur GitHub. Cle de chiffrement n8n sauvegardee hors-ligne.
R4 Indisponibilite du service Tres faible Faible SLA Azure 99.95%. Applications non-critiques (pas de production industrielle). Redeploy en 5 min via GitHub Actions.
R5 Depart du responsable (bus factor) Moyen Moyen Code standard (HTML/JS), versionne sur GitHub, documente (INFRA.md). n8n interface visuelle. Aucun framework proprietaire. Reprise possible par tout developpeur web.
R6 Proliferation d'outils non gouvernes Faible Faible Tout est dans le meme Resource Group Azure, visible dans le portail. Matrice de decision existante (Microsoft / Zoho / n8n). Pas de shadow IT : code sur GitHub CLS, hebergement sur tenant CLS.
En resume, cette architecture :
CLS-DIT-CP-26-0012 — Solution Design — Plateforme Digitale Azure — Classification : Interne — Avril 2026