マルチテナント & 分離
Synapse がユーザー間や mind 間でデータを分離する仕組み — セキュリティ境界の解説。
マルチテナント & 分離
Synapse はマルチテナントです — 複数のユーザーが各々複数の mind を持ち、完全に分離されています。本ページでは分離モデルを説明します。
テナント階層
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)分離レベル
レベル 1:ユーザー分離
各ユーザーアカウントは分離されています。Alice は以下を行えません。
- Bob の mind を見る
- Bob のメモリにアクセス(彼女の JWT でも不可)
- Bob のアカウント情報を一覧表示
実装:全テーブルに user_id カラム、JWT は user_id を含む、全クエリが user_id でフィルタ。
レベル 2:Mind 分離
ユーザー内で各 mind は分離されています。Mind A は以下を行えません。
- Mind B のメモリを見る
- Mind B のタスク、チャット、スクリプトにアクセス
実装:全データテーブルに mind_id カラム、Mind Key は mind_id を含む、全クエリが mind_id でフィルタ。
Mind Key の分離が主要なセキュリティ境界です。流出した Mind Key はその mind のデータへの完全なアクセスを許可します — ただし、その mind のみ。
認証トークン
| トークン | スコープ | アクセス可能なもの |
|---|---|---|
| Mind Key | 単一 mind | その mind のデータのみ |
| JWT | ユーザーアカウント | アカウント管理(mind の作成/一覧/削除) |
| Computer Token | 単一コンピュータ | そのコンピュータのコマンド |
Mind 間アクセス
同一ユーザー内
ユーザーは JWT 経由で自身の全 mind にアクセスできます(例:GET /minds が全件リスト)。ただしメモリデータの読み書きには特定の Mind Key が必要です。
ユーザー間
ユーザーは互いのデータにアクセスできません — Sharing API で明示的に mind を共有した場合を除きます。
# 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"}'共有後、Bob は自身の JWT で Mind A にアクセスできます(role=read の場合は読み取り専用)。
セキュリティ境界
┌─────────────────────────────────────────────────┐
│ Synapse Instance │
│ ┌─────────────────────────────────────────┐ │
│ │ User Account Boundary │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ Mind Bound. │ │ Mind Bound. │ │ │
│ │ │ (Mind Key) │ │ (Mind Key) │ │ │
│ │ │ │ │ │ │ │
│ │ │ Memories │ │ Memories │ │ │
│ │ │ Tasks │ │ Tasks │ │ │
│ │ │ Chat │ │ Chat │ │ │
│ │ │ Scripts │ │ Scripts │ │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘よくあるマルチテナントパターン
パターン 1:単一ユーザー、単一 mind
個人 LLM エージェントユーザーに最も一般的。
- 1 ユーザーアカウント
- 1 mind
- 1 Mind Key
- すべてのメモリが 1 スコープに
パターン 2:単一ユーザー、複数 mind
複数コンテキスト(仕事、個人、プロジェクト)を持つユーザー向け。
- 1 ユーザーアカウント
- N mind(例:「work」「personal」「project-x」)
- N Mind Key
- 各 LLM セッションは 1 つの Mind Key を使用
パターン 3:チーム共有 mind
プロジェクトで協業するチーム向け。
- 1 ユーザーが mind を作成(Mind Key を取得)
- 作成者が JWT でチームメンバーと共有
- 全チームメンバーが JWT(または共有 Mind Key)でアクセス
Mind Key の共有は完全な読み書きアクセスを与えます。チーム協業には、Mind Key を直接共有するより Sharing API(JWT ベース)を使用してください。
パターン 4:SaaS プロバイダー
Synapse をメモリレイヤーとして組み込むアプリ向け。
- 各顧客 = 1 ユーザーアカウント
- 各顧客プロジェクト = 1 mind
- アプリが顧客/プロジェクトごとに Mind Key を保存
- 顧客間の完全な分離
分離の検証
テスト:Mind Key は他の mind にアクセスできない
# 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)テスト:JWT はメモリデータに直接アクセスできない
# 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