【免费下载链接】OpenShellOpenShell is the safe, private runtime for autonomous AI agents.项目地址https://gitcode.com/gh_mirrors/op/OpenShell点击查看免费下载OpenShell 的安全策略Security Policy定义了一个沙箱化 AI Agent 可以访问什么、不可以访问什么。它由沙箱内的内核控制Landlock、进程设置与本地策略代理共同强制执行网关只负责存储和下发策略不参与逐请求的出口决策。阅读本文后你将掌握策略的分层强制执行模型、网络决策链路、主机通配符规则、TLS/L7 检查与凭证端点治理、实时热更新机制、策略顾问Policy Advisor自动审批流程、提案证明器Prover的形式化检查能力以及安全日志的可观测性要求。策略的定义与分层强制执行在 OpenShell 中策略以沙箱为边界来定义 Agent 可访问的范围并在每个沙箱内部强制执行。强制执行不是一个单点动作而是由三个层面协同完成内核控制基于 Linux Landlock LSM 对文件系统路径做只读/读写限制进程设置supervisor 以非特权用户、削减 capabilities 的方式启动 Agent 进程本地策略代理对网络出口做目标、端口、调用二进制与可选 L7 规则的评估。网关在整个模型中只负责存储与下发策略不做逐请求的出口决策从而将决策点保留在离沙箱最近、信息最全的本地执行层。各策略领域的强制执行方式可以归纳为下表领域强制执行方式文件系统Landlock 限制只读与读写路径进程supervisor 以非特权用户、削减 capabilities 启动 Agent网络代理评估目标、端口、调用二进制与可选 L7 规则Provider 访问附加的 provider 配置档案贡献端点与二进制规则凭证仍绑定在档案授权的端点上运行时设置类型化设置随策略下发可作用于全局或沙箱作用域关键的时间语义是文件系统与进程策略属于启动期控制静态一旦沙箱创建后修改它们需要重建沙箱网络策略是动态的可以在新策略成功通过校验后被热加载hot-reload无需重启。授权策略的边界解析器归属与 fail-closedOpenShell 对策略的 YAML/JSON 书写形式authored representation有非常明确的唯一所有权划分。openshell-policy-schemacrate 是授权 YAML 与 JSON 表示的唯一所有者职责见 crates/openshell-policy-schema/src/lib.rs保留作者书写时的语义区别例如filesystem_policy缺失运行时生效为include_workdir: true与显式空对象{}保持include_workdir: false是两种不同的状态拒绝重复键并在 noyalib 构建 YAML 文档期间施加解析预算parser budgets拥有纯语言语义例如 access 预设、MCP revision 词汇表、有效端口与规则名、协议分类以及词法层面的策略路径归一化。消费方consumers则把这种语法投影到用途特定的模型上。openshell-policycrate 负责 protobuf 转换、组合composition、合并行为merge、原始 protobuf 校验以及依赖运行时组件的校验。从源码结构看compose_effective_policy、merge_policy与 L7 校验分别位于 crates/openshell-policy/src/compose.rs、crates/openshell-policy/src/merge.rs 与 crates/openshell-policy/src/l7_validate.rs。无论是提案风险证明器proposal-risk prover还是独立包含性检查器standalone containment checker都通过与运行时相同的 fail-closed 解析器把共享 schema 投影到各自的模型中。解析器强制version: 1在任何消费方投影运行之前就拒绝受管理的注解与所有未知字段。不存在宽松解析档案不支持的策略字段必然使整个文档失效。作为例外中间件config、query 与持久化查询persisted-query名称、以及递归的 MCP 参数名称是开放的用户数据映射open user-data maps而不是 schema 扩展。解析预算的具体数值同样有据可查单个文档上限 4 MiB、嵌套深度 64 层、AST 节点 100,000、解析事件 300,000、累计标量数据 4 MiB、别名展开 100 次且别名与锚点比例为 5:1、每个映射或序列最多 10,000 项。这些限制由ParseLimits结构体及其默认值定义见 crates/openshell-policy-schema/src/lib.rs。文件系统与进程策略的落地细节基线路径富集baseline enrichment在应用 Landlock 之前supervisor 会为运行时所需的基线文件系统路径做富集enrichment。实现位于 crates/openshell-supervisor/src/lib.rs 的enrich_proto_baseline_paths与enrich_sandbox_baseline_paths函数代理模式沙箱的基线只读路径包含/usr、/lib、/etc、/proc、/dev/urandom等基线读写路径为/tmp与/dev/null后者被常见子进程启动器打开缺失会导致uv等工具报 EACCES。富集逻辑的关键安全性质是缺失的基线路径会被跳过一个不存在的运行时路径不会削弱整个规则集源码注释明确引用 issue #664防止单一路径缺失在 best-effort 模式下放弃整个 Landlock 规则集绝不删除用户显式指定的路径只做增量添加。GPU 场景的路径提升当沙箱中存在 GPU 设备时GPU 基线富集会添加现有 GPU 设备节点如/dev/nvidiactl、/dev/nvidia-uvm、/dev/nvidia-uvm-tools、/dev/nvidia-modeset、WSL2 下的/dev/dxg为读写路径并把/proc提升为读写。原因在 crates/openshell-sandbox/src/boundary_server.rs 有明确注释CUDA 工作负载在cuInit()期间通过/proc/pid/task/tid/comm写入线程名称而/proc/self规则只会绑定到启动器launcher的 inode无法覆盖其工作负载子进程所以必须针对整个/proc做读写授权。Landlock 规则的 inode 类型适配Landlock 规则根据已打开路径描述符所报告的 inode 类型进行定制目录保留请求的目录权限与文件权限普通文件、设备节点、套接字及其他非目录类型只保留与文件兼容的权限。这种做法的意义在于既避免拒绝合法的混合路径策略又不会削弱hard_requirement——真正不支持的 ABI 能力与准备阶段的失败依然会导致沙箱启动失败。Landlock 兼容性模式landlock.compatibility字段控制 Landlock 失败时的行为取值如下值无路径配置内核 ABI 不可用单个路径不可访问全部路径不可访问best_effort默认Landlock 跳过no-op告警并继续无 Landlock跳过该路径应用其余规则告警并继续拒绝应用空规则集hard_requirement中止沙箱启动中止沙箱启动中止沙箱启动Kubernetes sidecar 当前用户模式除外该模式下跳过不可访问路径中止沙箱启动best_effort适合大多数部署它优雅地处理缺失路径例如/app并非每个容器镜像都存在但属于基线集合。hard_requirement适合对隔离缺口零容忍的环境——任何路径无法打开缺失、权限拒绝、符号链接环都直接失败而不是降级运行。需要说明的是hard_requirement配置为无文件系统路径时同样是启动错误。进程策略则通过process.run_as_user/process.run_as_group设置 Agent 的 OS 级身份支持字符串用户名或数字 UID/GID1到4294967294显式拒绝0root与4294967295非法身份哨兵。每个字段的缺失被独立保留——例如只设置run_as_user而让驱动选择 group。网络决策链路普通网络流量按以下顺序决策强制流量通过 namespace 与 seccomp 控制强制流量经过沙箱代理识别调用二进制比对调用二进制的可信身份硬阻断拒绝硬阻断的目标包括未显式允许的不安全内部 IP 段策略匹配将目标与二进制与网络策略块匹配L7 规则对启用协议检查的端点应用可选的 HTTP/L7 规则处置根据匹配策略执行 allow允许、deny拒绝、audit审计或 log记录。两条铁律贯穿始终显式拒绝与加固检查优先于允许规则没有任何规则匹配时请求被拒绝默认拒绝default-deny。值得注意的还有enforcement字段enforce主动阻断不允许的请求audit记录违规但放行流量其他任何值在激活前被拒绝而不会降级解释为 audit——未知的枚举值永远不以退回审计模式的方式被容忍。主机通配符规则DNS 标签边界网络端点的host模式支持在第一个 DNS 标签内使用*通配符也支持把**作为整个中间 DNS 标签使用。OPA 运行时以.为标签边界匹配因此通配符永远不会跨越点号验证器强制同样的边界使策略加载快速失败而不是在代理处静默失配。模式是否接受示例匹配说明*.example.com是api.example.com第一个标签可为任意值**.example.com是a.b.example.com递归通配符作为整个第一个标签*-aiplatform.googleapis.com是us-central1-aiplatform.googleapis.com第一个 DNS 标签内的标签内通配符*.s3.*.amazonaws.com是bucket.s3.us-east-1.amazonaws.com中间标签*恰好匹配一个 DNS 标签*或**否—匹配所有主机*.com、**.com否—TLD 通配符标签数 ≤ 2foo.us-*.example.com否—不允许部分中间标签通配符foo.**.example.com否—不允许第一个标签之外的递归通配符foo**.example.com否—递归**混在标签内仅允许作为整个第一个标签验证在策略加载时拒绝上述不允许的模式。OPA 加载错误会省略所提供的主机名不泄露策略细节。精确主机与 IP 地址不走这条通配符验证路径。底层实现可参考 crates/openshell-core/src/host_pattern.rs 的HostPattern大小写不敏感匹配*停留在一个 DNS 标签内、单独的**标签消耗一个或多个标签语义与 Rego 端点 glob 匹配glob.match.分隔符完全一致。对于protocol: tcp端点还有一项重要安全提示通配符会授权对所有匹配名称的 DNS 查询从而可能构成 DNS 标签外泄通道因此精确主机更受推荐。TLS 与 L7 检查TLS 终止与请求级控制对需要请求级控制的 HTTP 端点代理可以用沙箱的临时 CAephemeral CA终止 TLS并在转发前检查 method/path 或协议特定元数据。代理还支持在策略允许的端点上对已终止的 HTTP 流做凭证注入credential injection。tls字段只接受两个状态省略auto-detect默认检测并终止 TLS 以便检查或skip跳过自动检测用于客户端证书 mTLS 等边缘场景其余任何值——包括已移除的terminate与passthrough拼写——都会被拒绝。原始流与长连接的作用域语义原始流raw streams与长生命周期响应体是连接作用域的策略代际变化会关闭固定到上一代级的 relay而不是让它们继续在过期授权下运行HTTP 升级upgrade默认切换为原始 relayraw relayprotocol: rest端点可选用websocket_credential_rewrite在允许的101升级后对客户端到服务器的 WebSocket 文本消息做凭证重写服务器到客户端的流量以及其他所有升级协议保持原始直通。TCP 主机名是路由约束而非应用权威protocol: tcp主机名是连接路由约束不是应用权威边界。透明捕获在打开流之前验证批准的 DNS 名称、固定目标地址、端口与调用二进制但不检查 TLS SNI、HTTPHost或其他协议级目标。因此兼容的共享基础设施可能让客户端在批准的前门之后选择另一个租户、虚拟主机或服务——这是必须被理解的架构边界。凭证端点治理凭证来源与范围推导OpenShell 默认把 Provider 凭证放在它可以检查或重写的路径上。网关在组合时间从附加的 provider 推导凭证来源credential provenance并把它盖章stamp到有效策略上。该来源是内部信息不含任何凭证标识符或值永远不信任来自用户编写策略的来源。每次评估都会清空整个策略上的来源并重新推导来源只有两处携带凭证的附加 provider 配置档案的端点沙箱策略中有效的credential_binding条目命名一个附加 provider且其配置档案是 endpointless 的。绑定只缩减为主机与端口作用域绑定binding只缩减为主机与端口作用域——有意丢弃路径。原因在于路径在 L4 或tls: skip端点上不可观察路径级推导会在未检查凭证门本应捕获的表面上恰好遗漏标记。畸形绑定provider 为空、主机缺失、或端口超出1..65535会让评估失败而不是贡献一个作用域指向 endpointful 档案或未附加 provider 的绑定不贡献任何内容网关会另行拒绝这些用法。两个来源合并为一个去重的作用域集合每个端点在每次评估中从该集合盖章一次。盖章是赋值而非累积端点一旦不再匹配凭证作用域或绑定被移除就在同一遍丢失其标记。这必须是全量重算——增量推导会让一系列各自合法的编辑达到任何单个编辑都不会允许的状态。未检查凭证的逃逸门凭据性的 L4-only 与tls: skip端点在策略校验时失败除非显式启用公共的allow_uninspected_credentials逃逸门。该标志默认false并在策略审批流中被安全标记security-flagged。增量合并只会在匹配的端点上增加该标志清除它必须移除端点或替换整个策略。网关与 supervisor 的双层强制网关在完整 provider 组合与来源推导之后应用凭证门。被拒绝的有效配置会保持启动阻塞并给出有界诊断supervisor 等待管理修复而不是以连接时拒绝或回退策略启动。接受的运行时状态包含匹配的 provider-environment revision因此策略与凭证更新不可能独立激活。网络 supervisor 独立强制同一边界凭据性 WebSocket 升级使用解析后的 relay二进制帧 fail closed文本占位符要求重写。REST 请求体在禁用重写时继续流式传输。relay 持有完整占位符候选直到请求作用域的元数据快照可以分类它们权威未知的键与当前绑定的有效凭证原样通过包括绑定到目标本身的引用被撤销或无效的身份、以及不可用的分类状态fail closed分类永不替换机密值并共享请求的凭证 revision过期的凭证或策略代际会终止转发。候选限制在4096 个线上字节含百分号编码畸形或超大的候选 fail closedHTTP trailers 保留基于前缀的拒绝。请求体重写的缓冲区上限为 256 KiB分块请求计入 framing、扩展与 trailers并更新Content-Length。身体拒绝以本地 HTTP 403 返回credential_placeholder_in_request_body并丢弃任何部分写入的上游请求——安全前缀字节可能已经到达上游。拒绝事件与不泄露原则拒绝同时发出相关的网络活动与检测发现两类事件。事件只标识目标、策略、流量面与受控的拒绝原因绝不包含凭证名称、占位符、请求体内容或机密值。OCSF JSONL 输出可能被发送到外部系统因此这是硬性纪律。无来源provenance-less策略的两个特例凭证来源由网关推导且有意从策略 YAML schema 中缺席因此它不会在从未经过网关的策略中存活。网关交付的策略是该控制的权威来源没有来源的策略既不应用原始隧道拒绝也不应用 WebSocket 二进制帧拒绝。请求体后备backstop仍然生效因为它依赖的是 secret resolver 的存在而非端点来源。两条 supervisor 本地路径会加载无来源策略从显式供应的策略文件启动的 supervisor在该策略重新同步到网关网关随后提供盖章后的有效策略之前存在一个有界窗口显式 supervisor Rego 与 data 覆盖是永久的因为网关修订只为设置与 provider 而观察从不替换本地策略。工作负载镜像文件与环境变量不能配置被单独隔离的 supervisor。当 supervisor 覆盖与注入的 provider 凭证组合时supervisor 在启动时发出高严重度检测发现点名无效的控制。策略加载诊断有界错误消息OpaEngine在从文件、字符串或 protobuf 加载/重载策略时对返回的错误消息设界每条消息最多8 个错误项与512 UTF-8 字节含标题、分隔符与任何additional violations omitted标记loader 报告完整的、固定的分类丢弃作者提供的名称、值、路径、源码片段与嵌套错误链。类型化校验分类可以区分进程身份、文件系统路径与限制、Landlock 兼容性、端点主机与端口、凭证签名与重写、MCP 配置、以及中间件配置。L7 语义错误报告invalid L7 policy configuration协议配置或别名错误报告invalid L7 protocol configuration端点冲突报告ambiguous network endpoint selectorsYAML 错误保留固定解析器分类与可用时的数值行号/列号文件 I/O、Rego 加载与内部策略数据错误使用固定消息。校验中被拒绝的候选不会替换活动引擎或推进其代际。supervisor 随后应用policy_validation_failure_mode并可能发布隔离代际quarantine generation详见下文实时更新。实时更新Live Updates配置修订与热加载网关把沙箱作者策略修订与派生的有效沙箱配置分开存储。有效配置可以包含网关全局策略覆盖与 provider 档案策略层。supervisor 轮询配置修订并尝试把新的动态策略加载进进程内 OPA 引擎CLI 读取最新沙箱策略时走同一有效配置路径。OPA loader 在注入运行时字段、归一化值或展开 access 预设之前先检查原始策略数据的对象与列表形状。它用固定结构错误拒绝第一个畸形容器排除作者键与值从而保留有效的无版本 OPA 数据与运行时专用字段。被拒绝的 OPA 引擎重载会保持该引擎已安装的策略、代际与决策不变supervisor 单独应用其配置的运行时拒绝模式。匹配器归一化在验证 L7 规则之后OPA loader 把非空字符串 query 与 MCP 参数匹配器转换为显式glob对象包括 MCPtool别名与 deny 规则。例如query: { status: active* }变成query: { status: { glob: active* } }。YAML 与 protobuf 均可表示的匹配器因此对端点配置消费方暴露相同表示已低化的glob与any匹配器在重载间保留值归一化保留运行时端点来源。空标量 query 匹配器仍是 OPA 专属形式Rego 给它们的语义与空glob对象不同。显式提供的 MCP 规则params值在 allow 与 deny 规则中都必须是映射。只使用tool别名时应省略该字段params: null在别名低化之前就被拒绝。被拒绝的原始策略重载保留活动求值器及其代际。完整代际验证与端点重叠supervisor 在激活前验证完整的有效策略代际。重叠的端点选择器只有在连接与请求处理元数据一致时才能贡献 allow/deny 规则冲突的 TLS、目标、凭证、解析器或强制元数据会拒绝整个代际。纯 L4 端点不贡献请求处理元数据因此当连接元数据一致时它可以与 L7 端点重叠。请求路径重叠时更高特异性等级的路径端点确定性覆盖更宽的请求处理元数据同等具体的重叠端点必须一致。端点tls、enforcement与access使用 protobuf 枚举并保留命名的 YAML 拼写。protocol保持为字符串以便协议集演进但每个入口ingress在持久化或激活前都验证它。supervisor 还防御性地拒绝未知枚举号与协议值——未知的 enforcement 值永远不退回 audit。网关变更路径与失败模式网关变更路径在受影响沙箱作用域已知时会在持久化前验证完整有效候选。直接替换、增量合并与审批、provider 附加、配置档案扇出fanout都会原子地拒绝歧义不会创建无效修订或部分激活更新。supervisor 校验仍是启动、并发变更与这些变更之外的来源的纵深防御边界。L7 allow/deny 追加操作携带显式规则目标与完整的受影响二进制与端口作用域。合并引擎在该规则内解析一个非 provider 端点可选按精确端点路径并在变更前比较两个作用域集。部分声明、歧义目标或已变更作用域会在修订持久化前拒绝整个批次。声明记录操作者意图不授予策略写入权限也不改变已存储的二进制与端口集合。[openshell.gateway] policy_validation_failure_mode配置控制被 supervisor 运行时校验拒绝的候选网关预检拒绝永不成为代际活动策略保持不变运行时模式默认fail_closed发布隔离代际、拒绝新出口、使现有 relay 失效、并让上一策略保持非活动状态操作者可显式选择retain_last_valid保持上一代际活动若没有上一有效代际无论配置如何有效模式都是fail_closed。网关把该启动配置随每个有效策略快照分发给沙箱 supervisor。OCSF 配置与发现事件声明候选版本、校验依据、配置与有效模式、活动代际以及上一策略是否活动。静态控制如文件系统 allowlist 与进程身份因为是在子进程启动前应用的所以需要新沙箱。网关全局策略可以覆盖沙箱作用域策略但应克制使用因为它会改变网关上每个沙箱的有效访问模型。策略顾问Policy Advisor把拒绝转化为提案策略顾问管线把观察到的拒绝denials转化为草稿策略建议。共有两个提议者proposer沙箱侧机制性映射器mechanistic mapper与通过policy.local的 Agent 编写网关是唯一裁判referee。启用后L7policy_denied响应同时包含结构化的next_steps与简短的agent_guidance字符串让通用 Agent 能继续走提案循环而不是把拒绝当作终点。六步流程提交Submit两个提议者通过同一SubmitPolicyAnalysis路径 POST。每个块chunk连同其analysis_mode持久化以用于审计溯源。Agent 编写的块不能请求protocol: tcp或tls: skip沙箱本地 API 立即拒绝这些传输选择网关在持久化前重复检查。省略 protocol 的端点仍可通过显式代理使用默认 TLS 终止与 HTTP 权威检查管理员仍可直接编写原生 TCP 与原始 TLS 策略。构建并验证候选Build and validate网关先把机制性提案对实时有效策略做规范化canonicalize。若端点已被检查型或 provider 拥有的契约覆盖候选保留该契约并只添加提议的沙箱二进制。Provider 规则是不可变输入沙箱贡献存储为覆盖层overlay。网关随后执行候选应用时会遇到的同一套合并、策略校验、provider 组合、凭证预检与证明器求值。每个块存储最终有效候选、其哈希、任何应用错误以及从候选及其非机密实时输入派生的审查令牌review token。自动审批门与提议者无关可选开启自动审批仅在三个条件同时成立时触发(a)proposal_approval_mode解析为auto网关作用域优先沙箱作用域是按沙箱覆盖默认manual(b) 证明器 delta 为空prover: no new findings(c) 从块当前提议规则重新计算的安全备注为空。合并前网关重新加载已存储块并从实时策略、provider 与凭证输入重新计算候选。若审查令牌未变网关复用持久化的证明器结果若已变网关持久化刷新后的候选并要求重新审查而不是应用它。解码、证明、合并、provider 组合或凭证失败会让块保持 pending 并带应用错误。审计事件使用CONFIG:APPROVED携带autotrue、sourcemode、prover_deltaempty、resolved_fromgateway|sandbox作为未映射字段消息文本为auto-approved: no new prover findings——绝不使用 safe。该可选门保留了 OpenShell 的默认拒绝姿态两个作用域都未设置时即使证明器未见任何发现每个提案也进入pending等待人工审查。隐式取代Implicit supersede任何成功提交时网关扫描该沙箱的 pending 块匹配(host, port, binary)并自动拒绝较旧块理由为superseded by chunk X。这给 Agent 一条精化路径宽机制 L4 → 窄 Agent L7无需显式supersedes_chunk_id字段。机制去重与自拒绝机制性提交按(host, port, binary)去重对已有草稿行的端点重复拒绝会折叠进该行递增hit_count而不是新建块。当端点已被不同的已批准块覆盖时冗余机制提交到达即自拒绝理由为already covered by approved chunk X。这只会作用于真正新鲜的、仍处于pending的提交它永不重写已决定块的状态。去重命中解析到已批准行自身 id 时该块保持approved并已合并——自拒绝路径不会取消合并规则因为把已批准块翻转为rejected会让治理账本与仍然生效的策略不一致。升级Escalation其余一切进入pending等待人工审查。在任何成功策略写入之后已被新实时有效策略覆盖的 pending 块被拒绝为冗余使审查收件箱与沙箱当前强制执行的内容保持一致。端点顾问标记来源而非授权端点顾问标记advisor markers是来源provenance不是授权或连接元数据。Provider 或用户编写的端点携带显式来源policy.local端点携带顾问来源。仅来源差异在有效策略歧义验证中是兼容的相同端点合并时显式声明支配顾问声明。提案覆盖同样忽略来源因此当现有显式声明已提供相同身份时已批准覆盖层会收敛。这种兼容性不会削弱 SSRF 分类。精确主机信任要求一个匹配规则同时包含精确显式端点与匹配的二进制身份。顾问端点不能从无关显式端点拼装这种信任。当顾问为现有显式端点契约观察到新二进制时规范化把观察保留在单独规则中其端点保留顾问来源。Provider 或用户规则可以为其自己的显式端点与二进制对独立建立信任但顾问覆盖层不会把该对拓宽到不同二进制。Security-notes 门与证明器分离每个块携带咨询性的security_notes。读取、批量审批与自动审批都会从当前存储的提议规则重新生成备注而不是信任编辑后可能过期的持久化值。非空备注阻断自动审批并使ApproveAllDraftChunks跳过该块除非设置include_security_flagged。块保持pending显式人工审批仍可合并被标记的块。私有/内部目标是咨询性而非阻断性的。字面端点 IP、allowed_ips条目或与 RFC 1918、CGNAT100.64.0.0/10、IPv6 ULAfc00::/7或其他特殊用途范围由 crates/openshell-core/src/net.rs 的net::is_internal_net覆盖相交的 CIDR 会产生备注。携带allowed_ips的无主机规则因可能匹配解析进该范围的任意主机名而获得额外备注。始终阻断的目标与此咨询分类分离回环、链路本地与未指定 IP/CIDR加上localhost与已知元数据端点主机名被排除在安全备注之外。提交与编辑可以存储此类草稿但现有合并校验会在审批试图将其加入策略时拒绝运行时 SSRF 保护仍是最终强制边界。独立边界检查Standalone boundary checks独立的openshell-prover check命令把一个完整组合的本地候选策略与操作者提供的本地边界比较为结果中报告的策略域建立Allowed(candidate) ⊆ Allowed(boundary)的包含关系。它不获取网关状态、组合 provider 规则、应用策略也不决定边界内变更是否有资格自动审批。安装与详细用法见 docs/reference/policy-prover.mdx。包含模型覆盖文件系统路径、受支持的进程身份、Landlock 兼容性要求、L4 目标含 IP 范围、以及强制的 REST 方法与路径权威。身份比较假设一致的用户与组解析兼容性检查比较请求的强制要求而非运行中沙箱的实际内核状态。当可靠决策依赖模型外的权威或运行时上下文时它返回显式 unsupported 或 inconclusive 结果。结果记录覆盖域调用者可要求与其决策相关的权威。JSONschema_version为结果契约定版本prover_version标识产生实现的版本。语义验证前检查器观察取消并在两个输入上应用聚合限制1024 条网络规则、4096 个端点、4096 个二进制选择器、65536 个作者端口条目、4096 条allowed_ips、16384 条 REST 规则、每个建模模式 4 KiB、建模模式文本 1 MiB。超限检查返回resource_limit不构建验证索引。跨协议歧义验证索引主机与端口权威而非比较每对端点并在扫描已接纳策略时检查取消。Rust 包含 API 有显式可扩展性契约选项与建模域证据允许增量增长而四个CheckResult状态保持穷尽授权只接受Within。该 Rust 源码兼容边界与 CLI JSON schema 及报告的建模域分离。Solver 默认 10 秒预算可用--timeout 30s调整。退出码0表示within_boundary、1表示exceeds_boundary、2表示error、3表示unsupported/inconclusive、130表示被 Ctrl-C 中断——只有 0 表示验证成功CI 中应将 unsupported 与 inconclusive 视为失败。该包含操作与下面的提案风险查询分离详见 docs/reference/policy-prover.mdx。提案证明器Proposal Prover回答的四个问题证明器对每个提议的策略变更回答四个正式问题。每个是回答成为它自己的分类发现——没有严重度分级任何类别任何一条都阻断自动审批。类别设计为大部分按底层变更互斥网关抑制capability_expansion路径中(binary, host, port)也出现在credential_reach_expansiondelta 中的路径因此全新的凭据性可达只呈现为一条发现而不是一条可达 N 条方法发现。类别定义与测试覆盖见 crates/openshell-prover/src/finding.rs 与 crates/openshell-prover/src/queries.rs。类别证明器检测……link_local_reach提案授予对169.254.0.0/16、fe80::/10或已知元数据主机名如metadata.google.internal的主机可达。无条件——云元数据端点无论沙箱状态如何都提供凭证。l7_bypass_credentialed提案让使用非 HTTP 线上协议的二进制git-remote-https、ssh、nc到达沙箱凭证在其作用域内的主机。L7 代理无法检查该线上协议由审查者决定是否信任该二进制持有凭证。credential_reach_expansion二进制获得了此前无法到达的 (host, port) 的凭据性可达。新的已认证可达是声明的意图变更审查者确认该二进制是否应认证该主机。capability_expansion在已具凭据性可达的 (binary, host, port) 上策略新增 HTTP 方法。审查者精确看到新增的方法例如 PUT并决定它是否属于 Agent 任务。凭证在作用域内是沙箱粒度而非二进制粒度若沙箱附加了target_hosts覆盖提议端点主机的 provider则视为在作用域内包括运行时式的首个标签通配符覆盖如*.github.com覆盖api.github.com。v1 不建模凭证作用域只读 vs 写存在性已足够。提案有意省略allowed_ips若提议规则目标主机解析到私有 IP代理的运行时 SSRF 分类会阻断连接。操作者随后必须添加显式allowed_ips条目以允许它——一个两步流程让 SSRF 保护默认开启。顾问提出窄增量并保留显式拒绝行为。自动审批由证明器确定性门控而非人工判断基于 LLM 的上下文审查者是有意放在确定性证明器门之上的未来扩展。安全日志OCSF 结构化事件沙箱中代表可观察行为的事件使用 OCSF 结构化日志映射如下事件OCSF 类网络与代理决策Network 或 HTTP activitySSH 认证与 relay 活动SSH activity进程生命周期Process activity策略与设置变更Configuration state change安全发现Detection finding内部管道重试、调试状态、中间步骤最终可观察事件单独记录使用普通 tracing。转发代理成功是最终可观察事件必须在中间件、令牌授予、凭证重写、策略代际检查与 HTTP relay 全部成功之后才发出使同一请求的后续拒绝不会与允许记录共存。绝不在 OCSF 消息中记录机密、凭证、不记名令牌或查询参数——OCSF JSONL 输出可能被发送到外部系统。网关本地 OCSF JSONL 文件 sink 仅限 Windows/MXC 路径并要求显式OPENSHELL_OCSF_JSON1选择加入其他网关部署不初始化该文件 sink跨平台网关 sink 需要自己的存储与配置集成。MXC ETW 进程事件的归因纪律MXC ETW 进程事件记录可执行身份但从结构化字段与消息中省略命令行参数。原始 ETW 调试摘要用[REDACTED]替换commandLine值包括 pending-buffer 逐出诊断。MXC ETW 归因绝不把命令文本当作所有权证据。它使用驱动所有的wxc-execPID 加上其内核进程启动键作为初始锚点。ETW 把该代际键附加到每条记录驱动从其子进程句柄查询同一键。PID 归因要求两个值匹配因此重用不能跨进程代际转移所有权。退役 PID 证据被丢弃已建立的身份、活动与关联向量链接在五秒迟到事件窗口内仍可入选。无匹配代际证据的记录 fail closed。实战要点速览默认拒绝无规则匹配即拒绝显式 deny 与加固检查优先于 allow。凭证默认绑定可检查表面L4-only 与tls: skip的凭据端点需要显式allow_uninspected_credentials默认 false审批流安全标记。静态 vs 动态文件系统与进程策略启动期生效、需重建沙箱网络策略可热重载。网络动态策略更新用openshell policy update做增量合并或openshell policy set做全量替换参考 docs/reference/policy-schema.mdx。策略语言参考逐字段 YAML 参考见 Policy Schema Reference独立证明器文档见 Standalone Policy Prover。网关全局覆盖要克制它会改变网关上每个沙箱的有效访问模型。OpenShell 的安全策略体系把作者意图的显式表达与运行时的严格默认拒绝连接成一个闭环解析器保证无宽松路径Landlock 与进程设置固化静态边界网络代理与 OPA 引擎热更新动态边界凭证来源推导防止未检查表面携带机密策略顾问与证明器则把每一次策略演进都置于可审计、可证明、默认需人工确认的治理流程之中。赞分享【免费下载链接】OpenShellOpenShell is the safe, private runtime for autonomous AI agents.项目地址https://gitcode.com/gh_mirrors/op/OpenShell点击查看免费下载相关推荐OpenShell 策略证明器 CLIopenshell-prover实战指南用边界包含检查守护 Agent 沙箱授权OpenShell 策略证明器 CLIopenshell prover实战指南用边界包含检查守护 Agent 沙箱授权 openshell prover如何快速搭建跨平台多点触控开发环境TUIOSimulator终极指南如何快速搭建跨平台多点触控开发环境TUIOSimulator终极指南 TUIOSimulator是一款基于Unity和C 开发的TUIO v1.1模拟器支持后端低代码Astrid 安全策略深度解读漏洞报告流程、安全边界与防护体系源码印证Astrid 安全策略深度解读漏洞报告流程、安全边界与防护体系源码印证 Astrid 是一个可移植、以能力capability为核心安全模型的组合式软件操创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考