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.