{"title":"Multi-Tenancy & Isolation","slug":"multi-tenancy","category":"concepts","summary":"Wie Synapse Daten zwischen Nutzern und Minds isoliert — Sicherheitsgrenzen erklärt.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":497,"read_minutes":2,"lang":"de","translated":true,"requested_lang":"de","content_markdown":"\n# Multi-Tenancy & Isolation\n\nSynapse ist Multi-Tenant: mehrere Nutzer, jeder mit mehreren Minds, vollständig\nvoneinander isoliert. Diese Seite erklärt das Isolationsmodell.\n\n## Tenant-Hierarchie\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## Isolations-Level\n\n### Level 1: Nutzer-Isolation\n\nJedes Nutzerkonto ist isoliert. Alice kann nicht:\n\n- Bobs Minds sehen\n- Auf Bobs Memories zugreifen (auch nicht mit ihrem JWT)\n- Bobs Konto-Infos auflisten\n\nErzwungen durch: `user_id`-Spalte auf allen Tabellen, JWT enthält `user_id`,\nalle Queries filtern nach `user_id`.\n\n### Level 2: Mind-Isolation\n\nInnerhalb eines Nutzers ist jeder Mind isoliert. Mind A kann nicht:\n\n- Memories von Mind B sehen\n- Auf Tasks, Chat, Scripts von Mind B zugreifen\n\nErzwungen durch: `mind_id`-Spalte auf allen Datentabellen, Mind Key enthält\n`mind_id`, alle Queries filtern nach `mind_id`.\n\n> [!CRITICAL]\n> Die Mind-Key-Isolation ist die primäre Sicherheitsgrenze. Ein geleakter Mind\n> Key gewährt vollen Zugriff auf die Daten dieses Minds — aber NUR auf dieses.\n\n## Authentifizierungs-Tokens\n\n| Token | Scope | Worauf Zugriff |\n|-------|-------|----------------|\n| Mind Key | Einzelner Mind | Nur Daten dieses Minds |\n| JWT | Nutzerkonto | Kontoverwaltung (Minds anlegen/auflisten/löschen) |\n| Computer Token | Einzelner Rechner | Commands dieses Rechners |\n\n## Mind-übergreifender Zugriff\n\n### Innerhalb desselben Nutzers\n\nNutzer können über JWT auf alle ihre Minds zugreifen (z. B. listet `GET /minds`\nalle auf). Um Memory-Daten zu lesen/schreiben, benötigen sie aber den\nspezifischen Mind Key.\n\n### Nutzerübergreifend\n\nNutzer können nicht aufeinander Daten zugreifen — AUSSER sie teilen explizit\neinen Mind via Sharing-API:\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\nNach dem Teilen kann Bob via JWT auf Mind A zugreifen (read-only bei\n`role=read`).\n\n## Sicherheitsgrenzen\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## Häufige Multi-Tenancy-Patterns\n\n### Pattern 1: Ein Nutzer, ein Mind\n\nAm häufigsten für einzelne LLM-Agent-Nutzer.\n\n- 1 Nutzerkonto\n- 1 Mind\n- 1 Mind Key\n- Alle Memories in einem Scope\n\n### Pattern 2: Ein Nutzer, mehrere Minds\n\nFür Nutzer mit mehreren Kontexten (Arbeit, persönlich, Projekte).\n\n- 1 Nutzerkonto\n- N Minds (z. B. „work\", „personal\", „project-x\")\n- N Mind Keys\n- Jede LLM-Session verwendet einen Mind Key\n\n### Pattern 3: Team-Shared-Mind\n\nFür Teams, die an einem Projekt zusammenarbeiten.\n\n- 1 Nutzer legt den Mind an (erhält Mind Key)\n- Ersteller teilt mit Teammitgliedern via JWT\n- Alle Teammitglieder greifen via JWT (oder geteiltem Mind Key) zu\n\n> [!WARNING]\n> Das Teilen eines Mind Keys gewährt vollen Lese-/Schreibzugriff. Für\n> Team-Kollaboration bevorzuge die Sharing-API (JWT-basiert) gegenüber dem\n> direkten Teilen von Mind Keys.\n\n### Pattern 4: SaaS-Provider\n\nFür Apps, die Synapse als Memory-Layer einbetten.\n\n- Jeder Kunde = 1 Nutzerkonto\n- Jedes Kundenprojekt = 1 Mind\n- App speichert Mind Keys pro Kunde/Projekt\n- Volle Isolation zwischen Kunden\n\n## Isolations-Verifikation\n\n### Test: Mind Key kann nicht auf andere Minds zugreifen\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: JWT kann Memory-Daten nicht direkt lesen\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## Best Practices\n\n> [!TIP]\n> - **Ein Mind pro Projekt/Kontext** — Isolation ist dein Freund\n> - **Mind Keys niemals teilen** — verwende stattdessen die Sharing-API\n> - **Mind Keys rotieren**, falls kompromittiert (Mind löschen, neu anlegen)\n> - **Geteilte Minds auditieren** — `GET /sharing` regelmäßig prüfen\n> - **JWT für Human-UI verwenden** — Mind Keys nie an Endnutzer geben\n\n## Nächste Schritte\n\n- [Authentifizierung](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Architektur](/docs/concepts/architecture)\n","content_html":"<h1>Multi-Tenancy &amp; Isolation</h1>\n<p>Synapse ist Multi-Tenant: mehrere Nutzer, jeder mit mehreren Minds, vollständig\nvoneinander isoliert. Diese Seite erklärt das Isolationsmodell.</p>\n<h2>Tenant-Hierarchie</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>Isolations-Level</h2>\n<h3>Level 1: Nutzer-Isolation</h3>\n<p>Jedes Nutzerkonto ist isoliert. Alice kann nicht:</p>\n<ul>\n<li>Bobs Minds sehen</li>\n<li>Auf Bobs Memories zugreifen (auch nicht mit ihrem JWT)</li>\n<li>Bobs Konto-Infos auflisten</li>\n</ul>\n<p>Erzwungen durch: <code>user_id</code>-Spalte auf allen Tabellen, JWT enthält <code>user_id</code>,\nalle Queries filtern nach <code>user_id</code>.</p>\n<h3>Level 2: Mind-Isolation</h3>\n<p>Innerhalb eines Nutzers ist jeder Mind isoliert. Mind A kann nicht:</p>\n<ul>\n<li>Memories von Mind B sehen</li>\n<li>Auf Tasks, Chat, Scripts von Mind B zugreifen</li>\n</ul>\n<p>Erzwungen durch: <code>mind_id</code>-Spalte auf allen Datentabellen, Mind Key enthält\n<code>mind_id</code>, alle Queries filtern nach <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">Die Mind-Key-Isolation ist die primäre Sicherheitsgrenze. Ein geleakter Mind\nKey gewährt vollen Zugriff auf die Daten dieses Minds — aber NUR auf dieses.</div><h2>Authentifizierungs-Tokens</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Scope</th>\n<th>Worauf Zugriff</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Einzelner Mind</td>\n<td>Nur Daten dieses Minds</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Nutzerkonto</td>\n<td>Kontoverwaltung (Minds anlegen/auflisten/löschen)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Einzelner Rechner</td>\n<td>Commands dieses Rechners</td>\n</tr>\n</tbody></table>\n<h2>Mind-übergreifender Zugriff</h2>\n<h3>Innerhalb desselben Nutzers</h3>\n<p>Nutzer können über JWT auf alle ihre Minds zugreifen (z. B. listet <code>GET /minds</code>\nalle auf). Um Memory-Daten zu lesen/schreiben, benötigen sie aber den\nspezifischen Mind Key.</p>\n<h3>Nutzerübergreifend</h3>\n<p>Nutzer können nicht aufeinander Daten zugreifen — AUSSER sie teilen explizit\neinen Mind via Sharing-API:</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>Nach dem Teilen kann Bob via JWT auf Mind A zugreifen (read-only bei\n<code>role=read</code>).</p>\n<h2>Sicherheitsgrenzen</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>Häufige Multi-Tenancy-Patterns</h2>\n<h3>Pattern 1: Ein Nutzer, ein Mind</h3>\n<p>Am häufigsten für einzelne LLM-Agent-Nutzer.</p>\n<ul>\n<li>1 Nutzerkonto</li>\n<li>1 Mind</li>\n<li>1 Mind Key</li>\n<li>Alle Memories in einem Scope</li>\n</ul>\n<h3>Pattern 2: Ein Nutzer, mehrere Minds</h3>\n<p>Für Nutzer mit mehreren Kontexten (Arbeit, persönlich, Projekte).</p>\n<ul>\n<li>1 Nutzerkonto</li>\n<li>N Minds (z. B. „work&quot;, „personal&quot;, „project-x&quot;)</li>\n<li>N Mind Keys</li>\n<li>Jede LLM-Session verwendet einen Mind Key</li>\n</ul>\n<h3>Pattern 3: Team-Shared-Mind</h3>\n<p>Für Teams, die an einem Projekt zusammenarbeiten.</p>\n<ul>\n<li>1 Nutzer legt den Mind an (erhält Mind Key)</li>\n<li>Ersteller teilt mit Teammitgliedern via JWT</li>\n<li>Alle Teammitglieder greifen via JWT (oder geteiltem Mind Key) zu</li>\n</ul>\n<div class=\"callout callout-warn\">Das Teilen eines Mind Keys gewährt vollen Lese-/Schreibzugriff. Für\nTeam-Kollaboration bevorzuge die Sharing-API (JWT-basiert) gegenüber dem\ndirekten Teilen von Mind Keys.</div><h3>Pattern 4: SaaS-Provider</h3>\n<p>Für Apps, die Synapse als Memory-Layer einbetten.</p>\n<ul>\n<li>Jeder Kunde = 1 Nutzerkonto</li>\n<li>Jedes Kundenprojekt = 1 Mind</li>\n<li>App speichert Mind Keys pro Kunde/Projekt</li>\n<li>Volle Isolation zwischen Kunden</li>\n</ul>\n<h2>Isolations-Verifikation</h2>\n<h3>Test: Mind Key kann nicht auf andere Minds zugreifen</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: JWT kann Memory-Daten nicht direkt lesen</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>Best Practices</h2>\n<div class=\"callout callout-ok\"></div><h2>Nächste Schritte</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Authentifizierung</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\">Architektur</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"]}