让 Agent 执行代码和 SQL,沙箱怎么设计?
面试怎么回答
代码执行我会放在独立的容器或轻量虚拟机里,每个任务一个、用完销毁;非 root 运行,数据只读挂载,只有临时目录可写;沙箱里不放任何生产凭证,需要数据就通过按用户鉴权的受控接口取;默认禁止出网,只放行内部镜像源这类白名单;CPU、内存、时长都设上限,依赖预装或只从内部镜像装。SQL 在数据库层控制:只读或以用户身份执行,执行前解析拦截 DDL 和 DML,强制 LIMIT 和分区条件,放在独立资源队列。输出限制大小、做脱敏,并记录生成的代码和执行日志。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
数据分析 Agent 经常需要自己写 Python 处理数据、写 SQL 查询。代码是模型生成的,可能有 bug,也可能被提示词注入诱导执行危险操作。面试官问沙箱,是想看你能不能在「让 Agent 有能力」和「控制风险」之间做好隔离设计。
风险有哪些
- 删除或修改文件、数据;
- 读取环境变量里的密钥、凭证;
- 访问内网服务,或者把数据发到外部地址;
- 死循环、占满 CPU 和内存,影响其他任务;
- 安装恶意依赖包。
代码执行的沙箱设计
- 隔离环境:每个任务在独立的容器或轻量虚拟机里运行(比如 gVisor、Firecracker 这类强隔离方案),用完即销毁,不复用;
- 最小权限:非 root 用户运行,只读挂载必要的数据,只有一个临时目录可写;
- 不放凭证:沙箱里没有生产数据库密码和云账号密钥。需要访问数据时,通过受控的接口拿,接口按用户身份鉴权;
- 网络控制:默认禁止出网,需要的话只允许访问白名单地址(比如内部的包镜像源);
- 资源限制:CPU、内存、磁盘、运行时长都设上限,超时直接终止;
- 依赖管理:预装常用库,禁止运行时随意安装,或者只能从内部镜像安装。
SQL 执行的控制
SQL 一般不放沙箱,而是在数据库层控制:
- 只读账号,或者以用户身份执行;
- 执行前做语法解析,拦截 DDL、DML,强制 LIMIT 和分区条件;
- 独立资源队列,设置扫描量和超时上限。
结果的处理
- 输出的文件、图表放到指定的存储位置,限制大小;
- 返回给模型的结果做截断和脱敏;
- 记录完整的执行日志:生成的代码、执行时长、资源使用、输出。