DMV — Backlog de sécurisation V1 préprod
Date : 2026-06-07
Source : audit complémentaire sécurité / confidentialité / RBAC / résilience
Périmètre : api, dmv-public, dmv-workspace, exploitation DMV
Statut : backlog d’exécution priorisé
1. Objectif
Ce document recense tout ce qu’il reste à faire pour amener DMV vers un niveau de sécurité, de confidentialité, de résilience et d’exploitabilité proche de 9/10 sur les domaines audités.
Il est conçu pour une exécution progressive, en environnement préprod utilisé :
- ne pas casser le produit ;
- ne pas lancer de refactor large non demandé ;
- travailler par petits lots ;
- valider après chaque phase ;
- éviter toute régression fonctionnelle ou sécurité.
2. Règles d’exécution obligatoires
- Toujours traiter une seule phase à la fois.
- Toujours commencer par audit du code concerné avant modification.
- Ne pas modifier le design, l’UX ou le périmètre métier, sauf si la sécurité l’impose directement.
- Ne pas renommer ou déplacer massivement des fichiers.
- Ne pas ouvrir plusieurs chantiers de sécurité en parallèle si leurs effets se croisent.
- Après chaque phase :
- lancer les validations ciblées ;
- vérifier les routes et permissions affectées ;
- faire un commit isolé ;
- documenter ce qui a été fait et ce qui reste.
- Si une zone est ambiguë, s’arrêter, documenter, et ne pas improviser.
3. Priorités globales
| Priorité | Objectif | Statut cible |
|---|---|---|
P0 | Bloquer les risques sécurité / confidentialité incompatibles avec un pilote propre | obligatoire avant montée de criticité |
P1 | Rendre la plateforme exploitable, traçable et RGPD-opérationnelle | fortement recommandé avant ouverture plus large |
P2 | Durcir l’architecture pour tendre vers un niveau 9/10 durable | recommandé après stabilisation |
4. P0 — Correctifs immédiats
P0-1 — Remplacer le rôle admin monolithique par un RBAC minimum viable
Priorité : critique
Repos : api, puis dmv-workspace, dmv-public si interfaces concernées
Problème
- Le backoffice Laravel repose aujourd’hui sur un accès global
admin. - Cela concentre trop de pouvoir sur un seul rôle.
Travail attendu
- Introduire au minimum les rôles suivants :
platform_adminsupport_agentcontent_moderatorbilling_adminmunicipal_manager
- Définir les permissions minimales par module.
- Remplacer les gates purement
adminlà où une permission plus fine est possible. - Conserver les comportements existants tant que la permission équivalente est bien accordée.
Fichiers de départ
api/app/Modules/Admin/Routes/api.phpapi/app/Http/Middleware/EnsureUserIsAdmin.phpapi/app/Modules/Identity/Models/UserRole.phpapi/app/Modules/Identity/Services/ProfileService.php
Critères d’acceptation
- Un agent support ne peut pas administrer les abonnements.
- Un modérateur ne peut pas voir ou modifier les données de support.
- Un gestionnaire mairie ne peut pas accéder au backoffice global.
- Un
platform_adminconserve l’accès complet.
Validation
- tests permissions ciblés ;
- vérification manuelle des routes admin ;
php artisan testciblé sur auth/admin si disponible.
P0-2 — Sécuriser la fonction de réponse support
Priorité : critique
Repos : dmv-public, potentiellement api
Problème
- La fonction de réponse support authentifie un utilisateur Supabase, mais ne vérifie pas qu’il est autorisé à agir comme support.
Travail attendu
- Bloquer toute réponse support pour un utilisateur non autorisé.
- Vérifier le rôle via une source de vérité métier.
- Conserver le flux existant de réponse une fois autorisé.
Fichiers de départ
dmv-public/supabase/functions/send-team-reply/index.ts- si nécessaire, ajouter une vérification via API Laravel dédiée
Critères d’acceptation
- un simple utilisateur connecté ne peut jamais répondre à un thread support ;
- seuls les rôles explicitement autorisés peuvent le faire ;
- aucun message support ne part sans contrôle métier.
Validation
- test manuel avec utilisateur non admin ;
- test manuel avec rôle autorisé ;
- revue des erreurs 401/403.
P0-3 — Mettre en place un audit log central
Priorité : critique
Repos : api
Problème
- Il n’existe pas de journal d’audit central fiable couvrant les actions sensibles.
Travail attendu
- Créer une table
audit_logs. - Créer un service unique d’écriture des audits.
- Tracer au minimum :
- attribution / retrait de rôle ;
- lecture d’une fiche utilisateur via admin ;
- lecture d’un thread support ;
- réponse support ;
- validation / rejet / annulation de claim ;
- modification admin d’un acteur ;
- modération / suppression / restauration ;
- export / suppression de compte quand ils existeront.
Fichiers de départ
api/app/Modules/Admin/Services/AdminUserService.phpapi/app/Modules/Admin/Services/AdminClaimService.phpapi/app/Modules/Admin/Controllers/AdminMessagesController.php
Critères d’acceptation
- chaque action sensible laisse une trace exploitable ;
- acteur, utilisateur, admin auteur, action, contexte et timestamp sont conservés ;
- l’historique
claimne dépend plus d’une table absente ou implicite.
Validation
- tests feature ciblés ;
- contrôle manuel des inserts d’audit ;
- vérification lecture triée par date.
P0-4 — Tester réellement la restauration
Priorité : critique
Repos : exploitation / dmv-docs
Problème
- La sauvegarde est documentée mais la restauration n’est pas prouvée dans le flux courant.
Travail attendu
- Exécuter un backup réel.
- Restaurer sur un environnement non production.
- Vérifier un jeu minimal de données critiques :
- profils
- acteurs
- publications
- claims
- messages
- rôles
- Mesurer un temps de restauration.
- Documenter précisément la procédure réelle.
Fichiers docs
dmv-docs/docs/11-devops/16-backup.mddmv-docs/docs/09-data/14-backups.md
Critères d’acceptation
- backup lisible prouvé ;
- restauration réussie prouvée ;
- runbook réaliste ;
- limites explicites sur buckets et off-site.
P0-5 — Aligner la politique de confidentialité sur la réalité
Priorité : critique
Repos : dmv-public, dmv-docs si besoin
Problème
- Le texte juridique ne doit pas annoncer une réalité d’hébergement ou de traitement inexacte.
Travail attendu
- Vérifier et corriger :
- hébergement réel ;
- transferts hors UE réels ;
- durées réellement tenables ;
- droits effectivement implémentés ;
- contact et procédure d’exercice des droits.
Fichier de départ
dmv-public/app/confidentialite/page.tsx
Critères d’acceptation
- plus d’écart manifeste entre le texte et l’architecture réelle ;
- pas d’annonce de droit ou de rétention non soutenue par l’exploitation.
5. P1 — Mise à niveau forte
P1-1 — Implémenter l’export utilisateur
Repos : api, dmv-workspace
Travail attendu
- Ajouter une route d’export compte.
- Exporter au minimum :
- profil ;
- rôles ;
- communes gérées ;
- acteurs liés ;
- publications de l’utilisateur ;
- messages support liés ;
- claims liées.
Critères
- export générable à la demande ;
- format exploitable ;
- journal d’audit associé.
P1-2 — Implémenter suppression / anonymisation de compte
Repos : api, dmv-workspace
Travail attendu
- Ajouter un flux de demande de suppression ;
- anonymiser ou supprimer selon contraintes métier et légales ;
- conserver uniquement ce qui doit l’être ;
- journaliser la demande et son exécution.
Critères
- droit à l’effacement exécutable ;
- aucune suppression sauvage d’objets métier partagés ;
- impact métier maîtrisé.
P1-3 — Ajouter une vraie politique de rétention technique
Repos : api, dmv-public, dmv-docs
Travail attendu
- Définir puis implémenter la rétention sur :
claimsmessagescontact_rate_limits- logs techniques
- anciens tokens/sessions si concernés
- Ajouter les jobs planifiés nécessaires.
Critères
- la rétention ne repose plus sur un texte seul ;
- les purges sont codées et documentées.
P1-4 — Corriger tous les formulaires publics sensibles
Repos : dmv-public
Travail attendu
- Vérifier que tout captcha affiché est bien validé côté backend.
- Ajouter un contrôle backend réel sur :
- contact équipe ;
- contact acteur ;
- proposition de fiche ;
- claims si nécessaire.
- Ajouter anti-duplicate simple quand pertinent.
Fichiers de départ
dmv-public/app/[commune]/AddActorModal.tsxdmv-public/app/components/ContactActorModal.tsxdmv-public/supabase/functions/contact-team/index.tsdmv-public/supabase/functions/send-actor-message/index.ts
Critères
- aucun flux sensible n’est protégé uniquement en frontend ;
- les erreurs 429/403 sont propres ;
- pas de régression UX visible hors message d’erreur normal.
P1-5 — Chiffrer les téléphones et données privées les plus sensibles
Repos : api, éventuellement Supabase schema
Travail attendu
- Chiffrer en priorité :
- téléphone profil ;
- téléphone claim ;
- téléphone message support si conservé ;
- futures préférences sensibles.
À ne pas chiffrer en V1 par défaut
- email ;
- prénom/nom ;
- organisation ;
- rattachement commune.
Critères
- lecture toujours possible dans les flux métiers autorisés ;
- fuite DB moins directement exploitable.
P1-6 — Masquer davantage les PII en backoffice
Repos : api, interface consommatrice si nécessaire
Travail attendu
- Réduire les listes admin qui exposent les emails/téléphones sans besoin direct.
- Afficher uniquement le minimum utile par rôle.
- Réserver l’accès au détail PII à un rôle explicitement autorisé.
Critères
- support et modération ne voient pas plus que nécessaire ;
- le backoffice respecte le principe de minimisation.
6. P2 — Durcissement vers un vrai 9/10
P2-1 — RBAC complet par permissions et scopes
- introduire un système permissions/scopes durable ;
- documenter la matrice rôle → permissions ;
- couvrir aussi les futures apps
PlayLoop,AssoSuite,Mairie.
P2-2 — MFA obligatoire pour rôles sensibles
- imposer MFA pour :
platform_adminsupport_agentbilling_admin- futur
security_admin
P2-3 — Sauvegarde off-site et PRA formalisé
- copie hors VPS ;
- sauvegarde buckets ;
- test de restauration périodique ;
- RPO/RTO explicites.
P2-4 — Alerting sécurité et coût
- alerte sur :
- pics IA ;
- erreurs auth ;
- échecs backup ;
- activité admin anormale ;
- volume claims/messages anormal.
P2-5 — Extension des tests RLS et frontières de confiance
- étendre les tests RLS aux autres tables sensibles ;
- documenter ce qui est protégé par RLS et ce qui doit passer par Laravel ;
- supprimer les zones ambiguës entre sécurité API et sécurité Supabase.
7. Ordre d’exécution recommandé
P0-2— sécurisersend-team-replyP0-1— RBAC minimum viableP0-3— audit logsP0-5— politique de confidentialitéP0-4— backup + restore prouvésP1-4— formulaires publics sensiblesP1-1— export utilisateurP1-2— suppression / anonymisationP1-3— rétentionP1-5— chiffrement cibléP1-6— minimisation backofficeP2-*— durcissement long terme
8. Conditions de réussite
Le chantier ne doit être considéré comme réussi que si :
- chaque phase est isolée ;
- les validations passent après chaque phase ;
- aucun comportement métier existant n’est cassé ;
- les accès refusés sont propres ;
- les permissions sont testées ;
- les documents de sécurité et d’exploitation sont mis à jour en même temps que le code.
9. Conditions de stop
Le chantier doit être interrompu si :
- une phase exige une refonte trop large non prévue ;
- le comportement réel de production n’est pas clair ;
- une dépendance Supabase / Cloudflare / Laravel n’est pas vérifiée ;
- un doute subsiste sur la non-régression d’un flux utilisé en préprod.
Dans ce cas :
- documenter l’écart ;
- ne pas improviser ;
- reprendre dans un lot séparé.