让 Agent 执行代码和 SQL,沙箱怎么设计?

第 1181 题 约 2 分钟读完

本文目录
  1. 面试怎么回答
  2. 风险有哪些
  3. 代码执行的沙箱设计
  4. SQL 执行的控制
  5. 结果的处理

面试怎么回答

代码执行我会放在独立的容器或轻量虚拟机里,每个任务一个、用完销毁;非 root 运行,数据只读挂载,只有临时目录可写;沙箱里不放任何生产凭证,需要数据就通过按用户鉴权的受控接口取;默认禁止出网,只放行内部镜像源这类白名单;CPU、内存、时长都设上限,依赖预装或只从内部镜像装。SQL 在数据库层控制:只读或以用户身份执行,执行前解析拦截 DDL 和 DML,强制 LIMIT 和分区条件,放在独立资源队列。输出限制大小、做脱敏,并记录生成的代码和执行日志。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

数据分析 Agent 经常需要自己写 Python 处理数据、写 SQL 查询。代码是模型生成的,可能有 bug,也可能被提示词注入诱导执行危险操作。面试官问沙箱,是想看你能不能在「让 Agent 有能力」和「控制风险」之间做好隔离设计。

风险有哪些

  • 删除或修改文件、数据;
  • 读取环境变量里的密钥、凭证;
  • 访问内网服务,或者把数据发到外部地址;
  • 死循环、占满 CPU 和内存,影响其他任务;
  • 安装恶意依赖包。

代码执行的沙箱设计

  1. 隔离环境:每个任务在独立的容器或轻量虚拟机里运行(比如 gVisor、Firecracker 这类强隔离方案),用完即销毁,不复用;
  2. 最小权限:非 root 用户运行,只读挂载必要的数据,只有一个临时目录可写;
  3. 不放凭证:沙箱里没有生产数据库密码和云账号密钥。需要访问数据时,通过受控的接口拿,接口按用户身份鉴权;
  4. 网络控制:默认禁止出网,需要的话只允许访问白名单地址(比如内部的包镜像源);
  5. 资源限制:CPU、内存、磁盘、运行时长都设上限,超时直接终止;
  6. 依赖管理:预装常用库,禁止运行时随意安装,或者只能从内部镜像安装。

SQL 执行的控制

SQL 一般不放沙箱,而是在数据库层控制:

  • 只读账号,或者以用户身份执行;
  • 执行前做语法解析,拦截 DDL、DML,强制 LIMIT 和分区条件;
  • 独立资源队列,设置扫描量和超时上限。

结果的处理

  • 输出的文件、图表放到指定的存储位置,限制大小;
  • 返回给模型的结果做截断和脱敏;
  • 记录完整的执行日志:生成的代码、执行时长、资源使用、输出。