# Runbook — Fuite de Données PII / Incident de Sécurité **Alerte :** `VeylantPIIVolumeAnomaly` ou signalement client / équipe **Réglementation :** RGPD Art. 33 — notification CNIL sous 72 heures si risque pour les personnes **Commandement :** Ce runbook déclenche le plan de réponse aux incidents (IRP). Impliquer le DPO immédiatement. --- ## Symptômes - Alerte `VeylantPIIVolumeAnomaly` : taux PII > 3× baseline - Signalement client d'une exposition de données personnelles - Audit log montrant des requêtes atypiques (volume anormal, tenant inconnu) - Logs PII service : erreur de pseudonymisation, données non anonymisées retournées - Accès non autorisé détecté via gitleaks ou SIEM --- ## Phase 1 — Détection et Triage (0-15 min) ### 1.1 Identifier la nature de l'incident ```bash # Logs PII service (dernière heure) kubectl logs -n veylant deploy/pii-service --since=1h | \ grep -E "(error|bypass|unmasked|pseudonym)" | tail -50 # Audit logs — requêtes suspectes curl -sf -H "Authorization: Bearer $ADMIN_TOKEN" \ "https://api.veylant.ai/v1/admin/logs?limit=100&sort=desc" | \ jq '.[] | select(.pii_entities_count > 50) | {request_id, tenant_id, user_id, pii_count: .pii_entities_count, timestamp}' # Vérifier les métriques PII anormales curl -s "http://prometheus:9090/api/v1/query_range" \ --data-urlencode 'query=rate(veylant_pii_entities_detected_total[5m])' \ --data-urlencode 'start=1h ago' \ --data-urlencode 'end=now' \ --data-urlencode 'step=1m' | jq '.data.result[0].values[-10:]' ``` ### 1.2 Classifier l'incident | Niveau | Description | Action immédiate | |--------|-------------|------------------| | **P1 — Critique** | Données PII retournées en clair dans les réponses API | Isolation immédiate | | **P2 — Élevé** | Anomalie volume PII, cause inconnue | Investigation + monitoring renforcé | | **P3 — Moyen** | Pseudo non réversible exposé, pas de données réelles | Logging + rapport | | **P4 — Info** | Alerte technique sans impact sur les données | Analyse, pas d'action urgente | --- ## Phase 2 — Isolation Immédiate (si P1) **ARRÊTER le flux de données avant toute investigation.** ```bash # Option A — Mode maintenance (impact utilisateurs, mais sécurisé) curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"enabled": true, "message": "Maintenance de sécurité en cours."}' \ https://api.veylant.ai/v1/admin/flags/maintenance-mode echo "Maintenance mode ACTIVÉ — toutes les requêtes bloquées" # Option B — Isoler un tenant spécifique seulement (si périmètre connu) curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"suspended": true, "reason": "security_incident"}' \ "https://api.veylant.ai/v1/admin/tenants/$AFFECTED_TENANT_ID" echo "Tenant $AFFECTED_TENANT_ID suspendu" ``` ### 2.2 Désactiver le service PII si compromis ```bash # Désactiver le PII service (stoppe l'anonymisation — plus sécuritaire qu'un bypass) kubectl scale deploy/pii-service -n veylant --replicas=0 echo "PII service arrêté — toutes les requêtes avec PII rejetées (fail_open=false)" ``` --- ## Phase 3 — Investigation (15-60 min) ### 3.1 Collecter les preuves ```bash # Snapshot des logs d'audit (immuables dans ClickHouse) curl -sf -H "Authorization: Bearer $ADMIN_TOKEN" \ "https://api.veylant.ai/v1/admin/logs?tenant_id=$TENANT_ID&limit=1000&format=csv" \ > incident_audit_$(date +%Y%m%d_%H%M%S).csv # Export des métriques Prometheus au moment de l'incident curl -s "http://prometheus:9090/api/v1/query_range" \ --data-urlencode "query=rate(veylant_pii_entities_detected_total[1m])" \ --data-urlencode "start=$(date -u -d '2 hours ago' +%s)" \ --data-urlencode "end=$(date -u +%s)" \ --data-urlencode "step=60" > pii_metrics_$(date +%Y%m%d).json # Capture des logs système kubectl logs -n veylant deploy/veylant-proxy-blue --since=2h > proxy_logs_$(date +%Y%m%d_%H%M%S).log kubectl logs -n veylant deploy/pii-service --since=2h > pii_logs_$(date +%Y%m%d_%H%M%S).log ``` ### 3.2 Analyser les données exposées ```bash # Identifier quels types de PII ont été détectés grep "entity_type" incident_audit_*.csv | \ awk -F',' '{print $NF}' | sort | uniq -c | sort -rn # Identifier les utilisateurs concernés grep "pii" incident_audit_*.csv | \ awk -F',' '{print $3}' | sort -u # colonne user_id ``` ### 3.3 Vérifier la réversibilité des pseudonymes ```bash # Les pseudonymes Redis sont-ils accessibles sans contexte tenant ? # Tester depuis un tenant différent (devrait échouer) curl -sf -X POST \ -H "Authorization: Bearer $OTHER_TENANT_TOKEN" \ -H "Content-Type: application/json" \ -d '{"text": "[PSEUDONYM_XXX]"}' \ https://api.veylant.ai/v1/pii/analyze # Si le pseudonyme est résolu depuis un autre tenant → fuite critique (CVSS 9.0+) ``` --- ## Phase 4 — Notification RGPD (si données réelles exposées) ### Délai légal : 72 heures après prise de connaissance (RGPD Art. 33) ### 4.1 Notifier le DPO immédiatement ``` Contact DPO : [nom] — [email] — [téléphone] Message type : "Incident de sécurité potentiel détecté sur Veylant IA à [HH:MM]. Type : [description]. Données possiblement affectées : [types PII]. Utilisateurs potentiellement impactés : [N]. Investigation en cours. Présence requise immédiatement." ``` ### 4.2 Préparer la notification CNIL La notification doit inclure (RGPD Art. 33§3) : - Nature de la violation - Catégories et nombre approximatif de personnes concernées - Catégories et nombre approximatif d'enregistrements concernés - Nom et coordonnées du DPO - Description des conséquences probables - Mesures prises ou envisagées pour remédier ```bash # Template notification CNIL (à compléter) cat > cnil_notification_$(date +%Y%m%d).md << 'EOF' # Notification de violation de données — RGPD Art. 33 **Date de la violation :** [DATE] **Date de détection :** [DATE] **Date de notification :** [DATE] (dans les 72h) ## Nature de la violation [Description précise] ## Catégories de données affectées - [ ] Noms/prénoms - [ ] Emails - [ ] Numéros de téléphone - [ ] Données financières (IBAN, etc.) - [ ] Données de santé - [ ] Autres : [préciser] ## Personnes affectées - Nombre approximatif : [N] - Catégories : [employés, clients, etc.] ## Mesures prises 1. Isolation des systèmes affectés : [HH:MM] 2. Investigation en cours 3. [Autres mesures] ## Contact DPO [Nom, email, téléphone] EOF ``` ### 4.3 Notifier les clients affectés (si données réelles exposées) Délai recommandé : sans retard injustifié (RGPD Art. 34 si risque élevé pour les personnes) ``` Template email client : Objet : [Important] Notification de sécurité — Veylant IA Madame, Monsieur, Nous vous informons d'un incident de sécurité détecté le [DATE] à [HH:MM]... ``` --- ## Phase 5 — Restauration et Post-mortem ### 5.1 Restaurer le service ```bash # Redémarrer le PII service kubectl scale deploy/pii-service -n veylant --replicas=1 kubectl rollout status deploy/pii-service -n veylant # Désactiver le mode maintenance curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"enabled": false}' \ https://api.veylant.ai/v1/admin/flags/maintenance-mode # Réactiver le tenant (si applicable) curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"suspended": false}' \ "https://api.veylant.ai/v1/admin/tenants/$AFFECTED_TENANT_ID" # Smoke test post-restauration curl -sf https://api.veylant.ai/healthz | jq . ``` ### 5.2 Invalider les pseudonymes compromis (si applicable) ```bash # Forcer la rotation des clés Redis de pseudonymisation # ATTENTION : invalide TOUS les pseudonymes actifs → les mappings PII seront recréés kubectl exec -n veylant deploy/redis -- redis-cli FLUSHDB echo "Pseudonymes invalidés — nouveaux pseudonymes générés au prochain appel PII" ``` --- ## Checklist Incident - [ ] Incident détecté à [HH:MM] - [ ] DPO notifié à [HH:MM] (< 15 min après détection) - [ ] Isolation effectuée à [HH:MM] - [ ] Preuves collectées (logs, métriques) - [ ] Évaluation RGPD : notification CNIL requise ? [Oui/Non] - [ ] Si oui : notification CNIL < 72h (deadline : [DATE HH:MM]) - [ ] Notification clients si risque élevé - [ ] Service restauré à [HH:MM] - [ ] Post-mortem planifié (J+3) - [ ] Rapport de remédiation livré (J+7)