Document public — Mai 2026
Architecture de sécurité Garante
Vue d'ensemble des mesures techniques et organisationnelles (Art. 32 RGPD) que Garante met en œuvre pour protéger les données traitées par les cabinets DPO utilisant la plateforme. Document destiné aux prospects, auditeurs et clients.
Cloisonnement multi-tenant
Row-Level Security Postgres
Isolation des données par cabinet au niveau de la base de données (rôle non-superuser garante_app sans BYPASSRLS). Une faille applicative ne peut pas faire fuiter de données cross-tenant.
Filtrage applicatif cabinetId
Toutes les requêtes Prisma filtrent par cabinetId (Art. 32.1 RGPD — confidentialité par défaut).
Service role séparé
Bootstrap auth, crons et tâches admin utilisent un rôle distinct (garante_service BYPASSRLS) — séparation explicite des privilèges.
Authentification & accès
JWT HS256 explicite
Access token 15 min, refresh 7 jours en rotation single-use avec blacklist Redis + DB. Algorithm pinning (algorithms: ['HS256']).
Mots de passe
Hash bcrypt 12 rounds, jamais stockés ni logués en clair.
2FA TOTP obligatoire par défaut
Activation obligatoire pour tous les rôles (admin, DPO, assistant). Grace period de 7 jours pour les admins, 30 jours pour les autres rôles à compter de la première connexion. 10 codes de récupération 48 bits chiffrés AES-256-GCM. Tolérance drift ±120s. Configurable au niveau cabinet par un admin (toggle « Exiger 2FA tous utilisateurs ») si exception métier documentée.
Brute-force lockout
10 tentatives échouées → blocage 1h. Email d'alerte envoyé au compte verrouillé (Brevo).
Panel admin séparé
Accès au CRM prospection / onboarding gardé par PLATFORM_ADMIN_KEY + cookie HMAC + 2FA TOTP optionnel (table dédiée).
Chiffrement (défense en couches)
TLS 1.3 in-transit
HTTPS partout (Let's Encrypt). HSTS preload 2 ans. Headers Helmet sur l'API : CSP, COOP, CORP, Referrer-Policy.
AES-256-GCM application-level
Tous les secrets sensibles en DB (clés API connecteurs, secrets TOTP, codes de récupération 2FA, credentials sous-traitants) chiffrés avec IV 12 bytes (NIST SP 800-38D). Versioning de clé pour rotation future.
MinIO SSE-KMS at-rest
Stockage S3-compatible avec auto-encryption KMS activée (MINIO_KMS_AUTO_ENCRYPTION=on) — chaque fichier (DSAR, pièces d'identité, DPA, bundles CNIL) chiffré sur disque avec clé maître dédiée.
Backups AES-256-CBC
Archives pg_dump + MinIO chiffrées AES-256-CBC, dérivation PBKDF2 100 000 itérations. Clé indépendante du chiffrement applicatif.
Disque hyperviseur
Hébergeur Hetzner certifié ISO/IEC 27001:2022 (datacenters Falkenstein, Nuremberg, Helsinki). Destruction physique des disques en fin de vie selon ISO/IEC 21964 classe 2. Le chiffrement OS-level (LUKS) n'est pas activé : la défense repose sur le chiffrement applicatif des secrets sensibles + isolation tenant RLS.
Audit trail tamper-evident
Hash chain SHA-256
Chaque action sur DSAR / violation / AIPD est journalisée avec un hash chaîné (chaque entrée référence le hash précédent, racine GENESIS_HASH). Toute modification ou suppression d'une entrée invalide la chaîne — détectable par verifyChain().
Horodatage UTC + IP
Chaque entrée stocke l'horodatage serveur, l'IP du requêteur, l'identifiant utilisateur, l'action et les détails métier en JSON.
Opposabilité
Conformité Art. 5.2 RGPD (accountability) et Art. 1366 du Code Civil (preuve par écrit / signature électronique simple). Bundle d'export inclut le manifest SHA-256 par fichier + signature globale.
Validation IA & responsabilité
Validation à 4 yeux par défaut
Toute DSAR doit passer par 2 relectures (1 DPO + 1 DPO/assistant distinct) avant envoi. Désactivable uniquement par admin avec déclaration écrite assumant la responsabilité juridique (stockée comme preuve).
Disclaimer IA systématique
Tout livrable généré par Mistral AI (réponses DSAR, politiques de confidentialité, AIPD, rapports) est étiqueté « BROUILLON IA — relecture obligatoire ». La responsabilité juridique reste sur le DPO.
Audit Mistral
Chaque appel IA est journalisé (table aiAuditLog) : prompt système, message utilisateur, réponse, latence, tokens, succès/échec. Reproductibilité totale.
Anti-abus & disponibilité
Rate limiting Redis
Login 5/15min, 2FA 5/15min, register 3/h, AI generate 10/h, portail public DSAR 5/h, global authentifié 600/min/utilisateur.
SSRF protection
RFC1918, link-local, cloud metadata (AWS/Azure/GCP) bloqués + résolution DNS validée pour les webhooks et connecteurs.
Anti-virus uploads
ClamAV scan obligatoire sur tous les uploads (pièces d'identité DSAR, attachments violations, DPA scannés). Fail-closed en production.
WAF Bunny Shield
Web Application Firewall en frontal du site et de l'API. Hébergeur EU (Bunny.net), pas de Cloud Act US.
Monitoring email
Healthcheck infrastructure toutes les 5 min. Email d'alerte envoyé après 3 échecs consécutifs. Logs Pino avec redaction automatique de 13 patterns sensibles (passwords, tokens, secrets).
Données personnelles & rétention
Pièces d'identité DSAR
Stockées dans MinIO chiffré, purgées automatiquement 30 jours après vérification d'identité. Cron quotidien.
DSAR clos
Conservés 36 mois par défaut (configurable par cabinet, max 84 mois). Purge cron mensuelle.
Logs offboarding
Conservés 5 ans (Art. 28.3.g RGPD + prescription civile), puis purge automatique.
Anonymisation tiers
L'IA détecte et signale les données de tiers présentes dans les résultats de discovery DSAR avant inclusion dans la réponse au demandeur.
Données DSAR agrégées (minimisation)
Lors d'un DSAR, les données extraites des connecteurs API sont agrégées temporairement dans Garante le temps de bâtir la réponse au demandeur, puis purgées automatiquement après envoi (défaut 30 jours, configurable par cabinet). Seul le cabinet DPO du client peut y accéder durant cette fenêtre. Hors DSAR actif, Garante ne stocke que les métadonnées (registres Art. 30, scores conformité, historiques d'actions) — pas le contenu personnel des personnes concernées.
Statut sous-traitant ultérieur
Garante agit comme sous-traitant ultérieur du cabinet DPO (lui-même sous-traitant de ses clients). Une fiche Article 28 prête à coller dans le registre Art. 30 de chaque client est publiée sur /legal/fiche-article-28 (copier-coller direct), conforme à l'obligation de mention des sous-traitants ultérieurs (Art. 28.4 RGPD).
Infrastructure & hébergement
Hébergeur Hetzner Allemagne
Serveur dédié (CPX32, 4 vCPU, 8 Go RAM) hébergé à Falkenstein. Souveraineté UE — pas soumis au Cloud Act US.
Réseau
Hetzner Firewall + UFW + Fail2ban + CrowdSec. Seuls les ports 80, 443 et 2222 (SSH custom) exposés. Tous les services internes (Postgres, Redis, MinIO, ClamAV) liés à 127.0.0.1.
Conteneurs
Docker non-root, no-new-privileges, resource limits, multi-stage builds. Mises à jour de sécurité hebdomadaires.
Vault Infisical
Secrets critiques (Mistral API key, Brevo API key, JWT secret, encryption key) gérés par Infisical avec rotation. Refresh automatique toutes les 5 min.
Sauvegardes & continuité
Backup quotidien chiffré
pg_dump complet + dump MinIO, chiffrés AES-256-CBC avec dérivation PBKDF2 100 000 itérations. Cron 03:00 UTC, rétention 30 jours.
Copie hors-ligne rotative
Copie quotidienne 03:30 UTC vers un répertoire isolé du runtime applicatif (rétention 7 jours). Permet une restauration rapide en cas d'incident applicatif (suppression accidentelle, corruption).
Réplication off-site géographique
Réplication off-site géographique non mise en place à ce jour. Procédure de restauration depuis backup chiffré documentée.
Monitoring uptime externe
UptimeRobot ping de l'API et du frontend toutes les 5 minutes. Alerte email si serveur entièrement down.
Signaler une vulnérabilité
Si vous découvrez une faille de sécurité dans Garante, contactez-nous àsecurity@garante.fr. Nous nous engageons à accuser réception sous 24h ouvrées et à coordonner la divulgation responsable.