Require session on APIs, scope KPIs/activos/simulate to the user tenant, strip real JWTs from .env.example, and add health/smoke/docs for 4Ventures ops. Co-authored-by: Cursor <cursoragent@cursor.com>
1.5 KiB
1.5 KiB
Security — Centro de Mando (app.4ventures.es)
Incident NOW (secretos filtrados)
El PDF “Agencia 2030” y el antiguo .env.example del repo contenían JWTs reales
(anon + service_role) y passwords de demo.
- En Supabase Studio → Settings → API: regenerar
anonyservice_role. - Actualizar secrets en Dokploy / env del contenedor
appy de n8n. - Cambiar passwords de
admin@…y clientes demo; invalidar sesiones. - Rotar
ANTHROPIC_API_KEYsi estuvo en chats/docs. - Confirmar que
.env.examplesolo tiene placeholders (ya corregido en este repo).
Superficies a restringir (amenaza)
| Host | Acción |
|---|---|
git.4ventures.es |
VPN / IP allowlist / Basic Auth delante de Gitea |
n8n-agencia UI |
No público; solo webhooks con path secreto |
supabase Studio |
Solo red interna / SSO admin |
app |
Público OK; APIs tras sesión (middleware) |
Controles en código (este repo)
- Middleware exige sesión en
/dashboard/*y/api/*(excepto/api/health). /api/chaty/api/simulateexigen usuario +tenant_iden metadata./api/admin/*bloqueado para rolclient.- Activos leen
documentsvía cliente SSR (RLS), no anon global. - Headers: frame deny, nosniff, robots noindex, HSTS en prod.
RLS (verificar en Studio)
Ejecutar checklist en sql/rls_checklist.sql. Sin RLS real, el multi-tenant es cosmético.
Cron / n8n
- Webhooks solo POST.
- Header secreto compartido (
X-Webhook-Secret/ HMAC) en lead-inbound y deal-won. - No loguear bodies con PII a stdout público.