Files
AuditShield/plan.md
Vincent 2df14dcc73 docs: initialize plan.md and update CLAUDE.md after phase 1
plan.md:
- Phase 1 détaillée et cochée (backend, frontend, infra, décisions techniques)
- Phases 2 (Nmap/Celery), 3 (vulns/CVE), 4 (PDF/dashboard) planifiées avec tâches
- Prochaine étape : feature/phase-2-nmap

CLAUDE.md:
- Structure de dossiers mise à jour (route groups, lib, core)
- Commandes corrigées (uvicorn backend.main:app, alembic depuis racine)
- Conventions Phase 1 : imports backend.xxx, Pydantic v2, PATCH pattern,
  selectinload, TimestampMixin, guard auth frontend, camelCase types TS
- Pièges à éviter documentés

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 17:24:47 +01:00

9.9 KiB
Raw Blame History

AuditShield — Plan de développement

Vue d'ensemble

Outil d'audit infrastructure et sécurité pour clients MSP. Scans réseau + vulnérabilités + pentest → rapports PDF compréhensibles pour non-techniciens.


Phase 1 — Socle (terminée)

Branche : feature/phase-1-socle → mergée dans dev

Ce qui a été créé

Backend (FastAPI + SQLAlchemy)

  • backend/core/ — config (pydantic-settings), database (SQLAlchemy 2.0), security (JWT + bcrypt)
  • backend/models/ — 7 modèles : User, Client, Audit, Cible, Vulnérabilité, Action + TimestampMixin
  • backend/schemas/ — Pydantic v2 : UserCreate/Read, ClientCreate/Update/Read, AuditCreate/Update/Read/Detail, CibleCreate/Read, VulnerabiliteCreate/Read, ActionCreate/Update/Read
  • backend/api/auth.py — POST /register, POST /login (OAuth2), GET /me
  • backend/api/clients.py — CRUD complet (GET list, POST, GET/{id}, PATCH/{id}, DELETE/{id})
  • backend/api/audits.py — CRUD audit + nested : cibles (add/valider), vulnérabilités (add), actions (add/update)
  • backend/main.py — FastAPI app, CORS (localhost:3000), rate limiting (slowapi), docs /api/docs en DEBUG
  • backend/alembic/ — migrations configurées (env.py prêt avec models importés)
  • backend/tests/test_auth.py — test async register + login avec SQLite in-memory

Frontend (Next.js 14 App Router)

  • Route groups : (auth) pour login, (dashboard) pour pages protégées
  • app/(auth)/login/page.tsx — formulaire login avec gestion JWT
  • app/(dashboard)/layout.tsx — guard auth (redirect /login), layout sidebar + main
  • app/(dashboard)/dashboard/page.tsx — 4 stat cards + 5 audits récents
  • app/(dashboard)/clients/page.tsx — grille clients avec recherche
  • app/(dashboard)/audits/page.tsx — liste audits avec badges statut + recherche
  • components/layout/sidebar.tsx — navigation (Dashboard, Clients, Audits) + déconnexion
  • components/ui/ — Button (CVA variants), Card, Input, Label, Badge (+ variantes criticité)
  • lib/api.ts — client fetch générique typé : authApi, clientsApi, auditsApi
  • lib/auth.ts — helpers localStorage pour token JWT

Infrastructure

  • docker/docker-compose.yml — 4 services : postgres:16, redis:7, backend, frontend
  • docker/docker-compose.prod.yml — images registry + labels Traefik + Let's Encrypt
  • backend/Dockerfile — Python 3.11-slim + WeasyPrint deps + alembic upgrade
  • frontend/Dockerfile — multi-stage Node 20 (deps → builder → runner standalone)
  • .env.example — toutes les variables documentées

Décisions techniques

Décision Raison
SQLAlchemy 2.0 avec type hints Mapped[] API moderne, meilleure inference TypeScript équivalente côté Python
Pydantic v2 séparé des modèles ORM Découplage validation/persistance, évite circular imports
JWT HS256 + 24h expiration Simple à implémenter, stateless, suffisant pour MVP
slowapi pour rate limiting Compatible FastAPI/Starlette, minimal
TimestampMixin DRY pour created_at/updated_at sur tous les modèles
Cascade delete Intégrité référentielle (supprimer client → supprime tout)
Celery + Redis (infra seulement) Prêt pour les jobs asynchrones de scan (Phase 2)
Next.js App Router + route groups Layouts différents auth/dashboard sans duplication
shadcn/ui + Radix Accessibilité, composants non-opinionnés, facilement personnalisables
JWT dans localStorage Simple pour MVP — à migrer vers HttpOnly cookie en Phase 3
camelCase pour types TS, snake_case en DB Convention JS vs convention Python/SQL
Rewrites next.config.ts vers backend Pas de CORS en prod, tout passe par Next.js

État fonctionnel

  • Register/Login utilisateur avec JWT
  • CRUD clients complet
  • CRUD audits + cibles + vulnérabilités + actions
  • Dashboard avec stats temps réel
  • Pages liste clients et audits avec recherche
  • Guard auth côté frontend
  • Docker dev + prod prêt
  • Pages de formulaire (création/édition) non créées
  • Pages détail client et audit non créées
  • Scanners : dossier vide (placeholder Phase 2)
  • Génération PDF : dossier vide (placeholder Phase 4)

🔲 Phase 2 — Scanners réseau (Nmap)

Branche : feature/phase-2-nmap

Objectif

Permettre le lancement d'un scan Nmap sur des cibles validées, afficher les résultats en temps réel, et les persister en base.

