feat(episode): TRAZA_estado-de-seguridad-servidor-memoria-m_S20260831.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD

Skill: AEGIS | Type: troubleshooting
Summary: EPISODIO 1 — brasaluz.com: 🛡️ Estado de seguridad — servidor MEMORIA (medición S
This commit is contained in:
Ember 2026-09-01 02:07:21 +00:00
parent aaa2fcd066
commit d96b473c2c

View file

@ -0,0 +1,40 @@
---
episode_id: "90abb3f1-48dc-4974-b102-fb053b4b1976"
puente_flat: "TRAZA_estado-de-seguridad-servidor-memoria-m_S20260831.R1_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD"
session_code: "S20260831.SID57AA1B256D8E"
acto_dialogico: "informar"
actor_flujo: "multi_actor"
criticidad_aegis: "low"
skill_dominante: "AEGIS"
fase_proyecto: "operations"
tipo_semantico: "troubleshooting"
summary_one_line: "EPISODIO 1 — brasaluz.com: 🛡️ Estado de seguridad — servidor MEMORIA (medición S2026083"
source_type: "claude_code"
trust_boundary: "internal"
created_at: "2026-09-01T02:07:18.708452+00:00"
relectura_tagged: false
forgejo_commit_sha: "pending"
---
`continua` — recibido. El workflow adversarial corre en background (te aviso al terminar). Mientras verifica, te doy la **foto medida ya utilizable** — todo es salida real de comandos de hoy, nada de memoria.
## 🛡️ Estado de seguridad — servidor MEMORIA (medición S20260831, pre-refutación)
Evidencia cruda: [evidencia_seguridad_servidor_S20260831.txt](../../../../../Users/ADMINI~1/AppData/Local/Temp/claude/C--Users-Administrador-Downloads-CLAUDE-ANTROPIC-ember-claude-code/57aa1b25-6d8e-4c7e-9788-278fd29f14ac/scratchpad/evidencia_seguridad_servidor_S20260831.txt)
### Lo que está BIEN hecho (no es un servidor descuidado)
- **SSH endurecido de verdad:** puerto 47822, sin login root, sin password (solo llave pública), `maxauthtries 3`, `allowusers johnember`, sin X11 ni TCP-forwarding. Los logs solo muestran accesos legítimos tuyos.
- **Casi todo en `127.0.0.1`:** de ~64 contenedores, a internet solo salen 80/443 (Caddy), 47822 (SSH) y 51820 (WireGuard). Todo lo demás (Postgres, Qdrant, Neo4j, Redis, LiteLLM, ember-mcp…) escucha en loopback.
- **Defensa activa:** fail2ban con 5 cárceles + crowdsec + bouncer (0 decisiones activas = tranquilo).
- **Docker sano:** ningún contenedor `privileged`, sin socket TCP de dockerd, y el `docker.sock` solo lo toca el **socket-proxy** en modo lectura. Authelia protege la mayoría de los paneles (portainer, dozzle, uptime-kuma, temporal, etc.).
- **Secretos:** los `.env` están en `600`, ninguno world-readable. `unattended-upgrades` activo.
### Gaps reales (severidad preliminar — el workflow los está refutando/ajustando)
| # | Hallazgo | Sev. prelim. | Blast radius del arreglo |
|---|----------|:---:|:---:|
| 1 | **OS sin parchear:** 58 paquetes upgradables + **reboot pendiente** + **105 días de uptime**. Kernel nuevo instalado sin bootear; containerd 2.2.2→2.3.4, docker-ce 29.3.0→29.7.2 pendientes. `unattended-upgrades` NO cubre repo Docker ni el reboot. | 🟠 HIGH | 🔴 Alto (reboot prod) |
| 2 | **Sin firewall default-deny de host** (INPUT=ACCEPT, ufw no instalado, Hetzner sin cloud-firewall). La protección de ingreso ES "todo en loopback" + 1 regla iptables. Frágil: si algún día un contenedor publica `0.0.0.0:X`, Docker salta el filtro INPUT y queda expuesto. | 🟠 HIGH | 🔴 Alto (riesgo lockout) |
| 3 | **`warden-mcp` escucha en `*:3005`** (todas las interfaces) — proceso node de host, adyacente a Vaultwarden (secretos), protegido por **una sola** línea iptables. Debería bindear a `127.0.0.1`. | 🟡 MEDIUM | 🟢 Bajo |
| 4 | **Concentración de privilegio:** `sudo` sin contraseña + `johnember` en grupo `docker` (= root-equivalente). Comprometer tu llave SSH = root inmediato. | 🟡 MEDIUM | 🟡 Medio |
| 5 | **Internet-facing solo con app-auth:** `context.brasaluz.com` (context-docs) **sin auth ni access_log**; `llm.brasaluz.com` (LiteLLM, gateway con master-key) y `lumbre` (ember-mcp) expuestos apoyados solo en su auth propia. | 🟡 MEDIUM | 🟢 Bajo (Caddy) |
| 6 | Muchos contenedores como **root** (litellm explícito, qdrant 0:0, +decenas con User vacío); sesiones tmux abiertas desde junio. | ⚪ LOW | 🟢 Bajo |