Skip to main content

什么是 OpenShell

OpenShellNVIDIA 开源的自治 AI 智能体安全沙箱运行时Safe Private Runtime for Autonomous AI Agents),GitHub 地址为 https://github.com/NVIDIA/OpenShell,官方文档地址为 https://docs.nvidia.com/openshell/latest/index.html

当前 AI 编程智能体(如Claude CodeOpenCodeCodexGitHub Copilot CLI等)在开发者本机或云服务器上运行时,往往拥有无限制的文件系统访问权限、任意出站网络权限以及执行任意命令的能力。这种"信任一切"的运行模式带来了严重的安全隐患:智能体可以读取 SSH 私钥、泄露代码仓库、向任意外部服务发送数据,甚至通过第三方依赖投毒导致供应链攻击。

OpenShell 正是为了解决这一问题而生。它为每个 AI 智能体提供独立的隔离容器(沙箱),通过声明式YAML策略文件,从文件系统、网络、进程、推理四个层面全面管控智能体的行为,做到"零信任、最小权限"。策略文件中静态部分(文件系统、进程)在沙箱创建时锁定,动态部分(网络、推理路由)支持在不重启沙箱的情况下热加载,兼顾安全性与灵活性。

当前版本状态Alpha(单用户模式)。OpenShell 目前专注于单开发者、单环境、单Gateway的使用场景,团队正在向多租户企业部署演进。


解决的核心问题

AI 智能体在没有隔离机制的情况下运行,面临以下主要风险:

风险类型具体危害
数据泄露智能体读取~/.ssh~/.aws等敏感目录并上传至外部
凭据滥用智能体将API Key泄露给未授权的第三方服务
基础设施越权智能体通过kubectlaws CLI 对生产环境执行破坏性操作
网络滥用智能体向任意目标发送出站请求,绕过企业安全策略
供应链攻击恶意包通过代码执行渗透开发者主机

OpenShell 的解决方案核心是防御纵深Defense in Depth):

  • 文件系统隔离:通过 Linux Landlock LSM限制智能体只能访问策略允许的路径。
  • 网络隔离:所有出站流量强制经过HTTP CONNECT代理,由OPA/Rego策略引擎逐连接审查。
  • 进程隔离seccomp BPF过滤危险系统调用,阻止提权操作。
  • 推理层隔离API Key不直接注入智能体进程,而是通过Privacy Router在代理层动态替换,保证凭据不进入智能体内存。

架构设计

OpenShell采用分层架构:用户侧工具(CLI / TUI / SDK)通过mTLS gRPC与运行在Docker容器内的K3s集群通信;集群中的Gateway控制平面管理沙箱生命周期,每个沙箱作为独立的Kubernetes Pod运行,内置代理、策略引擎和SSH服务。

组件介绍

Gateway(控制平面)

Gatewayopenshell-server)是整个系统的控制平面,部署为K3s集群中的StatefulSet。它通过单一端口(集群内8080,宿主机NodePort 30051)同时提供gRPCHTTP服务,使用mTLS双向认证保障通信安全。

核心职责说明
沙箱生命周期管理通过Kubernetes CRD创建、删除、监控沙箱Pod
策略存储与下发持久化YAML策略并通过gRPC下发给沙箱
凭据管理存储ProviderAPI KeyToken 等),在运行时安全注入沙箱
SSH 隧道中继CLISSH连接桥接到沙箱内的SSH服务器
推理路由配置存储集群级推理路由,下发Bundle给沙箱本地路由器
日志收集聚合沙箱日志并对外暴露查询接口

Gateway使用SQLite(默认)或PostgreSQL持久化数据,支持SQLite的持久卷挂载用于生产部署。其内部协议复用器(MultiplexService)根据Content-TypegRPC和普通HTTP流量分流到不同处理器。

Sandbox(沙箱)

每个沙箱是一个独立的Kubernetes Pod,内部运行两类进程:

  • Sandbox Supervisor(特权用户):负责代理、策略引擎、SSH服务和证书管理,是安全隔离机制的执行者。
  • Agent Process(受限用户):实际运行的AI智能体进程,受Landlock文件系统隔离和seccomp系统调用过滤双重约束。

