介绍 nono:用于 AI 代理的安全沙箱
Source: Dev.to
请提供您希望翻译的完整文本(除代码块、URL 和源链接之外),我将把它翻译成简体中文并保持原有的格式、Markdown 语法和技术术语不变。谢谢!
介绍
Claude Code、OpenCode 等 AI 编码代理功能强大——它们可以编写代码、重构整个代码库,并自动化繁琐的任务。然而,它们在你的权限下运行,这意味着它们可以读取 SSH 密钥、访问 AWS 凭证,甚至可能将数据外泄。当前的解决方案往往依赖代理自行监管,但错误和漏洞屡见不鲜。
nono 是一种基于能力的安全外壳,利用内核级原语对 AI 代理和其他不受信任的进程进行沙箱隔离。它在 Linux 上使用 Landlock,在 macOS 上使用 Seatbelt,创建一个环境:一旦施加限制,就没有任何 API 能够逃脱这些限制——即使是 nono 本身也不例外。
名字已经说明了一切:“不”允许未经授权的文件系统访问,“不”允许机密数据外泄,“不”允许破坏性命令。
为什么选择 nono 而不是容器?
| 关注点 | 容器 | nono |
|---|---|---|
| 开销 | 需要镜像、层以及运行时 | 无需镜像或运行时;直接施加限制 |
| 复杂性 | 管理卷、网络和权限 | 简单的 CLI 标志 |
| 对单个命令来说过度 | 是 | 否,设计上轻量 |
nono 在不增加容器、虚拟机或额外基础设施负担的情况下提供安全性。
安装
macOS(Homebrew)
brew tap lukehinds/nono
brew install nono
从源码构建(Linux/macOS)
git clone https://github.com/lukehinds/nono.git
cd nono
cargo build --release
基本用法
# Give Claude Code read/write access only to the current directory
nono run --allow . -- claude
# Separate read and write permissions
nono run --allow ./project-dir --write ./output claude
# Block network access entirely
nono run --allow . --net-block -- my-agent
# Preview what would happen (dry run)
nono run --allow . --dry-run -- my-command
一旦 nono 应用沙箱,内核会拒绝未授权的操作。这是一种结构性强制,而不是可以被绕过的策略过滤器。
Protection Layers
| 层 | 保护措施 | 是否可被覆盖? |
|---|---|---|
| 命令黑名单 | 阻止危险的二进制文件(rm、dd、chmod、sudo) | 是,使用 --allow-command |
| 内核(删除) | 阻止 unlink/rmdir 系统调用 | 否 |
| 内核(截断) | 防止将文件清零 | 否 |
| 文件系统沙箱 | 限制路径访问 | 仅通过显式 --allow |
| 网络沙箱 | 阻止网络访问 | 仅通过移除 --net-block |
默认会阻止敏感路径,如 SSH 密钥、AWS 凭证和 shell 配置文件。子进程会继承所有限制,防止通过子进程技巧提升特权。
Visual Overview
Terminal
$ nono run --allow ./project -- claude
│
├─ nono (applies sandbox, then exec)
│ └─ Claude Code (sandboxed)
│ ✓ Can read/write ./project
│ ✗ Cannot access ~/.ssh, ~/.aws
│ ✗ Cannot delete files
平台支持
| 平台 | 机制 | 内核要求 | 状态 |
|---|---|---|---|
| Linux | Landlock LSM | 5.13+ | ✅ 文件系统 |
| Linux | Landlock LSM | 6.7+ | ✅ 文件系统 + 网络 |
| macOS | Seatbelt | 10.5+ | ✅ 文件系统 + 网络 |
| Windows | — | — | 🚧 尚未支持 |
调试:nono why
$ nono why ~/.ssh/id_rsa
Path: /Users/you/.ssh/id_rsa
Status: BLOCKED
Reason: Sensitive path – SSH private keys are protected by default
该命令解释了路径被阻止的原因,使沙箱行为易于理解和调试。
示例工作流
-
安全运行 AI 编码代理
nono run --allow ./my-project -- claude -
在受限写入权限下构建代码
nono run --read ./src --write ./target -- cargo build -
在无网络访问的情况下运行测试
nono run --allow . --net-block -- npm test -
在不担心删除的情况下处理文件
nono run --read ./input --write ./output -- python process.py
许可证与资源
- 许可证: Apache 2.0
- 源代码:
- 文档:
结论
随着 AI 代理变得更加强大和自主,“信任代理会行为得当”的安全模型变得越来越站不住脚。nono 提供了一种不同的方法:在内核层面使不良行为不可能。试一试,安全地进行实验,并分享你的反馈。
由 Luke Hinds 创建 – 如果觉得有用,请给仓库加星!