Files
4ventures-client-portal/SECURITY.md
4Ventures 2df3fe6983 fix(security): harden auth, tenant scoping, and scrub secrets
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>
2026-09-21 10:51:46 +02:00

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.

  1. En Supabase Studio → Settings → API: regenerar anon y service_role.
  2. Actualizar secrets en Dokploy / env del contenedor app y de n8n.
  3. Cambiar passwords de admin@… y clientes demo; invalidar sesiones.
  4. Rotar ANTHROPIC_API_KEY si estuvo en chats/docs.
  5. Confirmar que .env.example solo 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/chat y /api/simulate exigen usuario + tenant_id en metadata.
  • /api/admin/* bloqueado para rol client.
  • Activos leen documents ví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.