{ "index": 99, "slug": "editorial-2025-04-practice-ai-data-privacy", "title": "Перед AI-инструментом данные должны пройти четыре независимые проверки", "excerpt": "Как не отправить код, лог или тикет за пределы компании по ошибке: разделяем класс данных, условия сервиса, сетевой маршрут и полномочия человека.", "contentHtml": "

Инженер копирует в AI-инструмент десять строк лога, чтобы быстрее найти причину ошибки. В строках оказываются email, внутренний идентификатор и часть заголовка запроса. Интерфейс принимает текст. Ответ выглядит полезным. Через неделю никто не может точно сказать, какой контекст ушёл, к какому режиму сервиса он относился и кто разрешил передачу. Симптом проявился как удобная подсказка, а цена ошибки — потеря контроля над данными и дорогое расследование без исходного payload.

\n

Проблема не решается одной настройкой «корпоративный тариф» или запретом на секреты в prompt. Передача должна пройти четыре независимые проверки: что находится во фрагменте, допускает ли policy и договор такую обработку, куда технически пойдёт запрос и кто разрешил именно этот объём данных. Если один вопрос подменяет остальные, команда получает ложное зелёное состояние.

\n

Тезис: класс данных не равен разрешению

\n

Класс описывает содержимое. Например, public, internal или restricted. Он не говорит, можно ли передавать запись внешнему сервису. Это решает policy с учётом договора, режима хранения, обучения, региона и выбранного endpoint. Даже если policy разрешает класс, сеть должна вести запрос в нужное место, а сотрудник должен иметь право передать конкретный record.

\n

Разделяйте эти факты в карточке контекста. Запишите идентификатор и версию записи, класс, основание допустимости, проверенное условие сервиса, символическое имя назначения, requester, владельца и срок разрешения. Не заполняйте неизвестное значение словом «внутреннее». Не переносите approval с соседнего файла. При неполном evidence путь закрывается.

\n
\"Пять
Передача допускается только после независимой проверки содержимого, условий сервиса, маршрута и полномочий. Отсутствие одного доказательства ведёт к остановке.
\n

Как возникает утечка контекста

\n

Пользователь видит поле prompt, но поставщик может обрабатывать его вместе с контекстом продукта. Это может быть открытый файл, история диалога, выбранный репозиторий или дополнительный поиск. Поэтому проверяйте не только видимый текст, но и конкретную поверхность, включённые функции и endpoint. Такой анализ относится к режиму продукта, а не ко всем AI-инструментам сразу.

\n

Сетевое правило отвечает на узкий вопрос: может ли трафик достичь назначения. Allow-list не классифицирует payload. DPA или другая договорённость описывает обязательства, но не доказывает, что firewall отправил запрос только в нужный endpoint. Разрешение владельца показывает полномочия, но не меняет класс записи и не продлевает истёкший срок. Каждый контроль должен иметь собственную проверку.

\n

Учебный пример: решение без внешнего запроса

\n

Ниже приведён учебный JavaScript-пример. Он работает только с заранее заданными объектами в памяти. Он не вызывает модель, не читает файл, не отправляет лог и не утверждает ничего о production. Его задача — показать порядок проверок и отрицательный путь.

\n
const 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. В реальной системе нужны собственные справочники, журнал решения и проверка фактического маршрута.

\n

Симптом → причина → проверка → действие

\n
Диагностика передачи контекста
СимптомПричинаПроверкаДействие
В 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
\n

Порядок pre-flight проверки

\n
  1. Назовите запись. Зафиксируйте record id, версию, источник и владельца до открытия внешнего инструмента.
  2. Классифицируйте содержимое. Отделите публичное описание от персональных данных, секретов, клиентского кода и внутренних деталей. Не угадывайте класс по имени файла.
  3. Проверьте policy и договор. Найдите условие для выбранного сервиса и режима: хранение, обучение, регион, субподрядчик и срок. Если условие относится к другому плану, оно не подходит.
  4. Проверьте маршрут. Укажите разрешённый endpoint, proxy и правило egress. Наличие соединения не является разрешением на данные.
  5. Сверьте полномочия. Requester должен иметь доступ к записи. Владелец должен разрешить именно этот scope, destination и срок.
  6. Проверьте дополнительные источники контекста. Уточните, не добавляет ли режим историю, файлы репозитория, поиск или другие поля запроса.
  7. Оставьте отрицательный путь. При неизвестном поле не маскируйте данные и не переходите в другой аккаунт или интерфейс. Запишите вопрос, владельца и условие возобновления.
\n

Что нельзя считать доказательством

\n

Название инструмента, значок щита, корпоративная почта и доступ к приложению не доказывают допустимость конкретного payload. Слово «анонимизированный» тоже недостаточно: нужно знать, какие поля удалены, можно ли восстановить субъекта и кто проверил преобразование. Маскирование email не очищает токен в заголовке или идентификатор в URL.

\n

Не смешивайте учебную карточку с реальной политикой. В примере используются значения с префиксом synthetic-; они не описывают вашу систему, vendor contract или фактическое хранение. Пример показывает форму fail-closed решения. Он не даёт production-результата и не заменяет legal, security или data-owner review.

\n

Ограничения и критерий готовности

\n

Подход не отвечает за правильность самой классификации. Он делает неизвестность видимой. Если каталог данных устарел, approval выдан не тому владельцу или сетевой журнал неполон, проверка должна остановиться. Она также не доказывает, что ответ модели верен, что поставщик не изменит условия или что будущая функция инструмента сохранит прежний маршрут.

\n

Материал готов к применению в конкретной команде, когда для одного реального типа контекста можно предъявить четыре связанные записи: версионированный class, policy/contract condition для выбранного режима, проверенный egress и датированное scoped authorization. Отрицательный тест должен показать stop при истёкшем сроке, чужом scope или неизвестном endpoint. После этого команда может передавать только разрешённый минимальный фрагмент и восстановить, почему решение было принято.

\n

Проверяемые источники

\n" }