Безопасность секретов
Строгие правила secure coding, zero-trust модель облачного хранения и механизмы защиты локальных секретов.
Zero-Secret Policy
Безопасность — один из базовых принципов VibeBasket. Чувствительные ключи вроде OpenAI или GitHub API tokens, которые используют установленные MCP-серверы, никогда не проходят через базу bundle’ов и не кэшируются в ней.
Zero-Trust Cloud Policy
Bundle manifest’ы никогда не содержат runtime-секреты конечного пользователя. Hosted-приложение хранит выбранные метаданные каталога и, при необходимости, зашифрованные admin credentials для backup storage, но не API keys, которые MCP или agent tools используют во время работы.
Вместо этого при локальном apply bundle CLI анализирует credential keys цели и безопасно запрашивает их у оператора прямо в локальном терминале. Hosted-приложение никогда не видит эти runtime-значения.
Дальнейшая обработка secret’ов зависит от целевого адаптера. Большинству IDE нужны inline MCP env или header values в локальных конфиг-файлах, поэтому CLI разрешает эти secrets на машине оператора и записывает их только в локальный IDE config этой машины. Codex — частичное исключение для auth headers удалённых MCP: когда нативный config format поддерживает ссылку на environment-key, VibeBasket предпочитает её, а не сериализацию raw token в TOML.
Rate limiting
Все публичные API endpoints защищены sliding-window rate limiter’ом с per-IP tracking и автоматической очисткой. Proxy-derived IP headers считаются доверенными только если self-hoster явно включает proxy trust.
| Endpoint | Лимит |
|---|---|
| /api/health | 120/min |
| /api/catalog | 120/min |
| /api/auth/* | 60/min |
| /api/bundle/[id] | 60/min |
| /api/stacks | 30/min |
| /api/admin/stats | 30/min |
| /api/catalog/status | 5/min |
| /api/bundle POST | 20/min |
Security headers
Все ответы содержат усиленные security headers. В production HTML routes получают nonce-based Content-Security-Policy, чтобы Next.js мог безопасно гидратироваться без открытия двери для массового исполнения inline-скриптов, а HSTS применяется на всём deployment.
| Header | Value |
|---|---|
| X-Frame-Options | DENY |
| X-Content-Type-Options | nosniff |
| Referrer-Policy | strict-origin-when-cross-origin |
| X-Permitted-Cross-Domain-Policies | none |
| X-Download-Options | noopen |
| Permissions-Policy | camera=(), microphone=(), geolocation=() |
| Strict-Transport-Security | max-age=63072000; includeSubDomains; preload |
| Content-Security-Policy | default-src 'self'; script-src 'self' 'nonce-<request-nonce>' 'strict-dynamic' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline'; object-src 'none'; manifest-src 'self'; frame-ancestors 'none' |
Безопасность админ-панели
Админ-панель на /admin защищена OAuth-authenticated sessions. Доступ ограничен адресами из переменной окружения ADMIN_OAUTH_EMAILS , и только подтверждённые email’ы из allowlist получают роль администратора.
| Функция | Описание |
|---|---|
| Catalog Sync | Вручную запускает синхронизацию registry из upstream-источников. |
| Backup Mgmt | Создаёт, показывает, скачивает и восстанавливает backup’ы базы данных в любом настроенном storage backend. |
| FTS5 Index Health | Сверяет количество строк в индексе full-text search с таблицей каталога для проверки целостности. |
| DB Health Check | Запускает проверки целостности базы данных и помогает рано обнаружить corruption. |
| Force Cleanup | Удаляет просроченные bundle’ы, stale sessions, verification tokens и старые sync records, затем выполняет vacuum. |
| User Overview | Показывает количество зарегистрированных пользователей, телеметрию saved stacks и рейтинг популярности. |
| Admin Emails | Настраивает allowlist админских email’ов, сохранённый в site config в формате comma-separated. |
Все admin actions выполняются только на server-side и требуют подтверждённой admin session. Для endpoint’а /api/admin/stats действует лимит 30 запросов в минуту.