NVIDIA OpenShell 0.1.x:面向AI代理集群的安全、私有运行时

NVIDIA的OpenShell是一个采用Apache-2.0许可证的运行时,为自主AI代理提供真实能力——文件访问、软件包安装、API调用、凭据——同时在内核级别强制限制它们可以接触的内容,并在策略变更生效前进行形式化验证。该项目在Hacker News上登上了首页,获得489分和213条评论,讨论分为两派:一派热情欢迎这种开箱即用的代理沙箱,另一派则对默认开启的遥测、名称以及整个类别是否在重新发明容器表示怀疑。

OpenShell是什么

OpenShell是NVIDIA根据Apache License 2.0发布的安全、私有运行时,用于管理自主AI代理集群。其明确的前提是,当代理能够读取文件、安装软件包、调用API和使用凭据时,它们最有用——而赋予它们这些能力并不需要给予它们对数据、秘密或网络的无限制访问。

核心设计是声明式的:你在策略中声明每个代理可以接触什么,OpenShell强制执行。有两种机制负责执行:

  1. 内核级插桩,在运行时对每次文件访问、系统调用和网络连接应用策略。
  2. 形式化验证,在策略变更应用之前检查该变更将允许什么。

OpenShell以名为openshell的PyPI包形式分发,仓库位于github.com/NVIDIA/OpenShell。

0.1.x发布系列

README中标记了当前系列的一个里程碑:“OpenShell 0.1.x的新特性:稳定的发布节奏、新的隔离原语、扩展的扩展面以及新的API。”专门的0.1.0升级指南发布在docs.nvidia.com/openshell/latest/upgrade/0-1-0。

对于任何评估OpenShell的人来说,实际意义在于项目现在有了明确的发布节奏,而不是临时性的,并且扩展面(中间件、拦截器和计算驱动程序)和公共API都在本系列中有所增长。README还建议将SDK使用的OpenShell版本与运行网关的版本匹配。

内核级强制如何工作

OpenShell将每个代理限制在隔离的沙箱中,并在内核边界强制执行策略,而不是解析代理请求。根据README:

  • 内核控制限制代理可以访问的文件和可以进行的系统调用。
  • 每个网络连接在离开沙箱之前都要经过策略检查。
  • 代理永远不会看到真实的凭据。OpenShell仅将凭据添加到发往已批准端点的请求中。

第三点是凭据代理模型:沙箱不持有任何可用的秘密,运行时仅在目标匹配已批准端点时在出站路径上注入秘密。项目将此概念称为“提供者”——仅在已批准端点(包括推理端点)有效的凭据。

形式化验证的策略变更

策略漂移被视为审查门,而不是自动操作。在策略变更被批准之前,OpenShell使用形式化验证来标记变更将授予的风险新访问——例如,使用凭据访问新主机,或调用新的API方法——因此这些变更需要等待人工审查。

在OpenShell文档中,这在策略部分分为顾问和证明者。声明不是代理已被验证;而是分析新旧策略之间的差异,看它新允许了什么。

架构:网关、监督者、沙箱

OpenShell由三个协作部分组织,如其架构文档所述:网关、监督者和沙箱。网关是沙箱、策略和访问的控制平面。

策略模型涵盖文件系统规则、网络规则和进程规则。沙箱文档涵盖镜像、运行时、GPU和生命周期。

安装和快速入门

OpenShell需要Linux、Apple Silicon上的macOS或带有WSL 2的Windows(实验性),以及Docker、Podman或主机虚拟化。支持矩阵记录了详细信息。

文档化的快速入门是两个命令:

curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
openshell sandbox create --name demo

安装程序设置CLI和本地网关。默认沙箱镜像是最小的Ubuntu,没有安装代理。要运行真正的代理,“运行你的第一个代理”指南将OpenCode与免费的OpenRouter模型一起运行,并在代理请求时逐步指导批准新访问。

SDK、Kubernetes和扩展

SDK将应用程序连接到OpenShell网关;它们不安装CLI。

