
如何安全运行AI生成的代码Spring AI Alibaba DataAgent的Python沙箱实践Docker隔离PEP 723动态依赖【免费下载链接】DataAgentSpring AI Alibaba DataAgent项目地址: https://gitcode.com/gh_mirrors/da/DataAgentAI 生成的 Python 代码直接跑在服务器上是许多团队的隐忧。Spring AI Alibaba DataAgent 用任务级 Docker 沙箱 PEP 723 动态依赖给出了一套面向生产的解法每次代码执行都在独立容器中运行用完即销毁依赖按声明白名单安装。本文将带你快速理解这套 Python 沙箱机制的设计思路与关键配置帮助你放心地把 AI 代码执行能力接入自己的数据问答系统。1. 为什么不能让 AI 代码裸奔大模型生成的代码可能带来三类风险安全风险代码可能读取敏感文件、访问内网、发起任意请求资源风险死循环、内存暴涨、无限下载拖垮宿主机依赖风险AI 可能顺手安装未审计的第三方包。DataAgent 的做法是把执行环境与业务主机彻底切开Python 统一通过 Spring AI Alibaba Sandbox 在任务级独立容器中执行不再提供宿主机执行或长期存活的容器池。仅当分析计划包含PYTHON_GENERATE_NODE时才会创建沙箱纯 SQL 请求不受影响。2. 一个任务一个容器Docker 隔离怎么做到的整个执行链路的核心原则是用完即销毁懒启动应用启动时不连 Docker首次执行 Python 时才启动沙箱服务避免普通单元测试依赖 Docker 在线独立容器每次任务创建新的沙箱容器前缀dataagent-sandbox-不跨 Agent、会话或重试复用可写状态资源限额容器默认非特权privileged: false并限制 CPU 1 核、内存 500 MiB、文件句柄 4096自动清理无论成功还是失败任务结束后容器都会被关闭删除应用关闭时还会全量清理防止残留。关键实现位于service/code/sandbox/目录按职责拆分为三层依赖解析PythonDependencyMetadataParser.java、PythonDependencyPolicy.java解析并校验 PEP 723 依赖声明固定引导脚本PythonSandboxBootstrapBuilder.java生成依赖安装与代码执行两个阶段的固定 bootstrap不经过 shell沙箱运行时SaaSandboxRuntime.java、SaaSandboxTaskRunner.java管理 Docker 客户端、任务沙箱与 Runner 生命周期。3. PEP 723AI 如何声明式地安装依赖AI 生成的脚本头部可以按 PEP 723 标准声明依赖例如# /// script # requires-python 3.10 # dependencies [pandas2,3, six1.17.0] # /// import pandas as pd后端用 TOML 解析器读取声明并执行严格的白名单策略规则说明数量上限最多 20 个直接依赖元数据最大 8 KiB允许PyPI 包名、extras、版本约束如pandas2,3拒绝URL、VCS、本地路径、引用、环境标记、任何 pip 参数依赖清单只是一组结构化包规格不是命令字符串。安装时由后端生成固定的python -m pip install --target /tmp/dataagent-deps --index-url 服务端配置参数列表代码、stdin、依赖和索引 URL 全部先做 Base64 编码再传入容器从根本上避免字符串拼接注入。安装目录只存在于本次任务容器内任务结束随之销毁。4. 多层防护大小、超时与并发限制沙箱在入口层就做了快失败设计超限请求连容器都不会创建防护维度默认上限Python 源码大小256 KiB输入 JSONstdin10 MiB标准输出 / 错误输出1 MiB / 256 KiB依赖安装超时 / 代码执行超时3 分钟 / 60 秒最大并发沙箱 / 等待队列4 / 10任务总超时按依赖安装超时 代码超时 30 秒通信余量统一计算见 SaaSandboxPythonCodeExecutorService.java队列满时快速失败而非无限堆积。所有限制参数都集中在 CodeExecutorProperties.java 中可通过code-executor.sandbox配置项调整。5. 失败不扩散重试、降级与降级分析执行结果被封装为统一的结构化信封success / stdout / stderr / errorType / errorMessage再由工作流映射依赖安装失败 → 不继续执行业务代码进入现有重试分支代码执行失败 → 进入重试达到python-max-tries-count默认 5 次上限后降级为普通分析避免卡死整个问答流程超时或协议异常 → 返回明确失败并立即释放沙箱。这意味着沙箱故障只影响当前任务不会污染会话状态或其他用户的请求。6. 生产上线前的加固清单当前版本已具备独立容器、非特权、资源限额、依赖白名单和自动清理能力但生产环境建议再叠加基础设施级控制网络最小化沙箱仅允许访问企业私有 PyPI 代理禁止访问公网与业务内网SAA 1.1.2.2 尚无安装后立即断网的公开 API需在基础设施层实现镜像锁定固定基础镜像 digest镜像内使用非 root 用户凭据隔离不向沙箱注入数据库、模型、OSS 或 Docker Socket 等业务凭据代理侧扫描在私有代理处做恶意包、CVE 与许可证扫描。对应的配置示例与故障排查表见 ADVANCED_FEATURES.md 的 Python 执行环境配置 章节完整设计决策含验收结果与 CI 密钥边界记录在 2026-07-28-saa-python-sandbox-integration-design.md。7. 快速验证你的沙箱是否工作在数据问答页提交一个明确要求 Python 与第三方依赖的分析任务如用 pandas 对查询结果做趋势分析满足以下 4 点即说明沙箱链路正常页面时间线出现 Python 生成、依赖安装、执行与最终报告标准输出包含依赖版本与业务 JSON 结果后端日志包含沙箱创建、依赖安装、代码执行和容器删除记录执行docker ps --format {{.Names}} | grep ^dataagent-sandbox-无残留容器输出。小结DataAgent 的 Python 沙箱实践给出了三个可复用的安全模式任务级容器隔离一次一容器、用完即毁、声明式依赖白名单PEP 723 结构化校验拒绝一切命令字符串、入口快失败大小、超时、并发层层设限。配合生产环境的网络与镜像加固AI 生成代码的执行风险被收敛到了可控边界内。如果你正在构建自己的 Data Agent这套隔离、声明、限额的组合拳值得直接借鉴。【免费下载链接】DataAgentSpring AI Alibaba DataAgent项目地址: https://gitcode.com/gh_mirrors/da/DataAgent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考