Retour à la documentation
Guide 00

La pipeline DLP des documents — référence opérateur

Quand le balayage DLP est activé pour un workspace, chaque document téléversé traverse un balayage asynchrone pg-boss après l'ingestion :

4 min de lecture

Quand le balayage DLP est activé pour un workspace, chaque document téléversé traverse un balayage asynchrone pg-boss après l'ingestion :

Fonctionnalité Enterprise optionnelle, activable par workspace (workspaces.dlpDocumentScanEnabled, par défaut off ; l'activation exige le passage de la eval gate). Source : docs/DLP_DOCUMENT_PIPELINE.md (Phase 192, DLP-01..06 — v0.28.1). Lignes de provenance : FACT-CENSUS.md F-DLP-1, F-DLP-2, F-AUDIT-1.
  1. Detect — une pipeline à 3 niveaux : des patterns regex configurables par l'admin (dlpPatternService), la validation par somme de contrôle pour les identifiants italiens à format fixe (Codice Fiscale incl. l'omocodia, P.IVA, IBAN — dlpChecksum), la NER contextuelle via LLM pour les noms/adresses (le client Ollama existant).
  2. Mask — les entités détectées deviennent des espaces réservés numérotés à l'échelle du document ([PERSON_1], [GOV_ID_2], …). Le masquage est idempotent (mask∘mask = mask) — la syntaxe des espaces réservés ne peut jamais se ré-accrocher.
  3. Re-embed masqué — document_chunks.chunkText est réécrit avec le texte masqué, searchVector/searchVectorMulti (FTS) recalculés, et les vecteurs ré-embeddés via l'endpoint du collector /api/ingest/reembed. Aucun vecteur non rédigé ne reste consultable.
  4. Chiffrement des originaux — le texte original et chaque valeur d'entité sont conservés chiffrés AES-256-GCM (encryptionService, le contrat ENCRYPTION_KEY). Le masquage est one-way : les originaux chiffrés sont la seule copie propre.

Les contrôles admin

L'interrupteur par workspace (DLP-01)

Settings → Workspaces → l'interrupteur DLP document scan (la colonne workspaces.dlpDocumentScanEnabled, par défaut off).

  • L'interrupteur reste désactivé tant que la eval gate (ci-dessous) n'est pas passée — la DÉSACTIVATION n'est jamais bloquée.
  • L'état bascule optimiste et revient en arrière sur une erreur de sauvegarde.

La eval gate (DLP-05)

L'évaluation de la qualité de détection doit passer avant l'activation :

  • POST /api/system/dlp/eval/run (admin) — exécute le coureur répétable sur le corpus de fixtures PII italiennes commis (packages/server/src/__tests__/fixtures/dlp-eval/). Persiste le résultat dans SystemConfig DLP_EVAL_LAST_RUN (non éditable par l'admin).
  • GET /api/system/dlp/eval/result (admin) — lit le dernier run ; jamais exécuté retourne { passed: false, noRun: true } — jamais un pass silencieux.
  • La métrique de la barrière : zéro faux positif par sommes de contrôle supprimées sur les classes GOV_ID/FINANCIAL. La recall PERSON/ADDRESS est documentée seule (nerMode marque stub vs live).

Le backfill du corpus legacy (DLP-06)

POST /api/system/dlp/backfill (admin, avec la confirmation AlertDialog dans l'UI) :

  • Eval-gated : refuse avec 409 { error, gate: "eval-not-passed" } quand le dernier eval est absent ou tombé.
  • Idempotent + reprise : le marqueur dlpScannedAt — un re-run ne met en file que les documents sans le marqueur.
  • Rate-limited : concurrence de file 1 (sous la file de balayage en direct).
  • La convergence est épinglée par le jumeau d'intégration (Postgres réel) : chunks masqués persistés, tsvector recalculé, le payload reembed byte-égal au texte masqué, les requêtes d'audit = zéro PII restante.

Les quatre classes de patterns (identifiants européens/italiens)

ClasseCe qu'elle détecte
GOV_IDCodice Fiscale (incl. la vérification d'omocodia)
FINANCIALP.IVA, IBAN (avec validation par somme de contrôle)
PERSONles noms de personnes (NER contextuelle LLM)
ADDRESSles adresses (NER contextuelle LLM)

Les classes à somme de contrôle (GOV_ID/FINANCIAL) sont déterministes ; les contextuelles (PERSON/ADDRESS) passent par la NER LLM — leur recall est documentée dans le résultat de l'eval.

Chat re-composition (DLP-03)

Les espaces réservés masqués atteignent la LLM ; à la fin du stream, exactement une fois, le serveur recompose les espaces réservés dans le message terminal pour les utilisateurs détenant dlp:unmask sur le workspace du document cité. Le champ additif content du payload done SSE porte le texte recomposé ; les visiteurs widget ne reçoivent JAMAIS de texte recomposé (appliqué côté serveur ; pour l'UI, ce n'est qu'un cacher du contrôle).

L'aperçu unmask (DLP-04)

GET /api/documents/:documentId/text sert le texte masqué par défaut. ?unmask=true ne recompose qu'au travers de l'échelle de barrières : le param valable → l'interrupteur workspace on → resolveWorkspaceRole + la permission dlp:unmask. Chaque bras de manquement retourne du texte masqué (200) — l'endpoint n'est jamais un oracle d'habilitation. L'interrupteur de l'UI se dessine seulement pour les usagers autorisés sur des documents avec entités (absence du DOM), est par-vue et jamais persisté.

La matrice d'audit (SC-4)

Chaque chemin de lecture est épinglé par un test comportemental (18 lignes : la vue texte, l'aperçu OCR, synthesis, citations, widget RAG, MCP tools, FTS, export, copie KB, reembed admin). Widget/citations/MCP portent des épingles négatives dures (masqués, jamais recomposés).

Ce guide couvre la surface opérationnelle du pipeline DLP des documents; l'approfondissement technique vit dans la publication jumelle :

Provenance

SectionSource
La pipeline à 4 étapes / detect / mask / reembed / encryptdocs/DLP_DOCUMENT_PIPELINE.md (Overview — Phase 192 DLP-01..06) — F-DLP-1
Les contrôles admin / interrupteur / eval / backfilldocs/DLP_DOCUMENT_PIPELINE.md (§ Admin controls)
Chat re-composition / aperçu unmask / auditdocs/DLP_DOCUMENT_PIPELINE.md (§ DLP-03/04, SC-4) — F-AUDIT-1 pour la classe audit
Le compte « 10 PII »non cité : le compte n'est pas traçable dans cette passe (F-DLP-2 = UNTRACED-IN-THIS-PASS) — la page nomme les classes réelles, jamais un nombre non tracé

---

Référence opérateur — Simmetric Chat v0.28.1 (docs actualisées le 2026-10-02, SHA du census `aca5b8ff`).