Tâches backend

  • Celery worker — configurer backend/celery_app.py, worker Docker dans docker-compose
  • Scanner Nmapbackend/scanners/nmap.py
    • Wrapper autour de python-nmap
    • Parse les résultats : ports ouverts, services, OS
    • Vérification que la cible est validee = True avant tout scan
    • Log de chaque scan en BDD (model ScanLog)
  • Model ScanLogbackend/models/scan_log.py
    • audit_id, cible_id, type_scan, statut, résultat (JSON), durée
  • Tâche Celerybackend/scanners/tasks.py
    • task_scan_nmap(audit_id, cible_ids) — async, met à jour statut
    • Retour des résultats via polling ou WebSocket
  • Routes scanbackend/api/scans.py
    • POST /audits/{audit_id}/scans/nmap — lance le scan (en background)
    • GET /audits/{audit_id}/scans — liste les scans passés
    • GET /audits/{audit_id}/scans/{scan_id} — détail d'un scan
  • Parsing Nmap → Vulnérabilités — déduire des vulnérabilités simples (ports dangereux, services obsolètes)

Tâches frontend

  • Page détail auditapp/(dashboard)/audits/[id]/page.tsx
    • Affiche : infos audit, liste cibles (avec bouton "Valider"), liste vulnérabilités, liste actions
    • Bouton "Lancer un scan Nmap"
    • Statut du scan en temps réel (polling GET /scans)
  • Page détail clientapp/(dashboard)/clients/[id]/page.tsx
    • Infos client + liste des audits du client
    • Bouton "Nouvel audit"
  • Formulaire nouveau clientapp/(dashboard)/clients/nouveau/page.tsx
  • Formulaire nouvel auditapp/(dashboard)/audits/nouveau/page.tsx
  • Formulaire ajout cible — Modal ou inline dans détail audit
  • Composant ScanStatus — affiche statut scan (en cours / terminé / erreur)
  • Toast notifications — feedback utilisateur (succès, erreur)

Tâches infra

  • Ajouter service worker dans docker-compose (image backend + command: celery worker)
  • Ajouter python-nmap dans requirements.txt
  • Première migration Alembic : alembic revision --autogenerate -m "init"

🔲 Phase 3 — Vulnérabilités avancées + Actions

Branche : feature/phase-3-vulnerabilites

Objectif

Enrichissement des vulnérabilités avec CVE, scoring CVSS automatique, workflow de gestion des actions, et calcul du score global d'audit.

Tâches backend

  • Intégration CVE/NVDbackend/scanners/cve.py
    • Lookup CVE via NVD API (gratuit)
    • Traduction automatique en langage clair (résumé simplifié)
    • Auto-remplissage criticité depuis CVSS score
  • Calcul score global audit — méthode sur le model Audit
    • Pondération : critique × 4, important × 3, modéré × 2, faible × 1
    • Normalisé sur 10, mis à jour à chaque vulnérabilité ajoutée
  • OpenVAS optionnelbackend/scanners/openvas.py
    • Wrapper GVM (Greenbone Vulnerability Management)
    • Si disponible, scan plus profond
  • Notifications — model Notification, endpoint SSE ou WebSocket
    • Alertes nouvelles vulnérabilités critiques
    • Changements de statut d'action

Tâches frontend

  • Page détail vulnérabilitéapp/(dashboard)/audits/[id]/vulnerabilites/[vulnId]/page.tsx
    • Affiche : titre, criticité (badge coloré), CVE, CVSS, description, recommandation
    • Liste des actions liées + bouton "Ajouter une action"
    • Formulaire d'action inline
  • Composant CriticiteBar — représentation visuelle du score global
  • Page gestion des actions — tableau kanban simple (Ouvert → En cours → Résolu)
  • Filtres et tri — sur les listes de vulnérabilités (par criticité, statut)
  • Pagination — composant <Pagination> réutilisable

🔲 Phase 4 — Rapports PDF + Dashboard avancé

Branche : feature/phase-4-rapports

Objectif

Génération de rapports PDF professionnels compréhensibles par un dirigeant non-technique, et dashboard enrichi avec graphiques.

Tâches backend

  • Moteur PDFbackend/reports/pdf.py
    • WeasyPrint + Jinja2 templates HTML
    • Template rapport : page de garde, résumé exécutif, score global, vulnérabilités par criticité, recommandations, plan d'actions
    • Langage client : pas de jargon technique, CVE traduits en langage clair
  • Templates HTMLbackend/reports/templates/
    • rapport_audit.html — template principal
    • _vulnerabilite.html — bloc par vulnérabilité
    • CSS intégré (compatible WeasyPrint)
  • Route exportGET /audits/{audit_id}/rapport.pdf
    • Génère et streame le PDF
    • Header Content-Disposition: attachment
  • Tâche Celery — génération PDF asynchrone pour audits longs

Tâches frontend

  • Bouton "Exporter PDF" — dans la page détail audit
  • Dashboard avancé — graphiques :
    • Répartition vulnérabilités par criticité (donut chart)
    • Évolution des audits dans le temps (line chart)
    • Taux de résolution des actions (progress bar)
    • Utiliser recharts ou chart.js
  • Page rapportsapp/(dashboard)/rapports/page.tsx
    • Liste des rapports générés, téléchargement
  • Mode impression — CSS @media print pour la page détail audit

Prochaine étape

git checkout dev
git checkout -b feature/phase-2-nmap

Commencer par :

  1. Configurer Celery dans docker-compose.yml (service worker)
  2. Créer backend/models/scan_log.py
  3. Créer backend/scanners/nmap.py
  4. Générer la première migration Alembic
  5. Créer les pages frontend manquantes (détail audit, formulaires)