{ "index": 99, "slug": "editorial-2025-04-practice-ai-data-privacy", "title": "Перед AI-инструментом данные должны пройти четыре независимые проверки", "excerpt": "Как не отправить код, лог или тикет за пределы компании по ошибке: разделяем класс данных, условия сервиса, сетевой маршрут и полномочия человека.", "contentHtml": "
Инженер копирует в AI-инструмент десять строк лога, чтобы быстрее найти причину ошибки. В строках оказываются email, внутренний идентификатор и часть заголовка запроса. Интерфейс принимает текст. Ответ выглядит полезным. Через неделю никто не может точно сказать, какой контекст ушёл, к какому режиму сервиса он относился и кто разрешил передачу. Симптом проявился как удобная подсказка, а цена ошибки — потеря контроля над данными и дорогое расследование без исходного payload.
\nПроблема не решается одной настройкой «корпоративный тариф» или запретом на секреты в prompt. Передача должна пройти четыре независимые проверки: что находится во фрагменте, допускает ли policy и договор такую обработку, куда технически пойдёт запрос и кто разрешил именно этот объём данных. Если один вопрос подменяет остальные, команда получает ложное зелёное состояние.
\nКласс описывает содержимое. Например, public, internal или restricted. Он не говорит, можно ли передавать запись внешнему сервису. Это решает policy с учётом договора, режима хранения, обучения, региона и выбранного endpoint. Даже если policy разрешает класс, сеть должна вести запрос в нужное место, а сотрудник должен иметь право передать конкретный record.
Разделяйте эти факты в карточке контекста. Запишите идентификатор и версию записи, класс, основание допустимости, проверенное условие сервиса, символическое имя назначения, requester, владельца и срок разрешения. Не заполняйте неизвестное значение словом «внутреннее». Не переносите approval с соседнего файла. При неполном evidence путь закрывается.
\nПользователь видит поле prompt, но поставщик может обрабатывать его вместе с контекстом продукта. Это может быть открытый файл, история диалога, выбранный репозиторий или дополнительный поиск. Поэтому проверяйте не только видимый текст, но и конкретную поверхность, включённые функции и endpoint. Такой анализ относится к режиму продукта, а не ко всем AI-инструментам сразу.
\nСетевое правило отвечает на узкий вопрос: может ли трафик достичь назначения. Allow-list не классифицирует payload. DPA или другая договорённость описывает обязательства, но не доказывает, что firewall отправил запрос только в нужный endpoint. Разрешение владельца показывает полномочия, но не меняет класс записи и не продлевает истёкший срок. Каждый контроль должен иметь собственную проверку.
\nНиже приведён учебный JavaScript-пример. Он работает только с заранее заданными объектами в памяти. Он не вызывает модель, не читает файл, не отправляет лог и не утверждает ничего о production. Его задача — показать порядок проверок и отрицательный путь.
\nconst context = {\n id: 'example-17',\n version: 3,\n dataClass: 'synthetic-public',\n serviceCondition: 'synthetic-retention-reviewed',\n egressScope: 'fixed-ai-boundary-alpha',\n requester: 'alice',\n access: 'synthetic-read',\n authority: { owner: 'data-steward', scope: 'example-17', expires: '2026-12-31' }\n};\n\nfunction decide(record, policy, route, today) {\n const checks = [\n record.dataClass === policy.allowedClass,\n record.serviceCondition === policy.requiredCondition,\n record.egressScope === route.allowedScope,\n record.access === 'synthetic-read',\n record.authority.scope === record.id,\n record.authority.expires >= today\n ];\n\n return checks.every(Boolean)\n ? { status: 'review-ready', egressPerformed: false }\n : { status: 'stop', egressPerformed: false };\n}\n\nconst result = decide(\n context,\n { allowedClass: 'synthetic-public', requiredCondition: 'synthetic-retention-reviewed' },\n { allowedScope: 'fixed-ai-boundary-alpha' },\n '2026-08-02'\n);\nСтатус review-ready не означает, что запрос отправлен или что поставщик гарантирует нужный режим. Он означает только: фиксированная карточка прошла локальные проверки и может перейти к полномочному решению. Если изменить egressScope, срок или serviceCondition, функция возвращает stop. В реальной системе нужны собственные справочники, журнал решения и проверка фактического маршрута.
| Симптом | Причина | Проверка | Действие |
|---|---|---|---|
| В prompt попал production-лог | Класс записи не определён до копирования | Найти record и назначение класса у владельца данных | Остановить передачу, удалить локальную копию из рабочего контекста, запросить классификацию |
| Есть DPA, но неизвестен endpoint | Договор приняли за доказательство маршрута | Сверить plan, endpoint, proxy и сетевой журнал | Разрешать только явно названное назначение; иначе закрыть egress |
| Firewall пропускает запрос | Технический доступ приняли за допустимость payload | Сопоставить destination с policy и классом записи | Оставить сеть, но запретить payload до решения владельца |
| Approval есть в чате | Нет scope, срока или версии record | Проверить requester, record id, version, destination и expiry | Получить датированное разрешение; старое общее «можно» не переносить |
| Ответ модели содержит лишний контекст | Включён repository context, история или поиск | Проверить настройки конкретного режима и фактический запрос | Отключить дополнительный контекст или выбрать режим с проверенным scope |
Название инструмента, значок щита, корпоративная почта и доступ к приложению не доказывают допустимость конкретного payload. Слово «анонимизированный» тоже недостаточно: нужно знать, какие поля удалены, можно ли восстановить субъекта и кто проверил преобразование. Маскирование email не очищает токен в заголовке или идентификатор в URL.
\nНе смешивайте учебную карточку с реальной политикой. В примере используются значения с префиксом synthetic-; они не описывают вашу систему, vendor contract или фактическое хранение. Пример показывает форму fail-closed решения. Он не даёт production-результата и не заменяет legal, security или data-owner review.
Подход не отвечает за правильность самой классификации. Он делает неизвестность видимой. Если каталог данных устарел, approval выдан не тому владельцу или сетевой журнал неполон, проверка должна остановиться. Она также не доказывает, что ответ модели верен, что поставщик не изменит условия или что будущая функция инструмента сохранит прежний маршрут.
\nМатериал готов к применению в конкретной команде, когда для одного реального типа контекста можно предъявить четыре связанные записи: версионированный class, policy/contract condition для выбранного режима, проверенный egress и датированное scoped authorization. Отрицательный тест должен показать stop при истёкшем сроке, чужом scope или неизвестном endpoint. После этого команда может передавать только разрешённый минимальный фрагмент и восстановить, почему решение было принято.
\n