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