Skip to content
PПромтбук
RUEN
03Безопасность

PII в промтах: что считать, как редактировать, что НЕ хранить

Определение PII (имена, emails, phones, IDs, адреса), redaction-паттерны (regex + entities), audit logs, retention policy и что нельзя хранить в логах.

Спроектируй обработку PII в промтах и логах для агента, который принимает данные из {{data_source}}. Юрисдикция: {{jurisdiction}}. Цель — минимизация утечки и compliance, при этом сохранение полезности агента.

1. Что считается PII

Не одна категория, а четыре уровня чувствительности:

УровеньПримерыДействие по умолчанию
Direct identifiersfull name, email, phone, passport/SSN, government ID, payment cardRedact ВСЕГДА в логах
Quasi-identifiersдата рождения, ZIP/postcode, employer + job title, device IDRedact в логах; в prompt'е — только если нужно для задачи
Sensitive attributeshealth, religion, политические взгляды, sexual orientation, biometricsRedact; для prompt'а — explicit consent
Behavioral / inferredгеолокация, browsing history, voice/face embeddingsTokenize / hash

Граничные случаи (часто пропускают):

  • Имена в коде commit'ов (git author)
  • Email в stack trace'ах
  • IP-адреса в логах запросов
  • Customer-ID — формально pseudonym, но связываемый = quasi-identifier
  • Транскрипты звонков с упоминанием третьих лиц
  • Изображения с metadata EXIF (GPS)

2. Redaction-паттерны: regex + NER

Regex покрывает structured PII (форматные шаблоны), NER (Named Entity Recognition) — unstructured (имена, организации, адреса).

Regex (быстро, дёшево, false-positives возможны)

email:        \b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b
phone (E.164):\+?[1-9]\d{1,14}
ipv4:         \b(?:\d{1,3}\.){3}\d{1,3}\b
credit card:  \b(?:\d[ -]*?){13,19}\b   // + Luhn-check, иначе шумит
uuid:         \b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b
us-ssn:       \b\d{3}-\d{2}-\d{4}\b
iban:         \b[A-Z]{2}\d{2}[A-Z0-9]{4,30}\b

NER (entities)

Минимум: PERSON, ORG, LOC/GPE, DATE. Тулинг: spaCy, Presidio (Microsoft), AWS Comprehend, GCP DLP. На русском — Natasha / Slovnet.

Замена

Не удаляй — заменяй на типизированный токен, чтобы prompt сохранил структуру:

  • {{NAME_1}}, {{NAME_2}} — сохраняй consistency в рамках одного сообщения
  • {{EMAIL_1}}, {{PHONE_1}}
  • {{ID_REDACTED}} для непонятных ID

Сохраняй mapping token → original в secure vault на время сессии, удаляй после ответа агенту.

3. Audit logs: что писать, что НЕ писать

Логировать ВСЕГДА

  • timestamp, request_id, agent_version, model_version
  • категории найденного PII (counts: {email: 2, phone: 1})
  • решение redactor'а (что заменено, на какой токен)
  • хеш (SHA-256) исходного prompt'а — для воспроизведения incidents

НЕ логировать НИКОГДА

  • ❌ Raw user input до redaction (даже в DEBUG)
  • ❌ Распакованный mapping token → original (после ответа удалить из памяти)
  • ❌ Полный response модели, если в нём есть данные пользователя
  • ❌ Payment data в любом виде (PCI scope расширится на всю систему)
  • ❌ Health data без отдельного encrypted store с access control

Подводный камень

console.log(prompt) в Node = в stdout = в Cloud Logging = retention 30-400 дней. Один забытый log — нарушение retention policy.

4. Retention policy

АртефактСрокОбоснование
Raw user input0 (не хранить)Не нужен после redaction
Redacted promptдо 90 днейDebug и improvement
Token-mappingдо конца сессии (минуты)Восстановление контекста
Model responseдо 30 днейQuality review
Audit log (categories only)1-2 годаCompliance, audit
Embeddings от PIIНЕ создаватьEmbeddings = lossy representation, но восстановимо

Для GDPR — добавь механизм right-to-erasure: по запросу пользователя стирай все артефакты, связанные с его subject_id (нужен link между subject_id и redacted-логами через hashed pseudonym).

5. Чек-лист перед deploy

  • Все входы проходят redaction до того, как попадают в prompt и в логи
  • Redaction-pipeline покрыт unit-тестами на 20+ PII-паттернов
  • False-positive rate < 5%, false-negative rate измерен на golden set
  • Logs grep'нуты на email/phone/SSN regex — пусто
  • Token-mapping не сериализуется в JSON-response
  • Есть kill-switch: остановить логирование, если PII detection падает
  • DPA / privacy policy упоминает использование LLM-провайдера
  • Если LLM-провайдер тренируется на data — opt-out enabled (OpenAI: store: false, Anthropic — proper API tier)

6. Anti-patterns

  • console.log(userInput) в любом виде — попадёт в централизованные логи на годы
  • ❌ Regex-only без NER — пропустит имена, адреса, организации
  • ❌ "Hash и забудь" — hash от email/phone легко brute-force'ится (rainbow tables)
  • ❌ Redaction после prompt'а к модели — модель уже видела сырые данные
  • ❌ Token-mapping в same memory-store как агент — leak через prompt injection
  • ❌ Логирование полного response без проверки на echo (модель повторяет PII из input)
  • ❌ Embeddings от sensitive text в общий vector store — возможна реконструкция
  • ❌ "PII detection отключим, у нас private deployment" — внутренние утечки тоже incident
  • ❌ Одна retention policy на все артефакты — нужны разные сроки
  • ❌ Опираться только на LLM-based redaction без regex backup — нестабильно
  • ❌ Тестировать redactor только на синтетических данных — golden set должен быть из реальных (anonymized) логов

Deliverable

  • Классификация PII §1 с примерами из {{data_source}}
  • Pipeline: regex-rules + NER-конфиг + замена-на-токен
  • Список logging endpoints с пометкой allow/deny
  • Retention policy таблицей по артефактам
  • Чек-лист §5, подписанный security-reviewer'ом
  • Прогон redactor'а на 100 реальных (anonymized) сообщениях, precision/recall report
К подразделу «Безопасность»
Похожие промты