Блог
Безопасность

Документная DLP-труба: маски, которые держат

Документная DLP: три слоя обнаружения, нумерованные placeholder'ы на весь документ, тотальный ре-embed, оригиналы в AES-256-GCM - два явных заслона unmask. Census: F-DLP-1.

Simmetric Team8 мин чтения13/10/2026
Документная DLP-труба: маски, которые держат

Документ входит однажды; placeholder остаётся

База знаний AI-workspace глотает настоящие документы - договоры, HR-письма, счета. Иные несут данные, которые никто не должен читать мимоходом, и LLM не должен их цитировать никогда. Ответ Simmetric Chat для включённых workspace'ов: документная контора сканирования, превращающая чувствительные сущности в нумерованные placeholder'ы на весь документ и держащая единственную чистую копию зашифрованной. Точка дизайна - в последнем полуслове - placeholder остаётся: маскировка односторонняя по построению, так что «документ» и «искомый корпус» становятся разными объектами по проекту.

Эта статья проходит контору так, как её встречает оператор: асинхронный скан, три слоя обнаружения, что placeholder гарантирует, что происходит при ре-embedding'е, как хранятся оригиналы, и два заслона unmask (рекомпозиция в чате, unmask предпросмотра), делающие чистую копию достижимой лишь намеренно.

Опциональная Enterprise-функция, включаемая по workspace и по умолчанию выключенная (переключатель workspace + заслон оценки). Факты: FACT-CENSUS.md F-DLP-1.

Скан: асинхронно, в очереди, после глотания

Когда скан документов включён для workspace, каждый загруженное документы проходят через асинхронный pg-boss-скан после завершения глотания - путь загрузки остаётся отзывчивым, а скан ведёт себя как всякий фоновый джоб платформы: в очереди, с повторами, наблюдаемым. Legacy-корпус имеет собственный бэкфилл (заслонённый оценкой и явно подтверждаемый в интерфейсе), ограниченный ниже живой очереди и возобновляемый: колонка-маркер (dlpScannedAt) ограничивает каждый повторный проход документами, никогда не сканированными.

Обнаруживать: три слоя

Обнаружение - контора из 3 слоёв, каждый для своего:

  1. Регулярные выражения, настраиваемые админом - служба паттернов, которую ведёт админ (включает/выключает любой паттерн, пробные превью).
  2. Контрольная проверка по контрольным суммам для итальянских/европейских идентификаторов фиксированного формата - Кодекс Fiscale (с омокодией inclusive), P.IVA, IBAN: эти классы детерминированы; строка, сорвавшая свою checksum'у, - не идентификатор, поэтому обычные числа их никогда не ловят.
  3. Контекстное LLM-обнаружение имён/адресов - контекстные классы идут через модель; их recall - измеренное, документированное значение, а не обещание.

Два названных класса детерминированы (контрольные суммы) и два контекстны (LLM-классы) - и заслон оценки меряет ровно этот раскол: планка качества для включения = ноль подавленных ложных срабатываний на детерминированных классах, с документированным recall'ом контекстных классов за проход.

Число, которое этот пост никогда не напечатает: счёт «сколько типов PII существует». Договор census'а явный - не отслеживаемые числа не отгружаются; классы называются, код говорит, что он находит.

Маскировать: нумерованные placeholder'ы, которые не могут сматчиться заново

Найденные сущности становятся нумерованными placeholder'ами на весь документ ([PERSON_1], [GOV_ID_2], ...). Три свойства делают это значимым:

  • Согласованность на весь документ - та же сущность - тот же placeholder по всему документу; LLM продолжает читать цельный документ.
  • Идемпотентность - маскировка - собственная неподвижная точка: синтаксис placeholder'а никогда не сматчится заново, поэтому повторный скан не родит артефактов класса [PERSON_1_1].
  • Переписывание тотально - чанки переписываются замаскированным текстом, FTS-векторы пересчитываются, а embeddings перегенерируются на замаскированном тексте. Ни один незачернённый вектор не остаётся искомым.

Шифровать: единственная чистая копия - AES-256-GCM

Оригинальный текст и каждое значение сущности приземляются зашифрованными (AES-256-GCM под ключевой договор платформы). Вот что делает контору честной: маскировка - не «прятание в слое вида» - незачернённые байты просто не существуют без шифрования в хранилище. Зашифрованные оригиналы - единственная чистая копия.

Два заслона unmask

Чистая копия достижима ровно через два заслона, оба явные:

  1. Рекомпозиция в чате - в конце стрима, ровно однажды, сервер рекомпонует placeholder'ы в терминальном сообщении только для пользователей с правом dlp:unmask в workspace цитируемого документа. Рекомпонованный текст едет в done-payload SSE; посетители виджета никогда не получают рекомпонованного текста (принуждение на сервере, а не прятание кнопки).
  2. Unmask предпросмотра - endpoint текста документа по умолчанию отдаёт замаскированный текст; параметр unmask стоит лишь через лестницу заслона (параметр есть, переключатель workspace включён, роль несёт право). Каждый промах всё равно возвращает замаскированный текст с 200 - endpoint никогда не оракул прав.

Матрица аудита

Каждый путь чтения прибит поведенческим тестом (вид текста, OCR-предпросмотр, синтез, цитирования, виджет, MCP-инструменты, полнотекстовый поиск, экспорты, админ-реembed). Три самых твёрдых стержня - руки «никогда»: посетители виджетов, поверхности цитирований и MCP-инструменты получают замаскированный текст и никогда - рекомпозицию. Класс журнала аудита (неизменяемый реестр событий платформы, F-AUDIT-1) пишет операции, трогающие поверхность.

Читать дальше

Путеводитель несёт полный операторский проход - переключатель, бегун оценки, бэкфилл, каждый endpoint - на /ru/docs/document-dlp-pipeline:

  • Document DLP pipeline - путеводитель
  • Факты этого поста: строки FACT-CENSUS.md F-DLP-1 (контора), F-DLP-2 (решение неразыскиваемого счёта), F-AUDIT-1 (реестр событий)

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 - на зафиксированном census'ом документальном состоянии (SHA aca5b8ff).

Похожие статьи