Flux reseau — Application Checklist Salles CLS

ApplicationChecklist Salles CLS — Contrôle quotidien des salles de réunion par le Service Desk
URLhttps://checklist-salles.groupcls.com
AuteurChristophe Kersuzan — Digital Manager — DSI CLS
DateAvril 2026
ClassificationInterne
DestinatairesEquipe Securite SI / RSSI

1. Description de l'application

Checklist Salles CLS est une application web permettant au Service Desk d'effectuer le contrôle quotidien des salles de réunion. Chaque salle dispose d'une checklist d'équipements (écran, Teams, ClickShare, HDMI, vidéoprojecteur). Le statut est calculé automatiquement (Nominal / Dégradé / Bloquant) et, en cas d'anomalie, un email est envoyé automatiquement vers M42 pour création de ticket.

CaracteristiqueDetail
TypeApplication web statique (HTML/CSS/JS) + API serverless
HebergementAzure Static Web App (free tier) — swa-checklist-cls
Runtime APIAzure Functions managed (Node.js 18)
Base de donnéesAzure Cosmos DB (NoSQL, free tier) — cosmos-checklist-cls
Base : checklist-salles — Containers : salles, controles
EmailsMicrosoft Graph API (OAuth2 client_credentials) — alertes M42
AuthentificationAzure AD SSO (provider intégré SWA) + MFA
RégionWest Europe (SWA) / France Central (Cosmos DB)
Resource Grouprg-checklist-salles
Code sourceGitHub privé — glagadec/checklist-salles
CI/CDGitHub Actions — déploiement automatique sur push

Utilisateurs

RôleComptesDroits
Service DeskTout @groupcls.com (usage réservé au Service Desk)Contrôle des salles, soumission de checklist, consultation historique

Données traitées

DonnéeTypeSensibilité
Noms et identifiants des sallesListe ferméeFaible
Statut des équipements (écran, Teams, ClickShare, HDMI, vidéoprojecteur)OK / KOFaible
Nom et email du contrôleurIdentité Azure ADDonnée personnelle (RGPD)
Notes / commentairesTexte libreFaible
Photos / audio des anomaliesFichiers médiaFaible
Statut auto-calculéNominal / Dégradé / BloquantFaible
Aucune donnée sensible (RH, médicale, bancaire, classifiée défense) n'est traitée par cette application. Les seules données personnelles sont le nom et l'email du contrôleur, issus du token Azure AD.

2. Architecture

graph TB subgraph Users["Utilisateurs CLS"] U["Service Desk\n(navigateur + MFA)"] end subgraph Azure["Tenant Azure CLS"] subgraph SWA["Azure Static Web App\nswa-checklist-cls\nWest Europe"] FE["Frontend\nHTML / CSS / JS\n(statique)"] FN["Azure Functions\n(managed, Node.js 18)\n/api/controles\n/api/salles"] end AAD["Azure AD\nTenant CLS\ncfb22cb5-ed63-...\nSSO + MFA"] COSMOS[("Azure Cosmos DB\ncosmos-checklist-cls\nBase: checklist-salles\nContainers: salles, controles\nFrance Central\nChiffrement AES-256")] 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 subgraph M42["Systeme M42"] TICKET["noreply-matrix42@groupcls.com\nCreation ticket M42\n(via email entrant)"] end U -->|"1. HTTPS 443"| FE FE -->|"2. Redirect"| LOGIN LOGIN -->|"3. Token OIDC"| AAD AAD -->|"4. Cookie session"| FE FE -->|"5. POST/GET\n/api/controles\n/api/salles"| FN FN -->|"6. Query/Insert"| COSMOS FN -->|"7. POST /v1.0/users/.../sendMail\n(si Degradé ou Bloquant)"| GRAPH GRAPH -.->|"Email M42"| TICKET 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 style M42 fill:#fef3c7,stroke:#f59e0b,stroke-width:1px

3. Matrice des flux reseau

3.1 Flux entrants

