{"id":"43d32da1-dda6-424a-a800-a48dddf32d53","slug":"centinela","kind":"mcp","name":"centinela","summary":"A lightweight, defense-in-depth SecOps daemon for Linux/WSL that monitors processes and network traffic, provides plain-language threat explanations, and executes opt-in automated containment via an M","owner":"amurlaniakea","repoUrl":"https://github.com/amurlaniakea/centinela","license":"AGPL-3.0","licenseTier":"strong-copyleft","trust":"community","stars":1,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-07-11T07:39:55.000Z","addedAt":"2026-10-21T04:49:02.005Z","logoUrl":"https://avatars.githubusercontent.com/u/247767585?u=cae799644fb5cee7f38cefce731e8de75af4b081&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra"],"tags":["ciberseguridad","secops","threat-containment","wsl-security"],"runtime":"python","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-26T22:33:33.393Z","sample":false,"url":"https://conduits.dev/tools/centinela","language":"Python","transports":["stdio"],"install":{"pypi":"centinela"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# Centinela\n\n> Centinela de ciberseguridad personal, ligero, que corre en segundo plano en tu\n> PC, vigila la red y los procesos, explica en lenguaje claro lo que ocurre,\n> alerta y — solo si tú lo decides — contiene amenazas reales (bloquea IP, cierra\n> puerto, mata proceso).\n\n**Licencia:** AGPL-3.0-or-later · **Autor:** Pedro Sordo Martínez —\namurlaniakea@gmail.com\n\n---\n\n## Estado y fases\n\n| Fase | Qué hace | Estado |\n|------|----------|--------|\n| 1. Núcleo + sensores | puertos, conexiones, procesos, reglas R1-R3 | ✅ aprobada |\n| 2. Contención + lenguaje plano | block_ip / close_listener / kill_proc con confirmación | ✅ aprobada |\n| 3. Línea base | aprende lo normal, reduce falsos positivos | ✅ aprobada |\n| 4. Threat-intel | IOCs offline empaquetados; R2→high si hay match | ✅ aprobada |\n| 5. Agente puente | notificación/confirmación vía JSONL local al agente de IA | ✅ aprobada |\n| 6. Windows | backend Windows (NETSTAT, Get-Process) | ⏸ **planificada, NO implementada** |\n| 7. Empaquetado + publicación | install.sh, systemd, docs, CI | 🔧 empaquetado aprobado; docs/CI en curso |\n\n**Fase 6 (Windows) no está implementada.** Todo lo descrito aquí es Linux/WSL.\nNo hay binario ni instrucciones para Windows todavía.\n\n---\n\n## Instalación\n\n```bash\ngit clone <repo> centinela && cd centinela\nsudo ./install.sh\n```\n\n`install.sh` (idempotente) crea un usuario de sistema dedicado `centinela`, el\ngrupo `centinela-agent`, un venv en `/opt/centinela`, y habilita\n`centinela-watch` (**solo alerta, sin contención**).\n\n### ⚠️ Antes de activar la contención automática (léelo)\n\nPor defecto Centinela **solo vigila y avisa**. La contención automática por\nagente es **opt-in** y requiere dos pasos conscientes:\n\n```bash\n# 1) Añade a tu agente de IA al grupo que puede confirmar contenciones:\nsudo usermod -aG centinela-agent <tu_usuario_agente>\n\n# 2) Activa el timer de contención por agente (cada 30s):\nsudo systemctl enable --now centinela-agent-poll.timer\n```\n\n**Asunción de confianza:** cualquier proceso/local-user en el grupo\n`centinela-agent` puede disparar contención contra el hallazgo que confirmó. El\ngrupo es un **límite de confianza, no criptográfico** — si un atacante ya es\nmiembro del grupo, tiene capacidad de contención. Sin `agent-poll.timer`\nhabilitado, Centinela nunca contiene nada solo. Ver\n[RESEARCH.md §3.6](RESEARCH.md#36-asunción-de-confianza-del-grupo-centinela-agent-fase-7).\n\n---\n\n## Uso\n\n```bash\ncentinela watch            # vigilancia en bucle (alertas + notificación al agente)\ncentinela scan             # snapshot puntual\ncentinela scan --threat-intel   # cruza conexiones contra IOCs offline\ncentinela explain          # explica el último hallazgo en lenguaje claro\ncentinela contain --kind posible_c2   # contiene (PID a confirmar por ti)\ncentinela notify           # escribe el último hallazgo en outbox.jsonl para el agente\ncentinela agent-poll       # aplica contención confirmada por el agente (ref_id válido)\ncentinela learn            # propone línea base\ncentinela baseline commit  # confirma la línea base (muestra lo propuesto antes)\ncentinela baseline show    # muestra la línea base actual\n```\n\n`watch` aplica siempre las IOCs offline (sin coste de red). `scan` solo con\n`--threat-intel`.\n\n---\n\n## Cómo piensa Centinela (reglas)\n\n- **R1** — proceso desconocido escuchando → sospecha.\n- **R2** — conexión `ESTABLISHED` saliente a IP externa → posible C2. `medium`\n  por defecto; `high` si la IP coincide con un IOC de threat-intel.\n- **R3** — proceso desconocido escuchando sin línea base activa (suprimida si la\n  línea base está activa, para no duplicar R1).\n\nLa contención **nunca es automática sin confirmación**: o tú (`contain`) o tu\nagente de IA (`agent-poll`, solo con `ref_id` válido contra un hallazgo real).\n\n---\n\n## Seguridad por defecto\n\n- Usuario root con **bounding acotado** (`CAP_DAC_OVERRIDE`,\n  `CAP_DAC_READ_SEARCH`, `CAP_SYS_PTRACE`; SIN `CAP_KILL`/`CAP_NET_ADMIN`/\n  `CAP_SYS_ADMIN`) + `NoNewPrivileges`. El daemon `watch` solo lee y alerta:\n  no puede contener ni tocar red. Se corre como root porque `ss -tp` no\n  resuelve el proceso de conexiones ajenas con CAP_SYS_PTRACE a uid no-root\n  (verificado 2026-08-17: store con proc=NULL).\n- `agent-poll` (oneshot, desactivado) tiene `CAP_NET_ADMIN`+`CAP_KILL` y solo se\n  habilita con el timer opt-in.\n- Estado bajo `/var/lib/centinela` (`CENTINELA_STATE_DIR`).\n- `agent/` con grupo `centinela-agent` (0o770): solo quien esté en el grupo\n  puede confirmar contenciones.\n\n---\n\n## Limitaciones conocidas (IMPORTANTE)\n\nCentinela **no** es una solución de respuesta a incidentes garantizada. Entre\nlas limitaciones confirmadas:\n\n- **Contención con `sudo` real no verificada end-to-end** (P2): probada en\n  dry-run, no contra una conexión real.\n- **`kill_proc` compara `comm` truncado a 15 chars** (M1).\n- **Heurística `direction` aproximada** (Fase 1): no detecta bien proxies/VPN/tor;\n  rangos RFC1918/RFC5737 se tratan como locales incluso en tu LAN.\n- **Grupo `centinela-agent` = límite de confianza** (3.6): quien esté en el\n  grupo puede disparar contención.\n- **IOCs offline son documentales**, no feed online real.\n\nLista completa, con impacto y qué está cubierto por tests sintéticos vs verificado\nen real: **[RESEARCH.md → Limitaciones conocidas](RESEARCH.md#3-limitaciones-conocidas-crítico--léelo)**.\n\nMapeo a OWASP ASVS / NIST 800-53 a nivel general:\n**[RESEARCH.md → Fundamento y mapeo](RESEARCH.md#2-mapeo-aproximado-contra-estándares)**.\n\n---\n\n## Licencia\n\nAGPL-3.0-or-later. Ver [LICENSE](LICENSE).\n"}