沙箱的网络命名空间(Network Namespace)通过veth对实现隔离:智能体进程只能访问10.200.0.2,所有出站流量经由10.200.0.1:3128代理,由OPA策略引擎审查后决定放行、路由或拒绝。

Policy Engine(策略引擎)

策略引擎基于OPA/Rego(通过regorus Rust crate 内嵌),在代理中对每一个出站连接进行评估。策略分为静态与动态两类:

类型字段是否可热更新
静态filesystem_policylandlockprocess否(沙箱创建时锁定)
动态network_policies是(openshell policy set热加载)

动态策略通过轮询机制更新:沙箱每30秒向Gateway拉取最新策略版本,检测到版本变更时原子替换OPA引擎实例,旧引擎不中断(最后一个良好版本策略保留)。

Privacy Router / Inference Router(推理路由器)

这是OpenShell最具特色的设计之一。AI智能体访问inference.local这个虚拟主机来发起推理请求,代理拦截后:

  1. TLS终结(MITM),解析HTTP请求。
  2. 检测推理API模式(OpenAIAnthropic等格式)。
  3. 剥离智能体携带的凭据,注入真实的后端 API Key,再转发给实际推理后端。

这确保了AI智能体永远不会直接持有真实的 API Key,即使智能体被攻击或被操纵,也无法将凭据泄露给攻击者。

支持的推理协议:

