Solution Design — Plateforme Digitale CLS sur Azure
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 :
| Application | Fonction | Utilisateurs | Donnees traitees | Statut |
| Hub CLS | Portail central d'acces aux outils digitaux | Equipe DSI | Aucune donnee (portail statique) | Prod |
| Pause Cafe | Gestion des demandes de pauses cafe (4 roles) | Hotesses, EADM, directions | Demandes, noms, emails CLS | Prod |
| Checklist Salles | Controle quotidien des salles de reunion | Service Desk | Controles, etats des salles | Prod |
| Flotte Mobile | Dashboard lignes mobiles (consolidation ADP/Intune) | EADM, DSI | Numeros, operateurs, collaborateurs | Prod |
| VMS Indonesia | Suivi commandes VMS (pipeline Zoho/OCR/PostgreSQL) | Equipe VMS | Commandes, clients indonesiens | Prod |
| Transcript CR | Generation de comptes-rendus par IA (audio/texte) | Equipe Digital | Transcriptions, comptes-rendus | Prod |
| n8n Labs | Orchestration workflows (webhooks, ETL, veille, emails) | Admin uniquement | Donnees 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
| Service | Role | Tier | Region | Certifications |
| Azure Static Web Apps | Hebergement des 6 frontends + APIs serverless | Free | West Europe | ISO 27001, SOC 2, GDPR |
| Azure Functions | APIs backend (managed dans SWA) | Inclus dans SWA | West Europe | ISO 27001, SOC 2, GDPR |
| Azure Container Apps | n8n (orchestration workflows) | Consumption | France Central | ISO 27001, SOC 2, GDPR |
| Azure Cosmos DB | Base NoSQL (PauseCafe, Checklist) | Free (400 RU/s) | France Central | ISO 27001, SOC 2, GDPR, HIPAA |
| Azure PostgreSQL Flexible | Base relationnelle (n8n, VMS, Flotte) | Burstable B1ms | France Central | ISO 27001, SOC 2, GDPR |
| Azure AI Foundry | Inference LLM (GPT-4.1-mini, Grok) | Pay-per-token | France Central | ISO 27001, SOC 2, GDPR |
| Microsoft Graph API | Envoi emails (CLSWorkflow@) | Inclus M365 | EU Data Boundary | ISO 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)
| ID | Source | Destination | Port | Proto | Description | Authentification | Impact LAN |
| IN-01 | Navigateurs CLS | Azure Static Web Apps | 443 | HTTPS | Acces aux 6 webapps metier | Azure AD SSO + MFA | AUCUN |
| IN-02 | Azure SWA | Azure Functions | 443 | HTTPS | Appels API (CRUD donnees metier) | x-ms-client-principal (SSO) | AUCUN |
| IN-03 | Zoho Creator (SaaS) | n8n (Container Apps) | 443 | HTTPS | Webhooks formulaires VMS Indonesie | Secret partage (header) | AUCUN |
| IN-04 | Azure SWA | n8n (Container Apps) | 443 | HTTPS | Webhooks alertes M42, envoi CR | API Key (header) | AUCUN |
| IN-05 | Admin (navigateur) | n8n (Container Apps) | 443 | HTTPS | Interface admin n8n | Login/password n8n | AUCUN |
4.2 Flux sortants (Azure → Services externes)
| ID | Source | Destination | Port | Proto | Description | Authentification | Impact LAN |
| OUT-01 | Azure Functions | Microsoft Graph API | 443 | HTTPS | Envoi emails (clsworkflow@groupcls.com) | OAuth2 client_credentials | AUCUN |
| OUT-02 | n8n (Container Apps) | Azure AI Foundry | 443 | HTTPS | Inference LLM (GPT, Grok) | API Key Azure | AUCUN |
| OUT-03 | n8n (Container Apps) | desk.zoho.eu | 443 | HTTPS | API Zoho Desk (synchro tickets) | OAuth2 | AUCUN |
| OUT-04 | n8n (Container Apps) | Flux RSS publics | 443 | HTTPS | Veille automatisee (6 flux) | Aucune (publics) | AUCUN |
4.3 Flux intra-Azure (internes au tenant)
| ID | Source | Destination | Description | Securite |
| INT-01 | Static Web Apps | Azure AD | Authentification SSO (redirection OpenID Connect) | OAuth2 / OIDC / TLS |
| INT-02 | Azure Functions | Cosmos DB | Lecture/ecriture donnees applicatives | Connection string + TLS |
| INT-03 | Container Apps | PostgreSQL Flexible | Base de donnees n8n, VMS, Flotte | SSL obligatoire |
| INT-04 | Container Apps | AI Foundry | Inference LLM | API 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
| Composant | Mecanisme | Detail |
| 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-principal | Injecte 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 n8n | Compte admin unique. Interface d'edition des workflows. Acces restreint a l'equipe Digital. |
| Webhooks (n8n) | API Key / Secret partage | Chaque 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
| Role | Comptes associes | Droits |
| Admin | ckersuzan@, ltallieu@, jpoullaouec@ | Tout : lecture, creation, modification, suppression |
| Hotesse | accueil@groupcls.com | Modification statut, date/heure/salle, commentaire, suppression |
| EADM | admin-pause-cafe@groupcls.com | Modification date/heure/salle, suppression |
| User | Tout @groupcls.com | Creation 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
| Exigence | Implementation |
| Chiffrement en transit | TLS 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 repos | Cosmos 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 donnees | France 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'IA | Azure 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 credentials | Connection strings et API keys dans les Application Settings des SWA et Container Apps (chiffrees au repos). Jamais dans le code source. |
| Donnees sensibles exclues | Aucune 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
| Question | Reponse |
| 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
| Vecteur | Option DMZ (doc original) | Option Azure (actuelle) |
| Port expose sur le LAN | 443 (reverse proxy DMZ) | Aucun |
| Mouvement lateral | Possible si DMZ compromise | Impossible (aucune connexion reseau) |
| WAF / Firewall requis | Oui (a deployer et maintenir) | Non (isole par design) |
| Maintenance securite | Patching OS, WAF, reverse proxy | Geree par Microsoft (PaaS) |
| Surface d'attaque | LAN CLS + DMZ + services exposes | Identique a un App Service Azure |
7.3 En-tetes de securite HTTP
Chaque application configure les en-tetes suivants dans staticwebapp.config.json :
| En-tete | Valeur | Protection |
X-Frame-Options | DENY | Clickjacking |
X-Content-Type-Options | nosniff | MIME sniffing |
Strict-Transport-Security | Gere par Azure | Downgrade HTTPS |
8. Conformite et certifications
| Certification | Services couverts | Pertinence CLS |
| ISO 27001 | Tous les services Azure utilises | Alignement avec la politique SMSI CLS |
| SOC 2 Type II | Tous les services Azure utilises | Controles de securite audites par un tiers |
| GDPR | Tous les services Azure utilises | Donnees en UE (France Central / West Europe) |
| CSA STAR | Azure global | Transparence sur les pratiques cloud |
| EU Data Boundary | Microsoft Graph, Azure AD | Donnees 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 securite | Azure AI Foundry | AWS Bedrock |
| Perimetre de gouvernance | Meme tenant Azure CLS | Nouveau compte AWS a creer |
| Authentification | Azure AD existant (SSO CLS) | AWS IAM separe |
| Localisation donnees | France Central | eu-west-1 (Irlande) |
| Transfert inter-cloud | Aucun (tout dans Azure) | Azure → AWS → Azure |
| Audit | Azure Monitor (unifie) | CloudTrail (separe) + Azure Monitor |
| Facturation | Souscription CLS existante | Nouveau compte de facturation |
| Opt-out training | Par defaut | Par defaut |
| Certifications | ISO 27001, SOC 2, GDPR | ISO 27001, SOC 2, GDPR |
| Surface d'attaque ajoutee | Nulle (service existant) | +1 cloud provider a securiser |
9.3 Autres alternatives evaluees
| Alternative | Raison de l'ecart |
| OpenAI API directe | Donnees 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 AI | Meme 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
| Composant | Strategie de sauvegarde | RPO | RTO |
| Azure PostgreSQL | Backup automatique Azure (snapshots incrementaux) | 5 min (point-in-time restore) | < 1h |
| Cosmos DB | Backup continu Azure (point-in-time restore) | Dernieres 30 secondes | < 1h |
| Code source (6 apps) | GitHub (repos prives CLS), historique complet | Dernier commit | < 5 min (redeploy) |
| Workflows n8n | Export JSON dans le repo GitHub + backup PostgreSQL | Dernier export | < 30 min (reimport) |
| Secrets / credentials | Sauvegarde chiffree des Application Settings (fichiers JSON) | Derniere sauvegarde manuelle | < 15 min |
| Cle de chiffrement n8n | Documentee et sauvegardee hors-ligne | N/A (statique) | Disponible immediatement |
Mise a jour et maintenance
| Composant | Strategie | Frequence |
| Static Web Apps | Deploiement automatique via GitHub Actions (CI/CD) | A chaque push |
| Azure Functions | Deploiees avec les SWA (meme pipeline) | A chaque push |
| n8n (conteneur) | Mise a jour image Docker via Container Apps revision | Mensuelle (patch securite) |
| PostgreSQL / Cosmos DB | Patches geres par Microsoft (PaaS) | Automatique |
| Certificats TLS | Geres automatiquement par Azure (Let's Encrypt) | Renouvellement auto |
11. Gouvernance et audit
| Exigence | Implementation |
| Visibilite | Toutes les ressources sont dans le portail Azure CLS, Resource Group rg-checklist-salles. Visible par tout administrateur Azure CLS. |
| Logs d'acces | Azure AD sign-in logs pour les connexions SSO. Azure Monitor pour les requetes API. |
| Logs d'execution | n8n conserve l'historique des executions (30 jours). Azure Container Apps logs disponibles dans Log Analytics. |
| Historique des deployments | GitHub Actions : historique complet de chaque deploiement avec diff du code, auteur, date. |
| Versionning du code | Git (GitHub repos prives CLS). Chaque modification est tracee, reversible, auditable. |
| Responsable | Christophe Kersuzan — Digital Manager — DSI CLS |
| Reprise en cas de depart | Code 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
| ID | Risque | Probabilite | Impact | Mitigation |
| 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 :
- N'introduit aucun flux vers le LAN CLS
- Utilise un seul cloud provider (Azure, tenant CLS existant)
- Authentifie les utilisateurs via Azure AD SSO + MFA
- Chiffre les donnees en transit (TLS 1.2+) et au repos (AES-256)
- Localise les donnees en France Central / West Europe
- S'appuie sur des services certifies ISO 27001, SOC 2, GDPR
- Ne traite aucune donnee classifiee, RH, medicale ou bancaire
CLS-DIT-CP-26-0012 — Solution Design — Plateforme Digitale Azure — Classification : Interne — Avril 2026