2026/10/10 2:10:31

AIO Sandbox 安全加固指南:JWT 鉴权、短时票据与网络边界实践

AIO Sandbox 安全加固指南:JWT 鉴权、短时票据与网络边界实践 AI Agent后端MCP 服务浏览器控制Agent 评测【免费下载链接】sandboxAll-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container.项目地址https://gitcode.com/gh_mirrors/sandbox103/sandbox点击查看免费下载导读本文聚焦 AIO SandboxAll-in-One Sandbox for AI Agents在本地可信环境之外部署时的安全加固方案。默认情况下沙盒面向可信本地开发使用当需要暴露给网络或其他服务时必须开启鉴权并收紧访问边界。读完本文你将掌握用JWT_PUBLIC_KEY启用 Bearer token 校验的完整流程、短时票据的换取与使用方式、反向代理与网络边界的最小暴露策略以及密钥处理的最佳实践。安全模型总览默认可信暴露需加固AIO Sandbox 把浏览器、Shell、文件、MCP 与 VSCode Server 集成在同一个 Docker 容器中其核心 API如/v1/sandbox、/v1/shell/exec、/v1/file/read能力非常强。默认情况下沙盒面向可信本地开发使用此时无需额外鉴权但一旦要暴露给网络或其他服务就必须补齐三个层面身份鉴权启用 JWT Bearer token 校验或共享 token确保只有持有合法凭证的调用方可以访问 API访问边界端口绑定、反向代理、IP/网络/服务身份限制缩小暴露面凭据管理密钥的注入方式与生命周期控制避免长期密钥进入镜像或生成文件。对应环境变量的完整说明见 环境变量配置 中的「安全」小节变量默认值用途JWT_PUBLIC_KEY空启用 API 和 Web 路由的 Bearer token 校验AUTH_TOKEN空简单部署场景的共享 token取决于运行镜像是否支持JWT 鉴权用公钥验证 Bearer Token原理与角色划分设置JWT_PUBLIC_KEY即可启用 Bearer token 校验采用典型的非对称签名模式业务侧Token 签发方使用私钥签发 JWT沙盒侧Token 验证方只持有 base64 编码的公钥通过JWT_PUBLIC_KEY环境变量注入验证每个请求携带的 Bearer token。这种公私钥分离的设计保证私钥不会进入沙盒镜像业务侧可以独立控制签发策略如有效期、受众沙盒侧只负责验证。生成密钥对使用 OpenSSL 生成 2048 位 RSA 密钥对openssl genrsa -out private_key.pem 2048 openssl rsa -in private_key.pem -pubout -out public_key.pemprivate_key.pem保留在业务侧public_key.pem用于注入沙盒。启动沙盒并注入公钥通过-e JWT_PUBLIC_KEY$(base64 -w 0 public_key.pem)把公钥base64 单行编码注入容器。同时建议把端口只绑定到 localhost避免沙盒 API 直接暴露到局域网或公网docker run --security-opt seccompunconfined --rm -it \ -p 127.0.0.1:8080:8080 \ -e JWT_PUBLIC_KEY$(base64 -w 0 public_key.pem) \ ghcr.io/agent-infra/sandbox:latest说明--security-opt seccompunconfined是 AIO Sandbox 运行的必要参数浏览器等组件依赖与鉴权无关但不可省略。镜像名以当前仓库 docker-compose.yaml 与 README.md 中使用的ghcr.io/agent-infra/sandbox:latest为准。使用 Docker Compose 时仓库的 docker-compose.yaml 已预留了端口绑定与环境变量透传ports: - 127.0.0.1:${HOST_PORT:-8080}:8080 environment: JWT_PUBLIC_KEY: ${JWT_PUBLIC_KEY:-}也就是说你只需在宿主机导出JWT_PUBLIC_KEY环境变量或.env文件Compose 会自动注入容器。业务侧签发 JWT 并调用 API业务服务用私钥签发 token有效期建议按需控制例如 1 小时然后调用 API 时携带 Bearer tokencurl http://localhost:8080/v1/sandbox \ -H Authorization: Bearer $SANDBOX_TOKEN在本地验证鉴权链路的完整流程从密钥生成到请求成功可参考 鉴权指南其中包含用 shell 直接构造 RS256 JWT 的脚本base64url_encode() { openssl base64 -e -A | tr / -_ | tr -d ; } header{alg:RS256,typ:JWT} exp_time$(($(date %s) 3600)) payload{\exp\:${exp_time}} to_be_signed$(echo -n $header | base64url_encode).$(echo -n $payload | base64url_encode) signature$(echo -n $to_be_signed | openssl dgst -sha256 -sign private_key.pem | base64url_encode) jwt${to_be_signed}.${signature}并可通过curl http://localhost:8080/cdp/json/version -H Authorization: Bearer ${jwt}验证带鉴权的浏览器调试端点。生产环境中应使用成熟 JWT 库签发而不是手写脚本。共享 token 的补充场景对于简单部署场景镜像若支持还可以通过AUTH_TOKEN环境变量启用共享 token 鉴权见 环境变量配置。它不依赖密钥对适合单点信任的内网场景但共享 token 无法做细粒度的签发与吊销控制因此安全要求较高时仍应优先使用 JWT 模式。短时票据为浏览器访问与临时交接而设计为什么需要票据JWT 需要放在Authorization请求头中但浏览器直接打开 VNC、WebSocket 等页面时无法自定义请求头。此时就用「短时票据」替代先携带 JWT 通过一次带鉴权的 API 调用换取一次性票据再把票据以 URL 查询参数?ticket...形式拼接到前端访问地址中。票据应尽快过期并限制在最小必要访问范围内例如只允许访问 VNC 对应路径从而把长期 JWT 的泄露风险收敛为一个几十秒内有效的临时凭证。端点与 SDK 佐证从 SDK 源码可以看出票据功能的官方实现sdk/python/agent_sandbox/auth/raw_client.pyPOST /tickets创建并返回一个短时票据。SDK 文档明确标注这是非幂等操作每次调用都会生成一个新的唯一票据见 sdk/python/agent_sandbox/auth/client.pyGET /auth验证请求支持两种凭证——x-original-uri请求头中的票据或Authorization请求头中的 JWT。该端点专为 Nginxauth_request之类的鉴权子请求设计见 sdk/python/agent_sandbox/auth/raw_client.py。Python SDK 中的调用方式from agent_sandbox import Sandbox client Sandbox(base_urlhttp://localhost:8080) ticket client.auth.create_ticket()完整换取与使用流程前置条件服务已通过静态JWT_PUBLIC_KEY或动态模式启动并完成鉴权配置。用 JWT 换取票据票据默认有效期为 30 秒可通过TICKET_TTL_SECONDS环境变量调整ticket_response$(curl --silent -X POST http://localhost:8080/tickets \ -H Authorization: Bearer ${jwt}) ticket$(echo $ticket_response | jq -r .ticket) expires$(echo $ticket_response | jq -r .expires_in) echo 票据: ${ticket}, 有效期: ${expires}秒客户端拼接访问 URL以 VNC 为例vnc_urlhttp://localhost:8080/vnc/index.html?ticket${ticket}pathwebsockify%3Fticket%3D${ticket}浏览器打开该 URL 即可在无请求头能力的情况下完成鉴权访问。完整的可运行示例见 鉴权指南。网络边界最小暴露原则无论是否开启鉴权网络边界都是必须单独落实的一层不需要远程访问时只绑定到 localhost。例如上文-p 127.0.0.1:8080:8080或 Compose 中的127.0.0.1:${HOST_PORT:-8080}:8080让沙盒 API 只在本机可达共享环境中建议在沙盒前放置带 TLS 的反向代理。沙盒内部服务走 HTTPTLS 终结放在代理层同时可配合上文提到的GET /auth端点做auth_request鉴权子请求把「先鉴权、后转发」的职责交给代理通过 IP、网络或服务身份限制入站访问。例如防火墙只放行内网网段、Kubernetes 下用 NetworkPolicy 限定来源 Pod见 README.md 中的 Deployment 示例云环境可用安全组不要把未鉴权的沙盒 API 暴露到公网。沙盒内的 Shell 与文件 API 具备完整执行能力一旦裸奔暴露等同于把主机交给任意访客。更完整的云端部署边界建议边缘层加鉴权、启用沙盒自身 JWT 鉴权可参考 云部署指南。密钥处理凭据的生命周期管理针对可能进入沙盒容器的密钥遵循以下原则通过运行时环境变量或密钥管理系统传入密钥。沙盒的配置体系本身就建立在环境变量之上JWT_PUBLIC_KEY、AUTH_TOKEN都应通过docker run -e或 Compose 的environment注入而不是烧进镜像不要把密钥写入自定义镜像。镜像会被复制、分发和长期留存一旦打入镜像就失去吊销能力不要把长期密钥写入 Skills、Hooks、Notebook 或生成文件。这些内容可能在沙盒工作区持久化、被 Agent 读取或随上下文泄露长期密钥一旦进入就等于明文外泄任务级访问优先使用短时凭据。单个任务用几十秒有效的票据或短有效期 JWT即便被截获其影响范围也随时间自动收敛。小结从本地可信到生产可用的安全 Checklist层级措施关键配置/依据身份鉴权开启 JWT Bearer token 校验JWT_PUBLIC_KEYbase64 公钥见 环境变量配置身份鉴权简单场景共享 tokenAUTH_TOKEN临时交接浏览器/WebSocket 访问用短时票据POST /tickets?ticketTICKET_TTL_SECONDS控制有效期网络边界端口只绑 localhost、前置 TLS 反向代理、限制入站来源-p 127.0.0.1:8080:8080、GET /auth供代理auth_request使用密钥管理环境变量注入、不入镜像、不写进生成文件、优先短时凭据见 docker-compose.yaml 环境变量示例AIO Sandbox 的安全模型可以概括为一句话默认面向可信本地暴露即需鉴权。按照本文的 JWT 鉴权、短时票据、网络边界与密钥管理四步加固后沙盒的 Browser、Shell、File 等全部能力才能在受控边界内安全地开放给 Agent 与其他服务使用。赞分享AI Agent后端MCP 服务浏览器控制Agent 评测【免费下载链接】sandboxAll-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container.项目地址https://gitcode.com/gh_mirrors/sandbox103/sandbox点击查看免费下载相关推荐MeTube 安全模型与漏洞披露指南无鉴权 by design 的边界、防护与部署加固MeTube 安全模型与漏洞披露指南无鉴权 by design 的边界、防护与部署加固 MeTube 是一个自托管的视频下载服务yt dlp 的 Web U后端前端RVC语音变声完整指南用10分钟语音数据训练专属AI音色的全流程实战RVC语音变声完整指南用10分钟语音数据训练专属AI音色的全流程实战 Retrieval based Voice Conversion WebUI以下简称人工智能AI 应用语音音频深度学习从一句话需求到规范文档拆解 GPT-Pilot 的 Spec Writer从一句话需求到规范文档拆解 GPT Pilot 的 Spec Writer 凌晨一点半产品第三次改口这个功能要保留但要换个交互。你翻出三天前的需求文人工智能AI Agent代码智能体AI 应用开发工具CLI上一篇Cherry Studio 跨平台入门指南Windows/macOS/Linux 完整安装与快速上手下一篇解密Equalizer APO系统级音频处理的架构设计与实战优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考