xpeditis2.0/docs/mise-en-prod/16-rgpd-conformite.md
David b22f4e0b74 docs: procedure de mise en production pas a pas
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018BAUeCFpDkRD6tU5wGsc1C
2026-09-07 21:40:50 +02:00

11 KiB

16 — RGPD et conformité

Xpeditis traite des données personnelles de professionnels : noms, adresses e-mail, numéros de téléphone, adresses, SIRET, documents de transport nominatifs. Le RGPD s'applique intégralement.

Ce document décrit ce que l'infrastructure met en place et ce qu'il reste à faire. Il ne remplace pas un conseil juridique. Faites relire vos mentions légales, votre politique de confidentialité et vos contrats de sous-traitance par un professionnel avant de démarcher des grands comptes.


1. Ce que l'infrastructure apporte déjà

Exigence Mise en œuvre
Hébergement dans l'UE Hetzner, Falkenstein (Allemagne). Terraform refuse toute région hors UE.
Chiffrement en transit TLS 1.2+ partout, y compris entre l'application et PostgreSQL.
Chiffrement au repos Sauvegardes chiffrées côté client (libsodium, age). Secret k8s chiffrés dans l'état de k3s.
Contrôle d'accès RBAC applicatif, Argon2, JWT courts, cookies httpOnly.
Traçabilité audit_logs applicatif, journal d'audit Kubernetes, auditd système.
Minimisation dans les journaux pino expurge authorization, x-api-key et les mots de passe. Traefik ne conserve que User-Agent et Cf-Connecting-Ip.
Durée de conservation des journaux Loki 31 jours, Prometheus 15 jours, audit k8s 30 jours.
Sécurité des sauvegardes Chiffrées, cloisonnées, testées.
Résilience PITR 5 min, RTO < 2 h — l'article 32 exige de pouvoir « rétablir la disponibilité ».

Le chiffrement du disque n'est pas activé. Les volumes Hetzner ne sont pas chiffrés au repos par défaut. En pratique, la protection repose sur la sécurité physique du datacenter (certifié ISO 27001) et sur la destruction sécurisée des supports. Si un client l'exige contractuellement, il faut mettre en place LUKS sur le volume PostgreSQL — au prix d'une clé à saisir ou à stocker à chaque démarrage, ce qui déplace le problème plus qu'il ne le résout sur un serveur distant. À arbitrer, pas à improviser.


2. Registre des sous-traitants

À tenir à jour. C'est la première chose que demande un client grand compte, et c'est obligatoire au titre de l'article 30.

Sous-traitant Rôle Données Localisation Transfert hors UE DPA
Hetzner Online GmbH Hébergement, stockage, sauvegardes Toutes Allemagne non DPA Hetzner à signer
Cloudflare Inc. DNS, WAF, CDN IP, en-têtes, métadonnées de requête Réseau mondial oui (États-Unis) DPA + CCT, incluses aux CGU
Stripe Inc. Paiements Nom, e-mail, données de facturation UE + États-Unis oui DPA Stripe
Brevo (Sendinblue SAS) E-mails transactionnels Nom, e-mail, contenu des messages France non DPA Brevo
Functional Software Inc. (Sentry) Suivi des erreurs Traces, potentiellement des identifiants utilisateur États-Unis oui DPA + purge des données
Pappers (SAS) Vérification SIRET SIRET, raison sociale France non DPA
Scaleway SAS Registre d'images Aucune donnée personnelle France non —
GitHub Inc. Code source, CI Aucune donnée client États-Unis oui —

Actions

[ ] Signer le DPA Hetzner (formulaire dans la console)
[ ] Récupérer et archiver les DPA Cloudflare, Stripe, Brevo, Sentry, Pappers
[ ] Activer la purge des données personnelles dans Sentry
      Settings → Security & Privacy → Data Scrubbing → activer
      + champs supplémentaires : email, phone, siret, token
[ ] Documenter ce registre dans un document versionné

Sentry mérite une attention particulière. Une trace d'exception peut contenir l'e-mail, l'identifiant et le corps de requête d'un utilisateur, et partir chez un sous-traitant américain. Activez la purge avant de connecter Sentry à la production, pas après.


3. Durées de conservation

À décider, puis à appliquer techniquement. Proposition de départ :

Donnée Durée proposée Justification
Compte utilisateur actif Durée de la relation contractuelle Exécution du contrat
Compte inactif 3 ans après la dernière connexion Recommandation CNIL en prospection B2B
Réservations et documents de transport 10 ans Obligation comptable et commerciale (art. L123-22 code de commerce)
Factures 10 ans Idem
audit_logs 1 an Sécurité, art. 32
Journaux techniques (Loki) 31 jours Déjà appliqué
Sauvegardes 7 j PITR, 30 j dumps Déjà appliqué
Cookies analytiques 13 mois Recommandation CNIL

La conservation légale prime sur le droit à l'effacement. Un client peut demander la suppression de son compte : les réservations qui portent une obligation comptable doivent être conservées, mais peuvent être pseudonymisées (retirer nom, e-mail, téléphone en gardant les montants et références). C'est ce que doit faire la fonction d'effacement du module GDPR.

À vérifier dans le code

Le backend expose un module gdpr. Vérifiez qu'il fait bien ce qu'il annonce :

