"Resume esta alerta de Wazuh y dime si es importante."
"Eres analista Blue Team. Alerta: <json> Acciones a ejecutar: 1. kill_sessions(src_ip) 2. change_password(user) 3. message_and_kill (honeypot) Analiza 4-6 líneas: secuencia, impacto, hardening."
# agent.py · on_critical() · router dinámico def on_critical(alert: dict): uc = use_cases.match(alert) # 1 de 10 if not uc: return prompt = uc.build_prompt(alert) # rol + tools raw = ask_claude(prompt) d = json.loads(raw) # {tool, args, reason} log("USECASE", uc.id, CYAN) log("REASON", d["reason"], CYAN) log("DECISION", d["tool"], MAGENTA) actions.run(d["tool"], d["args"], ctx) # kill_session · rotate_password · block_ip · ...
action_kill_sessions · log PIDs terminadosaction_change_password · log nueva pwdaction_message_and_kill · honeypot trazadolog(EJECUTADO, ...) · huella obligatoria# actions/kill_session.py · 1 archivo · 1 acción class KillSessionAction(Action): name = "kill_session" def execute(self, args: dict, ctx: dict) -> dict: user, c = args["user"], args.get("container") r = subprocess.run( ["docker", "exec", c, "pkill", "-KILL", "-u", user], capture_output=True, text=True, timeout=10) # Audit trail — siempre estructurado return { "action": "kill_session", "ok": r.returncode == 0, # EJECUTADO? "target": f"{user}@{c}", "ts": datetime.utcnow().isoformat(), "stderr": r.stderr if r.returncode else "", }
execute() que devuelve dict de audit. Sin huella, la acción no se considera ejecutada. 13 acciones registradas, todas con el mismo contrato.def print_claude_response(response: str): print(f"\n{MAGENTA}{'·'*64}{R}", flush=True) for line in response.splitlines(): print(f" {WHITE}{line}{R}", flush=True) print(f"{MAGENTA}{'·'*64}{R}\n", flush=True) # Pipeline · respond_brute_success() log("CLAUDE", "Consultando analista Blue Team...", MAGENTA + B) response = ask_claude(prompt) if response: print_claude_response(response) # REASON visible log("ACCION", "Rotando contrasena...", MAGENTA) action_change_password(agent_name, user) # EJECUCION
| Patrón | Anti-patrón | Regla |
|---|---|---|
| 01 · Decisión, no resumen | Prompt "resume esto" | Diseña el menú de acciones en el prompt. El LLM analiza, no improvisa. |
| 02 · Action loop con audit | Fire & forget | Toda acción reversible o trazable. El log es parte de la acción. |
| 03 · Explicabilidad | Caja negra | CLAUDE → REASON → ACCION → EJECUTADO en el mismo stream. Replayable. |
use_cases/. Agregar uno nuevo = drop un .py + reiniciar agent. Plug-in arquitectura.