Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018BAUeCFpDkRD6tU5wGsc1C
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.