{ "index": 97, "slug": "editorial-2025-04-field-ai-data-privacy", "title": "Перед AI-инструментом данные должны пройти четыре проверки", "excerpt": "Почему удаление имён из лога не делает контекст безопасным: разбираем классификацию, договорные условия, маршрут передачи и полномочия на конкретный фрагмент.", "contentHtml": "
Инженер копирует в AI-чат фрагмент ошибки, удаляет имя пользователя и ждёт подсказку. Симптом исчезает из текста, но риск остаётся. В логе могут сохраниться время операции, редкий тип события, идентификатор запроса, структура платежа или сочетание полей, по которому запись узнают. Если сервис добавляет к prompt историю диалога, файлы проекта или поиск, наружу уходит не только выделенная строка.
\nЦена ошибки складывается из нескольких частей. Команда теряет контроль над копией данных. Нельзя быстро доказать, куда она попала и как долго хранилась. Нельзя уверенно ответить на запрос владельца данных. В худшем случае один удобный ответ превращается в инцидент, расследование и остановку инструмента для всей команды.
\nБезопасный AI-review начинается не с маскирования и не с выбора модели. Сначала нужно доказать, что конкретный фрагмент можно передать конкретной поверхности по конкретному маршруту. Для этого разделите четыре решения: какой класс у данных, какие условия обработки действуют, куда пойдёт запрос и кто имеет право его отправить. Если хотя бы один факт неизвестен, путь должен закрыться.
\nЭта граница важнее названия продукта. Один vendor может иметь несколько поверхностей: веб-чат, расширение редактора, API, поиск и агент с доступом к репозиторию. Они могут собирать разный контекст и использовать разные настройки хранения. Одобрение «AI разрешён» не покрывает автоматически каждый экран и каждый тип записи.
\nВходной фрагмент обычно рассматривают как строку. Система должна рассматривать его как объект с контекстом: recordId, версией, владельцем, классом, целью, destination и сроком действия разрешения. Redaction меняет содержимое. Он не назначает класс и не подтверждает договорные условия. Поле, заменённое на [redacted], всё ещё может быть чувствительным по структуре.
Следующий слой — маршрут. Запрос может пройти через прокси, региональный endpoint, подключённый поиск, плагин или сервис-посредник. Успешное TLS-соединение доказывает только доступность канала. Оно не доказывает, что выбранный destination разрешён для этого класса данных. Так же firewall allow-list не превращает restricted record в public.
\nПоследний слой — полномочия. Разрешение относится к ресурсу, цели, requester и сроку. Старое согласование для синтетического примера не даёт права отправить production-лог. Доступ к инструменту не равен праву передавать ему все доступные пользователю данные.
\nНиже приведён синтетический пример. Он не читает лог, не содержит PII, секретов, клиентских идентификаторов и настоящего endpoint. Названия намеренно фиксированы. Цель примера — показать отрицательный путь: при restricted-классе функция закрывает передачу до проверки разрешения. Это не готовая DLP-система и не доказательство безопасности какого-либо AI-сервиса.
\nconst request = {\n recordId: 'synthetic-log-shape-v1',\n dataClass: 'restricted',\n allowExternalEgress: false,\n destination: 'fixed-external-ai-boundary-alpha',\n requester: 'synthetic-engineering-read',\n expiresAt: '2025-04-20T00:00:00Z'\n};\n\nfunction decide(request, now) {\n if (request.dataClass === 'restricted') {\n return { decision: 'stop', reason: 'class-denies-external-egress' };\n }\n\n if (!request.allowExternalEgress) {\n return { decision: 'stop', reason: 'contract-not-proven' };\n }\n\n if (new Date(request.expiresAt) <= now) {\n return { decision: 'stop', reason: 'authorization-expired' };\n }\n\n return { decision: 'hand-off' };\n}\n\nconst result = decide(request, new Date('2025-04-19T12:00:00Z'));\n// { decision: 'stop', reason: 'class-denies-external-egress' }\nПорядок проверок здесь принципиален. Сначала система видит запрет класса. Она не использует наличие пользователя или действующий срок как override. Если заменить класс на допустимый, нужно всё равно проверить условия хранения, destination, requester и дату. Положительный результат в таком fixture означает только, что фиксированные входы соответствуют фиксированным правилам учебной модели.
\n| Симптом | Причина | Проверка | Действие |
|---|---|---|---|
| «Мы удалили имена, значит всё можно» | Redaction перепутали с классификацией | Проверить остаточную структуру, owner и правило класса | Остановить передачу до решения владельца данных |
| «Продукт уже разрешён» | Surface, plan или route отличаются | Зафиксировать фактический destination и дополнительные источники context | Сверить конкретный маршрут с policy и договором |
| «Сеть пропускает endpoint» | Технический egress приняли за право на данные | Сопоставить data class, destination и условия обработки | Не отправлять payload при любом несовпадении |
| «Есть approval от команды» | Разрешение не имеет scope или истекло | Проверить record, requester, цель, issuer и expiresAt | Запросить новое датированное решение или выбрать локальный путь |
| «Ассистент ответил, значит утечки нет» | Проверили output, но не весь outbound path | Проверить request, журналы, включённые интеграции и retention terms | Считать результат недоказанным до проверки маршрута |
На схеме нет шага «попросить модель оценить риск». Модель может помочь сформулировать вопрос, но не должна сама становиться источником разрешения на доступ к данным. Сначала работает детерминированный gate. Он возвращает один из двух исходов: hand-off в заранее разрешённый workflow или stop с причиной и владельцем следующего решения.
\nЭта схема не заменяет инвентаризацию данных, DLP, договор, privacy impact assessment, контроль доступа и аудит поставщика. Она не обнаруживает PII сама по себе. Она не знает, что делает vendor после получения запроса, если это не подтверждено условиями конкретного сервиса. Она также не решает вопрос законного основания обработки и не определяет допустимость данных без владельца policy.
\nМаскирование может снизить объём данных, но не гарантирует анонимизацию. Локальная модель может убрать внешний egress, но не отменяет права доступа и хранение локальных журналов. Человеческое согласование полезно, но не должно заменять проверяемые ограничения в коде и конфигурации.
\nУчебные строки в примере не дают production-результата. Они показывают форму контракта. В реальной системе положительный результат нужно подтвердить документацией поставщика, конфигурацией маршрута, журналом события и решением владельца данных на дату запуска.
\nРешение готово, если другой инженер без доступа к исходному обсуждению может повторить проверку и получить тот же исход. Для одного synthetic restricted record тест должен показать: внешний вызов не выполнен, payload не попал в prompt builder, причина stop сохранена, а следующий владелец назван. Для допустимого учебного record тест должен показать все совпадения: class, условия обработки, destination, requester и expiry.
\nЕсли хотя бы один из этих фактов нельзя предъявить ссылкой, конфигурацией или тестовым результатом, передача не доказана. Оставьте данные локально и закройте вопрос до появления недостающего evidence.
\n