AI CPO — Техническая документация по безопасности
Для ИБ-отделов, архитекторов и технических руководителей
| Поле | Значение |
|---|---|
| Версия | 2.0 |
| Дата | 2026-04-03 |
| Классификация | Конфиденциально — для потенциальных клиентов |
| Контакт | roman.neverov@aicpo.ru |
1. Архитектура платформы
1.1 Стек
| Компонент | Технология | Версия |
|---|---|---|
| Backend | Ruby on Rails | 8.1 |
| Runtime | Ruby | 3.3.8 |
| Web server | Puma (multi-threaded) | 6.x |
| БД (Cloud/Encrypted) | PostgreSQL | 16+ |
| БД (Private) | PostgreSQL (клиентский) | 14+ |
| Кэш | Redis | 7+ |
| Фоновые задачи | SolidQueue | — |
| WebSocket | ActionCable (Redis adapter) | — |
| Assets | Propshaft (без Node.js) | — |
| Контейнеризация | Docker (multi-stage) | 24+ |
| Оркестрация | docker-compose / Kubernetes | — |
1.2 Архитектурная схема
┌──────────────────────────────────────────────────────────┐
│ КЛИЕНТСКИЙ КОНТУР │
│ (Tier 4: всё внутри / Tier 3: только БД внутри) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │
│ │PostgreSQL│ │ Redis │ │ LLM (Ollama/vLLM) │ │
│ │(данные) │ │ (кэш) │ │ (клиентская модель) │ │
│ └────┬─────┘ └────┬─────┘ └──────────┬───────────┘ │
│ │ │ │ │
│ └──────────────┼────────────────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ AI Product │ │
│ │ Builder App │ │
│ │ (Docker) │ │
│ │ │ │
│ │ ┌────────────┐ │ │
│ │ │ Encrypted │ │ │
│ │ │ Prompts │ │ │
│ │ └────────────┘ │ │
│ │ ┌────────────┐ │ │
│ │ │ License │ │ │
│ │ │ Validator │ │ │
│ │ └────────────┘ │ │
│ └───────┬────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ Reverse Proxy │ │
│ │ (nginx) │ │
│ └───────┬────────┘ │
│ │ │
└──────────────────────┼────────────────────────────────────┘
│
┌───────┴────────┐
│ Браузер │
│ (TLS/HTTPS) │
└────────────────┘
1.3 Потоки данных по тирам
Tier 2: Encrypted
Браузер ──TLS──→ App Server ──→ AR::Encryption ──→ PostgreSQL (AES-256 at rest)
│
├──→ Redis (TTL-limited, no PII)
│
├──→ LLM API (OpenRouter/Groq/Anthropic)
│ ⚠ Данные отправляются в зашифрованном виде
│ ⚠ Отключаемо: DATA_TIER=encrypted → sanitized context
│
└──→ File Storage (AES-256 encrypted at rest)
Tier 3: Hybrid
Браузер ──TLS──→ App Server (наш контур) ──VPN/WireGuard──→ PostgreSQL (контур клиента)
│
├──→ Redis (наш контур, no PII, TTL)
│
├──→ LLM API (настраиваемый endpoint)
│
└──→ File Storage (S3/NFS клиента)
Tier 4: Private (air-gap capable)
Браузер ──TLS──→ nginx ──→ App (Docker) ──→ PostgreSQL (локальный)
│
├──→ Redis (локальный)
│
├──→ LLM (Ollama/vLLM, локальный)
│ ✅ Ноль данных наружу
│
└──→ File Storage (локальный volume)
Внешние подключения: НОЛЬ (при air-gap)
Опциональные: license server ping (отключаемо, grace 30 дней)
2. Шифрование данных
2.1 Encryption at Rest
| Слой | Метод | Ключ | Ротация |
|---|---|---|---|
| Данные в БД | ActiveRecord::Encryption, AES-256-GCM | ENCRYPTION_PRIMARY_KEY (ENV, предоставляет клиент) |
Поддержка previous_encryption_key для бесшовной ротации |
| Файлы | AES-256 через ActiveStorage custom service | Тот же ENCRYPTION_PRIMARY_KEY |
При ротации — фоновая перешифровка |
| Промпты (Tier 4) | AES-256-CBC | Ключ из JWT лицензии | При обновлении лицензии |
| Redis кэш | Не шифруется (не содержит PII, TTL ≤24ч) | — | — |
2.2 Шифруемые поля
| Модель | Поля | Тип шифрования |
|---|---|---|
workspace_messages |
content |
Non-deterministic |
workspace_context_facts |
content |
Deterministic (для поиска) |
workspace_artifacts |
content |
Non-deterministic |
workspace_project_contacts |
value |
Deterministic |
workspace_artifact_comments |
content |
Non-deterministic |
email_messages |
body |
Non-deterministic |
users |
email, name |
Deterministic |
crm_leads |
notes |
Non-deterministic |
workspace_projects |
name |
Deterministic |
workspace_custom_artifact_requests |
description |
Non-deterministic |
workspace_org_invites |
email |
Deterministic |
workspace_artifact_tasks |
title |
Non-deterministic |
workspace_audit_logs |
metadata |
Non-deterministic |
Deterministic = можно искать по точному совпадению (WHERE field = value). Non-deterministic = нельзя искать, максимальная безопасность.
2.3 Encryption in Transit
| Канал | Протокол | Сертификат |
|---|---|---|
| Браузер → App | TLS 1.3 | Let's Encrypt (Cloud) / клиентский CA (Private) |
| App → PostgreSQL | TLS (опционально) / VPN (Tier 3) | — |
| App → Redis | Localhost (Tier 4) / TLS (Tier 2-3) | — |
| App → LLM | TLS 1.3 | Провайдер (Cloud) / localhost (Tier 4) |
| WebSocket (ActionCable) | WSS (TLS) | Тот же сертификат |
2.4 Ключевое: Zero-Knowledge архитектура (Tier 2+)
При Tier 2+: - Ключ шифрования предоставляет клиент через ENV - Мы не имеем доступа к ключу - Дамп БД без ключа = нечитаемые данные - Бэкапы зашифрованы тем же ключом - При потере ключа данные невосстановимы (by design)
3. Управление доступом
3.1 Аутентификация
| Метод | Tier 1-2 | Tier 3-4 | Детали |
|---|---|---|---|
| Email + пароль | ✅ | ✅ | bcrypt, минимум 8 символов |
| Google OAuth 2.0 | ✅ | Опционально | Требует интернет |
| Telegram Login | ✅ | Опционально | Через Cloudflare Worker relay |
| SAML 2.0 | Roadmap | Roadmap | Для интеграции с корп. IdP |
| OIDC | Roadmap | Roadmap | — |
| Domain auto-join | ✅ | ✅ | Все с @company.ru автоматически в организацию |
3.2 Авторизация (RBAC)
Organization
├── Owner (1) — полный контроль вкл. биллинг и удаление
├── Admin (N) — управление командой, инвайты, все проекты
├── Editor (N) — CRUD проектов, артефактов, комментариев, чат с AI
└── Viewer (N) — только чтение + комментирование
Проверка доступа: Teams::PermissionService.can?(user, action, resource) — единая точка на уровне контроллера. Скоупинг запросов через organization_id — невозможно получить данные чужой организации.
3.3 Матрица пермишенов
| Действие | Owner | Admin | Editor | Viewer |
|---|---|---|---|---|
| Управление организацией | ✅ | ❌ | ❌ | ❌ |
| Биллинг | ✅ | ❌ | ❌ | ❌ |
| Инвайт/удаление участников | ✅ | ✅ | ❌ | ❌ |
| Настройка скоупа проекта | ✅ | ✅ | ❌ | ❌ |
| Создание проектов | ✅ | ✅ | ✅ | ❌ |
| Чат с AI | ✅ | ✅ | ✅ | ❌ |
| Генерация артефактов | ✅ | ✅ | ✅ | ❌ |
| Комментирование | ✅ | ✅ | ✅ | ✅ |
| @AI в комментариях | ✅ | ✅ | ✅ | ❌ |
| Просмотр артефактов | ✅ | ✅ | ✅ | ✅ |
| Просмотр аудит-лога | ✅ | ✅ | ❌ | ❌ |
| Экспорт данных | ✅ | ✅ | ❌ | ❌ |
3.4 Изоляция данных
| Уровень | Механизм |
|---|---|
| Между организациями | organization_id скоупинг на уровне SQL. Row-level фильтрация. Невозможно получить данные чужой организации через API |
| Между проектами в орг | visibility: private (только автор), org (вся организация), public |
| Между юзерами | Соло-проекты (organization_id = NULL) изолированы по user_id |
| Research cache | Глобальный shared (ниши, каналы, статьи). НЕ содержит данные организаций. Только публичная информация |
| Анонимные юзеры | Изоляция по session_id. Нет доступа к данным других сессий |
4. Аудит и мониторинг
4.1 Аудит-трейл
При audit_enabled = true (Tier 2+):
| Что логируется | Поля |
|---|---|
| Каждый CRUD на орг-ресурсах | user_id, action (create/read/update/delete), resource_type, resource_id |
| Контекст | ip_address, user_agent, timestamp |
| Метаданные | JSON: старое значение → новое значение (для update) |
| Иммутабельность | Soft-delete only. Записи аудит-лога нельзя удалить или изменить |
Хранение: таблица workspace_audit_logs. Экспорт: CSV / JSON. Roadmap: SIEM integration (Splunk, ELK).
AI-трансформация: все AI-взаимодействия (чат, генерация артефактов, @AI комментарии) логируются в аудит-лог. Контролируемая точка входа в AI вместо хаотичного использования ChatGPT сотрудниками.
4.2 Логирование
| Уровень | Что логируется | PII |
|---|---|---|
| Production (INFO) | HTTP запросы, job execution, errors | Редактировано: email → ***@***.ru, content → [REDACTED] |
| Error | Stack traces, exception details | Без чувствительных данных в бэктрейсах |
| Audit | Все CRUD операции | Только resource_id, не содержимое |
4.3 Мониторинг (Tier 4)
| Эндпоинт | Назначение |
|---|---|
GET /up |
Health check: БД connection + Redis ping |
GET /admin/health |
Детальный статус: jobs queue, disk space, DB size, последний бэкап |
| ActionCable | Websocket status: connected clients |
4.4 Штрафы ФЗ-152 (с мая 2025)
С 30 мая 2025 года вступили в силу значительно ужесточённые штрафы за нарушения в области персональных данных:
| Нарушение | Штраф |
|---|---|
| Утечка 1K-10K субъектов | 3-5 млн ₽ |
| Утечка 10K-100K субъектов | 5-10 млн ₽ |
| Утечка 100K+ или биометрия | 15-20 млн ₽ |
| Повторная утечка | 1-3% годовой выручки (мин 20M, макс 500M ₽) |
| Обработка без согласия | 150-300K ₽ первый раз, 300-500K ₽ повтор |
| Без уведомления РКН | 100-300K ₽ |
| Без уведомления об утечке | 1-3 млн ₽ |
AI CPO Tier 3-4 обеспечивает полное соответствие ФЗ-152: данные не покидают РФ (Tier 3) или контур клиента (Tier 4). Это не абстрактная безопасность — это защита от оборотных штрафов до 500M ₽.
5. LLM и обработка данных
5.1 Централизованный LLM-клиент
Все вызовы LLM проходят через единый LlmGateway:
LlmGateway.complete(
prompt: "...",
model: "sonnet", # alias, routing is automatic
max_tokens: 2048,
system: "...",
temperature: 0.7
)
При установке переменной LLM_BASE_URL все вызовы автоматически направляются на локальный LLM-сервер (Ollama, vLLM, LocalAI) через OpenAI-совместимый API:
| Переменная | Назначение | Пример |
|---|---|---|
LLM_BASE_URL |
Base URL самохостного LLM | http://ollama:11434/v1 |
LLM_MODEL |
Имя модели на локальном сервере | llama3, qwen2.5, mistral |
LLM_API_KEY |
API-ключ (если требуется сервером) | Опционально |
5.2 Конфигурация LLM по тирам
| Параметр | Tier 1 (Cloud) | Tier 2 (Encrypted) | Tier 3 (Hybrid) | Tier 4 (Private) |
|---|---|---|---|---|
| LLM endpoint | OpenRouter (внешний) | OpenRouter (внешний) | Настраиваемый | Локальный (Ollama/vLLM) |
| Данные в запросе | Plaintext | Sanitized context | Sanitized context | Полный контекст (локально) |
| API ключ | Наш | Наш | Клиентский | Клиентский (или без ключа) |
| Модели | Qwen, Gemini, Claude | То же | То же + клиентские | Любые: Llama, Qwen, Mistral, etc. |
Важно: на Tier 1-2 данные обрабатываются через API OpenRouter/Groq (серверы в США/ЕС). Системные промпты (методология) не содержат пользовательских данных. Для Tier 2: контент санитизируется перед отправкой (PII redaction). Для полного контроля над данными — Tier 3 (свой LLM endpoint) или Tier 4 (локальные модели, air-gap).
5.3 Какие данные отправляются в LLM
| Тип данных | Cloud | Encrypted+ |
|---|---|---|
| Системный промпт (методология) | ✅ | ✅ (не содержит user data) |
| Последние 10 сообщений чата | ✅ | 🔶 Sanitized (без PII) |
| Извлечённые факты (для артефактов) | ✅ | 🔶 Anonymized |
| Имя проекта | ✅ | ❌ Masked |
| Контакты (email, phone) | ❌ Никогда | ❌ Никогда |
| Загруженные файлы (содержимое) | ✅ (для анализа) | 🔶 Только при явном запросе |
5.4 Data Processing Agreement
Для Tier 2+: - Подписываем DPA с клиентом - Данные обрабатываются только для предоставления сервиса - Не используем данные клиента для обучения моделей - Данные удаляются по запросу (GDPR Art. 17) - Подпроцессоры: OpenRouter, Groq, Anthropic (только для Tier 1-2, отключаемо) - Для Tier 4: подпроцессоров НЕТ — всё на инфре клиента
5.5 Подготовка к ограничениям иностранных AI-моделей
В России обсуждается ограничение доступа к проприетарным иностранным AI-моделям (ChatGPT, Claude, Gemini). AI CPO готов к любому сценарию:
| Сценарий | Tier 1-2 | Tier 3 | Tier 4 |
|---|---|---|---|
| Текущее состояние (API доступен) | ✅ Groq/OpenRouter | ✅ Настраиваемый endpoint | ✅ Локальные модели |
| Блокировка проприетарных моделей | ⚠️ Переключение на open-source (Qwen, Llama, Mistral) | ✅ Свой endpoint | ✅ Полная автономность |
| Полный air-gap (требование регулятора) | ❌ | ❌ | ✅ Ноль зависимостей |
Tier 4 — единственный вариант, который работает при ЛЮБОМ сценарии ограничений. Рекомендуется для компаний, планирующих на 3+ лет.
6. Защита интеллектуальной собственности (Tier 4)
6.1 Docker image
| Защита | Что делает |
|---|---|
| Multi-stage build | Финальный image содержит только скомпилированный код (bootsnap cache) + precompiled assets. Нет .rb файлов |
| Encrypted prompts | 44 шаблона промптов зашифрованы AES-256. Дешифровка при запуске ключом из JWT лицензии |
| No source code | Методология Product DNA не доступна в виде читаемого кода |
| Image signing | Docker Content Trust (Notary). Модифицированный image не запустится |
6.2 Лицензирование
| Параметр | Значение |
|---|---|
| Формат | JWT (JSON Web Token), подписанный RS256 |
| Содержимое | client_id, max_users, expires_at, data_tier, features[] |
| Проверка | При запуске + каждые 24ч |
| Offline grace | 30 дней без подключения к license server |
| Hardware bind | MAC + hostname при первом запуске. Другой сервер = новый ключ |
| Обновление | Новый JWT доставляется с обновлённым Docker image |
7. Развёртывание Tier 4
7.1 Системные требования
| Ресурс | Минимум | Рекомендовано |
|---|---|---|
| CPU | 4 cores | 8 cores |
| RAM | 8 GB | 16 GB |
| Disk | 50 GB SSD | 100 GB SSD |
| OS | Linux (Ubuntu 22.04+, RHEL 8+) | Ubuntu 24.04 LTS |
| Docker | 24.0+ | latest |
| Docker Compose | 2.20+ | latest |
Для локального LLM (Ollama с 7B моделью): дополнительно 16 GB RAM + GPU (опционально, NVIDIA).
7.2 Установка
# 1. Получить docker-compose.yml и .env.template от вендора
# 2. Настроить .env
cp .env.template .env
# Обязательные переменные:
# APP_DOMAIN=product.yourcompany.ru
# ENCRYPTION_PRIMARY_KEY=<ваш_ключ_256_bit>
# LICENSE_JWT=<лицензионный_токен>
# LLM_BASE_URL=http://ollama:11434/v1 (или ваш endpoint)
# SECRET_KEY_BASE=<rails_secret>
# 3. Запуск
docker-compose up -d
# 4. Инициализация БД
docker-compose exec app bin/rails db:create db:migrate db:seed
# 5. Проверка
curl -k https://product.yourcompany.ru/up
# → 200 OK
7.3 Обновление
# 1. Получить новый image от вендора
docker-compose pull
# 2. Обновить (zero-downtime)
docker-compose up -d --no-deps app
# 3. Миграции (если есть)
docker-compose exec app bin/rails db:migrate
7.4 Бэкап
# PostgreSQL dump (ежедневно, рекомендовано)
docker-compose exec db pg_dump -U postgres ai_product_builder > backup_$(date +%Y%m%d).sql
# Файлы (загрузки пользователей)
docker cp $(docker-compose ps -q app):/rails/storage ./backup_storage/
8. Инцидент-респонс
8.1 Классификация
| Severity | Описание | SLA ответа | Пример |
|---|---|---|---|
| P1 Critical | Полная недоступность / утечка данных | 30 мин (Tier 4 TAM) | App не запускается, данные доступны извне |
| P2 High | Частичная недоступность / потеря функционала | 4ч | Генерация артефактов не работает, но чат работает |
| P3 Medium | Деградация производительности | 8 раб. ч | Медленная генерация, задержки WebSocket |
| P4 Low | Косметические дефекты | 1-2 раб. дня | Ошибка в UI, опечатка |
8.2 При обнаружении уязвимости
- Уведомление клиента в течение 24ч
- Патч в течение 72ч (P1) / 7 дней (P2) / 30 дней (P3-P4)
- Обновлённый Docker image доставляется в private registry клиента
- Post-mortem с root cause analysis
9. Roadmap безопасности
| Фича | Срок | Описание |
|---|---|---|
| SSO/SAML 2.0 | Q2-Q3 2026 (в разработке) | Интеграция с корпоративными IdP (Okta, Azure AD, Keycloak) |
| SCIM provisioning | Q2-Q3 2026 (в разработке) | Автоматическое создание/удаление юзеров из IdP |
| IP whitelist | Q2-Q3 2026 (в разработке) | Ограничение доступа по IP-адресам |
| MFA (TOTP) | Q2-Q3 2026 (в разработке) | Двухфакторная аутентификация |
| SOC 2 Type II | Planned Q4 2026 | Сертификация (планируется) |
| Custom roles | Q3 2026 | Настраиваемые роли сверх 4 стандартных |
| SIEM integration | Q3 2026 | Экспорт аудит-логов в Splunk, ELK, QRadar |
| Key management | Q3 2026 | Интеграция с HashiCorp Vault / AWS KMS |
| Реестр Минцифры | В планах | Подача заявки. После включения: освобождение от НДС, преференция в госзакупках |
10. FAQ для ИБ
Q: Где хранятся данные? A: Зависит от тира. Tier 4: исключительно на вашей инфраструктуре. Ноль данных покидает ваш контур.
Q: Используете ли вы данные клиентов для обучения AI? A: Нет. Мы не обучаем модели на данных клиентов. При Tier 4 мы вообще не имеем доступа к данным.
Q: Что происходит при расторжении контракта? A: Tier 1-3: данные удаляются в течение 30 дней. Экспорт доступен до удаления. Tier 4: Docker image перестаёт работать после истечения лицензии. Данные остаются у клиента в PostgreSQL (вы владеете своими данными).
Q: Можно ли использовать без интернета? A: Tier 4: да, полный air-gap. LLM работает локально (Ollama/vLLM). Offline grace лицензии 30 дней. Ресёрч (поиск в интернете) будет недоступен — только manual input.
Q: Какие подпроцессоры задействованы? A: Tier 1-2: OpenRouter (LLM), Groq (LLM), Anthropic (LLM), российский хостинг-провайдер. Tier 3: только LLM-провайдер по выбору клиента. Tier 4: подпроцессоров нет.
Q: Как проходит обновление?
A: Новый Docker image доставляется в private registry клиента. docker-compose pull && docker-compose up -d. Миграции БД автоматические. Rollback: docker-compose up -d --force-recreate с предыдущим image.
Q: Есть ли пентест? A: Планируется Q2 2026. До этого — внутренний security audit + автоматизированные проверки (Brakeman, bundler-audit).
Документ подготовлен для технической оценки. Для демонстрации платформы свяжитесь: roman.neverov@aicpo.ru