{"title":"Multi-tenancy e isolamento","slug":"multi-tenancy","category":"concepts","summary":"Come Synapse isola i dati tra utenti e menti — confini di sicurezza spiegati.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":602,"read_minutes":3,"lang":"it","translated":true,"requested_lang":"it","content_markdown":"\n# Multi-tenancy e isolamento\n\nSynapse è multi-tenant: utenti multipli, ciascuno con menti multiple, completamente\nisolati tra loro. Questa pagina spiega il modello di isolamento.\n\n## Gerarchia dei tenant\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## Livelli di isolamento\n\n### Livello 1: isolamento utente\n\nOgni account utente è isolato. Alice non può:\n\n- Vedere le menti di Bob\n- Accedere alle memorie di Bob (nemmeno con il suo JWT)\n- Elencare le informazioni dell'account di Bob\n\nImposto da: colonna `user_id` su tutte le tabelle, il JWT contiene `user_id`,\ntutte le query filtrano per `user_id`.\n\n### Livello 2: isolamento mente\n\nAll'interno di un utente, ogni mente è isolata. La Mente A non può:\n\n- Vedere le memorie della Mente B\n- Accedere alle attività, chat, script della Mente B\n\nImposto da: colonna `mind_id` su tutte le tabelle dati, la Mind Key contiene\n`mind_id`, tutte le query filtrano per `mind_id`.\n\n> [!CRITICAL]\n> L'isolamento tramite Mind Key è il confine di sicurezza primario. Una Mind Key\n> leakata concede pieno accesso ai dati di quella mente — ma SOLO a quella mente.\n\n## Token di autenticazione\n\n| Token | Ambito | Cosa può accedere |\n|-------|-------|-------------------|\n| Mind Key | Singola mente | Solo i dati di quella mente |\n| JWT | Account utente | Gestione account (crea/elenca/elimina menti) |\n| Computer Token | Singolo computer | I comandi di quel computer |\n\n## Accesso tra menti\n\n### All'interno dello stesso utente\n\nL'utente può accedere a tutte le sue menti tramite JWT (es. `GET /minds` le\nelenca tutte). Ma per leggere/scrivere dati di memoria, ha bisogno della Mind\nKey specifica.\n\n### Tra utenti\n\nGli utenti non possono accedere ai dati l'uno dell'altro — A MENO CHE non\ncondividano esplicitamente una mente tramite la 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\nDopo la condivisione, Bob può accedere alla Mente A tramite il suo JWT (sola\nlettura se `role=read`).\n\n## Confini di sicurezza\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## Modelli multi-tenant comuni\n\n### Modello 1: utente singolo, mente singola\n\nPiù comune per utenti singoli di agenti LLM.\n\n- 1 account utente\n- 1 mente\n- 1 Mind Key\n- Tutte le memorie in un unico scope\n\n### Modello 2: utente singolo, menti multiple\n\nPer utenti con contesti multipli (lavoro, personale, progetti).\n\n- 1 account utente\n- N menti (es. \"work\", \"personal\", \"project-x\")\n- N Mind Key\n- Ogni sessione LLM usa una Mind Key\n\n### Modello 3: mente condivisa di team\n\nPer team che collaborano a un progetto.\n\n- 1 utente crea la mente (ottiene la Mind Key)\n- Il creatore condivide con i membri del team tramite JWT\n- Tutti i membri del team accedono tramite JWT (o Mind Key condivisa)\n\n> [!WARNING]\n> Condividere una Mind Key dà pieno accesso in lettura/scrittura. Per\n> collaborazione di team, preferisca la Sharing API (basata su JWT) rispetto\n> alla condivisione diretta di Mind Key.\n\n### Modello 4: provider SaaS\n\nPer app che integrano Synapse come loro layer di memoria.\n\n- Ogni cliente = 1 account utente\n- Ogni progetto cliente = 1 mente\n- L'app salva le Mind Key per cliente/progetto\n- Pieno isolamento tra clienti\n\n## Verifica dell'isolamento\n\n### Test: una Mind Key non può accedere ad altre menti\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: il JWT non può leggere i dati di memoria direttamente\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 practice\n\n> [!TIP]\n> - **Usi una mente per progetto/contesto** — l'isolamento è suo amico\n> - **Non condivida mai le Mind Key** — usi la Sharing API invece\n> - **Roti le Mind Key** se compromesse (elimini la mente, ne crei una nuova)\n> - **Verifichi le menti condivise** — revisioni `GET /sharing` periodicamente\n> - **Usi JWT per UI umana** — non esponga mai le Mind Key agli utenti finali\n\n## Prossimi passi\n\n- [Autenticazione](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Architettura](/docs/concepts/architecture)\n","content_html":"<h1>Multi-tenancy e isolamento</h1>\n<p>Synapse è multi-tenant: utenti multipli, ciascuno con menti multiple, completamente\nisolati tra loro. Questa pagina spiega il modello di isolamento.</p>\n<h2>Gerarchia dei tenant</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>Livelli di isolamento</h2>\n<h3>Livello 1: isolamento utente</h3>\n<p>Ogni account utente è isolato. Alice non può:</p>\n<ul>\n<li>Vedere le menti di Bob</li>\n<li>Accedere alle memorie di Bob (nemmeno con il suo JWT)</li>\n<li>Elencare le informazioni dell&#39;account di Bob</li>\n</ul>\n<p>Imposto da: colonna <code>user_id</code> su tutte le tabelle, il JWT contiene <code>user_id</code>,\ntutte le query filtrano per <code>user_id</code>.</p>\n<h3>Livello 2: isolamento mente</h3>\n<p>All&#39;interno di un utente, ogni mente è isolata. La Mente A non può:</p>\n<ul>\n<li>Vedere le memorie della Mente B</li>\n<li>Accedere alle attività, chat, script della Mente B</li>\n</ul>\n<p>Imposto da: colonna <code>mind_id</code> su tutte le tabelle dati, la Mind Key contiene\n<code>mind_id</code>, tutte le query filtrano per <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">L'isolamento tramite Mind Key è il confine di sicurezza primario. Una Mind Key\nleakata concede pieno accesso ai dati di quella mente — ma SOLO a quella mente.</div><h2>Token di autenticazione</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Ambito</th>\n<th>Cosa può accedere</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Singola mente</td>\n<td>Solo i dati di quella mente</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Account utente</td>\n<td>Gestione account (crea/elenca/elimina menti)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Singolo computer</td>\n<td>I comandi di quel computer</td>\n</tr>\n</tbody></table>\n<h2>Accesso tra menti</h2>\n<h3>All&#39;interno dello stesso utente</h3>\n<p>L&#39;utente può accedere a tutte le sue menti tramite JWT (es. <code>GET /minds</code> le\nelenca tutte). Ma per leggere/scrivere dati di memoria, ha bisogno della Mind\nKey specifica.</p>\n<h3>Tra utenti</h3>\n<p>Gli utenti non possono accedere ai dati l&#39;uno dell&#39;altro — A MENO CHE non\ncondividano esplicitamente una mente tramite la 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>Dopo la condivisione, Bob può accedere alla Mente A tramite il suo JWT (sola\nlettura se <code>role=read</code>).</p>\n<h2>Confini di sicurezza</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>Modelli multi-tenant comuni</h2>\n<h3>Modello 1: utente singolo, mente singola</h3>\n<p>Più comune per utenti singoli di agenti LLM.</p>\n<ul>\n<li>1 account utente</li>\n<li>1 mente</li>\n<li>1 Mind Key</li>\n<li>Tutte le memorie in un unico scope</li>\n</ul>\n<h3>Modello 2: utente singolo, menti multiple</h3>\n<p>Per utenti con contesti multipli (lavoro, personale, progetti).</p>\n<ul>\n<li>1 account utente</li>\n<li>N menti (es. &quot;work&quot;, &quot;personal&quot;, &quot;project-x&quot;)</li>\n<li>N Mind Key</li>\n<li>Ogni sessione LLM usa una Mind Key</li>\n</ul>\n<h3>Modello 3: mente condivisa di team</h3>\n<p>Per team che collaborano a un progetto.</p>\n<ul>\n<li>1 utente crea la mente (ottiene la Mind Key)</li>\n<li>Il creatore condivide con i membri del team tramite JWT</li>\n<li>Tutti i membri del team accedono tramite JWT (o Mind Key condivisa)</li>\n</ul>\n<div class=\"callout callout-warn\">Condividere una Mind Key dà pieno accesso in lettura/scrittura. Per\ncollaborazione di team, preferisca la Sharing API (basata su JWT) rispetto\nalla condivisione diretta di Mind Key.</div><h3>Modello 4: provider SaaS</h3>\n<p>Per app che integrano Synapse come loro layer di memoria.</p>\n<ul>\n<li>Ogni cliente = 1 account utente</li>\n<li>Ogni progetto cliente = 1 mente</li>\n<li>L&#39;app salva le Mind Key per cliente/progetto</li>\n<li>Pieno isolamento tra clienti</li>\n</ul>\n<h2>Verifica dell&#39;isolamento</h2>\n<h3>Test: una Mind Key non può accedere ad altre menti</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: il JWT non può leggere i dati di memoria direttamente</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 practice</h2>\n<div class=\"callout callout-ok\"></div><h2>Prossimi passi</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Autenticazione</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\">Architettura</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"]}