IDSourceDestinationPortProtoDescriptionAuthLAN CLS
CK-IN-01 Navigateur Service Desk CLS checklist-salles.groupcls.com
(Azure SWA — West Europe)
443 HTTPS Accès à l'application (pages HTML, JS, CSS, images). Authentification Azure AD SSO + MFA. Azure AD SSO + MFA AUCUN
CK-IN-02 Frontend (navigateur) checklist-salles.groupcls.com/api/*
(Azure Functions — managed)
443 HTTPS Appels API REST : GET/POST /api/controles, GET /api/salles Header x-ms-client-principal
(injecté par Azure, non falsifiable)
AUCUN

3.2 Flux sortants

IDSourceDestinationPortProtoDescriptionAuthLAN CLS
CK-OUT-01 Azure Functions login.microsoftonline.com
(Azure AD token endpoint)
443 HTTPS Obtention du token OAuth2 (client_credentials grant)
Tenant : cfb22cb5-ed63-4518-b2ef-aeb539d18da7
Client ID + Client Secret AUCUN
CK-OUT-02 Azure Functions graph.microsoft.com
POST /v1.0/users/{userId}/sendMail
443 HTTPS Envoi email alerte M42 lorsque le statut d'une salle est Dégradé ou Bloquant
From : CLSWorkflow@groupcls.com
To : noreply-matrix42@groupcls.com
Header : original_sender{ckersuzan@groupcls.com}
Bearer token OAuth2
(permission Mail.Send)
AUCUN

3.3 Flux intra-Azure (internes au tenant CLS)

IDSourceDestinationDescriptionSécurité
CK-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+
CK-INT-02 Azure Functions Cosmos DB
cosmos-checklist-cls.documents.azure.com:443
Lecture et écriture des contrôles de salles.
Container salles : liste des 11 salles et leurs équipements.
Container controles : résultats des contrôles quotidiens.
Connection string (AccountKey)
TLS 1.2+ obligatoire
Chiffrement au repos AES-256

3.4 Flux vers le réseau LAN CLS

ZERO flux vers/depuis le LAN CLS

L'application Checklist Salles 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 (SSO)

sequenceDiagram participant U as Service Desk CLS participant DNS as DNS groupcls.com participant SWA as Azure SWA
checklist-salles.groupcls.com participant AAD as Azure AD
login.microsoftonline.com U->>DNS: Résolution checklist-salles.groupcls.com DNS-->>U: CNAME → azurestaticapps.trafficmanager.net U->>SWA: GET https://checklist-salles.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 (liste des salles)

4.2 Soumission d'un contrôle de salle

sequenceDiagram participant U as Service Desk CLS participant SWA as Azure SWA participant FN as Azure Function
/api/controles participant DB as Cosmos DB
Container: controles participant DB2 as Cosmos DB
Container: salles participant TOK as Azure AD
Token endpoint participant GRAPH as Microsoft Graph API U->>SWA: POST /api/controles (JSON checklist + cookie .auth) SWA->>SWA: Valide cookie session SWA->>FN: Forward + injecte header x-ms-client-principal FN->>FN: Décode header → email, nom du contrôleur FN->>FN: Valide résultats (équipements OK/KO) FN->>FN: Auto-calcul statut (Nominal / Dégradé / Bloquant) FN->>DB: INSERT document contrôle (id=UUID, statut, résultats) DB-->>FN: 201 Created FN->>DB2: UPDATE salle (dernier contrôle, statut courant) DB2-->>FN: 200 OK alt Statut = Dégradé ou Bloquant rect rgb(254, 243, 199) Note over FN,GRAPH: Envoi email alerte M42 FN->>TOK: POST /oauth2/v2.0/token
(client_id + client_secret + scope=Mail.Send) TOK-->>FN: Bearer access_token FN->>GRAPH: POST /v1.0/users/{userId}/sendMail
From: CLSWorkflow@groupcls.com
To: noreply-matrix42@groupcls.com
Header: original_sender{ckersuzan@groupcls.com} GRAPH-->>FN: 202 Accepted end end FN-->>SWA: 201 + document créé SWA-->>U: 201 (confirmation contrôle enregistré) Note over U,GRAPH: Aucun flux vers le LAN CLS

4.3 Détail de l'email alerte M42

sequenceDiagram participant FN as Azure Function participant TOK as Azure AD
Token endpoint participant GRAPH as Microsoft Graph API participant M42 as M42 (noreply-matrix42@) Note over FN: Contrôle Dégradé ou Bloquant détecté
Ex: Salle D251 — Ecran KO, Teams KO FN->>TOK: POST /oauth2/v2.0/token
(client_credentials, scope=Mail.Send) TOK-->>FN: Bearer access_token (caché 55 min) FN->>GRAPH: POST /v1.0/users/{userId}/sendMail Note right of FN: From: CLSWorkflow@groupcls.com
To: noreply-matrix42@groupcls.com
Subject: [BLOQUANT] Salle D251 - Ecran, Teams
Body: texte brut (détail équipements KO)
Header: original_sender{ckersuzan@groupcls.com} GRAPH-->>FN: 202 Accepted GRAPH->>M42: Email délivré M42->>M42: Création ticket M42 automatique
(routage via original_sender) Note over FN,M42: Le header original_sender permet à M42
de router le ticket vers le bon assigné

5. Sécurité

MesureImplémentation
Authentification Azure AD SSO (provider intégré SWA). MFA appliquée par la politique Azure AD CLS. 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. Le header est injecté par le reverse proxy Azure et ne peut pas être falsifié par le client.
GET /api/salles : tout utilisateur authentifié.
GET /api/controles : tout utilisateur authentifié.
POST /api/controles : tout utilisateur authentifié.
Chiffrement en transit TLS 1.2+ sur tous les flux (navigateur ↔ SWA, Functions ↔ Cosmos DB, Functions ↔ Graph API). Certificat TLS géré automatiquement par Azure.
Chiffrement au repos Cosmos DB : AES-256 (Microsoft-managed keys). Données au repos chiffrées 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.
Secrets COSMOS_ENDPOINT, COSMOS_KEY, GRAPH_CLIENT_ID, GRAPH_CLIENT_SECRET stockés dans les Application Settings de la SWA (chiffrés au repos). Jamais dans le code source.
Isolation réseau Aucun flux vers le LAN CLS. Cosmos DB accessible uniquement depuis les Azure Functions (même Resource Group). Pas d'endpoint public exposé pour la base de données.
Audit Azure AD sign-in logs (connexions SSO). Azure Monitor (requêtes API). GitHub Actions (historique déploiements). Chaque document Cosmos DB contient le nom et l'email du contrôleur.
Backup Cosmos DB : backup continu Azure (point-in-time restore, 30 jours). Code source : GitHub (historique complet).

6. Détail OAuth2 — Graph API (alerte email M42)

L'envoi d'email alerte M42 utilise le flux OAuth2 client_credentials (application-to-application, sans interaction utilisateur).

ParamètreValeur
Token endpointhttps://login.microsoftonline.com/cfb22cb5-ed63-4518-b2ef-aeb539d18da7/oauth2/v2.0/token
Grant typeclient_credentials
Scopehttps://graph.microsoft.com/.default
Permission APIMail.Send (application permission, consent admin)
ExpéditeurCLSWorkflow@groupcls.com (boîte partagée)
Destinatairenoreply-matrix42@groupcls.com
Header spécialoriginal_sender{ckersuzan@groupcls.com} — utilisé par M42 pour le routage du ticket
Sujet type[BLOQUANT] Salle D251 - Ecran, Teams
CorpsTexte brut (plaintext) — détail des équipements en anomalie
DéclencheurSoumission d'un contrôle avec statut Dégradé ou Bloquant
Cache tokenToken caché en mémoire, renouvelé 5 min avant expiration (durée standard : 1h)

7. Synthèse des endpoints exposés

URLMéthodeAuth requiseRôlesDescription
/api/controlesGETSSOTousListe des contrôles (filtres : salle_id, latest, from, to, limit)
/api/controlesPOSTSSOTousSoumission d'un contrôle avec tableau de résultats OK/KO
/api/sallesGETSSOTousListe des 11 salles et leurs équipements
/.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 (HTTP 401). Ce header est injecté uniquement par Azure après authentification SSO réussie.

8. Résumé des connexions réseau

graph LR subgraph IN["2 flux entrants"] A["CK-IN-01 : Navigateur → SWA (443/HTTPS)"] B["CK-IN-02 : Navigateur → API Functions (443/HTTPS)"] end subgraph OUT["2 flux sortants"] C["CK-OUT-01 : Functions → Azure AD token (443/HTTPS)"] D["CK-OUT-02 : Functions → Graph API sendMail (443/HTTPS)"] end subgraph INT["2 flux internes Azure"] E["CK-INT-01 : SWA ↔ Azure AD (OIDC)"] F["CK-INT-02 : Functions → Cosmos DB (443/TLS)"] end subgraph LAN["LAN CLS"] G["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 G fill:#fee2e2,stroke:#ef4444,color:#dc2626
CatégorieNombreProtocolePortsImpact LAN CLS
Flux entrants2HTTPS443 uniquementAUCUN
Flux sortants2HTTPS443 uniquementAUCUN
Flux intra-Azure2HTTPS / TLS443Interne Azure
Total6 fluxHTTPS uniquement443 uniquementZERO flux LAN
CLS — Collecte Localisation Satellites — Flux réseau Checklist Salles — Document interne — Avril 2026