Перейти к содержанию

Безопасность

Безопасность — ключевая ценность Synth. Модель по определению ненадёжна, поэтому надёжность обеспечивает платформа: единый слой для LLM-вызовов, гранулярные права, роли, подтверждение опасных действий и журнал аудита.

LLM Gateway

LLM Gateway — единый слой безопасности для всех LLM-вызовов (включая саб-агентов, суммаризацию и служебные запросы). Он перехватывает трафик «запрос → провайдер → ответ → потребление» и не допускает утечки секретов.

Выключен по умолчанию

Пока шлюз не включён, трафик идёт напрямую. Включается администратором в разделе «Шлюз безопасности»; настройка глобальная.

Обфускация секретов

При включении шлюз по умолчанию обфусцирует, а не блокирует: найденный секрет (API-ключ, токен, пароль, данные карты) заменяется плейсхолдером ⟦SYNTH_SECRET_N⟧, а соответствие сохраняется в карте обфускации сессии.

Вход:  "мой ключ sk-abc123 используй для подключения"
          ↓ обфускация (карта: ⟦SYNTH_SECRET_1⟧ → sk-abc123)
          "мой ключ ⟦SYNTH_SECRET_1⟧ используй для подключения"
          ↓ LLM
Ответ: "Подключение с ⟦SYNTH_SECRET_1⟧ установлено"

Реальные значения подставляются обратно не в поток ответа, а в точках потребления: при записи файла, выполнении shell-команды, веб-запросе, git-операции, поиске и вызове MCP-инструмента.

Два режима обработки входа:

Режим Поведение
obfuscate (по умолчанию) Секрет заменяется плейсхолдером, запрос уходит в LLM
block При обнаружении секрета запрос блокируется, в LLM ничего не уходит

Карта обфускации — тоже секрет

Доступ к словарю есть только у ADMIN и AUDITOR (вкладка «Словарь обфускации» в правой панели). Раскрытие плейсхолдера пользователем логируется как событие аудита. Сгенерированные моделью плейсхолдеры, которых нет в карте, не восстанавливаются.

Rate limit

Ограничивается частота LLM-запросов:

  • на пользователя — llmGateway.rateLimit.userPerMinute;
  • на провайдера — llmGateway.rateLimit.providerPerMinute, защита от исчерпания квоты.

Ограничение действует и на внутренние вызовы (суммаризация, авто-заголовки, саб-агенты), а не только на запросы пользователя.

Output Guard

Ответы модели тоже проверяются: детектируются подозрительные секреты, URL и команды. События пишутся в аудит (output_guard).

Конфигурация шлюза:

llmGateway:
  enabled: false          # выключен по умолчанию
  inputMode: "obfuscate"  # obfuscate | block
  rateLimit:
    userPerMinute: 60
    providerPerMinute: 120
  audit:
    enabled: true
    logPath: ""           # пусто → {dataDir}/audit/llm-gateway.jsonl

Гранулярные права

Поверх ролей работает тонкая настройка доступа к инструментам. Правила задают для каждого инструмента одно из действий:

Действие Смысл
allow Выполнять без подтверждения
ask Спросить подтверждение у пользователя
deny Запретить

Правила описываются в секции permission.rules и могут учитывать паттерны команд и файлов. Опасные действия по умолчанию требуют подтверждения; таймаут ожидания ответа — permission.askTimeoutMs. Настройки наследуются саб-агентами: дочерний агент не может получить прав больше, чем родительская сессия.

Режимы Plan / Act / YOLO

Режим сессии — глобальный переключатель, задающий, насколько свободно агент действует:

Режим Поведение
plan Только планирование и чтение; изменения запрещены
act Действия разрешены в рамках правил прав, опасные — с подтверждением
yolo Максимальная автономность: подтверждения не запрашиваются

Помимо режима настраивается строгость цикла «план → реализация» (session.planMode: auto, strict, off). Подробнее — в разделе Режимы и права.

Аутентификация: OIDC и API-ключи

  • OIDC (Keycloak) — продакшен-вход: JWT, проверка подписи и извлечение ролей. Настройка — в разделе SSO / Keycloak.
  • API-ключи — для развёртываний без OIDC и для локального режима. Предъявляются в заголовке Authorization: Bearer <api-key>.

Роли ADMIN, USER, LEAD, AUDITOR определяют доступ к разделам и админским операциям. Подробнее — в разделе Аутентификация и роли.

Аудит-журнал

Каждый LLM-запрос логируется в append-only JSONL-файл {dataDir}/audit/llm-gateway.jsonl (одна строка — одна запись). Фиксируются: время, тип события, пользователь, сессия, провайдер и модель, найденные секреты и плейсхолдеры, расход токенов и стоимость, причина.

Типы событий: obfuscated, blocked, revealed, rate_limited, output_guard. Секреты в журнале хранятся только как плейсхолдеры.

Просмотр доступен администраторам и аудиторам: через API (GET /api/v2/audit с фильтрами по пользователю, сессии и периоду) и командой synth audit.

Защищённые пути: 403 «Permission denied»

Часть путей защищена от чтения и изменения агентом. Проверка применяется ко всем файловым инструментам и shell-командам, и её запрет приоритетнее обычных правил прав.

Симптом: агент не может прочитать или изменить файл; в ответе Permission denied.

Решение — настроить политику защищённых путей одним из способов:

GET/PUT/DELETE /api/v2/settings/protected-paths с телом вида {version: 1, add: [...], remove: [...]} — добавить или убрать пути относительно системного списка.

{dataDir}/security/protected-paths.json в том же формате add/remove (version: 1).

Тумблер security.protectedPaths.enabled в секции «Безопасность» интерфейса или false в config.yaml. Отключайте осознанно: защита включена по умолчанию.

Что дальше