Skip to content

网络与安全

CubeSandbox 的网络安全目标很明确:让沙箱能访问任务需要的外部服务,同时防止它访问不该访问的地址、拿到不该拿到的密钥,或绕过审计。

两层出网控制

组件能判断什么
L3/L4CubeVSIP、CIDR、DNS 学习后的目标 IP、端口和连接状态。
L7CubeEgressscheme、SNI、Host、HTTP method、path、header 注入和审计。

CubeVS 负责“能不能连到这个网络目标”;CubeEgress 负责“这个 HTTP/HTTPS 请求是否符合策略”。

基础配置字段

创建沙箱时可以传网络配置:

python
from cubesandbox import Sandbox

with Sandbox.create(
    template="<template-id>",
    allow_internet_access=False,
    network={
        "allow_out": ["api.github.com"],
        "deny_out": ["169.254.169.254/32"],
        "rules": [],
    },
) as sb:
    ...
字段说明
allow_internet_access是否默认允许公网出网。设为 False 时安装 deny-all 兜底。
allow_out允许的 IP、CIDR 或域名。域名通过 DNS 学习变成临时 IP allow。
deny_out拒绝的 IP 或 CIDR,不支持域名。
rulesHTTP/HTTPS L7 规则,由 CubeEgress 执行。

策略优先级可以先记成:allow 优先于 deny,未命中时看默认是否允许公网。

常见策略

完全禁止公网

python
Sandbox.create(
    template="<template-id>",
    allow_internet_access=False,
)

适合离线代码执行、受控评测、数据处理。

只允许固定域名

python
Sandbox.create(
    template="<template-id>",
    allow_internet_access=False,
    network={"allow_out": ["api.github.com", "*.example.com"]},
)

域名 allow-list 依赖沙箱内的 DNS 查询学习 A 记录。如果程序跳过 DNS 直接连 IP,严格模式下不会自动放行。

限制 HTTP 方法和路径

python
from cubesandbox import Rule, Match, Action

rules = [
    Rule(
        name="allow_llm_chat",
        match=Match(
            scheme="https",
            sni="api.example.com",
            host="api.example.com",
            method=["POST"],
            path="/v1/*",
        ),
        action=Action(allow=True, audit="metadata"),
    )
]

Sandbox.create(
    template="<template-id>",
    allow_internet_access=False,
    network={"rules": rules},
)

在严格出网模式下,L7 规则应包含 hostsni,这样 CubeVS 才知道要把哪个网络目标送进 CubeEgress。

凭证注入

最安全的 API Key 使用方式是:沙箱内代码不持有密钥,由 CubeEgress 在出站请求上追加 header。

python
from cubesandbox import Rule, Match, Action, Inject

rules = [
    Rule(
        name="deepseek_api",
        match=Match(
            scheme="https",
            sni="api.deepseek.com",
            host="api.deepseek.com",
            method=["POST"],
            path="/v1/*",
        ),
        action=Action(
            allow=True,
            audit="metadata",
            inject=[
                Inject(
                    header="Authorization",
                    format="Bearer ${SECRET}",
                    secret="sk_xxxxxxxx",
                )
            ],
        ),
    )
]

这样密钥不会进入:

  • 沙箱环境变量。
  • 文件系统。
  • 模型上下文。
  • 用户代码日志。

审计日志会记录注入行为,但不会记录密钥明文。

访问审计

CubeEgress 审计日志默认在:

text
/data/log/cube-egress/access.jsonl

常见字段包括时间、沙箱 IP、目的 IP/端口、host、method、path、状态码、延迟和规则名。生产环境应把这类日志纳入集中日志或 SIEM。

公开访问与 TLS

如果要让外部用户访问沙箱内的 HTTP 服务,需要理解 CubeProxy 的两种路由方式:

模式形式适用情况
Host-based<port>-<sandbox_id>.<domain>有泛域名和 TLS 配置时体验最好。
Path-based/sandbox/<sandbox_id>/<port>/...不方便配置泛域名时更简单。

生产暴露前至少完成:

安全学习清单

你要理解的问题去哪里看
L3/L4 出网策略如何合并和下发出网网络策略
CubeEgress 如何匹配请求和注入凭证安全代理
如何避免服务裸露到公网网络加固
如何配置 API Key鉴权
如何限制 WebUI / CubeAPI 对外访问限制公开访问

下一步

继续阅读 运维与排障,把安全策略和实际日志、服务状态联系起来。

微信公众号《有机系统》作者整理的个人学习笔记与教程。