diff --git a/agents/asistente-2/config.yaml b/agents/asistente-2/config.yaml index 8666b05..ff2a4dd 100644 --- a/agents/asistente-2/config.yaml +++ b/agents/asistente-2/config.yaml @@ -162,6 +162,8 @@ matrix: dm_respond: true ignore_bots: true ignore_users: [] + allowed_users: [] # vacío = sin restricción (todos pueden hablar) + unauthorized_response: silent # silent | explicit min_power_level: 0 # ============================================ diff --git a/agents/assistant-bot/config.yaml b/agents/assistant-bot/config.yaml index ce0b4d7..e555f12 100644 --- a/agents/assistant-bot/config.yaml +++ b/agents/assistant-bot/config.yaml @@ -162,6 +162,11 @@ matrix: dm_respond: true # responde en DMs (modo principal por ahora) ignore_bots: true ignore_users: [] + allowed_users: [] # vacío = sin restricción (todos pueden hablar) + # allowed_users: # ejemplo con restricción: + # - "@admin:matrix-af2f3d.organic-machine.com" + # - "@enmanuel:matrix-af2f3d.organic-machine.com" + unauthorized_response: silent # silent | explicit min_power_level: 0 # cualquiera puede hablar con el assistant # ============================================ diff --git a/dev/issues/README.md b/dev/issues/README.md index dd69688..0594bcb 100644 --- a/dev/issues/README.md +++ b/dev/issues/README.md @@ -14,7 +14,7 @@ afectados y notas de implementacion. | 7 | Logs mejorados | [0007-logs-mejorados.md](completed/0007-logs-mejorados.md) | completado | | 8 | Knowledge por agente | [0008-knowledge_por_agente.md](completed/0008-knowledge_por_agente.md) | completado | | 9 | Command system | [0009-command_system.md](completed/0009-command_system.md) | completado | -| 10 | Access control | [0010-access-control.md](0010-access-control.md) | pendiente | +| 10 | Access control | [0010-access-control.md](completed/0010-access-control.md) | completado | | 11 | Markdown rendering | [0011-markdown-rendering.md](completed/0011-markdown-rendering.md) | completado | | 12 | Threads | [0012-threads.md](0012-threads.md) | pendiente | | 13 | Hot reload | [0013-hot-reload.md](0013-hot-reload.md) | pendiente | diff --git a/dev/issues/0010-access-control.md b/dev/issues/completed/0010-access-control.md similarity index 100% rename from dev/issues/0010-access-control.md rename to dev/issues/completed/0010-access-control.md diff --git a/docs/creating-agents.md b/docs/creating-agents.md index 63f2d47..37ba8a1 100644 --- a/docs/creating-agents.md +++ b/docs/creating-agents.md @@ -345,6 +345,59 @@ openssl rand -hex 32 # → guardar como PICKLE_KEY_ en .env tail -f run/.log ``` +## Control de acceso + +El sistema de control de acceso permite restringir quién puede interactuar con cada agente. Tiene tres niveles independientes: + +### Nivel 1 — Allowlist de usuarios + +Restringe qué usuarios pueden enviar mensajes al bot. Si la lista está vacía, todos pueden hablar (comportamiento por defecto). + +```yaml +matrix: + filters: + allowed_users: + - "@admin:matrix-af2f3d.organic-machine.com" + - "@enmanuel:matrix-af2f3d.organic-machine.com" + unauthorized_response: silent # silent (default) | explicit +``` + +- `silent`: ignora mensajes de usuarios no autorizados (como si el bot no existiera) +- `explicit`: responde con "No tienes permisos para interactuar con este agente" + +### Nivel 2 — Invite gating + +Si `allowed_users` está configurado, el bot solo acepta invites a salas de usuarios en la lista. Invites de usuarios no autorizados se ignoran silenciosamente. + +### Nivel 3 — RBAC por acción + +Conecta los roles de `security.roles` para controlar qué acciones puede ejecutar cada usuario: + +```yaml +security: + roles: + admin: + users: ["@admin:matrix-af2f3d.organic-machine.com"] + actions: ["*"] # acceso total + user: + users: ["*"] # todos los demás + actions: ["ask", "help", "command:help", "command:ping"] +``` + +**Acciones disponibles:** + +| Acción | Qué protege | +|--------|-------------| +| `*` | Todo (wildcard) | +| `ask` | Hablar con el LLM (mensajes de texto libre) | +| `command:*` | Todos los comandos `!xxx` | +| `command:` | Un comando específico (ej: `command:tool`) | +| `tool:*` | Todas las tools vía LLM | +| `tool:` | Una tool específica (ej: `tool:ssh_command`) | +| `help` | Comandos informativos (`!help`, `!info`, `!status`) | + +**Retrocompatibilidad:** si no se configura `allowed_users` ni `security.roles`, el agente funciona en modo abierto (como siempre). + ## Troubleshooting | Problema | Causa | Solución | diff --git a/shell/matrix/listener.go b/shell/matrix/listener.go index 9a8e666..5b585cf 100644 --- a/shell/matrix/listener.go +++ b/shell/matrix/listener.go @@ -236,6 +236,10 @@ func (l *Listener) shouldHandle(evt *event.Event) bool { } if !allowed { l.logger.Debug("ignoring unauthorized user", "sender", evt.Sender) + if f.UnauthorizedResponse == "explicit" { + ctx := context.Background() + _ = l.client.SendText(ctx, evt.RoomID.String(), "No tienes permisos para interactuar con este agente.") + } return false } }