协议路径方法
openai_chat_completions/v1/chat/completionsPOST
openai_completions/v1/completionsPOST
openai_responses/v1/responsesPOST
anthropic_messages/v1/messagesPOST
model_discovery/v1/models / /v1/models/*GET

TUI(终端用户界面)

openshell term启动一个受k9s启发的实时终端仪表盘,无需反复输入 CLI 命令即可监控集群状态:

┌─────────────────────────────────────────────────────────────────┐
│ OpenShell ─ my-cluster ─ Dashboard ● Healthy │
├─────────────────────────────────────────────────────────────────┤
(Dashboard or Sandboxes view content)
├─────────────────────────────────────────────────────────────────┤
[1] Dashboard [2] Sandboxes │ [?] Help [q] Quit │
├─────────────────────────────────────────────────────────────────┤
:
└─────────────────────────────────────────────────────────────────┘

Dashboard视图展示集群整体状态、Provider 配置和全局设置;Sandboxes视图展示所有沙箱的名称、状态、年龄、镜像和 Provider 信息,状态以颜色区分(绿色=就绪,黄色=启动中,红色=错误)。

Provider(凭据管理)

ProviderOpenShell对外部服务凭据的一级抽象实体,每个Provider具有名称(name)、类型(type)、凭据映射(credentials)和配置映射(config)。

内置的Provider类型及自动发现机制:

Provider 类型自动发现的环境变量自动发现的配置文件
claudeANTHROPIC_API_KEYCLAUDE_API_KEY~/.claude.json~/.claude/credentials.json
opencodeOPENCODE_API_KEYOPENROUTER_API_KEYOPENAI_API_KEY~/.config/opencode/config.json
codexOPENAI_API_KEY~/.config/codex/config.json
githubGITHUB_TOKENGH_TOKEN~/.config/gh/hosts.yml
gitlabGITLAB_TOKENGLAB_TOKENCI_JOB_TOKEN~/.config/glab-cli/config.yml
nvidiaNVIDIA_API_KEY

凭据在沙箱内通过占位符替换机制注入:智能体进程看到的是占位符环境变量,代理在出站请求时将占位符替换为真实凭据后再转发。

保护层级

OpenShell在四个层面实施防御:

层级保护内容何时生效
文件系统防止读写策略外路径(基于Landlock LSM沙箱创建时锁定
网络阻断未授权出站连接(基于OPA/Rego + HTTP CONNECT代理)运行时热加载
进程阻止提权和危险系统调用(基于seccomp BPF沙箱创建时锁定
推理凭据不注入智能体,API 调用强制经过受控路由运行时热加载

网络策略支持 L7(应用层)粒度的控制,例如允许GET /repos但拒绝POST /repos(防止写操作),且无需重启沙箱即可动态生效。

安装与部署

前置条件

  • 已安装并运行DockerDocker DesktopDocker Daemon)。
  • Linux 主机(用于 GPU 支持)或macOS/Linux开发机(基本功能)。

安装 OpenShell CLI

方式一:Install Script(推荐)

curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh

方式二:通过 PyPI(需要 uv)

uv tool install -U openshell

安装完成后可验证:

openshell --version

初始化 Gateway

首次创建沙箱时Gateway会自动初始化:

openshell sandbox create -- claude

CLI会自动在Docker中启动一个包含K3s的容器,并在其中部署Gateway和沙箱。若需要连接到远程主机:

openshell sandbox create --remote user@host -- claude

策略配置

策略文件为YAML格式,包含静态和动态两部分。以下是完整的策略结构示例:

version: 1

# 静态部分:文件系统策略(沙箱创建时锁定)
filesystem_policy:
include_workdir: true # 自动将 --workdir 加入 read_write
read_only:
- /usr
- /lib
- /proc
- /dev/urandom
- /app
- /etc
- /var/log
read_write:
- /sandbox
- /tmp
- /dev/null

# 静态部分:Landlock LSM 兼容性
landlock:
compatibility: best_effort # best_effort | strict

# 静态部分:进程策略
process:
run_as_user: sandbox
run_as_group: sandbox

# 动态部分:网络策略(可热更新)
network_policies:
github_api: # 策略块名称(任意标识符)
name: github-api-readonly
endpoints:
- host: api.github.com
port: 443
protocol: rest # rest | grpc | inference(用于推理路由)
enforcement: enforce # enforce | monitor(仅记录不拦截)
access: read-only # read-only | read-write(HTTP 方法预设)
binaries:
- { path: /usr/bin/curl }
- { path: /usr/bin/git }

应用策略到运行中的沙箱

# 应用策略(热加载,无需重启)
openshell policy set my-sandbox --policy examples/policy.yaml

# 等待策略加载完成再返回
openshell policy set my-sandbox --policy examples/policy.yaml --wait

# 查看当前生效策略
openshell policy get my-sandbox

使用示例

示例一:创建基础沙箱并运行 Claude Code

# 1. 确保 ANTHROPIC_API_KEY 已设置
export ANTHROPIC_API_KEY=sk-ant-xxx

# 2. 创建 Provider(CLI 会自动从环境变量发现)
openshell provider create --type claude --from-existing

# 3. 创建沙箱并启动 Claude Code
openshell sandbox create -- claude

# 4. 此时 Claude Code 在沙箱内以最小权限运行
# 默认网络策略为 deny-all,Claude 只能访问 Anthropic API

示例二:网络策略演示(默认拒绝 + 动态放行)

# 1. 创建一个无 Provider 的裸沙箱(网络完全拒绝)
openshell sandbox create \
--name policy-demo \
--keep \
--no-auto-providers \
--no-tty \
-- echo "sandbox ready"

# 2. 进入沙箱,测试被阻断的请求
openshell sandbox connect policy-demo
sandbox$ curl -sS https://api.github.com/zen
# → curl: (56) Received HTTP code 403 from proxy after CONNECT

# 3. 退出沙箱,在宿主机应用 GitHub API 只读策略
sandbox$ exit
openshell policy set policy-demo --policy policy.yaml --wait

# 4. 重新进入沙箱,验证 GET 请求已放行
openshell sandbox connect policy-demo
sandbox$ curl -sS https://api.github.com/zen
# → Anything added dilutes everything else.

# 5. 验证 POST 请求被 L7 策略拦截
sandbox$ curl -sS -X POST https://api.github.com/repos/octocat/hello-world/issues \
-d '{"title":"oops"}'
# → {"error":"policy_denied","detail":"POST /repos/... not permitted by policy"}

示例三:配置本地推理路由(使用 NVIDIA NIM)

# 1. 创建 NVIDIA Provider
openshell provider create --name nvidia --type nvidia \
--credential NVIDIA_API_KEY

# 2. 配置集群推理路由
openshell inference set \
--provider nvidia \
--model meta/llama-3.1-8b-instruct

# 3. 创建沙箱,智能体通过 inference.local 访问模型
openshell sandbox create \
--policy examples/local-inference/sandbox-policy.yaml \
-- claude

# 4. 沙箱内智能体调用 inference.local 时,不持有任何真实 API Key
# OpenShell 自动将请求路由到 NVIDIA NIM 并注入凭据

示例四:运行 OpenClaw 智能体沙箱

# 使用社区沙箱镜像启动 OpenClaw,转发 18789 端口
openshell sandbox create --forward 18789 --from openclaw -- openclaw-start

# 访问 OpenClaw Web 控制台
open http://127.0.0.1:18789/

示例五:GPU 直通沙箱(实验性)

# 在支持 NVIDIA GPU 的主机上,自动引导 GPU 网关
openshell sandbox create \
--gpu \
--from ghcr.io/my-org/gpu-sandbox:latest \
-- Claude

常用命令速查

命令说明
openshell sandbox create -- <agent>创建沙箱并启动智能体
openshell sandbox connect [name]SSH 进入运行中的沙箱
openshell sandbox list列出所有沙箱
openshell sandbox delete <name>删除沙箱
openshell sandbox logs <name> --tail实时流式查看沙箱日志
openshell provider create --type <t> --from-existing从本地环境自动发现并创建 Provider
openshell provider list列出所有 Provider
openshell policy set <name> --policy file.yaml对运行中沙箱应用或更新策略
openshell policy get <name>查看当前生效策略
openshell inference set --provider <p> --model <m>配置集群推理路由
openshell inference get查看当前推理路由配置
openshell term启动实时终端仪表盘
openshell status检查 Gateway 健康状态

支持的智能体

智能体沙箱来源Provider 凭据
Claude Codebase(内置)ANTHROPIC_API_KEY
OpenCodebase(内置)OPENAI_API_KEYOPENROUTER_API_KEY
Codexbase(内置)OPENAI_API_KEY
GitHub Copilot CLIbase(内置)GITHUB_TOKENCOPILOT_GITHUB_TOKEN
OpenClaw社区镜像OPENCLAW_API_KEY
Ollama社区镜像

显著优点

零信任最小权限

传统的AI智能体运行在开发者主机上,默认可以访问一切。OpenShell扭转这一范式:一切默认拒绝,策略显式授权。即使是最受信任的AI模型,也在严格的沙箱边界内运行。

声明式策略,动态热更新

网络策略是声明式YAML,版本化管理,支持在不重启沙箱的情况下热加载。策略变更有完整的版本历史和状态跟踪(pending/loaded/failed),支持回滚到已知良好版本。

凭据永不接触智能体内存

Privacy Router机制确保API Key等敏感凭据永远只存在于Supervisor进程内存中,智能体进程只持有无意义的占位符,即使智能体被prompt injection攻击也无法窃取凭据。

本地推理优先,自主可控

通过inference.local虚拟端点和推理路由器,可以将智能体的推理请求路由到vLLMLM Studio等本地推理服务,无需联网,数据完全自主可控。

社区生态与自定义沙箱

通过--from参数支持从OpenShell Community镜像库、本地Dockerfile或任意容器镜像创建沙箱,便于构建定制化的智能体运行环境(BYOC —— Bring Your Own Container)。

Agent-First 开发理念

OpenShell项目本身也遵循智能体驱动的开发工作流:.agents/skills/目录中包含用于CLI使用、集群调试、推理排障、策略生成等场景的智能体技能文件,所有实现工作均由人工审批后交由智能体执行。这赋予了OpenShell独特的自我进化能力。

同类项目对比

随着AI智能体安全隔离需求的兴起,业界已经出现了若干定位相近的开源和商业项目。以下从部署模式、隔离机制、策略能力、AI针对性等维度对它们进行横向比较。

主要同类项目简介

  • E2Bhttps://e2b.dev · GitHub: e2b-dev/E2B ⭐11.7k)是目前与OpenShell最为接近的项目,专为AI编程智能体提供云端隔离沙箱,提供开源SDK,支持Python/JavaScript调用。沙箱以轻量虚拟机(Firecracker microVM)为基础,启动速度快(约500ms),主要用于云端托管场景。

  • Daytonahttps://daytona.io · GitHub: daytonaio/daytona ⭐72.3k)是一个开源的AI代码沙箱基础设施平台,通过Dev Container规范提供安全、弹性的执行环境,适用于AI生成代码的运行与隔离。

  • gVisorhttps://gvisor.dev · GitHub: google/gvisor ⭐18.1k)是Google开源的容器沙箱运行时,通过用户态内核(Sentry)拦截系统调用实现强隔离,与containerd/Docker集成,是通用的容器安全加固方案,不针对AI智能体场景。

  • Kata Containershttps://katacontainers.io · GitHub: kata-containers/kata-containers ⭐7.8k)通过轻量虚拟机为每个容器提供强隔离,与OCI运行时兼容,安全隔离强度高,但资源开销相对更大,同样不专门针对AI场景。

  • Runloophttps://runloop.ai)是面向AI智能体的云端沙箱平台,提供托管的隔离执行环境和文件系统快照能力,商业闭源,以SaaS API形式提供服务。

  • Modalhttps://modal.com)是云端无服务器计算平台,提供容器化隔离执行,面向通用AI/ML 工作负载,不专注AI智能体安全策略。

  • Firejail(GitHub: netblue30/firejail ⭐7.3k)是 Linux 下的通用应用沙箱工具,利用Linux namespaceseccomp提供轻量隔离,成熟稳定,但缺乏AI智能体专用的凭据管理和推理路由能力。

功能对比表

特性OpenShellE2BgVisorKata ContainersDaytonaFirejail
GitHub ⭐NVIDIA/OpenShell ⭐5ke2b-dev/E2B ⭐11.7kgoogle/gvisor ⭐18.1kkata-containers/kata-containers ⭐7.8kdaytonaio/daytona ⭐72.3knetblue30/firejail ⭐7.3k
开源协议Apache 2.0Apache 2.0Apache 2.0Apache 2.0AGPL-3.0GPL-2.0
部署模式自托管(本地/远程)云托管为主自托管自托管自托管本地
AI 智能体专用
网络策略(L4)OPA/Rego基础隔离namespace
网络策略(L7)HTTP 方法级
策略热更新✅ 无需重启
文件系统隔离Landlock LSM✅ VM 隔离✅ VM 隔离Dev Containernamespace
进程隔离seccomp BPF✅ VM 隔离✅ 用户态内核✅ VM 隔离基础seccomp
凭据安全注入✅ 占位符替换
推理路由(Privacy Router)
GPU 直通✅ 实验性
自定义沙箱镜像(BYOC)
SSH 访问沙箱
终端仪表盘(TUI)
启动速度中(K3s 初始化)快(~500ms)慢(VM 启动)
成熟度AlphaGAGAGAGAGA

选型建议

场景推荐方案
本地/私有化部署 AI 智能体,需完整安全策略OpenShell
云端快速启动 AI 沙箱,不关心自托管E2BRunloop
通用容器安全加固,不涉及 AI 场景gVisorKata Containers
开发环境标准化(非安全隔离目的)Daytona
单机简单应用沙箱Firejail

OpenShell的核心差异化在于:它是目前唯一将L7 网络策略热更新凭据占位符隔离推理 API 路由三者合一、专门面向 AI 编程智能体设计的自托管开源方案。对于有私有化部署需求、对 AI 智能体凭据安全有严格要求的团队,OpenShell是目前最接近生产就绪的选择。


总结

OpenShell代表了AI智能体基础设施安全的一个重要方向:当AI编程助手逐渐具备自主执行代码、访问网络和操作文件系统的能力时,如何在不牺牲效率的前提下为其套上可控的"围栏",成为每个企业和开发团队必须面对的课题。OpenShell通过Linux内核安全机制(Landlockseccomp)、应用层策略引擎(OPA/Rego)、隐私路由器和声明式策略的有机结合,提供了一套生产级的解决方案参考,值得在AI智能体大规模落地之前认真研究和部署。