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.
| Caracteristique | Detail |
|---|---|
| Type | Application web statique (HTML/CSS/JS) + API serverless |
| Hebergement | Azure Static Web App (free tier) — swa-checklist-cls |
| Runtime API | Azure Functions managed (Node.js 18) |
| Base de données | Azure Cosmos DB (NoSQL, free tier) — cosmos-checklist-cls Base : checklist-salles — Containers : salles, controles |
| Emails | Microsoft Graph API (OAuth2 client_credentials) — alertes M42 |
| Authentification | Azure AD SSO (provider intégré SWA) + MFA |
| Région | West Europe (SWA) / France Central (Cosmos DB) |
| Resource Group | rg-checklist-salles |
| Code source | GitHub privé — glagadec/checklist-salles |
| CI/CD | GitHub Actions — déploiement automatique sur push |
| Rôle | Comptes | Droits |
|---|---|---|
| Service Desk | Tout @groupcls.com (usage réservé au Service Desk) | Contrôle des salles, soumission de checklist, consultation historique |
| Donnée | Type | Sensibilité |
|---|---|---|
| Noms et identifiants des salles | Liste fermée | Faible |
| Statut des équipements (écran, Teams, ClickShare, HDMI, vidéoprojecteur) | OK / KO | Faible |
| Nom et email du contrôleur | Identité Azure AD | Donnée personnelle (RGPD) |
| Notes / commentaires | Texte libre | Faible |
| Photos / audio des anomalies | Fichiers média | Faible |
| Statut auto-calculé | Nominal / Dégradé / Bloquant | Faible |
| ID | Source | Destination | Port | Proto | Description | Auth | LAN 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 |
| ID | Source | Destination | Port | Proto | Description | Auth | LAN 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 |
| ID | Source | Destination | Description | Sé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 |
| Mesure | Implé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). |
L'envoi d'email alerte M42 utilise le flux OAuth2 client_credentials (application-to-application, sans interaction utilisateur).
| Paramètre | Valeur |
|---|---|
| Token endpoint | https://login.microsoftonline.com/cfb22cb5-ed63-4518-b2ef-aeb539d18da7/oauth2/v2.0/token |
| Grant type | client_credentials |
| Scope | https://graph.microsoft.com/.default |
| Permission API | Mail.Send (application permission, consent admin) |
| Expéditeur | CLSWorkflow@groupcls.com (boîte partagée) |
| Destinataire | noreply-matrix42@groupcls.com |
| Header spécial | original_sender{ckersuzan@groupcls.com} — utilisé par M42 pour le routage du ticket |
| Sujet type | [BLOQUANT] Salle D251 - Ecran, Teams |
| Corps | Texte brut (plaintext) — détail des équipements en anomalie |
| Déclencheur | Soumission d'un contrôle avec statut Dégradé ou Bloquant |
| Cache token | Token caché en mémoire, renouvelé 5 min avant expiration (durée standard : 1h) |
| URL | Méthode | Auth requise | Rôles | Description |
|---|---|---|---|---|
/api/controles | GET | SSO | Tous | Liste des contrôles (filtres : salle_id, latest, from, to, limit) |
/api/controles | POST | SSO | Tous | Soumission d'un contrôle avec tableau de résultats OK/KO |
/api/salles | GET | SSO | Tous | Liste des 11 salles et leurs équipements |
/.auth/login/aad | GET | — | — | Redirection vers Azure AD (géré par SWA) |
/.auth/me | GET | Cookie | — | Identité de l'utilisateur connecté (géré par SWA) |
/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.
| Catégorie | Nombre | Protocole | Ports | Impact LAN CLS |
|---|---|---|---|---|
| Flux entrants | 2 | HTTPS | 443 uniquement | AUCUN |
| Flux sortants | 2 | HTTPS | 443 uniquement | AUCUN |
| Flux intra-Azure | 2 | HTTPS / TLS | 443 | Interne Azure |
| Total | 6 flux | HTTPS uniquement | 443 uniquement | ZERO flux LAN |