bounded-systems/claude-box

GitHub: bounded-systems/claude-box

一个基于对象能力模型、用 Nix 和 Podman 构建的 Claude Code 隔离运行时,提供多账号支持与细粒度的网络及文件权限管控。

Stars: 0 | Forks: 0

# claude-box 一个**固定的、隔离的、多账号的 Claude runtime** — Claude Code 运行于一个 内容寻址的 OCI container 中,每个账号对应一个 volume,由 nix 可复现地构建。每个账号的认证/历史记录/项目都存放在各自的 podman volume 中; container 本身不带任何凭证(参见 [CAPABILITIES.md](./CAPABILITIES.md))。 ## 快速开始 **前置条件:**[nix](https://nixos.org/download)(包含 flakes),[podman](https://podman.io/docs/installation) + `podman machine` (macOS) **macOS — 一条命令:** `nix run .#setup` 会完成整个启动流程(前置检查 → `podman machine` → 构建+加载镜像 → 在 TCP 上启动 doors)。然后,在 另一个终端中: ``` nix run .#setup # one-time bringup, leaves doors running DOORS_TCP=1 claude-box --room dev --repo . # launch a box (TCP mode — see note below) ``` 在 macOS 上,doors 运行在 **TCP 模式** (`DOORS_TCP=1`):virtiofs 无法 跨 macOS ↔ podman-machine 边界共享 Unix sockets,因此 daemons 监听在 TCP 端口上,容器通过 `host.containers.internal` 访问它们。 **手动 / Linux:** ``` # 1. 构建并加载 Claude 镜像 nix build .#claude-image && podman load -i result # 2. 初始化 door 服务(一次性设置;Linux/quadlet) claude-box doors init # 3. 以完整权限启动 claude-box --room dev --repo . # 或者快速启动而不使用 door(不安全,但可立即运行): claude-box --net-open --repo . ``` **在家里自托管?** 原生 Linux 主机是最简单的方式(无需 podman-machine 虚拟机,没有 door 墙)。请参阅 **[HOSTING.md](./HOSTING.md)** 获取硬件 建议(ARM64 *和* x86_64 都是首选支持架构)以及无头启动指南。 ## 使用 ``` claude-box # 'personal' account (no network — see --net) claude-box work # 'work' account — separate auth/history claude-box work --resume # flags pass through to claude claude-box work --net # policed egress via the netd door (allowlist) claude-box ls # list accounts (+ descriptions) claude-box name work "Acme, Inc. — billing@acme" # friendly label ``` 账号首次运行 → 执行一次 `/login`;它会持久化保存在该账号的 volume (`claude--config`)中。名称格式不限;标签存放在 `~/.config/claude-box/accounts.json` 中。 容器限制了 box 可以*写入*的内容,而不是它可以*访问*的内容 — 因此 **出口访问是一种授权**:box 默认运行 `--network=none`,并且只能 通过 **netd** door (`--net`) 访问网络,该 door 会强制执行一个允许列表 (`--net-open` 是一个显式的、不安全的完全出口逃生通道)。请参阅 [CAPABILITIES.md](./CAPABILITIES.md) — 以及 [OCAP.md](./OCAP.md) 了解这种 应用了对象能力设计的方法在既定经典中的位置。 ## 设计 — 为任何访客准备的房间 能力引擎(door → room → rulebook)与访客无关,位于 [`guest-room/`](./guest-room/) 中 — 这是一个内部依赖项,`claude-box` 通过 提供自己的 door 目录和 room 包来使用它。该模型是一个**酒店**: 由相邻的门连接起来的独立房间,每扇门通向一个代理服务, 绝不触及钥匙或整栋建筑。文章 [*The Guest Room*](./drafts/the-guest-room.md) 完整讲述了这个故事; 拓扑结构(host / VM / room)详见 [ROOM.md](./ROOM.md)。 ## 安装 (home-manager) ``` inputs.claude-box.url = "github:bounded-systems/claude-box"; # … home.packages = [ inputs.claude-box.packages.${system}.claude-box ]; ``` `claude-box` 是一个使用 TypeScript 类型标明的 Bun CLI,由 nix 构建(一个固定版本的 bun 启动器 — `bun --compile` 无法在 nix 沙盒中运行)。它需要 **podman** + 正在运行的 `podman machine`,并且需要加载镜像(见下文)。 ## 镜像 `packages.{aarch64,x86_64}-linux.claude-image` — 基于固定版本 nixpkgs 构建的 `dockerTools.buildLayeredImage` (包含 `claude-code` + git, gh, ripgrep, fd, bun, openssh…), 使用非 root 用户 `claude`,以及一个 config-volume 挂载点。生成的 OCI 镜像 通过其自身的 **sha256 digest**(即固定标签)进行寻址。两种 Linux 架构 均可开箱即用地构建(每种架构都固定了其自己的 `prx` 发行版 + glibc loader);请参阅 [HOSTING.md](./HOSTING.md)。 构建需要一个 `aarch64-linux` 构建器。在 Apple Silicon 上,请使用 **vz** (Apple Virtualization.framework)构建器 — QEMU `nix run .#linux-builder` 在 M3/M4 上会崩溃(`HV_SYS_REG_SMCR_EL1`);请参阅 **[BUILD.md](./BUILD.md)** 了解 完整设置: ``` nix build .#claude-image # offloads to the Linux builder podman load -i result # → localhost/claude-personal:dev ``` 特意使用 `buildLayeredImage`(而不是 `streamLayeredImage`):流式处理脚本是一个 无法在 darwin 宿主机上运行的目标架构可执行文件;而 tarball 可以在 任何地方加载。 ## 开发 ``` # 运行测试(单元测试不需要 podman) bun test # 类型检查 bun x tsc --noEmit # `bunx` is a separate binary not all bun installs ship; `bun x` always works ``` 提交/PR 标题遵循 [Conventional Commits](https://www.conventionalcommits.org/) (发行版即从中切割而来)— 请参阅 [CONTRIBUTING.md](./CONTRIBUTING.md) 和 [RELEASING.md](./RELEASING.md)。 ### 启动 doors (daemons) `--room dev` 预设需要三个 daemons:keeperd(git 签名)、scoutd (外部读取)和 netd(出口访问允许列表)。 **一次性设置**(构建镜像,安装 systemd 单元,启动服务): ``` claude-box doors init ``` 这在 podman-machine (macOS) 或原生 systemd (Linux) 上运行。初始化之后: ``` claude-box doors status # check service status claude-box --room dev --repo . # launch with all doors ``` **手动启动 daemon**(替代 quadlet 的方案): ``` nix run .#keeperd -- serve # → ~/.claude-box/run/keeperd.sock nix run .#scoutd -- serve # → ~/.claude-box/run/scoutd.sock nix run .#netd -- serve # → ~/.claude-box/run/netd.sock ``` 每个 daemon 都会以安全的权限 (0700) 自动创建 `~/.claude-box/run/`。 使用 `--socket PATH` 或环境变量(`KEEPERD_SOCK` 等)覆盖 socket 路径。 ### 快速开始(无 daemons) 要在没有完整 door 设置的情况下进行开发,请使用不安全的逃生通道: ``` claude-box --net-open --repo . # unrestricted egress, no daemon needed ``` ## 状态 从 prx `claude-runtime` 工作中提取(ADR:[ADR.md](./ADR.md))。prx 的 **builder actor** 是镜像的预期生产者/签名者;此仓库是 独立的源码。
标签:AI代理, NIDS, Nix, Podman, 容器化, 开发环境, 沙箱, 自动化攻击, 隔离运行时