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

242 lines
11 KiB
Markdown

# 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).