Multi-Tenancy y aislamiento
Cómo Synapse aísla los datos entre usuarios y minds — explicación de los límites de seguridad.
Multi-Tenancy y aislamiento
Synapse es multi-tenant: múltiples usuarios, cada uno con múltiples minds, completamente aislados entre sí. Esta página explica el modelo de aislamiento.
Jerarquía de tenants
Synapse Instance
│
├── User Account 1 (email: alice@example.com)
│ ├── Mind A (Mind Key mk_aaa...)
│ │ ├── Memories (only accessible via mk_aaa...)
│ │ ├── Tasks
│ │ └── Chat
│ └── Mind B (Mind Key mk_bbb...)
│ └── ... (isolated from Mind A)
│
├── User Account 2 (email: bob@example.com)
│ └── Mind C (Mind Key mk_ccc...)
│ └── ... (isolated from Alice's minds)
│
└── ... (more users)Niveles de aislamiento
Nivel 1: Aislamiento de usuario
Cada cuenta de usuario está aislada. Alice no puede:
- Ver los minds de Bob
- Acceder a las memorias de Bob (incluso con su JWT)
- Listar la información de la cuenta de Bob
Aplicado por: columna user_id en todas las tablas, el JWT contiene user_id,
todas las consultas filtran por user_id.
Nivel 2: Aislamiento de mind
Dentro de un usuario, cada mind está aislado. Mind A no puede:
- Ver las memorias de Mind B
- Acceder a tareas, chat, scripts de Mind B
Aplicado por: columna mind_id en todas las tablas de datos, el Mind Key
contiene mind_id, todas las consultas filtran por mind_id.
Tokens de autenticación
| Token | Ámbito | A qué puede acceder |
|---|---|---|
| Mind Key | Un solo mind | Solo los datos de ese mind |
| JWT | Cuenta de usuario | Gestión de cuenta (crear/listar/eliminar minds) |
| Computer Token | Una sola computadora | Los comandos de esa computadora |
Acceso entre minds
Dentro del mismo usuario
El usuario puede acceder a todos sus minds vía JWT (p. ej. GET /minds los
lista todos). Pero para leer/escribir datos de memoria, necesita el Mind Key
específico.
Entre usuarios
Los usuarios no pueden acceder a los datos de los demás — A MENOS que compartan explícitamente un mind vía la API de Sharing:
# Alice shares Mind A with Bob
curl -X POST https://synapse.schaefer.zone/sharing \
-H "Authorization: Bearer ALICE_JWT" \
-d '{"mind_id": "m_aaa", "email": "bob@example.com", "role": "read"}'Tras compartirlo, Bob puede acceder a Mind A vía su JWT (solo lectura si
role=read).
Límites de seguridad
┌─────────────────────────────────────────────────┐
│ Synapse Instance │
│ ┌─────────────────────────────────────────┐ │
│ │ User Account Boundary │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Mind Bound. │ │ Mind Bound. │ │ │
│ │ │ (Mind Key) │ │ (Mind Key) │ │ │
│ │ │ │ │ │ │ │
│ │ │ Memories │ │ Memories │ │ │
│ │ │ Tasks │ │ Tasks │ │ │
│ │ │ Chat │ │ Chat │ │ │
│ │ │ Scripts │ │ Scripts │ │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘Patrones comunes de multi-tenancy
Patrón 1: Un usuario, un mind
El más común para usuarios individuales de agentes LLM.
- 1 cuenta de usuario
- 1 mind
- 1 Mind Key
- Todas las memorias en un ámbito
Patrón 2: Un usuario, múltiples minds
Para usuarios con múltiples contextos (trabajo, personal, proyectos).
- 1 cuenta de usuario
- N minds (p. ej. "trabajo", "personal", "proyecto-x")
- N Mind Keys
- Cada sesión LLM usa un Mind Key
Patrón 3: Mind compartido en equipo
Para equipos que colaboran en un proyecto.
- 1 usuario crea el mind (obtiene el Mind Key)
- El creador lo comparte con los miembros del equipo vía JWT
- Todos los miembros acceden vía JWT (o Mind Key compartido)
Patrón 4: Proveedor SaaS
Para aplicaciones que integran Synapse como su capa de memoria.
- Cada cliente = 1 cuenta de usuario
- Cada proyecto de cliente = 1 mind
- La app almacena los Mind Keys por cliente/proyecto
- Aislamiento completo entre clientes
Verificación de aislamiento
Test: Un Mind Key no puede acceder a otros minds
# Mind A's key cannot read Mind B's memories
curl -H "Authorization: Bearer mk_aaa..." \
"https://synapse.schaefer.zone/memory/search?q=test"
# Returns only Mind A's memories
curl -H "Authorization: Bearer mk_bbb..." \
"https://synapse.schaefer.zone/memory/search?q=test"
# Returns only Mind B's memories (different results)Test: Un JWT no puede leer datos de memoria directamente
# JWT can list minds
curl -H "Authorization: Bearer YOUR_JWT" \
https://synapse.schaefer.zone/minds
# Returns: list of minds
# JWT CANNOT read memories (need Mind Key)
curl -H "Authorization: Bearer YOUR_JWT" \
https://synapse.schaefer.zone/memory/recall
# Returns: 401 Unauthorized