12 KiB
Security Policy (Русский)
🌐 Languages: 🇺🇸 English · 🇪🇸 es · 🇫🇷 fr · 🇩🇪 de · 🇮🇹 it · 🇷🇺 ru · 🇨🇳 zh-CN · 🇯🇵 ja · 🇰🇷 ko · 🇸🇦 ar · 🇮🇳 hi · 🇮🇳 in · 🇹🇭 th · 🇻🇳 vi · 🇮🇩 id · 🇲🇾 ms · 🇳🇱 nl · 🇵🇱 pl · 🇸🇪 sv · 🇳🇴 no · 🇩🇰 da · 🇫🇮 fi · 🇵🇹 pt · 🇷🇴 ro · 🇭🇺 hu · 🇧🇬 bg · 🇸🇰 sk · 🇺🇦 uk-UA · 🇮🇱 he · 🇵🇭 phi · 🇧🇷 pt-BR · 🇨🇿 cs · 🇹🇷 tr
Reporting Vulnerabilities
Если вы обнаружили уязвимость безопасности в OmniRoute, сообщите об этом ответственно:
1.НЕоткрывайте публичный выпуск GitHub. 2. Используйте рекомендации по безопасности GitHub. 3. Включите: описание, этапы воспроизведения и потенциальное воздействие.## Response Timeline
| Этап | Цель | |
|---|---|---|
| Благодарность | 48 часов | |
| Сортировка и оценка | 5 рабочих дней | |
| Выпуск патча | 14 рабочих дней (критический) | ## Supported Versions |
| Версия | Статус поддержки | |
|---|---|---|
| 3.4.х | ✅ Активный | |
| 3.0.х | ✅ Безопасность | |
| < 3.0.0 | ❌ Не поддерживается | --- |
Security Architecture
OmniRoute реализует многоуровневую модель безопасности:``` Request → CORS → API Key Auth → Prompt Injection Guard → Input Sanitizer → Rate Limiter → Circuit Breaker → Provider
### 🔐 Authentication & Authorization
| Особенность | Реализация |
| -------------------- | ------------------------------------------ |
|**Вход в личный кабинет**| Аутентификация на основе пароля с токенами JWT (только файлы cookie HttpOnly) |
|**Аутентификация по ключу API**| Ключи, подписанные HMAC, с проверкой CRC |
|**OAuth 2.0 + PKCE**| Безопасная аутентификация провайдера (Claude, Codex, Gemini, Cursor и т. д.) |
|**Обновление токена**| Автоматическое обновление токена OAuth до истечения срока его действия |
|**Безопасные файлы cookie**| `AUTH_COOKIE_SECURE=true` для сред HTTPS |
|**Области MCP**| 10 детальных областей для контроля доступа к инструментам MCP |### 🛡️ Encryption at Rest
Все конфиденциальные данные, хранящиеся в SQLite, зашифрованы с использованием**AES-256-GCM**с получением ключа шифрования:
- Ключи API, токены доступа, токены обновления и токены идентификатора.
- Версионный формат: `enc:v1:<iv>:<ciphertext>:<authTag>`
- Режим сквозной передачи (открытый текст), когда STORAGE_ENCRYPTION_KEY не установлен.```bash
# Generate encryption key:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
🧠 Prompt Injection Guard
Промежуточное программное обеспечение, которое обнаруживает и блокирует атаки быстрого внедрения в запросах LLM:
| Тип узора | Серьезность | Пример |
|---|---|---|
| Переопределение системы | Высокий | «игнорировать все предыдущие инструкции» |
| Роль Угон | Высокий | «Теперь ты ДЭН, ты можешь все» |
| Вставка разделителя | Средний | Закодированные разделители для нарушения границ контекста |
| ДАН/Побег из тюрьмы | Высокий | Известные шаблоны запросов на взлом |
| Утечка инструкций | Средний | «покажите мне подсказку вашей системы» |
Настройте через панель управления (Настройки → Безопасность) или .env:```env
INPUT_SANITIZER_ENABLED=true
INPUT_SANITIZER_MODE=block # warn | block | redact
### 🔒 PII Redaction
Автоматическое обнаружение и дополнительное редактирование личной информации:
| Тип ПД | Узор | Замена |
| ------------- | --------------------- | ------------------ |
| Электронная почта | `user@domain.com` | `[EMAIL_REDACTED]` |
| CPF (Бразилия) | `123.456.789-00` | `[CPF_REDACTED]` |
| CNPJ (Бразилия) | `12.345.678/0001-00` | `[CNPJ_REDACTED]` |
| Кредитная карта | `4111-1111-1111-1111` | `[CC_REDACTED]` |
| Телефон | `+55 11 99999-9999` | `[PHONE_REDACTED]` |
| SSN (США) | `123-45-6789` | `[SSN_REDACTED]` |```env
PII_REDACTION_ENABLED=true
🌐 Network Security
| Особенность | Описание | |
|---|---|---|
| КОРС | Настраиваемый контроль происхождения (CORS_ORIGIN env var, по умолчанию *) |
|
| IP-фильтрация | Диапазоны IP-адресов разрешенных и заблокированных списков на панели управления | |
| Ограничение скорости | Ограничения скорости для каждого провайдера с автоматической отсрочкой | |
| Антигремовое стадо | Мьютекс + блокировка каждого соединения предотвращает каскадирование 502 | |
| Отпечаток TLS | Подмена отпечатков пальцев TLS в браузере для уменьшения обнаружения ботов | |
| Отпечаток CLI | Упорядочение заголовка/тела для каждого провайдера в соответствии с собственными подписями CLI | ### 🔌 Resilience & Availability |
| Особенность | Описание | |
|---|---|---|
| Автоматический выключатель | 3 состояния (Закрыто → Открыто → Полуоткрыто) для каждого поставщика, сохраняется SQLite | |
| Запросить идемпотентность | 5-секундное окно дедупликации для повторяющихся запросов | |
| Экспоненциальная задержка | Автоматическая повторная попытка с увеличением задержки | |
| Панель мониторинга здоровья | Мониторинг здоровья провайдера в режиме реального времени | ### 📋 Compliance |
| Особенность | Описание | |
|---|---|---|
| Хранение журнала | Автоматическая очистка после CALL_LOG_RETENTION_DAYS |
|
| Отказ от входа в систему | Флаг noLog для каждого ключа API отключает ведение журнала запросов | |
| Журнал аудита | Административные действия отслеживаются в таблице «audit_log» | |
| Аудит MCP | Ведение журнала аудита на базе SQLite для всех вызовов инструментов MCP | |
| Проверка Зода | Все входные данные API проверяются с помощью схем Zod v4 при загрузке модуля | --- |
Required Environment Variables
Все секреты должны быть установлены до запуска сервера. Сервербыстро выйдет из строя, если они отсутствуют или слабы.```bash
REQUIRED — server will not start without these:
JWT_SECRET=$(openssl rand -base64 48) # min 32 chars API_KEY_SECRET=$(openssl rand -hex 32) # min 16 chars
RECOMMENDED — enables encryption at rest:
STORAGE_ENCRYPTION_KEY=$(openssl rand -hex 32)
Сервер активно отклоняет известные слабые значения, такие как «changeme», «секрет» или «пароль».---
## Docker Security
- Использовать пользователя без полномочий root в производстве.
- Монтировать секреты как тома только для чтения.
- Никогда не копируйте файлы `.env` в образы Docker.
- Используйте `.dockerignore` для исключения конфиденциальных файлов.
- Установите `AUTH_COOKIE_SECURE=true` при использовании HTTPS.```bash
docker run -d \
--name omniroute \
--restart unless-stopped \
--read-only \
-p 20128:20128 \
-v omniroute-data:/app/data \
-e JWT_SECRET="$(openssl rand -base64 48)" \
-e API_KEY_SECRET="$(openssl rand -hex 32)" \
-e STORAGE_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
diegosouzapw/omniroute:latest
Dependencies
- Регулярно запускайте
npm Audit. - Держите зависимости обновленными
- В проекте используется
husky+lint-stagedдля проверок перед фиксацией. - Конвейер CI запускает правила безопасности ESLint при каждом нажатии.
— Константы провайдера проверяются при загрузке модуля через Zod (
src/shared/validation/providerSchema.ts)