PII в промтах: что считать, как редактировать, что НЕ хранить
Определение PII (имена, emails, phones, IDs, адреса), redaction-паттерны (regex + entities), audit logs, retention policy и что нельзя хранить в логах.
Спроектируй обработку PII в промтах и логах для агента, который принимает данные из {{data_source}}. Юрисдикция: {{jurisdiction}}. Цель — минимизация утечки и compliance, при этом сохранение полезности агента.
1. Что считается PII
Не одна категория, а четыре уровня чувствительности:
| Уровень | Примеры | Действие по умолчанию |
|---|---|---|
| Direct identifiers | full name, email, phone, passport/SSN, government ID, payment card | Redact ВСЕГДА в логах |
| Quasi-identifiers | дата рождения, ZIP/postcode, employer + job title, device ID | Redact в логах; в prompt'е — только если нужно для задачи |
| Sensitive attributes | health, religion, политические взгляды, sexual orientation, biometrics | Redact; для prompt'а — explicit consent |
| Behavioral / inferred | геолокация, browsing history, voice/face embeddings | Tokenize / 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 input | 0 (не хранить) | Не нужен после 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
Content Security Policy и security headers
CSP, HSTS, X-Frame, Permissions-Policy — закрыть основные классы атак за один проход.
Управление секретами
Где хранить, как ротировать, как обнаружить утечку.
Аутентификация и rate limiting
Защита логина, реги, восстановления пароля от brute force.