Flux reseau — Application Flotte Mobile CLS

ApplicationFlotte Mobile CLS — Dashboard de gestion des lignes mobiles CLS
URLhttps://flottemobile.groupcls.com
AuteurChristophe Kersuzan — Digital Manager — DSI CLS
DateAvril 2026
ClassificationInterne
DestinatairesEquipe Securite SI / RSSI

1. Description de l'application

Flotte Mobile CLS est une application web de gestion des lignes mobiles du groupe CLS. Elle consolide les données ADP (collaborateurs) et Intune (appareils), applique les tarifs opérateurs, et fournit un dashboard de suivi avec plan de migration. Un ETL intégré utilise Azure AI (GPT-4.1-mini) pour le matching flou entre noms ADP et appareils Intune.

CaracteristiqueDetail
TypeApplication web statique (HTML/CSS/JS) + API serverless
HebergementAzure Static Web App (free tier) — swa-flotte-mobile-v2
Runtime APIAzure Functions managed (Node.js 18)
Base de donnéesAzure PostgreSQL Flexible Server (B1ms) — pg-n8n-labs-cls.postgres.database.azure.com
Base : flotte_mobile — Tables : lignes_mobiles, plan_migration
Intelligence artificielleAzure AI Foundry (GPT-4.1-mini) — ai-foundry-cls.cognitiveservices.azure.com
Matching flou noms ADP / appareils Intune lors de l'ETL
EmailsMicrosoft Graph API (OAuth2 client_credentials) — si notifications email nécessaires
AuthentificationAzure AD SSO (provider intégré SWA) + MFA, avec fallback mot de passe
RégionWest Europe (SWA) / France Central (PostgreSQL, AI Foundry)
Resource Grouprg-checklist-salles
Code sourceGitHub privé — glagadec/flotte-mobile-cls
CI/CDGitHub Actions — déploiement automatique sur push

Utilisateurs

EquipeAccès
EADMConsultation dashboard, gestion plan de migration
DSIAdministration complète, ETL upload, plan de migration

Données traitées

DonnéeTypeSensibilité
Numéros de téléphoneNumériqueFaible à moyen (numéros professionnels)
Opérateurs (SFR, Orange, Bouygues, Free)Liste ferméeFaible
Noms des collaborateurs (nom_complet ADP)IdentitéDonnée personnelle (RGPD)
Tarifs mensuelsMontants €Faible
Numéros IMEI (Intune)Identifiant appareilFaible
Plan de migration (dates, statut)Données métierFaible
Aucune donnée sensible (classifiée défense, médicale, bancaire) n'est traitée par cette application. Les seules données personnelles sont les noms des collaborateurs issus de l'export ADP, et les numéros de téléphone professionnels.

2. Architecture

graph TB subgraph Users["Utilisateurs CLS"] U["EADM / DSI\n(navigateur + MFA)"] end subgraph Azure["Tenant Azure CLS"] subgraph SWA["Azure Static Web App\nswa-flotte-mobile-v2\nWest Europe"] FE["Frontend\nHTML / CSS / JS\n(statique)"] FN["Azure Functions\n(managed, Node.js 18)\n/api/data\n/api/etl\n/api/migration"] end AAD["Azure AD\nTenant CLS\ncfb22cb5-ed63-...\nSSO + MFA"] PG[("Azure PostgreSQL\nFlexible Server (B1ms)\npg-n8n-labs-cls\nBase: flotte_mobile\nTables: lignes_mobiles,\nplan_migration\nFrance Central\nSSL obligatoire")] AI["Azure AI Foundry\nai-foundry-cls\nGPT-4.1-mini\nFrance Central"] end subgraph Microsoft["Services Microsoft"] GRAPH["Microsoft Graph API\nhttps://graph.microsoft.com\nMail.Send\nOAuth2 client_credentials"] LOGIN["login.microsoftonline.com\nAuthentification OpenID Connect"] end U -->|"1. HTTPS 443"| FE FE -->|"2. Redirect"| LOGIN LOGIN -->|"3. Token OIDC"| AAD AAD -->|"4. Cookie session"| FE FE -->|"5. GET/POST\n/api/data, /api/etl,\n/api/migration"| FN FN -->|"6. SQL queries\nSSL :5432"| PG FN -->|"7. POST chat/completions\n(ETL matching)"| AI FN -->|"8. POST /oauth2/v2.0/token"| LOGIN FN -->|"9. POST sendMail\n(si email requis)"| GRAPH style Azure fill:#eff6ff,stroke:#1e3a5f,stroke-width:2px style SWA fill:#dbeafe,stroke:#3b82f6,stroke-width:1px style Microsoft fill:#f1f5f9,stroke:#94a3b8,stroke-width:1px style Users fill:#fff,stroke:#94a3b8,stroke-width:1px

