Python代码安全执行服务

BentoRun Python MCP是一个提供安全隔离环境执行Python代码的服务器,适用于AI代理的代码执行需求。

  • by vladkol
  • Python
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 vladkol/bentorun

使用说明

🍱 BentoRun Python MCP

A. 模型上下文协议(MCP) 为执行Python代码提供安全隔离环境的服务器。

概述

BentoRun Python MCP允许AI代理在轻量级沙盒中安全执行Python代码 谷歌云运行它使用严格的沙盒方法来确保执行的代码不会干扰主机系统或MCP服务器本身,同时仍然提供对互联网和特定库的必要访问。

您可以使用它来安全地执行由任何支持以下功能的AI代理生成的Python代码 模型上下文协议, 例如 双子星命令行工具Claude Code或您自己的代理 代理开发工具包(ADK).

每个MCP会话都隔离在一个单独的沙箱中。

带gVisor的沙盒

我们使用 gVisor,一个用于容器的应用程序内核,为每个代码执行创建一个安全的环境。它在运行中的应用程序和主机操作系统之间提供了额外的隔离层。

gVisor由谷歌构建,为多租户工作负载提供强大的隔离。它实现了Linux系统表面的大部分,允许不受信任的代码在不直接访问主机内核的情况下安全运行。

gVisor使用以下功能创建安全的隔离执行环境:

1.应用程序内核(“哨兵”)

gVisor拦截应用程序系统调用,并在名为Sentry的用户空间内核中处理它们。Sentry实现了Linux内核API,但它是用Go和memory-safe编写的。这意味着:

  • 攻击面减少:应用程序不直接与主机内核通信。
  • 纵深防御:即使应用程序危及Sentry,它仍然与主机隔离。

2.文件系统代理(“Gofer”)

文件操作通过一个名为Gofer的单独进程进行代理。这确保了应用程序只访问明确允许查看的文件,并强制执行严格的隔离边界。

3.OCI兼容性

gVisor与OCI(开放容器倡议)运行时无缝集成。我们使用 runsc (gVisor运行时)为每次执行启动轻量级、短暂的沙盒,通过标准容器控件管理资源。

沙盒环境模板

我们使用沙盒环境模板来确保执行的代码在一致和安全的环境中运行。模板在中定义 env_requirements.txt 并且包括安装在沙盒环境中的包的列表。

如果您希望您的代码经常需要某些依赖关系,请通过修改来定制沙盒环境 env_requirements.txt 文件 并通过向 Dockerfile.

根据代码的复杂性,您可能还需要通过修改来扩展系统挂载列表 KNOWN_SYSTEM_MOUNTS 列入 src/sandbox.py 文件。

MCP服务器工具

BentoRun MCP向AI代理提供了一个工具: execute_python

此工具在沙盒环境中执行Python代码。其参数为:

  • 代码:要执行的Python代码。

  • 包裹:在执行代码之前,要在沙盒环境中安装的其他PyPI包的列表。

  • env变量:在沙盒环境中设置的环境变量字典。

    对于使用Google Cloud库的代码,您可以通过两种方式传递凭据:

    • 通过 CLOUDSDK_AUTH_ACCESS_TOKEN 环境变量 使用来自的访问令牌 gcloud auth print-access-token CLI命令。
    • 通过 GOOGLE_APPLICATION_CREDENTIALS 环境变量包含服务帐户密钥json文件的内容。

该工具的说明明确指出,任何输出文件都应该写入 output 子目录。 此类文件将从处理和返回 execute_python 工具作为 嵌入资源 或 图像。参见 examples/adk/adk_sandbox/agent.py 例如如何使用它。

这些文件和已安装的包在同一会话内的执行之间保留。 会话在10分钟不活动后会自动清理。

关键隔离功能

  1. 文件系统隔离:

    • 沙盒以系统根文件系统的只读视图运行。
    • 仅挂载python执行所需的特定目录(/bin, /lib, /usr等等)。
    • 临时工作区被绑定挂载为 仅 可写位置。
    • 这可以防止执行的代码修改系统文件、安装持久性恶意软件或访问MCP服务器的敏感文件。
  2. 资源限制 (通过OCI/cgroups强制执行):

    • 记忆:默认限制为512MB,通过 runsc 配置以防止OOM攻击或泄漏。
    • CPU 时间:执行时间受到严格限制(默认60秒),通过 RLIMIT_CPU 以防止无限循环锁定资源。
  3. 网络接入:

    • 沙箱可以与主机容器共享网络命名空间(可配置)。
    • 这允许代码从互联网获取数据(例如,pip安装包,进行API调用),这通常是有用任务所需的。
    • 安全说明:由于我们在一个已经有自己的网络策略的容器(Cloud Run)中运行,这是一个可以接受的权衡。在Cloud Run中,我们确保使用“无权限”服务帐户,因此代码无法访问任何Google Cloud资源,除非在代码执行请求中给出明确的身份验证令牌。
  4. 用户隔离:

    • 代码以专用非特权用户身份运行(sandboxuser,uid:1000),这使得逃离沙盒变得更加困难。

