Skip to main content

Multi-tenancy e isolamento

Come Synapse isola i dati tra utenti e menti — confini di sicurezza spiegati.


Multi-tenancy e isolamento

Synapse è multi-tenant: utenti multipli, ciascuno con menti multiple, completamente isolati tra loro. Questa pagina spiega il modello di isolamento.

Gerarchia dei tenant

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)

Livelli di isolamento

Livello 1: isolamento utente

Ogni account utente è isolato. Alice non può:

  • Vedere le menti di Bob
  • Accedere alle memorie di Bob (nemmeno con il suo JWT)
  • Elencare le informazioni dell'account di Bob

Imposto da: colonna user_id su tutte le tabelle, il JWT contiene user_id, tutte le query filtrano per user_id.

Livello 2: isolamento mente

All'interno di un utente, ogni mente è isolata. La Mente A non può:

  • Vedere le memorie della Mente B
  • Accedere alle attività, chat, script della Mente B

Imposto da: colonna mind_id su tutte le tabelle dati, la Mind Key contiene mind_id, tutte le query filtrano per mind_id.

L'isolamento tramite Mind Key è il confine di sicurezza primario. Una Mind Key leakata concede pieno accesso ai dati di quella mente — ma SOLO a quella mente.

Token di autenticazione

Token Ambito Cosa può accedere
Mind Key Singola mente Solo i dati di quella mente
JWT Account utente Gestione account (crea/elenca/elimina menti)
Computer Token Singolo computer I comandi di quel computer

Accesso tra menti

All'interno dello stesso utente

L'utente può accedere a tutte le sue menti tramite JWT (es. GET /minds le elenca tutte). Ma per leggere/scrivere dati di memoria, ha bisogno della Mind Key specifica.

Tra utenti

Gli utenti non possono accedere ai dati l'uno dell'altro — A MENO CHE non condividano esplicitamente una mente tramite la Sharing API:

# 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"}'

Dopo la condivisione, Bob può accedere alla Mente A tramite il suo JWT (sola lettura se role=read).

Confini di sicurezza

┌─────────────────────────────────────────────────┐
│              Synapse Instance                    │
│  ┌─────────────────────────────────────────┐    │
│  │         User Account Boundary           │    │
│  │  ┌──────────────┐  ┌──────────────┐    │    │
│  │  │  Mind Bound. │  │  Mind Bound. │    │    │
│  │  │  (Mind Key)  │  │  (Mind Key)  │    │    │
│  │  │              │  │              │    │    │
│  │  │  Memories    │  │  Memories    │    │    │
│  │  │  Tasks       │  │  Tasks       │    │    │
│  │  │  Chat        │  │  Chat        │    │    │
│  │  │  Scripts     │  │  Scripts     │    │    │
│  │  └──────────────┘  └──────────────┘    │    │
│  └─────────────────────────────────────────┘    │
└─────────────────────────────────────────────────┘

Modelli multi-tenant comuni

Modello 1: utente singolo, mente singola

Più comune per utenti singoli di agenti LLM.

  • 1 account utente
  • 1 mente
  • 1 Mind Key
  • Tutte le memorie in un unico scope

Modello 2: utente singolo, menti multiple

Per utenti con contesti multipli (lavoro, personale, progetti).

  • 1 account utente
  • N menti (es. "work", "personal", "project-x")
  • N Mind Key
  • Ogni sessione LLM usa una Mind Key

Modello 3: mente condivisa di team

Per team che collaborano a un progetto.

  • 1 utente crea la mente (ottiene la Mind Key)
  • Il creatore condivide con i membri del team tramite JWT
  • Tutti i membri del team accedono tramite JWT (o Mind Key condivisa)
Condividere una Mind Key dà pieno accesso in lettura/scrittura. Per collaborazione di team, preferisca la Sharing API (basata su JWT) rispetto alla condivisione diretta di Mind Key.

Modello 4: provider SaaS

Per app che integrano Synapse come loro layer di memoria.

  • Ogni cliente = 1 account utente
  • Ogni progetto cliente = 1 mente
  • L'app salva le Mind Key per cliente/progetto
  • Pieno isolamento tra clienti

Verifica dell'isolamento

Test: una Mind Key non può accedere ad altre menti

# 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: il JWT non può leggere i dati di memoria direttamente

# 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

Best practice

Prossimi passi