3. Matrice des flux reseau

3.1 Flux entrants

IDSourceDestinationPortProtoDescriptionAuthLAN CLS
FM-IN-01 Navigateur collaborateur CLS flottemobile.groupcls.com
(Azure SWA — West Europe)
443 HTTPS Accès à l'application (pages HTML, JS, CSS). Authentification via Azure AD SSO + MFA, ou mot de passe (fallback). Azure AD SSO + MFA
ou mot de passe
AUCUN
FM-IN-02 Frontend (navigateur) flottemobile.groupcls.com/api/*
(Azure Functions — managed)
443 HTTPS Appels API REST : GET /api/data, POST /api/etl, POST /api/migration Header x-ms-client-principal
ou x-auth-password
(SSO injecté par Azure, non falsifiable)
AUCUN

3.2 Flux sortants

IDSourceDestinationPortProtoDescriptionAuthLAN CLS
FM-OUT-01 Azure Functions
(ETL — /api/etl)
ai-foundry-cls.cognitiveservices.azure.com
(Azure AI Foundry — France Central)
443 HTTPS Appel GPT-4.1-mini pour le matching flou entre noms ADP et appareils Intune lors de la consolidation ETL API Key (AZURE_AI_KEY) AUCUN
FM-OUT-02 Azure Functions login.microsoftonline.com
(Azure AD token endpoint)
443 HTTPS Obtention du token OAuth2 (client_credentials grant) pour envoi email via Graph API
Tenant : cfb22cb5-ed63-4518-b2ef-aeb539d18da7
Client ID + Client Secret AUCUN
FM-OUT-03 Azure Functions graph.microsoft.com
POST /v1.0/users/{userId}/sendMail
443 HTTPS Envoi email notification (si nécessaire)
From : CLSWorkflow@groupcls.com
Bearer token OAuth2
(permission Mail.Send)
AUCUN

3.3 Flux intra-Azure (internes au tenant CLS)

IDSourceDestinationDescriptionSécurité
FM-INT-01 Azure SWA Azure AD
(login.microsoftonline.com)
Redirection authentification SSO.
Protocole OpenID Connect. Le navigateur est redirigé vers Azure AD, l'utilisateur s'authentifie avec MFA, puis retour vers la SWA avec un cookie de session.
OAuth2 / OIDC / TLS 1.2+
FM-INT-02 Azure Functions PostgreSQL Flexible Server
pg-n8n-labs-cls.postgres.database.azure.com:5432
Lecture et écriture des données de la flotte mobile.
Table lignes_mobiles : données consolidées (ADP + Intune + tarifs).
Table plan_migration : planning de migration des lignes.
Connexion via pg Pool (Node.js).
Connection string (PG_USER + PG_PASSWORD)
SSL obligatoire
TLS 1.2+
Chiffrement au repos Azure

3.4 Flux vers le réseau LAN CLS

ZERO flux vers/depuis le LAN CLS

L'application Flotte Mobile n'a aucune connexion avec le réseau interne CLS : L'application est 100% hébergée dans Azure. Les utilisateurs y accèdent comme ils accèdent à Office 365 : via leur navigateur, en HTTPS, avec leur compte Microsoft CLS.

4. Détail des flux — Diagrammes de séquence

4.1 Connexion d'un utilisateur

sequenceDiagram participant U as Collaborateur CLS participant DNS as DNS groupcls.com participant SWA as Azure SWA
flottemobile.groupcls.com participant AAD as Azure AD
login.microsoftonline.com U->>DNS: Résolution flottemobile.groupcls.com DNS-->>U: CNAME → azurestaticapps6.trafficmanager.net U->>SWA: GET https://flottemobile.groupcls.com (HTTPS 443) SWA->>SWA: Pas de cookie de session valide SWA-->>U: 302 Redirect → /.auth/login/aad U->>AAD: GET /authorize (OpenID Connect) AAD->>U: Page de login Microsoft U->>AAD: Credentials + MFA AAD->>AAD: Vérification identité + MFA AAD-->>SWA: Authorization code SWA->>AAD: POST /token (code → token) AAD-->>SWA: id_token + access_token SWA->>SWA: Crée cookie session (.auth) SWA-->>U: 302 Redirect → / + Set-Cookie U->>SWA: GET / (avec cookie .auth) SWA-->>U: index.html (dashboard)

4.2 Chargement du dashboard

sequenceDiagram participant U as Collaborateur CLS participant SWA as Azure SWA participant FN as Azure Function
/api/data participant PG as PostgreSQL
flotte_mobile U->>SWA: GET /api/data?date=2026-04-15 (cookie .auth) SWA->>SWA: Valide cookie session SWA->>FN: Forward + injecte header x-ms-client-principal FN->>FN: Décode header → email, rôle FN->>PG: SELECT * FROM lignes_mobiles WHERE date_import = ... PG-->>FN: Rows (lignes mobiles) FN->>PG: SELECT * FROM plan_migration PG-->>FN: Rows (plan migration) FN->>FN: Calcul statistiques (total lignes, coût mensuel, par opérateur) FN->>FN: Liste des dates disponibles FN-->>SWA: 200 JSON {lignes, migration, stats, dates} SWA-->>U: Dashboard affiché (tableaux, graphiques, KPIs) Note over U,PG: Aucun flux vers le LAN CLS

4.3 ETL upload avec matching IA

sequenceDiagram participant A as Admin DSI participant SWA as Azure SWA participant FN as Azure Function
/api/etl participant AI as Azure AI Foundry
GPT-4.1-mini participant PG as PostgreSQL
flotte_mobile A->>SWA: POST /api/etl (fichiers CSV : ADP + Intune + Tarifs) SWA->>FN: Forward + header x-ms-client-principal FN->>FN: Décode header → rôle admin ✓ FN->>FN: Parse CSV ADP (noms collaborateurs, lignes) FN->>FN: Parse CSV Intune (IMEI, appareils, noms) FN->>FN: Parse CSV Tarifs (opérateur, forfait, montant) rect rgb(239, 246, 255) Note over FN,AI: Matching flou ADP ↔ Intune via IA FN->>AI: POST /openai/deployments/gpt-41-mini/chat/completions
(noms ADP vs noms Intune à matcher) AI-->>FN: Résultat matching (paires nom_ADP ↔ device_Intune, score confiance) end FN->>FN: Consolidation données (ADP + Intune + Tarifs + matching IA) FN->>PG: INSERT/UPDATE lignes_mobiles (données consolidées) PG-->>FN: OK (rows inserted/updated) FN-->>SWA: 200 JSON {imported: N, matched: M, unmatched: U} SWA-->>A: Résultat ETL affiché (succès, statistiques matching) Note over A,PG: Aucun flux vers le LAN CLS

5. Sécurité

MesureImplémentation
Authentification Azure AD SSO (provider intégré SWA). MFA appliquée par la politique Azure AD CLS. Fallback par mot de passe (header x-auth-password) pour les SWA identity.7 qui n'ont pas encore le SSO complet. Aucune page accessible sans authentification (sauf redirection vers login).
Autorisation Vérification de l'identité dans chaque endpoint API via le header x-ms-client-principal (SSO) ou x-auth-password (fallback). Le header SSO est injecté par le reverse proxy Azure et ne peut pas être falsifié par le client.
GET /api/data : utilisateurs authentifiés (EADM, DSI).
POST /api/etl : administrateurs uniquement.
POST /api/migration : utilisateurs authentifiés (EADM, DSI).
Chiffrement en transit TLS 1.2+ sur tous les flux (navigateur ↔ SWA, Functions ↔ PostgreSQL, Functions ↔ AI Foundry, Functions ↔ Graph API). Certificat TLS géré automatiquement par Azure. SSL obligatoire sur PostgreSQL.
Chiffrement au repos PostgreSQL Flexible Server : chiffrement au repos par défaut (Azure-managed keys). AI Foundry : aucun stockage de données (opt-out training par défaut).
En-têtes HTTP X-Frame-Options: DENY (anti-clickjacking)
X-Content-Type-Options: nosniff (anti-MIME sniffing)
Configurés dans staticwebapp.config.json (globalHeaders).
Secrets PG_HOST, PG_USER, PG_PASSWORD, AZURE_AI_KEY, GRAPH_CLIENT_ID, GRAPH_CLIENT_SECRET, APP_PASSWORD stockés dans les Application Settings de la SWA (chiffrés au repos). Jamais dans le code source.
Intelligence artificielle Azure AI Foundry dans le même tenant CLS, région France Central. Opt-out training par défaut : aucune donnée utilisée pour l'entraînement du modèle. Modèle utilisé uniquement pour le matching flou de noms lors de l'ETL.
Isolation réseau Aucun flux vers le LAN CLS. PostgreSQL accessible uniquement depuis les Azure Functions (même Resource Group). AI Foundry accessible via API Key sur HTTPS uniquement.
Audit Azure AD sign-in logs (connexions SSO). Azure Monitor (requêtes API). GitHub Actions (historique déploiements). Chaque import ETL est daté (date_import dans la base).
Backup PostgreSQL Flexible Server : backup automatique Azure (rétention 7 jours, point-in-time restore). Code source : GitHub (historique complet).

6. Synthèse des endpoints exposés

URLMéthodeAuth requiseDescription
/api/data?date=YYYY-MM-DDGETSSO ou mot de passeDonnées dashboard : lignes mobiles, plan migration, statistiques, dates disponibles
/api/etlPOSTSSO ou mot de passeETL upload : consolidation fichiers ADP/Intune/Tarifs avec matching IA
/api/migrationPOSTSSO ou mot de passeCRUD plan de migration : fetch, add, update, delete (action dans le body)
/.auth/login/aadGETRedirection vers Azure AD (géré par SWA)
/.auth/meGETCookieIdentité de l'utilisateur connecté (géré par SWA)
Tous les endpoints /api/* rejettent les requêtes sans le header x-ms-client-principal (SSO) ou x-auth-password valide (HTTP 401). Le header SSO est injecté uniquement par Azure après authentification réussie.

7. Résumé des connexions réseau

graph LR subgraph IN["2 flux entrants"] A["FM-IN-01 : Navigateur → SWA (443/HTTPS)"] B["FM-IN-02 : Navigateur → API Functions (443/HTTPS)"] end subgraph OUT["3 flux sortants"] C["FM-OUT-01 : Functions → AI Foundry GPT-4.1-mini (443/HTTPS)"] D["FM-OUT-02 : Functions → Azure AD token (443/HTTPS)"] E["FM-OUT-03 : Functions → Graph API sendMail (443/HTTPS)"] end subgraph INT["2 flux internes Azure"] F["FM-INT-01 : SWA ↔ Azure AD (OIDC)"] G["FM-INT-02 : Functions → PostgreSQL (5432/SSL)"] end subgraph LAN["LAN CLS"] H["AUCUN FLUX"] end style IN fill:#dbeafe,stroke:#2563eb style OUT fill:#f0fdf4,stroke:#22c55e style INT fill:#fef3c7,stroke:#f59e0b style LAN fill:#fef2f2,stroke:#ef4444,stroke-width:2px style H fill:#fee2e2,stroke:#ef4444,color:#dc2626
CatégorieNombreProtocolePortsImpact LAN CLS
Flux entrants2HTTPS443 uniquementAUCUN
Flux sortants3HTTPS443 uniquementAUCUN
Flux intra-Azure2HTTPS / TLS443, 5432Interne Azure
Total7 fluxHTTPS / TLS uniquement443 + 5432 uniquementZERO flux LAN
CLS — Collecte Localisation Satellites — Flux réseau Flotte Mobile — Document interne — Avril 2026