Skip to content

Production hardening: webhook auth, audit trail, atomic approvals y recovery de huérfanos - #54

Merged
nicolas344 merged 1 commit into
mainfrom
claude/hungry-black-84f50e
Jun 10, 2026
Merged

nicolas344 merged 1 commit into
mainfrom
claude/hungry-black-84f50e

Conversation

@nicolas344

@nicolas344 nicolas344 commented Jun 10, 2026 •

Copy link
Copy Markdown
Owner

Resumen

Correcciones de la revisión de preparación para producción de Sentinel:

Seguridad

  • Webhook /api/alerts autenticado: exige Authorization: Bearer <ALERT_WEBHOOK_SECRET>. Sin la env var queda abierto (modo dev) con warning en logs. Alertmanager envía el secreto vía http_config.authorization.
  • Auditoría human-in-the-loop: execute/reject/postpone registran approved_by (email del JWT).
  • Transiciones atómicas: el claim de awaiting_approval es un UPDATE condicional — dos aprobaciones simultáneas ya no ejecutan el comando dos veces (la segunda recibe 409).

Robustez

  • Deduplicación por fingerprint de Alertmanager, respaldada por índice único parcial en Postgres (elimina la race del check-then-insert).
  • Recovery sweep: incidentes huérfanos por reinicios del backend (atascados en detected/investigating/executing_solution/verifying >30 min) se marcan failed con nota explicativa. Corre al arrancar y cada 15 min.

Bugs y configuración

  • Fix: los endpoints de runbooks e incidentes similares para K8s/Podman consultaban las colecciones de Docker.
  • CORS por entorno: CORS_ORIGINS / CORS_ORIGIN_REGEX (necesario para que el frontend de Render funcione sin hardcodear orígenes).
  • Migraciones SQL versionadas en supabase/migrations/ (baseline reconstruido + hardening).

Tests

  • 40+ tests nuevos: validadores de comandos (inyección con ;, $(), backticks, pipes, path traversal) y auth del webhook. 76 passing, ruff limpio.

Pasos post-merge (manuales)

  1. Ejecutar supabase/migrations/0002_production_hardening.sql en el SQL Editor de Supabase (solo ADD COLUMN IF NOT EXISTS + índice; seguro sobre datos existentes).
  2. En Render (backend): configurar CORS_ORIGINS=https://sentinel-softserve-1.onrender.com y un ALERT_WEBHOOK_SECRET fuerte.
  3. Verificar: POST /api/alerts sin header → 401; con el secreto → 200.

…als y recovery

Correcciones de la revisión de preparación para producción:

- Webhook /api/alerts autenticado con ALERT_WEBHOOK_SECRET (Bearer);
  Alertmanager envía el secreto vía http_config.authorization
- Auditoría human-in-the-loop: execute/reject/postpone registran approved_by
- Transiciones atómicas: el claim de awaiting_approval es un UPDATE
  condicional — elimina la doble ejecución de acciones en paralelo
- Deduplicación por fingerprint de Alertmanager con índice único parcial
  (garantía a nivel de BD, no check-then-insert)
- Recovery sweep: incidentes huérfanos por reinicios del backend se marcan
  failed con nota tras 30 min (startup + cada 15 min)
- Fix: runbooks e incidentes similares de K8s/Podman consultaban las
  colecciones de Docker
- CORS configurable por entorno (CORS_ORIGINS / CORS_ORIGIN_REGEX)
- Migraciones SQL versionadas en supabase/migrations/
- Tests: validadores de comandos (inyección) y auth del webhook (76 passing)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@nicolas344
nicolas344 merged commit bf17d01 into main Jun 10, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant