# 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](https://www.hetzner.com/AV/DPA_en.pdf) à 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 : ```bash # 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](./12-sauvegardes-restauration.md) | 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](./README.md).