PII/secret redaction gate перед LLM за 21 день
PII/secret redaction gate перед LLM за 21 день — это fail-closed контур: allowlist полей → pre-LLM scanner → redaction log → block-on-leak тест; секреты и персональные данные не уходят в промпт «как есть». Без gate любой sales/ops-агент рано или поздно отправит паспорт, токен или карту в стороннюю модель.
Ниже — политика полей, scanner, audit trail и критерии done на три недели. Это не RAG-метрики и не multi-tenant isolation сессий — отдельный слой на входе в LLM.
За 21 день: дорожная карта gate
| Дни | Фокус | Артефакт |
|---|---|---|
| 1–3 | Инвентарь данных | карта: какие поля CRM/чатов реально кормят модель |
| 4–6 | Политика | allowlist / mask / drop / hash; owners и исключения |
| 7–10 | Scanner | детекторы PII + secrets + custom patterns; unit-тесты |
| 11–14 | Wire-in | pre-LLM hook во все вызовы (draft, brief, score, RAG query) |
| 15–17 | Redaction log | что срезано, hash исходника, model_call_id, без сырого секрета |
| 18–21 | Block-on-leak | synthetic leak-тесты, fail-closed, on-call runbook |
Must-have до production:
- Ни один путь к LLM в обход gate (единая функция
prepare_llm_payload). - Fail-closed: scanner error / timeout → block, не «пропустить как есть».
- Лог redaction без записи сырого секрета (только тип, позиция, hash).
- Allowlist полей сделки/контакта явным списком, не «все custom fields».
- Leak-тест в CI: известные fixtures с токенами/картами → 0 пропусков.
Политика полей: allowlist, mask, drop
Сначала inventarize, потом правила. Пример матрицы для sales-desk:
| Поле / тип | Действие | Пример |
|---|---|---|
| stage, product, amount (округл.) | allow | «стадия КП, пакет X» |
| name (ФИО полностью) | mask | «И. И.» или «Клиент #deal» |
| phone, email | hash/token | стабильный псевдоним в рамках сделки |
| passport, SNILS, inn физлица | drop | не в промпт никогда |
| card PAN, CVV, passwords, API keys | drop + block | leak-класс |
| body переписки | scan + redact | вырезать совпадения паттернов |
| вложения | metadata only | не слать PDF «целиком» без политики |
Правила, которые я фиксирую письменно:
- default deny для неизвестных custom fields;
- маска обратима только через vault/CRM UI для человека, не для модели;
- «нужно ФИО модели» — отдельный risk-accept с owner и expiry, не «навсегда в system prompt».
Pre-LLM scanner и redaction log
Минимальный стек scanner:
| Слой | Что ловит | Поведение |
|---|---|---|
| Regex/secrets | API keys, JWT, sk-, Bearer, private key blocks | drop + block call |
| PII patterns | карты (Luhn), телефоны, email, паспортные серии (локальные) | mask или drop по политике |
| Allowlist filter | JSON/CRM payload | strip non-allowed keys |
| Entropy / keywords | high-entropy strings, «password=» | quarantine → HITL |
| Output optional | ответ модели на echo секрета | post-check (доп. слой) |
Redaction log (на вызов):
model_call_id
pipeline (brief|reply|score|...)
field_path[]
action: allow|mask|drop|block
pii_class: phone|email|pan|secret|custom
source_hash (sha256 truncated)
timestamp, policy_version
Сырой секрет не пишем. Для разбора инцидента достаточно class + path + hash + кто обошёл (если bypass).
Wire-in паттерн:
raw_context
→ allowlist_project(fields)
→ scan_and_redact(text_blobs)
→ if block_class: raise BlockedForLLM
→ else: llm_call(safe_payload)
→ append redaction_log
Block-on-leak тест и fail-closed
Без автотестов gate — декорация.
| Тест | Вход | Ожидание |
|---|---|---|
| PAN Luhn | текст с валидным 16-digit | drop/block, call не уходит |
| API key | sk- / xoxb- / PEM | block |
| Phone in CRM field | allowlist phone=mask | в промпте только маска |
| Unknown custom field | UF_SECRET_NOTE | strip (default deny) |
| Scanner timeout | mock hang | fail-closed, 0 call |
| Bypass attempt | прямой SDK call в коде | lint/CI forbid (import guard) |
Критерии done на день 21:
- 100% LLM-путей через
prepare_llm_payload(code search + runtime counter); - leak-suite зелёный в CI;
- redaction log доступен on-call ≥ 30 дней;
- runbook: «что делать при BlockedForLLM» и «ложный positive»;
- 0 известных raw secret в prompt logs за пилотный период.
Что это не заменяет: session isolation multi-tenant, eval/canary, budget caps — соседние контуры. Redaction gate отвечает только на вопрос: что вообще можно показать модели.
Часто задаваемые вопросы
Достаточно ли «не присылай персональные данные» в system prompt?
Нет. Модель не filter; данные уже в user/context. Нужен детерминированный scanner + allowlist до вызова.
Mask или drop для телефона?
Для скоринга/brief обычно mask/псевдоним. Для логов промптов — никогда raw. Для support-агента с callback — отдельный tool «покажи телефон оператору», не LLM.
Что если бизнес требует «модель видит ФИО»?
Risk-accept: узкий pipeline, логирование, training запрета на echo, регулярный review. Не default для всех агентов.
Где хранить policy_version?
Рядом с кодом (yaml/json) + номер в redaction log. Смена политики = новый version, старые логи читаемы.
Читайте также
- База знаний RAG AI-агента продаж: источники, PII, метрики за 30 дней
- Session/memory isolation multi-tenant AI: client_id, TTL, leak-test за 28 дней
- Tool-calling Bitrix CRM: whitelist, dry-run, audit, откат
Внедрить redaction gate в ваш AI-контур: https://raisovich.ru
За сколько дней внедряют redaction gate перед LLM?
Целевой контур — 21 день: allowlist, scanner, block-on-leak тесты в CI, redaction log и 100% LLM-путей через prepare_llm_payload.
Что пишут в redaction log при срабатывании gate?
model_call_id, pipeline, field_path, action allow/mask/drop/block, pii_class, truncated source_hash и policy_version — без сырого секрета.
Что делать при BlockedForLLM в проде?
Fail-closed: вызов модели не уходит; on-call смотрит class + path + policy_version по runbook, правит allowlist или маскирует поле, не обходит scanner.
Подпишитесь на @raisovich_news
Первыми получайте новые статьи об AI-автоматизации, нейросетях для бизнеса и создании сайтов. Без спама — только полезный контент.
Часто задаваемые вопросы
За сколько дней внедряют redaction gate перед LLM?
Целевой контур — 21 день: allowlist, scanner, block-on-leak тесты в CI, redaction log и 100% LLM-путей через prepare_llm_payload.
Что пишут в redaction log при срабатывании gate?
model_call_id, pipeline, field_path, action allow/mask/drop/block, pii_class, truncated source_hash и policy_version — без сырого секрета.