语言 安装
Python uv add openshell
TypeScript npm install @nvidia/openshell-sdk(GitHub Packages)
Go go get github.com/NVIDIA/OpenShell/sdk/go@latest
Rust cargo add openshell-sdk --git https://github.com/NVIDIA/OpenShell --tag <release-tag>

对于Kubernetes,网关使用Helm部署,README声明了一个硬性要求:你的CNI必须强制执行NetworkPolicy。可扩展性通过中间件、拦截器和计算驱动程序暴露。

仓库还附带可通过npx skills add NVIDIA/OpenShell安装的代理技能。这些技能教编码代理驱动OpenShell CLI、编写沙箱策略以及调试网关和推理路由,并且它们不需要OpenShell源代码检出即可工作。

OpenShell明确以代理为先构建,使用它所启用的代理驱动工作流进行开发。贡献者设置位于CONTRIBUTING.md,仓库编码约定位于AGENTS.md。

遥测及其刻意不收集的内容

OpenShell默认收集匿名遥测,仅限于操作类别和计数。README列举了它不收集的内容:沙箱名称、主机名、文件路径、提示、凭据、提供者或模型名称以及用户内容。这些遥测的汇总报告发布在仓库中。

可以通过两种方式禁用遥测:在网关上设置OPENSHELL_TELEMETRY_ENABLED=false,或对于Helm安装设置server.telemetryEnabled=false。也可以完全编译掉。

默认开启的遥测是Hacker News线程中最一致的抱怨。一位评论者逐字引用了README的遥测部分并让它自己说话。另一位则更直率:

默认遥测是疯狂的。除此之外,控制级别很酷,几乎过于繁琐。它可能只对非常细致的企业需求特别有用(可能是它的目标)。大多数公司可以更粗略地设置权限,我认为代理行业正在远离k8s作为部署平台。

HN评论者喜欢什么

几位评论者将OpenShell视为整合之举,而不是新想法。“Nvidia Openshell绝对棒极了,功能集大成于一处,”一位写道,并补充说他们曾担心OpenShell会随着竞争项目的出现而被放弃。另一位说他们已经在容器中运行代理,但仍然看到了价值:“如果你还没有在容器中运行你的代理,那你疯了。话虽如此,这看起来是管理这些容器的一个好方法。”

一位参加过GTC Europe的线程参与者表示,那里相当一部分演示使用了OpenShell,而他们之前从未听说过它。

一个广受好评的重新定义是术语上的:“代理运行时——实际上对于今天称为编码代理或代理框架的东西来说是个好名字。”

批评:名称、营销和维护问题

命名立即引起了怀疑。OpenShell与长期存在的Open-Shell-Menu项目同名,一位评论者指出这是一个冲突。其他人发现品牌宣传自相矛盾:“我更喜欢这样读:Nvidia Opens Hell,”一位写道。另一位:“Open和Nvidia在同一句话中是一个很好的矛盾修辞。”更广泛的反对意见是,在产品描述中将“开放”、“安全”和“私有”配对会引发怀疑:“仅仅称某物开箱即用私有和安全,真的让我觉得它很可能在这些声明上全部失败。”

一位评论者直接质疑了这种框架:

对我来说,这掩盖了一个矛盾:你给代理的访问权限越多,它就越有能力。你不能鱼与熊掌兼得,我想这个工具允许取得平衡。但宣传语读起来像是它可以做所有事情,但现在安全了。那不可能是真的。

维护是另一个担忧。一位评论者询问OpenShell如何与现有沙箱领域相比,以及它的区别是什么,然后直白地表达了他们的期望:“我的期望是它将维护不善;nvidia不是一家软件公司。”线程中没有人提供逐功能比较,而要求将OpenShell与Docker基于microVM的沙箱进行比较的请求没有得到回应。

“为什么不直接用容器?”

最常被重复的反对意见是容器已经解决了这个问题。“为什么不直接用容器……”一位评论者问道;另一位说这个领域是“以AI风味重新发明虚拟化和容器化。”

