Blog
Segurança

A pipeline DLP documental: máscaras que sustentam

O DLP documental: três camadas de detecção, placeholders numerados no documento todo, re-embed total, originais em AES-256-GCM - duas travas unmask explícitas. Census: F-DLP-1.

Simmetric Team8 min de leitura13/10/2026
A pipeline DLP documental: máscaras que sustentam

O documento entra uma vez; o placeholder fica

A base de conhecimento de um workspace AI ingere documentos reais - contratos, cartas de RH, faturas. Alguns carregam os dados que ninguém deveria ler com descuido, e um LLM nunca deveria citá-los. A resposta do Simmetric Chat para os workspaces habilitados: um pipeline de escaneamento documental que transforma as entidades sensíveis em placeholders numerados ao longo do documento inteiro e mantém a única cópia limpa cifrada. O ponto do projeto é a última frase - o placeholder fica: a máscara é unidirecional por construção, de modo que "o documento" e "o corpus buscável" passam a objetos diferentes por projeto.

Este artigo percorre o pipeline como o operador o encontra: o escaneamento assíncrono, as três camadas de detecção, o que um placeholder garante, o que acontece no re-embedding, como os originais são guardados, e as duas travas de unmask (recomposição no chat, unmask da prévia) que fazem a cópia limpa alcançável só de propósito.

Uma função opcional da edição Enterprise, habilitável por workspace e desligada por padrão (a chave do workspace + a trava de avaliação). Fatos: FACT-CENSUS.md F-DLP-1.

O escaneamento: assíncrono, na fila, depois do ingest

Quando o escaneamento documental está habilitado num workspace, cada documento carregado passa por um escaneamento assíncrono via pg-boss depois que o ingest completa - o caminho do upload fica responsivo, e o escaneamento se comporta como qualquer trabalho de fundo da plataforma: na fila, em novas tentativas, observável. Um corpus legacy tem o seu próprio backfill (bloqueado na avaliação e confirmado explicitamente na interface), limitado abaixo da fila viva e retomável: uma coluna de marca (dlpScannedAt) cerca cada reexecução aos documentos nunca escaneados.

Detectar: três camadas

A detecção é um pipeline de 3 camadas, cada uma para o que é:

  1. Padrões regex configuráveis pelo admin - o serviço de padrões que o admin cultiva (liga/desliga qualquer padrão, prévias de teste).
  2. A validação por checksum para os identificadores italianos/europeus de formato fixo - Codice Fiscale (a validação de omocodia incluída), P.IVA, IBAN: essas classes são deterministas; uma cadeia que erra o seu checksum não é um identificador, então números comuns nunca as disparam.
  3. A detecção contextual via LLM para nomes/endereços - as classes contextuais passam pelo modelo; o seu recall é um valor medido e documentado, não uma promessa.

Duas classes nomeadas são deterministas (os checksums) e duas são contextuais (as classes do LLM) - e a trava de avaliação mede exatamente essa divisão: a barra de qualidade para habilitar = zero falsos positivos suprimidos nas classes deterministas, com o recall das classes contextuais documentado por corrida.

O número que este post nunca imprimirá: uma contagem de "quantos tipos de PII existem". O contrato do census é explícito - números sem rastro não embarcam; as classes são nomeadas, o código diz o que detecta.

Mascarar: placeholders numerados que não podem parear de novo

As entidades detectadas tornam-se placeholders numerados ao longo do documento ([PERSON_1], [GOV_ID_2], ...). Três propriedades tornam isso significativo:

  • Coerência por todo o documento - a mesma entidade é o mesmo placeholder no documento todo; o LLM continua lendo um documento coerente.
  • Idempotência - máscara é o seu próprio ponto fixo: a sintaxe do placeholder nunca pode parear de novo, então um re-escaneamento jamais produz artefatos de classe [PERSON_1_1].
  • A reescrita é total - os chunks são reescritos com o texto mascarado, os vetores FTS recalculados, e os embeddings re-gerados sobre o texto mascarado. Nenhum vetor não tachado fica buscável.

Cifrar: a única cópia limpa é AES-256-GCM

O texto original e cada valor de entidade pousam cifrados (AES-256-GCM sob o contrato de chave da plataforma). É o que torna honesto o pipeline: a máscara não é "esconder numa camada de vista" - os bytes não tachados simplesmente não existem sem cifragem no repositório. Os originais cifrados são a única cópia limpa.

As duas travas de unmask

A cópia limpa é alcançável por exatamente duas travas, ambas explícitas:

  1. Recomposição no chat - ao fim do stream, exatamente uma vez, o servidor recompõe os placeholders na mensagem terminal só para usuários com a permissão dlp:unmask no workspace do documento citado. O texto recomposto viaja no payload done do SSE; os visitantes do widget nunca recebem texto recomposto (imposto no servidor, não escondendo um botão).
  2. Unmask da prévia - o endpoint do texto documental serve o texto mascarado por padrão; um parâmetro de unmask só vale pela escada da trava (o parâmetro presente, a chave do workspace ligada, o papel resolvendo a permissão). Todo braço errado devolve mesmo texto mascarado com um 200 - o endpoint nunca é um oráculo de direitos.

A matriz de audit

Cada caminho de leitura fica pregado por um teste de comportamento (a vista do texto, a prévia OCR, a síntese, as citações, o widget, as ferramentas MCP, a busca de texto pleno, os exports, o re-embed do admin). Os três cravos mais duros são os braços do "nunca": os visitantes do widget, as superfícies de citação, e as ferramentas MCP recebem texto mascarado e nunca uma recomposição. A classe do registro de audit (o log imutável da plataforma, F-AUDIT-1) anota as operações que tocam a superfície.

Para continuar

A guia leva o percurso completo do operador - a chave, o corredor de avaliação, o backfill, cada endpoint - em /pt/docs/document-dlp-pipeline:

  • Document DLP pipeline - a guia
  • Fatos deste post: linhas FACT-CENSUS.md F-DLP-1 (o pipeline), F-DLP-2 (a decisão da contagem sem rastro), F-AUDIT-1 (o registro de eventos)

Provenance: Simmetric Chat docs/DLP_DOCUMENT_PIPELINE.md (v0.28.1, Phase 192 DLP-01..06), packages/server/src/services/ (dlpPatternService/dlpChecksum/quota services), encryptionService - no estado documental fixado pelo census (SHA aca5b8ff).

Artigos relacionados