merge: issue/0010-access-control — completar control de acceso
Cierra las tareas pendientes del issue 0010: - unauthorized_response: explicit en listener.go - allowed_users ejemplo en configs de agentes - documentación de control de acceso en docs/creating-agents.md - issue movido a completed/
This commit is contained in:
@@ -162,6 +162,8 @@ matrix:
|
|||||||
dm_respond: true
|
dm_respond: true
|
||||||
ignore_bots: true
|
ignore_bots: true
|
||||||
ignore_users: []
|
ignore_users: []
|
||||||
|
allowed_users: [] # vacío = sin restricción (todos pueden hablar)
|
||||||
|
unauthorized_response: silent # silent | explicit
|
||||||
min_power_level: 0
|
min_power_level: 0
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|||||||
@@ -162,6 +162,11 @@ matrix:
|
|||||||
dm_respond: true # responde en DMs (modo principal por ahora)
|
dm_respond: true # responde en DMs (modo principal por ahora)
|
||||||
ignore_bots: true
|
ignore_bots: true
|
||||||
ignore_users: []
|
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
|
min_power_level: 0 # cualquiera puede hablar con el assistant
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ afectados y notas de implementacion.
|
|||||||
| 7 | Logs mejorados | [0007-logs-mejorados.md](completed/0007-logs-mejorados.md) | completado |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 11 | Markdown rendering | [0011-markdown-rendering.md](completed/0011-markdown-rendering.md) | completado |
|
||||||
| 12 | Threads | [0012-threads.md](0012-threads.md) | pendiente |
|
| 12 | Threads | [0012-threads.md](0012-threads.md) | pendiente |
|
||||||
| 13 | Hot reload | [0013-hot-reload.md](0013-hot-reload.md) | pendiente |
|
| 13 | Hot reload | [0013-hot-reload.md](0013-hot-reload.md) | pendiente |
|
||||||
|
|||||||
@@ -345,6 +345,59 @@ openssl rand -hex 32 # → guardar como PICKLE_KEY_<AGENT> en .env
|
|||||||
tail -f run/<id>.log
|
tail -f run/<id>.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:<name>` | Un comando específico (ej: `command:tool`) |
|
||||||
|
| `tool:*` | Todas las tools vía LLM |
|
||||||
|
| `tool:<name>` | 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
|
## Troubleshooting
|
||||||
|
|
||||||
| Problema | Causa | Solución |
|
| Problema | Causa | Solución |
|
||||||
|
|||||||
@@ -236,6 +236,10 @@ func (l *Listener) shouldHandle(evt *event.Event) bool {
|
|||||||
}
|
}
|
||||||
if !allowed {
|
if !allowed {
|
||||||
l.logger.Debug("ignoring unauthorized user", "sender", evt.Sender)
|
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
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user