{"title":"Multi-tenancy e isolamento","slug":"multi-tenancy","category":"concepts","summary":"Como o Synapse isola dados entre usuários e minds — fronteiras de segurança explicadas.","audience":["human","llm"],"tags":["concept","multi-tenancy","security","isolation"],"difficulty":"intermediate","updated":"2026-06-27","word_count":590,"read_minutes":3,"lang":"pt","translated":true,"requested_lang":"pt","content_markdown":"\n# Multi-tenancy e isolamento\n\nO Synapse é multi-tenant: múltiplos usuários, cada um com múltiplos minds,\ntotalmente isolados entre si. Esta página explica o modelo de isolamento.\n\n## Hierarquia 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## Níveis de isolamento\n\n### Nível 1: isolamento de usuário\n\nCada conta de usuário é isolada. Alice não pode:\n\n- Ver os minds do Bob\n- Acessar as memórias do Bob (mesmo com o JWT dela)\n- Listar informações da conta do Bob\n\nAplicado por: coluna `user_id` em todas as tabelas, JWT contém `user_id`,\ntodas as consultas filtram por `user_id`.\n\n### Nível 2: isolamento de mind\n\nDentro de um usuário, cada mind é isolado. Mind A não pode:\n\n- Ver as memórias do Mind B\n- Acessar tarefas, chat, scripts do Mind B\n\nAplicado por: coluna `mind_id` em todas as tabelas de dados, Mind Key contém\n`mind_id`, todas as consultas filtram por `mind_id`.\n\n> [!CRITICAL]\n> O isolamento por Mind Key é a fronteira de segurança primária. Uma Mind Key\n> vazada concede acesso total aos dados daquele mind — mas SOMENTE àquele mind.\n\n## Tokens de autenticação\n\n| Token | Escopo | O que pode acessar |\n|-------|--------|---------------------|\n| Mind Key | Mind único | Apenas dados daquele mind |\n| JWT | Conta de usuário | Gerenciamento de conta (criar/listar/excluir minds) |\n| Computer Token | Computador único | Comandos daquele computador |\n\n## Acesso cross-mind\n\n### Dentro do mesmo usuário\n\nO usuário pode acessar todos os seus minds via JWT (ex.: `GET /minds` lista\ntodos). Mas para ler/escrever dados de memória, ele precisa da Mind Key\nespecífica.\n\n### Entre usuários\n\nUsuários não podem acessar dados um do outro — A MENOS que compartilhem\nexplicitamente um mind via API de Compartilhamento:\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\nApós compartilhar, Bob pode acessar o Mind A via seu JWT (somente leitura se\n`role=read`).\n\n## Fronteiras de segurança\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## Padrões comuns de multi-tenancy\n\n### Padrão 1: usuário único, mind único\n\nMais comum para usuários individuais de agentes LLM.\n\n- 1 conta de usuário\n- 1 mind\n- 1 Mind Key\n- Todas as memórias em um escopo\n\n### Padrão 2: usuário único, múltiplos minds\n\nPara usuários com múltiplos contextos (trabalho, pessoal, projetos).\n\n- 1 conta de usuário\n- N minds (ex.: \"work\", \"personal\", \"project-x\")\n- N Mind Keys\n- Cada sessão LLM usa uma Mind Key\n\n### Padrão 3: mind compartilhado em equipe\n\nPara equipes colaborando em um projeto.\n\n- 1 usuário cria o mind (recebe a Mind Key)\n- O criador compartilha com membros da equipe via JWT\n- Todos os membros acessam via JWT (ou Mind Key compartilhada)\n\n> [!WARNING]\n> Compartilhar uma Mind Key concede acesso total de leitura/escrita. Para\n> colaboração em equipe, prefira a API de Compartilhamento (baseada em JWT)\n> em vez de compartilhar Mind Keys diretamente.\n\n### Padrão 4: provedor SaaS\n\nPara apps que incorporam o Synapse como sua camada de memória.\n\n- Cada cliente = 1 conta de usuário\n- Cada projeto do cliente = 1 mind\n- O app armazena Mind Keys por cliente/projeto\n- Isolamento total entre clientes\n\n## Verificação de isolamento\n\n### Teste: Mind Key não pode acessar outros 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### Teste: JWT não pode ler dados de memória diretamente\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## Melhores práticas\n\n> [!TIP]\n> - **Use um mind por projeto/contexto** — isolamento é seu amigo\n> - **Nunca compartilhe Mind Keys** — use a API de Compartilhamento\n> - **Faça rotação de Mind Keys** se comprometidas (exclua o mind, crie um novo)\n> - **Audite minds compartilhados** — revise `GET /sharing` periodicamente\n> - **Use JWT para interface humana** — nunca exponha Mind Keys a usuários finais\n\n## Próximos passos\n\n- [Autenticação](/docs/getting-started/authentication)\n- [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt)\n- [Arquitetura](/docs/concepts/architecture)\n","content_html":"<h1>Multi-tenancy e isolamento</h1>\n<p>O Synapse é multi-tenant: múltiplos usuários, cada um com múltiplos minds,\ntotalmente isolados entre si. Esta página explica o modelo de isolamento.</p>\n<h2>Hierarquia 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>Níveis de isolamento</h2>\n<h3>Nível 1: isolamento de usuário</h3>\n<p>Cada conta de usuário é isolada. Alice não pode:</p>\n<ul>\n<li>Ver os minds do Bob</li>\n<li>Acessar as memórias do Bob (mesmo com o JWT dela)</li>\n<li>Listar informações da conta do Bob</li>\n</ul>\n<p>Aplicado por: coluna <code>user_id</code> em todas as tabelas, JWT contém <code>user_id</code>,\ntodas as consultas filtram por <code>user_id</code>.</p>\n<h3>Nível 2: isolamento de mind</h3>\n<p>Dentro de um usuário, cada mind é isolado. Mind A não pode:</p>\n<ul>\n<li>Ver as memórias do Mind B</li>\n<li>Acessar tarefas, chat, scripts do Mind B</li>\n</ul>\n<p>Aplicado por: coluna <code>mind_id</code> em todas as tabelas de dados, Mind Key contém\n<code>mind_id</code>, todas as consultas filtram por <code>mind_id</code>.</p>\n<div class=\"callout callout-critical\">O isolamento por Mind Key é a fronteira de segurança primária. Uma Mind Key\nvazada concede acesso total aos dados daquele mind — mas SOMENTE àquele mind.</div><h2>Tokens de autenticação</h2>\n<table>\n<thead>\n<tr>\n<th>Token</th>\n<th>Escopo</th>\n<th>O que pode acessar</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Mind Key</td>\n<td>Mind único</td>\n<td>Apenas dados daquele mind</td>\n</tr>\n<tr>\n<td>JWT</td>\n<td>Conta de usuário</td>\n<td>Gerenciamento de conta (criar/listar/excluir minds)</td>\n</tr>\n<tr>\n<td>Computer Token</td>\n<td>Computador único</td>\n<td>Comandos daquele computador</td>\n</tr>\n</tbody></table>\n<h2>Acesso cross-mind</h2>\n<h3>Dentro do mesmo usuário</h3>\n<p>O usuário pode acessar todos os seus minds via JWT (ex.: <code>GET /minds</code> lista\ntodos). Mas para ler/escrever dados de memória, ele precisa da Mind Key\nespecífica.</p>\n<h3>Entre usuários</h3>\n<p>Usuários não podem acessar dados um do outro — A MENOS que compartilhem\nexplicitamente um mind via API de Compartilhamento:</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>Após compartilhar, Bob pode acessar o Mind A via seu JWT (somente leitura se\n<code>role=read</code>).</p>\n<h2>Fronteiras de segurança</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>Padrões comuns de multi-tenancy</h2>\n<h3>Padrão 1: usuário único, mind único</h3>\n<p>Mais comum para usuários individuais de agentes LLM.</p>\n<ul>\n<li>1 conta de usuário</li>\n<li>1 mind</li>\n<li>1 Mind Key</li>\n<li>Todas as memórias em um escopo</li>\n</ul>\n<h3>Padrão 2: usuário único, múltiplos minds</h3>\n<p>Para usuários com múltiplos contextos (trabalho, pessoal, projetos).</p>\n<ul>\n<li>1 conta de usuário</li>\n<li>N minds (ex.: &quot;work&quot;, &quot;personal&quot;, &quot;project-x&quot;)</li>\n<li>N Mind Keys</li>\n<li>Cada sessão LLM usa uma Mind Key</li>\n</ul>\n<h3>Padrão 3: mind compartilhado em equipe</h3>\n<p>Para equipes colaborando em um projeto.</p>\n<ul>\n<li>1 usuário cria o mind (recebe a Mind Key)</li>\n<li>O criador compartilha com membros da equipe via JWT</li>\n<li>Todos os membros acessam via JWT (ou Mind Key compartilhada)</li>\n</ul>\n<div class=\"callout callout-warn\">Compartilhar uma Mind Key concede acesso total de leitura/escrita. Para\ncolaboração em equipe, prefira a API de Compartilhamento (baseada em JWT)\nem vez de compartilhar Mind Keys diretamente.</div><h3>Padrão 4: provedor SaaS</h3>\n<p>Para apps que incorporam o Synapse como sua camada de memória.</p>\n<ul>\n<li>Cada cliente = 1 conta de usuário</li>\n<li>Cada projeto do cliente = 1 mind</li>\n<li>O app armazena Mind Keys por cliente/projeto</li>\n<li>Isolamento total entre clientes</li>\n</ul>\n<h2>Verificação de isolamento</h2>\n<h3>Teste: Mind Key não pode acessar outros 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>Teste: JWT não pode ler dados de memória diretamente</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>Melhores práticas</h2>\n<div class=\"callout callout-ok\"></div><h2>Próximos passos</h2>\n<ul>\n<li><a href=\"/docs/getting-started/authentication\">Autenticação</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\">Arquitetura</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"]}