Skip to main content

マルチテナント & 分離

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

ベストプラクティス

次のステップ