UNPKG

overmind-mcp

Version:

Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mΓ©moire (Private Memory Context) et le support pour

352 lines (288 loc) β€’ 14.9 kB
# πŸ›‘οΈ PLAN SΓ‰CURITΓ‰ OVERMIND β€” GuΓ©rison ComplΓ¨te > **Date** : 28 Mai 2026 > **Auteur** : Sniper Analyste Financier (via audit Discord) > **Relecteur** : sley_73350 (validation en cours) > **Version** : 1.0 β€” Brouillon pour validation --- ## πŸ” Γ‰TAT DES LIEUX β€” Diagnostic Critique ### Surface d'attaque actuelle ``` ╔═══════════════════════════════════════════════════════════════════════════╗ β•‘ TRANSPORT β”‚ PROTOCOLE β”‚ POINT D'ENTRΓ‰E β”‚ AUTH? β”‚ PORT β•‘ ╠═══════════════════════════════════════════════════════════════════════════╣ β•‘ STDIO β”‚ JSON-RPC 2.0 β”‚ stdin β†’ stdout β”‚ ❌ β”‚ N/A β•‘ β•‘ HTTP Stream β”‚ JSON-RPC 2.0 β”‚ POST /mcp β”‚ ❌ β”‚ 3099 β•‘ β•‘ HTTP Stream β”‚ SSE β”‚ POST /mcp (stream) β”‚ ❌ β”‚ 3099 β•‘ β•‘ HTTP Stream β”‚ REST β”‚ GET /health β”‚ ❌ β”‚ 3099 β•‘ β•‘ HTTPS (SSL) β”‚ JSON-RPC 2.0 β”‚ POST /mcp β”‚ ❌ β”‚ 3099 β•‘ β•‘ HTTPS (SSL) β”‚ SSE β”‚ POST /mcp (stream) β”‚ ❌ β”‚ 3099 β•‘ β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• πŸ” CONSTAT : TOUS les endpoints sont OUVERTS β€” 0 authentification cΓ΄tΓ© serveur ``` ### 14 Outils MCP exposΓ©s sans protection ``` # β”‚ TOOL β”‚ RISQUE ───┼─────────────────────────┼────────── 01 β”‚ run_agent β”‚ πŸ”΄ CRITIQUE 02 β”‚ run_agents_parallel β”‚ πŸ”΄ CRITIQUE 03 β”‚ create_agent β”‚ 🟠 Γ‰LEVΓ‰ 04 β”‚ delete_agent β”‚ 🟠 Γ‰LEVΓ‰ 05 β”‚ update_agent_config β”‚ πŸ”΄ CRITIQUE 06 β”‚ list_agents β”‚ 🟑 MOYEN 07 β”‚ get_agent_configs β”‚ πŸ”΄ CRITIQUE (fuites clΓ©s API) 08 β”‚ create_prompt β”‚ 🟑 MOYEN 09 β”‚ edit_prompt β”‚ 🟑 MOYEN 10 β”‚ memory_search β”‚ 🟑 MOYEN 11 β”‚ memory_store β”‚ 🟑 MOYEN 12 β”‚ memory_runs β”‚ 🟒 FAIBLE 13 β”‚ config_example β”‚ 🟒 FAIBLE 14 β”‚ agent_control β”‚ πŸ”΄ CRITIQUE (kill process) ``` ### Modules bibliothΓ¨que β€” Couverture Bearer ``` MODULE β”‚ TYPE β”‚ ENVOIE BEARER β”‚ REΓ‡OIT/VERIFY β”‚ STATUS ────────────────────────┼─────────┼───────────────┼───────────────┼─────── overmind-client.ts β”‚ Client β”‚ βœ… OUI β”‚ N/A β”‚ βœ… OK cli.ts (serveur) β”‚ Serveur β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP server.ts (FastMCP) β”‚ Serveur β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP run_agent.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP run_agents_parallel.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP create_agent.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP manage_agents.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP memory_store.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP memory_search.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP agent_control.ts β”‚ Tool β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP config.ts β”‚ Config β”‚ N/A β”‚ ❌ NON β”‚ 🟑 processRegistry.ts β”‚ Runtime β”‚ N/A β”‚ ❌ NON β”‚ πŸ”΄ GAP ``` --- ## πŸ—οΈ ARCHITECTURE CIBLE β€” AprΓ¨s GuΓ©rison ``` πŸ” MIDDLEWARE AUTH ACTIF πŸ” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” Bearer β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Client β”‚ ──────────▢ β”‚ FastMCP │───▢│ 14 Tools β”‚ β”‚ (TS/JS) β”‚ Header βœ“ β”‚ v4.0.1 β”‚ β”‚ MCP β”‚ β”‚ β”‚ β”‚ βœ… CHECK βœ“ β”‚ β”‚ (protΓ©gΓ©s)β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Transports sΓ©curisΓ©s β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ stdio (pipe local) β”‚ β”‚ httpStream (port 3099) β”‚ β”‚ endpoint: /mcp β”‚ β”‚ βœ… Bearer: REQUIRED β”‚ β”‚ stateless: true β”‚ β”‚ SSL: ACTIF β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ“‹ PLAN D'IMPLΓ‰MENTATION β€” 5 Phases ### PHASE 1 β€” Middleware Serveur Bearer (PRIORITΓ‰ MAX) **Objectif** : Bloquer tout accΓ¨s non authentifiΓ© sur HTTP/RPC **Fichier cible** : `src/cli.ts` + `src/server.ts` **TΓ’ches** : - [ ] CrΓ©er `src/lib/bearerMiddleware.ts` - Fonction `verifyBearer(request): boolean` - Lecture `OVERMIND_AUTH` depuis `.env` - Comparaison via `crypto.timingSafeEqual()` (anti timing attack) - Retourner 401 + message JSON si token absent/invalide - [ ] Injecter le middleware dans FastMCP httpStream - Hook AVANT `server.start()` - Exempter UNIQUEMENT `GET /health` (monitoring) - Bloquer tout le reste si token absent - [ ] Logger chaque accΓ¨s (audit trail) - IP source, timestamp, tool appelΓ©, rΓ©sultat auth **Code de rΓ©fΓ©rence** : ```typescript // src/lib/bearerMiddleware.ts import crypto from 'crypto'; export function verifyBearer(authHeader: string | undefined): boolean { const expected = process.env.OVERMIND_AUTH; if (!expected) { console.warn('[AUTH] ⚠️ OVERMIND_AUTH non dΓ©fini β€” accΓ¨s refusΓ© par dΓ©faut'); return false; } if (!authHeader?.startsWith('Bearer ')) return false; const token = authHeader.slice(7); const expectedBuf = Buffer.from(expected); const tokenBuf = Buffer.from(token); if (tokenBuf.length !== expectedBuf.length) return false; return crypto.timingSafeEqual(tokenBuf, expectedBuf); } ``` **Validation** : - [ ] Tester sans token β†’ 401 - [ ] Tester avec mauvais token β†’ 401 - [ ] Tester avec bon token β†’ 200 - [ ] GET /health sans token β†’ 200 (exemptΓ©) --- ### PHASE 2 β€” IntΓ©gration dans tous les modules de la bibliothΓ¨que **Objectif** : Chaque module serveur vΓ©rifie le Bearer **Fichiers cibles** : - `src/cli.ts` (serveur principal) - `src/server.ts` (FastMCP) - Chaque tool MCP (run_agent, memory_store, etc.) **TΓ’ches** : - [ ] Importer `verifyBearer` dans chaque point d'entrΓ©e serveur - [ ] Ajouter un wrapper `withAuth(toolHandler)` qui : 1. Extrait le header Authorization du contexte MCP 2. VΓ©rifie via `verifyBearer()` 3. Si Γ©chec β†’ retourne erreur MCP avec code d'auth 4. Si succΓ¨s β†’ exΓ©cute le tool normalement - [ ] Valider que les 14 tools sont couverts **Code de rΓ©fΓ©rence** : ```typescript // src/lib/withAuth.ts import { verifyBearer } from './bearerMiddleware'; export function withAuth(handler: Function) { return async (args: any, context: any) => { const authHeader = context?.request?.headers?.authorization; if (!verifyBearer(authHeader)) { throw new Error('[AUTH] ❌ AccΓ¨s refusΓ© β€” Bearer token invalide'); } return handler(args, context); }; } ``` --- ### PHASE 3 β€” Propagation aux configs agents (.mcp.json) **Objectif** : Chaque agent injecte le Bearer dans ses appels **TΓ’ches** : - [ ] VΓ©rifier que `overmind-client.ts` envoie bien le Bearer βœ… (dΓ©jΓ  fait) - [ ] Mettre Γ  jour les templates `.mcp.json` des agents - Ajouter `Authorization: Bearer ${OVERMIND_AUTH}` dans les headers - [ ] Scripts externes β†’ utiliser `OVERMIND_AUTH` depuis `.env` - [ ] Documenter la variable dans le README Overmind **Exemple .mcp.json** : ```json { "mcpServers": { "overmind": { "url": "http://localhost:3099/mcp", "headers": { "Authorization": "Bearer ${OVERMIND_AUTH}" } } } } ``` --- ### PHASE 4 β€” SSL/TLS + Durcissement RΓ©seau **Objectif** : Chiffrer les communications + rΓ©duire la surface **TΓ’ches** : - [ ] Activer SSL sur le port 3099 (HTTPS) - GΓ©nΓ©rer certificat auto-signΓ© ou Let's Encrypt - Configurer dans FastMCP httpStream - [ ] Restreindre le bind Γ  `localhost` uniquement (sauf besoin externe) - [ ] Ajouter rate-limiting sur les endpoints - Max 100 req/min par IP - Ban temporaire aprΓ¨s 5 Γ©checs d'auth consΓ©cutifs - [ ] CORS restrictif (si besoin) - [ ] Firewall : bloquer le port 3099 Γ  l'extΓ©rieur sauf reverse proxy --- ### PHASE 5 β€” Audit Trail & Monitoring **Objectif** : TraΓ§abilitΓ© complΓ¨te des accΓ¨s **TΓ’ches** : - [ ] Logger chaque requΓͺte MCP : - Timestamp ISO 8601 - IP source - Tool appelΓ© - RΓ©sultat auth (success/fail) - Agent demandeur - [ ] Stocker les logs dans PostgreSQL (table `audit_log`) ```sql CREATE TABLE audit_log ( id SERIAL PRIMARY KEY, timestamp TIMESTAMPTZ DEFAULT NOW(), ip VARCHAR(45), tool VARCHAR(100), agent VARCHAR(100), auth_result BOOLEAN, details JSONB ); ``` - [ ] Alertes Discord automatiques : - 3 Γ©checs d'auth consΓ©cutifs β†’ alerte embed - Tool critique appelΓ© β†’ notification - [ ] Dashboard simple (endpoint `/audit/stats`) --- ## πŸ§ͺ PLAN DE TEST β€” Validation par Phase ### Tests Phase 1 (Middleware) ``` TEST β”‚ DESCRIPTION β”‚ RΓ‰SULTAT ATTENDU ─────┼────────────────────────────────┼────────────────── T1.1 β”‚ curl POST /mcp sans header β”‚ 401 Unauthorized T1.2 β”‚ curl POST /mcp mauvais token β”‚ 401 Unauthorized T1.3 β”‚ curl POST /mcp bon token β”‚ 200 OK T1.4 β”‚ curl GET /health sans token β”‚ 200 OK (exemptΓ©) T1.5 β”‚ curl GET /health mauvais token β”‚ 200 OK (exemptΓ©) T1.6 β”‚ Token vide β”‚ 401 Unauthorized T1.7 β”‚ OVERMIND_AUTH non dΓ©fini β”‚ 500 / 403 ``` ### Tests Phase 2 (Couverture modules) ``` TEST β”‚ DESCRIPTION β”‚ RΓ‰SULTAT ATTENDU ─────┼───────────────────────────────────────┼────────────────── T2.1 β”‚ Appeler run_agent sans Bearer β”‚ Erreur MCP auth T2.2 β”‚ Appeler run_agent avec Bearer β”‚ ExΓ©cution normale T2.3 β”‚ Appeler memory_search sans Bearer β”‚ Erreur MCP auth T2.4 β”‚ Appeler agent_control sans Bearer β”‚ Erreur MCP auth T2.5 β”‚ VΓ©rifier les 14 tools couverts β”‚ 14/14 βœ… ``` ### Tests Phase 3 (Propagation) ``` TEST β”‚ DESCRIPTION β”‚ RΓ‰SULTAT ATTENDU ─────┼──────────────────────────────────────────┼────────────────── T3.1 β”‚ Agent Claude appelle overmind sans Bearer β”‚ Connexion refusΓ©e T3.2 β”‚ Agent Kilo appelle overmind avec Bearer β”‚ Connexion OK T3.3 β”‚ Script externe sans OVERMIND_AUTH β”‚ Γ‰chec auth T3.4 β”‚ Script externe avec OVERMIND_AUTH β”‚ SuccΓ¨s ``` ### Tests Phase 4 (SSL + Durcissement) ``` TEST β”‚ DESCRIPTION β”‚ RΓ‰SULTAT ATTENDU ─────┼──────────────────────────────────────────┼────────────────── T4.1 β”‚ AccΓ¨s HTTP (non SSL) β”‚ Connexion refusΓ©e T4.2 β”‚ AccΓ¨s HTTPS avec cert valide β”‚ 200 OK T4.3 β”‚ Rate limit : 100+ req/min β”‚ 429 Too Many T4.4 β”‚ 5 Γ©checs auth consΓ©cutifs β”‚ Ban temporaire T4.5 β”‚ Bind localhost uniquement β”‚ Pas d'accΓ¨s externe ``` ### Tests Phase 5 (Audit) ``` TEST β”‚ DESCRIPTION β”‚ RΓ‰SULTAT ATTENDU ─────┼──────────────────────────────────────────┼────────────────── T5.1 β”‚ Appel tool β†’ vΓ©rifier log PostgreSQL β”‚ EntrΓ©e prΓ©sente T5.2 β”‚ Γ‰chec auth β†’ vΓ©rifier log β”‚ EntrΓ©e avec auth_result=false T5.3 β”‚ 3 Γ©checs consΓ©cutifs β†’ alerte Discord β”‚ Embed envoyΓ© T5.4 β”‚ GET /audit/stats β”‚ JSON statistiques ``` --- ## πŸ“Š PRIORISATION & EFFORT ``` PHASE β”‚ PRIORITΓ‰ β”‚ EFFORT β”‚ IMPACT β”‚ DΓ‰PENDANCE ──────┼─────────────┼───────────┼────────────┼──────────── 1 β”‚ πŸ”΄ CRITIQUE β”‚ 🟑 Moyen β”‚ 🟒 MAX β”‚ Aucune 2 β”‚ 🟠 Γ‰LEVΓ‰ β”‚ 🟑 Moyen β”‚ 🟒 Γ‰LEVΓ‰ β”‚ Phase 1 3 β”‚ 🟑 MOYEN β”‚ 🟒 Faible β”‚ 🟑 MOYEN β”‚ Phase 1 4 β”‚ 🟑 MOYEN β”‚ πŸ”΄ Γ‰LEVΓ‰ β”‚ 🟒 Γ‰LEVΓ‰ β”‚ Phase 1 5 β”‚ 🟒 FAIBLE β”‚ 🟑 Moyen β”‚ 🟑 MOYEN β”‚ Phase 1+2 ``` **Recommandation** : Phase 1 immΓ©diate β†’ Phase 2 le mΓͺme jour β†’ Phase 3 le lendemain β†’ Phase 4-5 dans la semaine --- ## πŸ”‘ LIVRABLES 1. `src/lib/bearerMiddleware.ts` β€” Middleware de vΓ©rification Bearer 2. `src/lib/withAuth.ts` β€” Wrapper pour les handlers MCP 3. `.env` β€” Ajout de `OVERMIND_AUTH=<token_sΓ©curisΓ©>` 4. `audit_log` table PostgreSQL β€” TraΓ§abilitΓ© 5. Documentation mise Γ  jour β€” README + SECURITY.md --- ## ⚠️ POINTS D'ATTENTION (Sley Γ  vΓ©rifier) - Le Bearer middleware doit-il Γͺtre dans `cli.ts` OU dans un hook FastMCP ? - FastMCP v4.0.1 supporte-t-il un middleware natif ou faut-il un workaround Express ? - STDIO doit-il aussi Γͺtre protΓ©gΓ© ou est-il trusted par design (local pipe) ? - Le token doit-il Γͺtre rotatif ou statique ? - Faut-il un systΓ¨me de scopes (admin vs lecture seule) ? --- *πŸ“ Document en attente de validation par sley_73350*