Seguridad de secretos
Reglas estrictas de secure coding, modelos zero-trust para almacenamiento en la nube y mecanismos locales de protección de secretos.
Política zero-secret
La seguridad es una directriz principal de VibeBasket. Las claves sensibles, como los tokens de OpenAI o GitHub API usados por los MCP instalados, nunca transitan ni se almacenan en caché dentro de la base de datos de bundles.
Política zero-trust en la nube
Los manifiestos de bundle nunca contienen secretos de runtime del usuario final. La app alojada guarda metadatos del catálogo seleccionado y, opcionalmente, credenciales cifradas del almacenamiento de backups para administración, pero no las claves API que los MCP o herramientas agent usan en runtime.
En su lugar, al aplicar un bundle en local, el CLI analiza las claves de credenciales del destino y pide al operador, dentro del terminal local, que las inyecte de forma segura. La app alojada nunca ve esos valores de runtime.
A partir de ahí, la gestión de secretos depende del adaptador de destino. La mayoría de IDEs exige valores MCP inline en env o headers dentro de archivos locales de configuración, así que el CLI resuelve esos secretos en la máquina del operador y los escribe solo en la configuración local de ese IDE. Codex es una excepción parcial para los headers de auth de MCP remotos: cuando su formato nativo soporta una referencia a una clave de entorno, VibeBasket prefiere esa referencia en lugar de serializar el token en TOML.
Limitación de tasa
Todos los endpoints públicos de la API están protegidos por un rate limiter de ventana deslizante con seguimiento por IP y recolección automática. Las cabeceras IP derivadas de proxy solo se consideran fiables cuando quien autoaloja habilita explícitamente la confianza en proxy.
| Endpoint | Límite |
|---|---|
| /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 |
Cabeceras de seguridad
Todas las respuestas incluyen cabeceras endurecidas. En producción, las rutas HTML reciben una Content-Security-Policy basada en nonce para que Next.js pueda hidratar con seguridad sin abrir la puerta a la ejecución masiva de scripts inline, y HSTS se aplica en todo el despliegue.
| Cabecera | Valor |
|---|---|
| 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' |
Seguridad del panel de administración
El panel de administración en /admin está protegido por sesiones autenticadas con OAuth. El acceso se restringe a direcciones de correo listadas en la variable de entorno ADMIN_OAUTH_EMAILS , y solo las cuentas verificadas incluidas en la allowlist reciben rol de admin.
| Función | Descripción |
|---|---|
| Sync del catálogo | Lanza manualmente la sincronización del registry desde fuentes upstream. |
| Gestión de backups | Crea, lista, descarga y restaura backups de la base de datos en cualquier backend de almacenamiento configurado. |
| Salud del índice FTS5 | Verifica el recuento del índice de búsqueda full-text frente a la tabla del catálogo para asegurar integridad. |
| Chequeo de BD | Ejecuta diagnósticos de integridad de la base de datos y detecta corrupción de forma temprana. |
| Limpieza forzada | Elimina bundles caducados, sesiones obsoletas, tokens de verificación y registros antiguos de sync, y después ejecuta vacuum. |
| Resumen de usuarios | Inspecciona los recuentos de usuarios registrados, la telemetría de stacks guardados y los rankings de popularidad. |
| Correos admin | Configura la allowlist persistida de correos admin separada por comas. |
Todas las acciones de administración se ejecutan solo del lado del servidor y requieren una sesión de administrador verificada. El endpoint /api/admin/stats está limitado a 30 solicitudes por minuto.