Предотвращаем катастрофу: разбираемся с тем, как работает защита проектов с AI
Шесть слоёв защиты вокруг LLM в корпоративной среде: данные, граница контура, доступы, инструменты агента, логи и ответственность — разбираем, как защитить AI-проект от утечки и промпт-инъекций.
Большинство инцидентов с LLM в корпоративной среде происходят не из-за уязвимости самой модели. Они происходят из-за отсутствия контура защиты — набора ограничений вокруг модели, которые определяют, какие данные попадают на вход, кто инициирует запросы, что модель может вызвать и куда уходит результат.
Ниже рассмотрим шесть слоёв защиты, которые мы выстраиваем в каждом проекте. Порядок — от данных к людям: чем ближе к модели, тем больше технических решений; чем ближе к человеку, тем больше процесса.
Данные: что попадает в контекст и куда это уезжает
Часто сталкиваемся с типичной проблемой — чувствительные данные защищены от утечки с обычной LLM, но никак не защищаются при работе с RAG.
При использовании RAG в промпт попадают чанки — фрагменты документов, подобранные ретривером под запрос. В этих фрагментах могут оказаться имена, номера договоров, финансовые показатели — всё, что содержится в исходных документах базы знаний. Полный текст каждого запроса, как правило, оседает в логах: у вас, у провайдера модели, иногда у обоих.
Конечно, мы все уповаем на честность крупных провайдеров LLM и верим, что они не будут делать ничего с персональными данными. Да и возникает резонный вопрос — ну утекли какие-то документы, допустим, в OpenAI — кто об этом узнает и что с ними вообще будет? Кому там в OpenAI нужны наши документы?
На самом деле проблема шире — на этих данных может быть обучена следующая версия LLM, и документы могут остаться в памяти модели — соответственно, по запросу можно будет получить эти данные напрямую от новой версии ChatGPT. Это уже опаснее.
Три меры, которые закрывают основную поверхность риска на этом уровне:
- Классификация данных до подключения источника. До первого эмбеддинга должно быть определено: что допустимо отправлять во внешний API, что допустимо только в маскированном виде, что не покидает периметр.
- Явные условия с провайдером модели. OpenAI, Anthropic, YandexGPT, GigaChat — у каждого свои условия по обучению на данных клиентов, срокам хранения и географии обработки. В российском контексте это пересекается с требованиями 152-ФЗ к локализации обработки персональных данных. Этот вопрос требует детальной обработки.
- Маскирование на входе. Имена, ИНН, номера договоров заменяются токенами до отправки в модель. Инструменты вроде Presidio (Microsoft, open source) или самописные regex-пайплайны покрывают базовый уровень. Если задача сложнее — всегда можно отдать задачу маскирования на LLM.
Граница контура: где заканчивается «наше» и начинается «их»
На этапе прототипа бэкенд обычно вызывает API модели напрямую: ключ в переменной окружения, запрос уходит в endpoint провайдера без промежуточного слоя. В продуктивной среде такая схема создаёт три проблемы:
- Отсутствие единой точки отключения. При необходимости заблокировать определённый тип запросов приходится вносить изменения в каждый сервис отдельно.
- Отсутствие наблюдаемости. Нет данных о том, сколько токенов потребляется, кто инициирует вызовы и что содержится в теле запроса.
- Смешение сред. Тестовый и прод контуры работают через один endpoint с одним ключом. Ошибка в staging приводит к отправке реальных данных в модель.
Стандартное решение — LLM-прокси или gateway. Для self-hosted инфраструктуры это LiteLLM, Portkey или собственный слой на уровне ingress. Для облачных решений — Azure API Management или аналоги в Yandex Cloud. Весь трафик к моделям проходит через единую точку, где можно логировать, фильтровать и при необходимости полностью отключить канал передачи данных.
Доступы и роли: почему авторизация на фронте — это не авторизация
LLM-проекты наследуют проблемы разграничения доступа обычных корпоративных систем — и усиливают их. Типичная ситуация: RAG подключён ко всей файловой базе, сотрудник с ограниченными правами задаёт вопрос, модель формирует ответ на основе документа, к которому у этого сотрудника нет доступа в DMS. Документ никто не открывал и не скачивал — но его содержание ушло в ответ.
Модель не проверяет доступы. Она генерирует ответ из того контекста, который получила. Это значит, что фильтрация должна происходить до модели — на уровне ретривера:
- Каждый чанк в векторной БД наследует доступы исходного документа.
- Ретривер перед формированием контекста проверяет роль текущего пользователя и отсекает запрещённые чанки.
- На этапе пилота, где полноценная система разграничения доступов на уровне чанков избыточна, минимальная мера — раздельные индексы под разные уровни доступа с запретом на cross-index поиск.
Единый индекс без фильтрации по ролям — это, по сути, SELECT * по всей базе для любого авторизованного пользователя.
Инструменты агента: когда модель не только говорит, но и делает
Пока LLM только генерирует текст, последствия ошибки ограничены неточным или неуместным ответом. При подключении function calling, MCP-серверов, записи в CRM, отправки писем или вызова внутренних API модель получает возможность действовать — и промпт-инъекция становится полноценным вектором атаки.
Механика простая: пользователь передаёт в чат текст для анализа, внутри которого содержится инструкция, замаскированная под цитату — например, вызов функции отправки письма. Если агент не разделяет пользовательские данные и системные инструкции (а базовые реализации этого не делают), вызов будет выполнен.
Пример максимально практичен: чат-бот в Телеграме, обрабатывающий лид-поток, часто имеет доступ в CRM — так удобно добавлять лидов сразу в CRM. Но есть ли гарантия, что пользователь бота не обойдёт защиту и не вытащит всю вашу базу лидов? Если не боитесь отдать конкурентам весь список своих лидов, который вы так тщательно обогащали много лет, — можно не задумываться о безопасности на этом слое.
Меры, которые работают на практике:
- Белый список инструментов на уровне сессии. Для каждого контекста определяется набор допустимых операций: поиск и чтение — без ограничений, запись — только с подтверждением.
- Валидация аргументов вызова отдельным слоем. Модель формирует JSON-вызов, промежуточный сервис проверяет: адресат письма в разрешённом домене, сумма в пределах лимита, ID документа существует в системе.
- Подтверждение человеком на деструктивных операциях. Удаление, отправка за периметр, изменение прав — через явное подтверждение. Потеря скорости на этом шаге несопоставима с последствиями несанкционированной записи в продуктивную среду.
Логи и аудит: инструменты расследования после инцидентов
Здесь существуют две крайности: полное логирование в открытом виде и полное отсутствие логов. Первое создаёт дополнительный чувствительный актив — лог с полными промптами по сути дублирует ваши данные. Второе делает расследование инцидента невозможным.
Минимальный набор для пилота, не создающий избыточного риска:
- Идентификатор сессии, роль пользователя, timestamp.
- Хеш или маскированная версия запроса — достаточно для корреляции с инцидентом, но не является копией данных.
- Факт вызова инструмента с маскированными аргументами.
- Потребление токенов и стоимость — для финансового контроля и обнаружения аномалий. Резкий всплеск потребления часто оказывается первым сигналом злоупотребления.
Логи с фрагментами данных подпадают под те же правила хранения, что и сами данные. Сроки ретеншна, круг доступа, место хранения — часть архитектуры, а не отложенная задача.
Человек в контуре: где модель не должна быть последней инстанцией
Этот слой — не технический, а процессный. Он отвечает на вопрос: кто несёт ответственность, если модель ошиблась и это привело к последствиям?
Автоматическая отправка ответа клиенту, генерация юридического документа без ревью, ответ на рекламацию — ситуации, где степень уверенности модели не имеет значения. LLM не калибрована: уровень уверенности в правильном и неправильном ответе может быть одинаковым.
На практике это решается явным реестром сценариев:
- Зелёные: модель работает автономно — внутренний FAQ, черновик саммари, поиск по документации. Цена ошибки низкая.
- Жёлтые: модель готовит черновик, человек подтверждает перед отправкой — ответ клиенту, коммерческое предложение, запись в CRM.
- Красные: модель используется только как справочный инструмент, решение принимает человек — юридические заключения, медицинские рекомендации, финансовые обязательства.
Границы между зонами определяет бизнес, не разработка. При отсутствии такого реестра все сценарии по умолчанию оказываются зелёными — и остаются таковыми до первого инцидента.
Как это работает вместе
Шесть слоёв — это не шесть отдельных проектов. На раннем пилоте поверхность атаки сужается сознательно: один источник данных, один инструмент, ограниченный круг пользователей, полное логирование. Каждый слой тонкий, но присутствует. Расширение идёт поэтапно: новый источник — пересмотр классификации и доступов; новый инструмент — валидация и логирование вызовов.
Распространённая ошибка — сводить безопасность к выбору провайдера. Провайдер отвечает за свою инфраструктуру. За контур, данные в промптах, доступы и действия пользователей отвечает владелец системы. Модель — это компонент. Безопасность — это контур вокруг компонента.
Три вопроса, которые стоит задать себе сейчас
- Можете ли вы нарисовать схему потока данных от пользователя до API модели и обратно — без неопределённых участков? Если нет, с этого стоит начать, а не с выбора модели.
- Кто единоличный владелец контура безопасности этого пилота? Один конкретный человек, к которому обращаются при инциденте, — не комитет и не распределённая ответственность.
- Есть ли план отключения? Что произойдёт с пользователями и данными, если LLM-контур будет остановлен целиком? Отсутствие ответа обычно означает, что зависимость от модели уже выше допустимой.
Как мы работаем
В sequo мы выстраиваем контур безопасности до выбора модели — не после. Это означает, что архитектура проекта учитывает границы данных, доступы и аудит с первого дня, а не добавляется как слой поверх работающей системы.
Если хотите разобрать конкретную задачу — напишите. Скажем прямо, если видим, что контур не готов.
FAQ
Достаточно ли корпоративного тарифа OpenAI / Azure для защиты данных?
Корпоративный тариф гарантирует, что провайдер не использует ваши данные для обучения, и предоставляет DPA. Однако он не покрывает то, что происходит на вашей стороне: состав данных в промпте, разграничение доступа, политику логирования. Периметр провайдера и периметр клиента — разные зоны ответственности.
Что такое промпт-инъекция и насколько это реальная угроза?
Промпт-инъекция — ситуация, при которой пользовательский ввод содержит инструкции, которые модель интерпретирует как системные. OWASP включил инъекции в топ-10 угроз для LLM-приложений. При наличии у модели доступа к инструментам (API, БД, почта) инъекция приводит не к искажённому тексту, а к реальным действиям в системе.
Нужна ли сертификация или аудит для LLM-пилота в РФ?
Отдельной сертификации для LLM-систем пока не существует. При обработке персональных данных действует 152-ФЗ, и место обработки имеет юридическое значение. Если система участвует в принятии решений, затрагивающих права граждан, применимы нормы 149-ФЗ. До запуска пилота необходимо определить, какие данные находятся в контуре и где физически происходит их обработка.
С чего начать, если LLM-чат уже работает без контура безопасности?
С карты потока данных: откуда данные поступают в промпт, куда уходит ответ, где хранятся логи. Следующий шаг — классификация: содержатся ли в источниках персональные данные или коммерческая тайна. Эти два шага выявляют зоны максимального риска.