# Que fait réellement l'export ? Que fait la suppression ?
grep -rn "class.*Gdpr\|anonymi\|pseudonym" apps/backend/src/application/gdpr/
[ ] L'export de données couvre : compte, organisation, réservations, documents
[ ] La suppression pseudonymise au lieu d'effacer les données à conservation légale
[ ] Une purge automatique des comptes inactifs > 3 ans existe (ou est planifiée)

4. Documents obligatoires

Document Où Statut
Politique de confidentialité /privacy (route publique existante) à rédiger
Mentions légales /terms à rédiger
Politique de cookies + bandeau de consentement /cookies à rédiger
CGU / CGV /terms à rédiger
Registre des traitements (art. 30) interne à créer
Registre des sous-traitants interne §2 ci-dessus
Procédure de violation de données interne §6 ci-dessous

Les routes /privacy, /terms et /cookies sont déjà publiques dans middleware.ts : il ne manque que le contenu.

Bandeau de cookies

Nécessaire uniquement si vous déposez des cookies non essentiels (mesure d'audience, publicité). Les cookies d'authentification httpOnly sont strictement nécessaires et n'exigent pas de consentement.

Si vous ajoutez Google Analytics (NEXT_PUBLIC_GA_ID est prévu dans le Dockerfile frontend), un bandeau de consentement préalable devient obligatoire — le script ne doit pas se charger avant l'acceptation.

Alternative plus simple : Plausible ou Matomo auto-hébergé, sans cookie ni consentement requis. Moins de code, moins de risque juridique.


5. Droits des personnes

Vous devez répondre sous un mois.

Droit Mise en œuvre
Accès / portabilité Module GDPR — export JSON ou CSV
Rectification Interface de profil
Effacement Module GDPR — pseudonymisation, cf. §3
Limitation Désactivation du compte (is_active = false)
Opposition Désinscription des communications

Publiez une adresse de contact dédiée (privacy@xpeditis.com ou dpo@xpeditis.com) dans la politique de confidentialité, et relevez-la.

DPO

Non obligatoire pour une PME dont le traitement de données personnelles n'est ni massif ni sensible. Désignez néanmoins un référent RGPD nommément — c'est ce que demandent les clients grands comptes.


6. Violation de données

Notification à la CNIL sous 72 heures à compter de la prise de connaissance (art. 33). Si le risque pour les personnes est élevé, il faut aussi les informer directement (art. 34).

Procédure

1. CONSTATER      Suivre 13 § Réponse à incident. Préserver les preuves.
2. QUALIFIER      Quelles données ? Combien de personnes ? Quel risque réel ?
3. CONTENIR       Isoler, faire tourner les secrets, restaurer.
4. NOTIFIER       CNIL sous 72 h : notifications.cnil.fr
                  Même incomplète, une notification dans les délais vaut mieux
                  qu'une notification complète hors délai.
5. INFORMER       Les personnes concernées si le risque est élevé.
6. DOCUMENTER     Journal des violations : obligatoire, même sans notification.

Ce dont vous aurez besoin

  • Quelles données, pour combien de personnes ?
  • Depuis quand, jusqu'à quand ?
  • Comment cela a-t-il été découvert ?
  • Quelles mesures ont été prises ?
  • Quelles conséquences probables pour les personnes ?

Les sources : audit_logs, Loki (31 j), journal d'audit k8s (30 j), auditd, journaux PostgreSQL. Ces rétentions déterminent votre capacité à répondre. Une intrusion découverte 45 jours après coup ne sera pas reconstituable — c'est un argument pour porter la rétention Loki à 90 jours dès que le volume le permet.


7. Ce qu'exigeront les grands comptes

Au-delà du RGPD, attendez-vous à :

Demande Statut Coût
Questionnaire sécurité (50-200 questions) ce dossier y répond en grande partie temps
DPA signé de votre côté à préparer juridique
Preuve de sauvegardes testées 12 fait
Engagement de disponibilité (SLA) pas d'engagement contractuel aujourd'hui à arbitrer
Test d'intrusion récent non fait 3 à 8 k€
SOC 2 Type II non ~800 €/mois (Vanta) + 15-25 k€ d'audit
ISO 27001 non 20-40 k€
Assurance responsabilité civile professionnelle / cyber prévue au budget (150 €/mois) à souscrire

Souscrivez la RC Pro / cyber avant l'ouverture. Elle figure dans le fichier de prévisions et couvre précisément ce que la technique ne peut pas couvrir : les conséquences financières d'un incident.


8. Contrôle

[ ] Hébergement UE confirmé (fsn1)
[ ] DPA Hetzner signé
[ ] DPA Cloudflare, Stripe, Brevo, Sentry, Pappers archivés
[ ] Purge des données personnelles activée dans Sentry
[ ] Registre des sous-traitants rédigé
[ ] Registre des traitements (art. 30) rédigé
[ ] Durées de conservation décidées et documentées
[ ] Module GDPR vérifié : export complet, suppression pseudonymisante
[ ] Politique de confidentialité publiée sur /privacy
[ ] Mentions légales et CGU publiées sur /terms
[ ] Politique de cookies publiée sur /cookies
[ ] Adresse privacy@ ou dpo@ publiée et relevée
[ ] Référent RGPD désigné nommément
[ ] Procédure de violation de données rédigée et accessible hors ligne
[ ] Assurance RC Pro / cyber souscrite

Fin de la documentation de mise en production. Retour à l'index.