每个MCP会话都在单独的临时gVisor沙箱中执行。

代码执行流程

  1. 会话初始化:当客户端连接时,会创建一个新会话。
  2. 软件包安装:如果请求了软件包,它们将安装在沙盒环境中。
  3. 代码执行:代码在沙盒环境中执行。
  4. 输出:输出作为JSON对象返回给客户端 stdout 和 stderr 领域 其包含来自执行的各个输出。

部署和运行BentoRun MCP服务器

你需要一个 谷歌云项目 启用计费以部署MCP服务器。

  1. 确保你有 gcloud CLI已安装并配置。
  2. 使用Google Cloud进行身份验证:
gcloud auth login
  1. 复制 env.template 到 .env,并设置 GOOGLE_CLOUD_PROJECT 到您的Google Cloud项目Id。

  2. 部署MCP服务器:

./deploy.sh

该脚本将把MCP服务器部署到Cloud Run as mcp-bentorun-python 服务并提供URL。

例子

我们的MCP Cloud Run服务器采用基于IAM的身份验证进行保护。 下面的两个示例都演示了如何在Cloud Run中向MCP服务器进行身份验证。 当代理的代码在Google Cloud中运行时,它会使用元数据服务自动获取凭据。在本地运行时,您需要进行身份验证 gcloud auth login. 在这两种情况下,主叫用户都需要 云运行调用器 (roles/run.invoker)分配的角色。

普通客户端

  • 编辑 examples/mcp_client/simple_client.py 改变 SERVER_URL 发送到您部署的服务地址。
  • 运行客户端:
python3 examples/mcp_client/simple_client.py

ADK代理示例

  • 创建 .env 在 examples/adk/ 作为副本 .env.example
  • 在中设置环境变量 .env 文件:
    • GOOGLE_GENAI_USE_VERTEXAI -设置为“true”以使用顶点AI。
    • GOOGLE_CLOUD_PROJECT -设置为您的Google Cloud项目Id。
    • GOOGLE_CLOUD_LOCATION -Gemini API终点位置。保持它 global 如果你没有具体的要求。
    • BENTORUN_MCP_URL -设置为您的BentoRun MCP URL(例如。 https://mcp-bentorun-python-PROJECT_NUMBER.REGION.run.app/mcp)
    • GEMINI_API_KEY -如果您更喜欢使用Gemini API密钥,请设置 GOOGLE_GENAI_USE_VERTEXAI “假”和 GEMINI_API_KEY 到您的Gemini API密钥。
  • 安装ADK要求:
pip install -r examples/adk/adk_sandbox/requirements.txt
  • 运行代理:
adk web examples/adk

使用BentoRun MCP与Gemini CLI或Claude代码

我们的MCP Cloud Run服务器采用基于IAM的身份验证进行保护。要使用服务器,您需要:

  1. 已使用登录gcloud CLI gcloud auth login.
  2. 有 云运行调用器 (roles/run.invoker)分配给用户的角色(如果您自己部署了服务器,很可能您已经拥有了它)。
  3. 将您的身份令牌传递给MCP服务器。你可以通过跑步来获得它 gcloud auth print-identity-token -q.

为了使最后一步自动化,我们使用 mcp-remote 带有shell命令组合的MCP代理工具。

将MCP服务器添加到 双子星命令行工具 或 克劳德代码:

  • 手动进入 settings.json 适用于Gemini CLI或 .mcp.json 克劳德代码:

    {
      "mcpServers": {
        "bento-run-mcp": {
          "env": {
            "BENTORUN_MCP": "MCP_SERVER_URL"
          },
          "command": "/bin/sh",
          "args": [
            "-c",
            "ID_TOKEN=$(gcloud auth print-identity-token -q) && npx -y mcp-remote --header \"Authorization: Bearer $ID_TOKEN\" $BENTORUN_MCP"
          ]
        }
      }
    }
    
  • 或 使用CLI添加它:

    对于Gemini CLI:

    gemini mcp add \
      -e BENTORUN_MCP="MCP_SERVER_URL" \
      bento-run-mcp \
      /bin/sh -- -c 'ID_TOKEN=$(gcloud auth print-identity-token -q) && npx -y mcp-remote --header "Authorization: Bearer $ID_TOKEN" $BENTORUN_MCP'
    

    克劳德代码:

    claude mcp add bento-run-mcp \
      --scope user \
      --env BENTORUN_MCP="MCP_SERVER_URL" \
      -- /bin/sh -c 'ID_TOKEN=$(gcloud auth print-identity-token -q) && npx -y mcp-remote --header "Authorization: Bearer $ID_TOKEN" $BENTORUN_MCP'
    

替换 MCP_SERVER_URL 使用您的BentoRun MCP URL(例如。 https://mcp-bentorun-python-PROJECT_NUMBER.REGION.run.app/mcp)

免责声明

这不是Google官方支持的产品。此项目不符合 谷歌开源软件漏洞奖励计划.