本文介绍自托管环境(Self-hosted Environment)的安全责任模型、数据边界和最佳实践,帮助企业安全、平台和运维人员完成部署前安全评审。
安全责任模型
自托管环境采用共享责任模型:方舟负责控制面安全,企业负责执行面安全。
信任边界
自托管环境的信任边界位于方舟控制面与企业执行面之间:
- 方舟控制面:托管模型推理、Agent 编排、Session 管理和事件流。Tool Call 和 Tool Result 会经过控制面。
- 企业 Worker:部署在企业基础设施,轮询 Work Queue,并在企业 Sandbox 中执行主 Agent 的 bash、read、write、edit、glob 和 grep。
- 企业 Sandbox:每个 Session 应使用独立的执行环境(容器、VM 或物理机上的隔离目录)。
- 方舟侧工具:Web、MCP 和多模态工具由方舟侧执行,不受企业 Sandbox 的文件和网络策略约束。
注意
自托管不等于所有业务数据均留在企业环境。工具调用和工具结果会经过方舟控制面;Web、MCP 和多模态工具也由方舟侧执行。需要限制数据出域时,关闭不符合数据边界要求的工具,并在 Worker 或业务应用侧过滤工具结果中的敏感信息。
数据如何流动
凭证安全
凭证分离
业务应用和 Worker 当前都使用标准方舟 API Key。为缩小单个凭证的暴露面,建议分别分配独立 API Key:
警告
Worker API Key 不是 Environment 专用凭证。MA_ENVIRONMENT_ID 只用于定位 Work Queue,不会缩小 API Key 的授权范围。API Key 泄露后,攻击者可能访问该凭证有权操作的其他方舟资源。不要把任何 API Key 放入 Agent 工作目录、工具进程环境或日志。
凭证保存
- 将业务应用和 Worker 使用的 API Key 分别保存到企业 Secret Manager(如 Kubernetes Secret、HashiCorp Vault 或等效服务)
- 不将 API Key 写入代码仓库、Docker 镜像、启动脚本正文、/workspace 目录或日志文件
- 为不同部署环境或 Worker 集群分配独立 API Key,便于单独轮换、吊销和审计
- 日志中只保留凭证尾号(如 ...a1b2),不输出完整凭证
凭证轮换与吊销
- 按企业凭证策略定期轮换 Worker API Key
- 凭证泄露或人员离职时,立即吊销已有 API Key 并生成新 Key
- 轮换时先使用新 API Key 启动 Worker,确认在线后再吊销旧 Key 并停止旧 Worker
Sandbox 隔离
每个 Session 应使用独立的执行环境,防止跨 Session 数据泄露和权限越界。
基本要求
- 每个 Session 使用独立的工作目录或 Sandbox
- 使用非 root 用户运行 Worker 和 Agent 工具
- Docker Socket(/var/run/docker.sock)
- 凭证目录(如 /etc/ark/、~/.aws/)
常驻 Worker 模式
如果使用常驻 Worker(EnvironmentWorker),确保 Worker 的根工作目录只用于 Agent 执行,并让 SDK 为每个 Session 创建独立子目录。需要扩容时,优先启动多个 Worker 进程或 Pod,并为每个实例设置独立的 MA_WORKER_ID。
不要让多个 Worker 共享同一个 Session 工作目录,也不要把凭证目录、宿主机系统目录或其他业务目录作为 Worker 工作目录。
每 Session 独立 Sandbox 模式
推荐使用 Kubernetes 每 Session 一个 Pod,每个 Pod 拥有独立的文件系统、网络命名空间和资源限制。
文件系统安全
Agent 通过 Bash 和文件工具访问企业文件系统,必须限制其可访问范围:
- 限制 Agent 可读写的根目录(如 /workspace),禁止访问 /etc、/proc、/sys 等系统目录
- 防止路径穿越:校验文件路径不包含 .. 或符号链接逃逸
- 限制文件类型和数量,防止 Agent 写入大量文件耗尽磁盘
- 自定义文件工具应重复执行路径校验,确保路径在允许范围内
网络安全
自托管 Worker 仅需主动出站访问方舟 API,无需开放入站端口:
- Worker 主机只需出站 HTTPS 访问 https://ark.cn-beijing.volces.com/api/v3
- 如果主 Agent 需要通过 Bash 访问企业内网服务,配置最小权限的域名或地址白名单
- 不把数据库管理凭证直接暴露给 Agent 的工具调用
注意
企业网络策略只约束 Worker 和 Sandbox 发起的请求。web_fetch、web_search、MCP 和多模态工具由方舟侧执行,不会使用企业 Sandbox 的网络出口。评审数据出域风险时,需要单独检查这些工具的输入、凭据和结果。
工具执行安全
Worker 在企业侧执行主 Agent 的 bash、read、write、edit、glob 和 grep,建议实施以下控制:
- 校验工具名称和输入参数 Schema,拒绝未定义的 Tool Call
- 对高风险工具(如数据库写入、生产环境部署)增加人工审批或二次确认
- Worker 按 Tool Call ID 持久化执行状态和结果;重复收到同一调用时直接复用结果,不再次执行工具
- 区分只读操作与写操作,对写操作实施更严格的权限控制
- 限制 Shell 命令:禁止 sudo、chmod 777、rm -rf / 等危险命令
- 清除包含凭证的环境变量后再执行 Agent 工具
注意
- 服务端幂等边界:服务端对 Tool Result 的幂等处理只作用于结果回传,不能阻止 Worker 再次执行本地工具。Worker 要在执行前保存 Tool Call ID 和“执行中”状态,执行完成后保存结果;收到重复调用时,直接复用已有结果。
- 执行状态未知:如果 Worker 在工具已经执行、结果尚未保存时退出,恢复后无法确认发送邮件、写入数据库等副作用是否已经发生。不要自动重试这类调用,应把状态标记为未知,交由业务侧核对。
- 执行账本持久化:执行账本要放在 Worker 重启后仍能读取的存储中。Go SDK 的 EnvironmentWorker 会把账本写入 Worker 工作目录,因此该目录也要持久化。使用其他 SDK 或自定义 Worker 时,先确认当前版本是否提供等价机制;如果没有,需要自行实现。
日志与审计
建议记录
- Work Item 的 Poll、Ack、Heartbeat、Complete
- Tool Call 的名称、参数、执行时间和结果状态
日志中应关联以下标识,便于跨系统追踪:
- work_id:Work Item 标识(与 Session ID 一致)
- environment_id:Environment 标识
禁止记录
- Tool Result 中的敏感数据(如数据库查询结果、内部 API 响应)
Worker 失联与 Work 回收
Heartbeat 机制
Worker 通过 Heartbeat 维持已认领 Work Item 的租约。默认 TTL 为 300 秒,Worker 应在 TTL 过期前续租。心跳中断时,Work 会在最近一次成功心跳的租约到期并经过 60 秒宽限期后进入 stopped。
服务端不会将已认领的 Work 自动分配给其他 Worker。若 Work 因租约到期停止,认领该 Work 的原 Worker 可以在 Ack 和 Heartbeat 请求中使用同一个非空 Ark-Worker-ID,通过后续 Heartbeat 将 Work 直接恢复为 active。该过程不会重新排队。匿名 Worker、其他 Worker,以及因其他原因停止的 Work 不能通过 Heartbeat 恢复。
回收未认领 Work
reclaim_older_than_ms 是 Work 的认领超时阈值,单位为毫秒。调用 Poll 接口时,使用该参数设置 Work 被拉取后等待认领的时间。Worker 需要在该时间内调用认领 Work 接口;超时仍未认领时,该 Work 保持 queued,其他 Worker 可以再次获取。
注意
已认领的 Work 不受 reclaim_older_than_ms 影响。Worker 心跳中断后,服务端不会根据该参数将 Work 分配给其他 Worker。Worker 应检查每次 Heartbeat 响应中的 state 和 lease_extended;仅当响应为 active 且 lease_extended 为 true 时继续执行,否则立即停止并释放本地资源。
迟到 Tool Result
Work Item 进入 stopped 状态后,发送新的 Tool Result 会使 Work Item 重新进入 queued 状态,并继续驱动 Session。该行为由新的 Session 事件触发,不属于 Reclaim,也不是 Worker 失联后的自动接管。Session 进入 terminated 状态后不再接受 Tool Result,请求返回 403 OperationDenied.SessionTerminated。
上线前安全检查
部署自托管环境前,对照下表确认安全控制,并根据原因评估不满足项的风险。
安全边界
使用自托管环境时,需要明确以下安全边界:
- 方舟控制面不校验企业 Sandbox 的隔离程度,隔离责任完全在企业侧
- 方舟不监控企业 Worker 主机的安全状态(如系统漏洞、异常进程)
- 企业 Sandbox 的文件和网络策略不约束方舟侧执行的 Web、MCP 和多模态工具
- Tool Permission 等待期间,Worker 需持续维持 Heartbeat 等待用户审批