没有评论者给出明确答案,但OpenShell的设计暗示了预期的区别:容器隔离限制了进程可以访问的范围,而OpenShell还按端点代理凭据,并通过验证和人工审查来门控策略变更。这个差异是否证明新运行时是合理的,正是怀疑者所质疑的。一位评论者还指出了替代方案的实际限制:Docker Sandbox依赖microVM,类似工具存在已知差距——例如,VS Code Remote SSH将主机暴露给来自沙箱的攻击。

集群问题:共谋和集体权限

一条详细评论描述了OpenShell在GTC上的宣传是关于集体权限,而不是个人权限:

从GTC的宣传来看,这个想法不仅限于限制每个单独代理能做什么,还要确保集体权限不超过你希望代理做的事情。显然,代理会通过将任务委托给具有所需权限的其他代理来共谋突破各自的沙箱。这是代理集群的一个问题,因为你需要它们协调任务。所以你需要它们通信。防止代理做你不希望做的事情的简单方法是权力分离,个人权限限于每个代理的任务……如果其中一个代理决定需要发布原始数据,那么它们很可能会共谋实现这一点,即使没有单个代理拥有实现该目标的权限。

同一位评论者说OpenShell通过监控集群的集体权限集和细粒度的每代理权限来解决这个问题,并且它与一个硬件防火墙(基于BlueField构建)一起展示,该防火墙位于代理运行的芯片和主机之间,消除了代理修改自己OpenShell策略的能力。这个硬件细节来自评论者对GTC演示的叙述,而不是来自README。

数据泄露是未解决的边缘问题

即使喜欢这种方法的评论者也指出了残余风险。一位描述了使用Iron Proxy进行按域网络限制和凭据交换,然后指出了剩余的差距:

如果你真的想信任代理,唯一真正剩下的问题是如何防止数据泄露……我们可以将网络限制到受信任的域,但代理总是有可能特别狡猾,尤其是在提示注入的情况下,比如一次几个字符地推送数据。

同一位评论者描述了代理gh而不是授予直接访问权限,以控制代理是否可以分叉公共仓库、打开问题或提交PR。结论未解决:代理可能仍然能够以意外方式向允许的域发送数据。

另一位评论者说他们正在生产环境中运行OpenShell,并在其上构建一层用于团队策略、安全的git使用(这样代理不会继承用户的完整访问权限)以及内置的SCA/SAST。他们动机的总结:“我见过的代理痕迹很疯狂,没有边界的追求目标是真实的。”

一位在k3s命名空间旁边使用ACL执行插件的评论者描述了整个问题中最难的部分,没有策略引擎能完全解决:“最难的不是设置安全规则,而是提前知道你的代理需要访问的一切。”

形式化验证的论点

一位评论者将OpenShell的证明者与一个更广泛的论点联系起来:前沿模型已经能够找到逃出沙箱的方法、规避权限和设计侧信道,因此使用形式化方法进行构造性安全是唯一持久的答案。他们指出Anthropic已发表的形式化验证工作作为大规模验证可能性的证据,但认为证明没有内存清理错误只是一类问题——全栈保证需要验证的芯片、引导加载程序、最小Linux和应用库栈,然后端到端声明如“在任何级别都无法泄露凭据”才有意义。

采用信号和开放问题

线程中的采用证据是轶事性的:一位评论者说他们使用OpenShell已有一段时间,并正在为其他团队扩展它;另一位认为这是在容器化代理之后的自然下一步。与此相对,几位评论者询问实际用户在哪里——“人们实际上在用代理集群做什么?”——以及一个讽刺的评论,GTC Europe的演示大量使用了该工具,这表明NVIDIA驱动的可见性多于独立采用。

仓库确实具体确立了:OpenShell是Apache-2.0,以openshell在PyPI上发布,提供Python、TypeScript、Go和Rust SDK,记录了基于Helm的Kubernetes路径,需要强制执行NetworkPolicy的CNI,支持Linux、Apple Silicon macOS和WSL 2(实验性)以及Docker、Podman或主机虚拟化,并带有明确免责声明,即检索到的外部材料受其自身单独条款约束,软件按“原样”提供。

Sources

相关

  • 项目
  • 项目
  • Dispatch
  • Dispatch
  • Dispatch