Платформа защиты корпоративных AI-систем
Шлюз между корпоративными AI-продуктами и языковыми моделями: каждый запрос проходит маскирование персональных данных, поиск prompt injection, проверку по базе коммерческой тайны и LLM-судью, а администраторы заказчика видят журнал, инциденты и очередь подтверждений.
О проекте
CorpSoft24 поставляет заказчикам корпоративные AI-продукты: ассистентов продаж, финансовых аналитиков, HR-ботов, помощников юристов. Сотрудники пишут в них всё подряд: ФИО и телефоны клиентов, паспортные данные кандидатов, внутренние скидки, показатели управленческой отчётности, иногда пароли. Без контроля всё это уходит во внешнюю или общую языковую модель. Нужен был единый слой защиты, который встаёт между продуктом и моделью, не требует переписывать сами продукты и отдаёт управление правилами службе безопасности заказчика.
Платформа состоит из двух контуров в одном репозитории. Шлюз построен на LiteLLM с собственными хуками на Python: он принимает обычные запросы OpenAI Chat Completions по ключу продукта, прогоняет их через цепочку проверок и только потом вызывает боевую модель. Распознавание персональных данных идёт через Microsoft Presidio с русской моделью spaCy, проверки по смыслу делает отдельная LLM-судья в контуре заказчика. Админ-панель написана на Bun, Hono и React: организации, администраторы, правила обработки, модели, ключи, журналы, инциденты и песочница. Хранение: две раздельные базы PostgreSQL (админка и шлюз) и S3-совместимое хранилище для баз знаний и черновиков, весь стек поднимается в Docker Compose.
Технологии
- LiteLLM
- Python
- Microsoft Presidio
- spaCy
- Bun
- TypeScript
- Hono
- OpenAPI 3.1
- Zod
- Drizzle ORM
- PostgreSQL
- React 19
- MinIO (S3)
- Mailpit
- Docker Compose
- Playwright
Что разработано
- OpenAI-совместимый шлюз на LiteLLM: продукт меняет только адрес и ключ, а весь трафик к моделям идёт через цепочку правил
- Извлечение текста из вложений (офисные документы, PDF, HTML, изображения), чтобы проверка видела не только сообщение, но и приложенные файлы
- Маскирование персональных данных до вызова модели: шаблоны для паспорта, СНИЛС, ИНН, телефона, почты, карт и счетов плюс Presidio для имён и организаций; в модель уходят ярлыки вида <<PERSON>> и <<EMAIL>>, оригиналы лежат в зашифрованном сейфе запроса
- Детектор prompt injection по OWASP LLM01: эвристика по ключевым фразам, обфускации и омоглифам, затем LLM-классификатор с примерами разметки; детектор отключается для отдельного продукта
- Корпоративная база знаний продукта: папки с терминами коммерческой тайны, справочники контрагентов и секреты, у каждой папки своя реакция (маскировать, отклонить, запросить подтверждение)
- Нормализация текста заказчика: синонимы и сокращения приводятся к канону до проверки, чтобы «дисконт» и «скидка» ловились одним правилом
- Классификация запрещённых тем (насилие, экстремизм, наркотики, политика и другие) и корпоративные метки с весами и приоритетами
- LLM-судья с пятью реакциями: пропустить, предупредить, маскировать, запросить подтверждение, отклонить; при нескольких сработавших слоях побеждает более строгое решение
- Оценка неуверенности судьи по энтропии распределения реакций: спорные решения не принимаются автоматически, а уходят администратору
- Ответы платформы в формате обычного chat.completion с finish_reason content_filter, чтобы продукт показал пользователю текст политики, а не ошибку API
- Очередь «Входящие»: запрос, требующий подтверждения, ждёт решения администратора, после решения повтор того же запроса проходит без повторной блокировки
- Иерархия организаций (платформа, заказчик, подразделение, продукт) и четыре уровня администраторов с приглашением только уровнем ниже и входом по одноразовому коду из письма
- Изоляция данных заказчиков: соседний заказчик не видит чужие запросы, правила, модели и ключи, а неизменяемый журнал действий администраторов защищён триггером в базе
- Журнал запросов с маскированным текстом, раздел инцидентов с категорией и критичностью, архив по срокам хранения и точечное раскрытие ярлыка по отдельному праву
- Дашборд: состояние компонентов, счётчики по реакциям, вердикты, проверки по дням, распределение по продуктам и категориям
- Песочница: черновики правил, захват трафика продукта без вызова боевой модели, пробный запрос с разбором по слоям и перенос конфигурации в прод отдельным действием
- Пять тематических пресетов (стратегия, техника, финансы, коммерция, кадры) с готовыми правилами, базой знаний, метками и golden-набором для проверки
- Режим отказа для каждой области: при недоступности Presidio или судьи трафик либо пропускается с инцидентом, либо режется
- Подключение моделей и выпуск ключей продуктов из админки, ключ показывается один раз, перевыпуск отзывает прежний
Ключевые фичи
- Продукт не нужно переписывать: шлюз совместим с OpenAI Chat Completions, отказ и ожидание подтверждения приходят как обычный ответ модели
- Персональные данные не покидают контур: в модель уходит текст с ярлыками, а раскрыть оригинал может только администратор с отдельным правом
- Несколько независимых слоёв (шаблоны, Presidio, детектор инъекций, база знаний, классификатор, LLM-судья), итоговое решение выбирается по строгости
- Спорные запросы не решаются молча: их видно во «Входящих», администратор пропускает запрос или применяет реакцию
- Правила настраивает служба безопасности заказчика в своей области, без доступа к данным соседних компаний и без участия разработчиков
- Новые правила сначала проверяются в песочнице на живом трафике без вызова боевой модели
- Тематический пресет за одно действие включает готовую защиту для продаж, финансов, кадров, стратегии или инфраструктуры
- Каждое действие администратора попадает в журнал, который нельзя изменить через API
Решение задачи
Главное ограничение задачи: продукты CorpSoft24 уже работали у заказчиков и общались с моделями по стандартному протоколу. Поэтому защита сделана не библиотекой внутри продукта, а шлюзом с тем же API. Продукт меняет адрес и ключ, а всё остальное остаётся как было. Отдельно продумано поведение при срабатывании правил: отклонение и ожидание подтверждения возвращаются как успешный ответ модели с фиксированным текстом, поэтому интерфейс продукта показывает пользователю понятное сообщение, а не падает с ошибкой API.
Второй пласт: одна мера защиты не справляется со всеми случаями. Шаблоны надёжно ловят паспорт, СНИЛС и карту, но не видят имя в свободной форме; Presidio находит имена и организации, но ничего не знает о внутренних скидках; LLM понимает пересказ, но может ошибиться. Поэтому запрос проходит цепочку слоёв, каждый выносит свой вердикт, а итог выбирается по строгости. Когда судья не уверен (высокая энтропия по реакциям), решение не принимается автоматически и передаётся администратору.
Третий пласт: платформа одна, а заказчиков много. Шлюз LiteLLM общий и ничего не знает о компаниях, поэтому привязку правил, баз знаний, режимов отказа и журналов к заказчику, подразделению и продукту держит админка, а шлюз запрашивает политику по ключу продукта. Права администраторов описаны матрицей ролей, каждый HTTP-маршрут проходит одну точку проверки сессии, права и области, а отказ в доступе пишется в журнал того, кто пытался зайти в чужую зону.
Метрики
Результаты
Синтетические данныеДанные на скриншотах вымышленные: реальные цифры, названия контрагентов и персональные данные заменены на синтетические.
Заказать похожий проект
Оставьте заявку, обсудим задачу и предложим решение под ваш бизнес.
Оставить заявку




















