# マルチテナント & 分離 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` でフィルタ。 > [!CRITICAL] > Mind Key の分離が主要なセキュリティ境界です。流出した Mind Key はその mind のデータへの完全なアクセスを許可します — ただし、その mind のみ。 ## 認証トークン | トークン | スコープ | アクセス可能なもの | |-------|-------|-------------------| | Mind Key | 単一 mind | その mind のデータのみ | | JWT | ユーザーアカウント | アカウント管理(mind の作成/一覧/削除) | | Computer Token | 単一コンピュータ | そのコンピュータのコマンド | ## Mind 間アクセス ### 同一ユーザー内 ユーザーは JWT 経由で自身の全 mind にアクセスできます(例:`GET /minds` が全件リスト)。ただしメモリデータの読み書きには特定の Mind Key が必要です。 ### ユーザー間 ユーザーは互いのデータにアクセスできません — Sharing API で明示的に mind を共有した場合を除きます。 ```bash # 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)でアクセス > [!WARNING] > Mind Key の共有は完全な読み書きアクセスを与えます。チーム協業には、Mind Key を直接共有するより Sharing API(JWT ベース)を使用してください。 ### パターン 4:SaaS プロバイダー Synapse をメモリレイヤーとして組み込むアプリ向け。 - 各顧客 = 1 ユーザーアカウント - 各顧客プロジェクト = 1 mind - アプリが顧客/プロジェクトごとに Mind Key を保存 - 顧客間の完全な分離 ## 分離の検証 ### テスト:Mind Key は他の mind にアクセスできない ```bash # 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 はメモリデータに直接アクセスできない ```bash # 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 ``` ## ベストプラクティス > [!TIP] > - **プロジェクト/コンテキストごとに 1 つの mind を使用** — 分離は味方です > - **Mind Key を共有しない** — Sharing API を使用 > - **侵害された場合は Mind Key をローテーション**(mind を削除して新規作成) > - **共有 mind を監査** — 定期的に `GET /sharing` を確認 > - **human UI には JWT を使用** — エンドユーザーに Mind Key を露出しない ## 次のステップ - [Authentication](/docs/getting-started/authentication) - [Mind Key vs JWT](/docs/getting-started/mind-key-vs-jwt) - [Architecture](/docs/concepts/architecture)