# 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) | Patch Traefik listo en `.ops/HARDEN_SURFACES.md` (**no aplicado**). Candidata egress oficina (2026-09-21): `90.161.248.78/32` — confirmar si es fija antes de allowlist. ## 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.