{"title":"Multi-Tenancy y aislamiento","slug":"multi-tenancy","category":"concepts","summary":"Cómo Synapse aísla los datos entre usuarios y minds — explicación de los límites de seguridad.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":622,"read_minutes":3,"lang":"es","translated":true,"requested_lang":"es","content_markdown":"\n# Multi-Tenancy y aislamiento\n\nSynapse es multi-tenant: múltiples usuarios, cada uno con múltiples minds,\ncompletamente aislados entre sí. Esta página explica el modelo de aislamiento.\n\n## Jerarquía de tenants\n\n```\nSynapse Instance\n  │\n  ├── User Account 1 (email: alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (only accessible via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolated from Mind A)\n  │\n  ├── User Account 2 (email: bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolated from Alice's minds)\n  │\n  └── ... (more users)\n```\n\n## Niveles de aislamiento\n\n### Nivel 1: Aislamiento de usuario\n\nCada cuenta de usuario está aislada. Alice no puede:\n\n- Ver los minds de Bob\n- Acceder a las memorias de Bob (incluso con su JWT)\n- Listar la información de la cuenta de Bob\n\nAplicado por: columna `user_id` en todas las tablas, el JWT contiene `user_id`,\ntodas las consultas filtran por `user_id`.\n\n### Nivel 2: Aislamiento de mind\n\nDentro de un usuario, cada mind está aislado. Mind A no puede:\n\n- Ver las memorias de Mind B\n- Acceder a tareas, chat, scripts de Mind B\n\nAplicado por: columna `mind_id` en todas las tablas de datos, el Mind Key\ncontiene `mind_id`, todas las consultas filtran por `mind_id`.\n\n> [!CRITICAL]\n> El aislamiento por Mind Key es el límite de seguridad principal. Un Mind Key\n> filtrado otorga acceso completo a los datos de ese mind — pero SOLO a ese\n> mind.\n\n## Tokens de autenticación\n\n| Token | Ámbito | A qué puede acceder |\n|-------|-------|-------------------|\n| Mind Key | Un solo mind | Solo los datos de ese mind |\n| JWT | Cuenta de usuario | Gestión de cuenta (crear/listar/eliminar minds) |\n| Computer Token | Una sola computadora | Los comandos de esa computadora |\n\n## Acceso entre minds\n\n### Dentro del mismo usuario\n\nEl usuario puede acceder a todos sus minds vía JWT (p. ej. `GET /minds` los\nlista todos). Pero para leer/escribir datos de memoria, necesita el Mind Key\nespecífico.\n\n### Entre usuarios\n\nLos usuarios no pueden acceder a los datos de los demás — A MENOS que\ncompartan explícitamente un mind vía la API de Sharing:\n\n```bash\n# Alice shares Mind A with Bob\ncurl -X POST https://synapse.schaefer.zone/sharing \\\n  -H \"Authorization: Bearer ALICE_JWT\" \\\n  -d '{\"mind_id\": \"m_aaa\", \"email\": \"bob@example.com\", \"role\": \"read\"}'\n```\n\nTras compartirlo, Bob puede acceder a Mind A vía su JWT (solo lectura si\n`role=read`).\n\n## Límites de seguridad\n\n```\n┌─────────────────────────────────────────────────┐\n│              Synapse Instance                    │\n│  ┌─────────────────────────────────────────┐    │\n│  │         User Account Boundary           │    │\n│  │  ┌──────────────┐  ┌──────────────┐    │    │\n│  │  │  Mind Bound. │  │  Mind Bound. │    │    │\n│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │\n│  │  │              │  │              │    │    │\n│  │  │  Memories    │  │  Memories    │    │    │\n│  │  │  Tasks       │  │  Tasks       │    │    │\n│  │  │  Chat        │  │  Chat        │    │    │\n│  │  │  Scripts     │  │  Scripts     │    │    │\n│  │  └──────────────┘  └──────────────┘    │    │\n│  └─────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────┘\n```\n\n## Patrones comunes de multi-tenancy\n\n### Patrón 1: Un usuario, un mind\n\nEl más común para usuarios individuales de agentes LLM.\n\n- 1 cuenta de usuario\n- 1 mind\n- 1 Mind Key\n- Todas las memorias en un ámbito\n\n### Patrón 2: Un usuario, múltiples minds\n\nPara usuarios con múltiples contextos (trabajo, personal, proyectos).\n\n- 1 cuenta de usuario\n- N minds (p. ej. \"trabajo\", \"personal\", \"proyecto-x\")\n- N Mind Keys\n- Cada sesión LLM usa un Mind Key\n\n### Patrón 3: Mind compartido en equipo\n\nPara equipos que colaboran en un proyecto.\n\n- 1 usuario crea el mind (obtiene el Mind Key)\n- El creador lo comparte con los miembros del equipo vía JWT\n- Todos los miembros acceden vía JWT (o Mind Key compartido)\n\n> [!WARNING]\n> Compartir un Mind Key otorga acceso completo de lectura/escritura. Para\n> colaboración en equipo, prefiera la API de Sharing (basada en JWT) sobre\n> compartir Mind Keys directamente.\n\n### Patrón 4: Proveedor SaaS\n\nPara aplicaciones que integran Synapse como su capa de memoria.\n\n- Cada cliente = 1 cuenta de usuario\n- Cada proyecto de cliente = 1 mind\n- La app almacena los Mind Keys por cliente/proyecto\n- Aislamiento completo entre clientes\n\n## Verificación de aislamiento\n\n### Test: Un Mind Key no puede acceder a otros minds\n\n```bash\n# Mind A's key cannot read Mind B's memories\ncurl -H \"Authorization: Bearer mk_aaa...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Returns only Mind A's memories\n\ncurl -H \"Authorization: Bearer mk_bbb...\" \\\n     \"https://synapse.schaefer.zone/memory/search?q=test\"\n# Returns only Mind B's memories (different results)\n```\n\n### Test: Un JWT no puede leer datos de memoria directamente\n\n```bash\n# JWT can list minds\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/minds\n# Returns: list of minds\n\n# JWT CANNOT read memories (need Mind Key)\ncurl -H \"Authorization: Bearer YOUR_JWT\" \\\n     https://synapse.schaefer.zone/memory/recall\n# Returns: 401 Unauthorized\n```\n\n## Mejores prácticas\n\n> [!TIP]\n> - **Use un mind por proyecto/contexto** — el aislamiento es su aliado\n> - **Nunca comparta Mind Keys** — use la API de Sharing en su lugar\n> - **Rote los Mind Keys** si se comprometen (elimine el mind, cree uno nuevo)\n> - **Audite los minds compartidos** — revise `GET /sharing` periódicamente\n> - **Use JWT para la interfaz humana** — nunca exponga Mind Keys a usuarios finales\n\n## Próximos pasos\n\n- [Autenticación](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Arquitectura](/docs/concepts/architecture)\n","content_html":"<h1>Multi-Tenancy y aislamiento</h1>\n<p>Synapse es multi-tenant: múltiples usuarios, cada uno con múltiples minds,\ncompletamente aislados entre sí. Esta página explica el modelo de aislamiento.</p>\n<h2>Jerarquía de tenants</h2>\n<pre><code class=\"hljs language-plaintext\">Synapse Instance\n  │\n  ├── User Account 1 (email: alice@example.com)\n  │   ├── Mind A (Mind Key mk_aaa...)\n  │   │   ├── Memories (only accessible via mk_aaa...)\n  │   │   ├── Tasks\n  │   │   └── Chat\n  │   └── Mind B (Mind Key mk_bbb...)\n  │       └── ... (isolated from Mind A)\n  │\n  ├── User Account 2 (email: bob@example.com)\n  │   └── Mind C (Mind Key mk_ccc...)\n  │       └── ... (isolated from Alice&#x27;s minds)\n  │\n  └── ... (more users)</code></pre><h2>Niveles de aislamiento</h2>\n<h3>Nivel 1: Aislamiento de usuario</h3>\n<p>Cada cuenta de usuario está aislada. Alice no puede:</p>\n<ul>\n<li>Ver los minds de Bob</li>\n<li>Acceder a las memorias de Bob (incluso con su JWT)</li>\n<li>Listar la información de la cuenta de Bob</li>\n</ul>\n<p>Aplicado por: columna <code>user_id</code> en todas las tablas, el JWT contiene <code>user_id</code>,\ntodas las consultas filtran por <code>user_id</code>.</p>\n<h3>Nivel 2: Aislamiento de mind</h3>\n<p>Dentro de un usuario, cada mind está aislado. Mind A no puede:</p>\n<ul>\n<li>Ver las memorias de Mind B</li>\n<li>Acceder a tareas, chat, scripts de Mind B</li>\n</ul>\n<p>Aplicado por: columna <code>mind_id</code> en todas las tablas de datos, el Mind Key\ncontiene <code>mind_id</code>, todas las consultas filtran por <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">El aislamiento por Mind Key es el límite de seguridad principal. Un Mind Key\nfiltrado otorga acceso completo a los datos de ese mind — pero SOLO a ese\nmind.</div><h2>Tokens de autenticación</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Ámbito</th>\n<th>A qué puede acceder</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Un solo mind</td>\n<td>Solo los datos de ese mind</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Cuenta de usuario</td>\n<td>Gestión de cuenta (crear/listar/eliminar minds)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Una sola computadora</td>\n<td>Los comandos de esa computadora</td>\n</tr>\n</tbody></table>\n<h2>Acceso entre minds</h2>\n<h3>Dentro del mismo usuario</h3>\n<p>El usuario puede acceder a todos sus minds vía JWT (p. ej. <code>GET /minds</code> los\nlista todos). Pero para leer/escribir datos de memoria, necesita el Mind Key\nespecífico.</p>\n<h3>Entre usuarios</h3>\n<p>Los usuarios no pueden acceder a los datos de los demás — A MENOS que\ncompartan explícitamente un mind vía la API de Sharing:</p>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Alice shares Mind A with Bob</span>\ncurl -X POST https://synapse.schaefer.zone/sharing \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer ALICE_JWT&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;mind_id&quot;: &quot;m_aaa&quot;, &quot;email&quot;: &quot;bob@example.com&quot;, &quot;role&quot;: &quot;read&quot;}&#x27;</span></code></pre><p>Tras compartirlo, Bob puede acceder a Mind A vía su JWT (solo lectura si\n<code>role=read</code>).</p>\n<h2>Límites de seguridad</h2>\n<pre><code class=\"hljs language-plaintext\">┌─────────────────────────────────────────────────┐\n│              Synapse Instance                    │\n│  ┌─────────────────────────────────────────┐    │\n│  │         User Account Boundary           │    │\n│  │  ┌──────────────┐  ┌──────────────┐    │    │\n│  │  │  Mind Bound. │  │  Mind Bound. │    │    │\n│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │\n│  │  │              │  │              │    │    │\n│  │  │  Memories    │  │  Memories    │    │    │\n│  │  │  Tasks       │  │  Tasks       │    │    │\n│  │  │  Chat        │  │  Chat        │    │    │\n│  │  │  Scripts     │  │  Scripts     │    │    │\n│  │  └──────────────┘  └──────────────┘    │    │\n│  └─────────────────────────────────────────┘    │\n└─────────────────────────────────────────────────┘</code></pre><h2>Patrones comunes de multi-tenancy</h2>\n<h3>Patrón 1: Un usuario, un mind</h3>\n<p>El más común para usuarios individuales de agentes LLM.</p>\n<ul>\n<li>1 cuenta de usuario</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Todas las memorias en un ámbito</li>\n</ul>\n<h3>Patrón 2: Un usuario, múltiples minds</h3>\n<p>Para usuarios con múltiples contextos (trabajo, personal, proyectos).</p>\n<ul>\n<li>1 cuenta de usuario</li>\n<li>N minds (p. ej. &quot;trabajo&quot;, &quot;personal&quot;, &quot;proyecto-x&quot;)</li>\n<li>N Mind Keys</li>\n<li>Cada sesión LLM usa un Mind Key</li>\n</ul>\n<h3>Patrón 3: Mind compartido en equipo</h3>\n<p>Para equipos que colaboran en un proyecto.</p>\n<ul>\n<li>1 usuario crea el mind (obtiene el Mind Key)</li>\n<li>El creador lo comparte con los miembros del equipo vía JWT</li>\n<li>Todos los miembros acceden vía JWT (o Mind Key compartido)</li>\n</ul>\n<div class=\"callout callout-warn\">Compartir un Mind Key otorga acceso completo de lectura/escritura. Para\ncolaboración en equipo, prefiera la API de Sharing (basada en JWT) sobre\ncompartir Mind Keys directamente.</div><h3>Patrón 4: Proveedor SaaS</h3>\n<p>Para aplicaciones que integran Synapse como su capa de memoria.</p>\n<ul>\n<li>Cada cliente = 1 cuenta de usuario</li>\n<li>Cada proyecto de cliente = 1 mind</li>\n<li>La app almacena los Mind Keys por cliente/proyecto</li>\n<li>Aislamiento completo entre clientes</li>\n</ul>\n<h2>Verificación de aislamiento</h2>\n<h3>Test: Un Mind Key no puede acceder a otros minds</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># Mind A&#x27;s key cannot read Mind B&#x27;s memories</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_aaa...&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=test&quot;</span>\n<span class=\"hljs-comment\"># Returns only Mind A&#x27;s memories</span>\n\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer mk_bbb...&quot;</span> \\\n     <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone/memory/search?q=test&quot;</span>\n<span class=\"hljs-comment\"># Returns only Mind B&#x27;s memories (different results)</span></code></pre><h3>Test: Un JWT no puede leer datos de memoria directamente</h3>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># JWT can list minds</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/minds\n<span class=\"hljs-comment\"># Returns: list of minds</span>\n\n<span class=\"hljs-comment\"># JWT CANNOT read memories (need Mind Key)</span>\ncurl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_JWT&quot;</span> \\\n     https://synapse.schaefer.zone/memory/recall\n<span class=\"hljs-comment\"># Returns: 401 Unauthorized</span></code></pre><h2>Mejores prácticas</h2>\n<div class=\"callout callout-ok\"></div><h2>Próximos pasos</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Autenticación</a></li>\n<li><a href=\"/docs/getting-started/mind-key-vs-jwt\">Mind Key vs JWT</a></li>\n<li><a href=\"/docs/concepts/architecture\">Arquitectura</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/multi-tenancy","text":"/docs/concepts/multi-tenancy?format=text","json":"/docs/concepts/multi-tenancy?format=json","llm":"/docs/concepts/multi-tenancy?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}