bluerock-io/bluerock

GitHub: bluerock-io/bluerock

BlueRock 是一个零代码改动的 Python MCP 服务器运行时安全传感器,通过捕获工具调用、会话生命周期和带 SHA-256 校验的模块导入事件,为 AI 代理部署提供即插即用的安全可见性。

Stars: 29 | Forks: 5

# BlueRock MCP Python Hooks [![PyPI](https://img.shields.io/pypi/v/bluerock)](https://pypi.org/project/bluerock/) [![Python](https://img.shields.io/pypi/pyversions/bluerock)](https://pypi.org/project/bluerock/) [![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE) **轻量级 Python MCP 服务器运行时安全传感器。** 监控您的应用程序进行的 MCP 工具调用、资源访问、会话生命周期和模块导入,无需更改任何代码,即可为每一次操作发出结构化事件。 ``` pip install bluerock[oss] mkdir -p ~/.bluerock echo '{"enable": true, "mcp": true, "imports": true}' > ~/.bluerock/bluerock-oss.json python -m bluepython --oss --cfg-dir ~/.bluerock your_script.py cat ~/.bluerock/event-spool/python-*.ndjson | jq .event ``` BlueRock 会包装您的 Python 进程,并为安全敏感操作发出结构化的 NDJSON 事件。它会在您的代码运行之前的启动阶段接管 Python,因此没有任何操作会被遗漏。您的代码、您的依赖项以及它们的传递依赖项都在监控范围之内。 专为部署 MCP 代理的安全团队、AppSec 工程师和 AI 开发人员打造。无需更改一行代码,即可准确了解您的工具调用了什么、加载了哪些模块,以及在线路上传输了什么数据。适合任何想要了解其 Python 应用程序在运行时实际行为的人。 | | BlueRock | 手动日志记录 | OpenTelemetry | |---|---|---|---| | 代码更改 | 无 | 为每个调用埋点 | 添加 spans/traces | | 覆盖依赖项 | 是(传递依赖) | 仅覆盖您封装的部分 | 仅覆盖您封装的部分 | | AI/MCP 监控 | 内置(6 种事件类型) | 自己实现 | 否 | | 导入验证 | 每个模块进行 SHA256 验证 | 否 | 否 | | 输出格式 | NDJSON(结构化) | 临时格式 | OTLP | ## 环境要求 | 依赖 | 版本 | |---|---| | Python | >= 3.10 (MCP hooks 需要 3.10+) | | Rust | stable 工具链(仅限从源码构建) | | 操作系统 | Linux (x86_64, aarch64), macOS (arm64, x86_64) | | Docker | 可选,用于 Grafana 仪表盘 | ## 立即体验 ``` # 1. 克隆并设置 git clone https://github.com/bluerock-io/bluerock.git cd bluerock python3 -m venv venv && source venv/bin/activate # 2. 安装 sensor + MCP 依赖 pip install -e "acoustic/python/" pip install setuptools-rust && pip install acoustic/python-oss/ pip install mcp fastmcp # 3. 创建 sensor 配置 mkdir -p ~/.bluerock echo '{"enable": true, "mcp": true}' > ~/.bluerock/bluerock-oss.json # 4. 运行 MCP 示例(client 启动 server,两者均被监控) cd examples/mcp/ python -m bluepython --oss mcp_client.py --transport stdio # 5. 查看发生的情况 cat ~/.bluerock/event-spool/python-*.ndjson | jq '.event.meta.name' | sort | uniq -c | sort -rn ``` 您应该会看到诸如 `python_mcp_event`、`python_mcp_server_add`、`python_mcp_session_created`、`python_mcp_server_init` 和 `python_mcp_client_connect` 这样的事件——每一个 MCP 协议交互都会被自动捕获。 **也可以尝试导入监控:** ``` # 在配置中启用 imports echo '{"enable": true, "mcp": true, "imports": true}' > ~/.bluerock/bluerock-oss.json # 运行 import 监控示例 pip install requests python -m bluepython --oss examples/core-hooks/import-monitoring/import_monitoring.py # 查看加载的每个 module 及其 SHA-256 哈希值 cat ~/.bluerock/event-spool/python-*.ndjson \ | jq -r '.event | select(.meta.name == "python_import") | "\(.fullname) \(.version // "n/a") \(.sha256[0:16])..."' ``` ## 为什么选择 BlueRock 大多数运行时检测工具侧重于可观测性(追踪 API 调用、测量延迟、收集指标)。BlueRock 则侧重于**安全**:从威胁检测的角度关注那些至关重要的操作。 - **零代码更改。** 使用 `python -m bluepython --oss your_script.py` 封装任何脚本。无需导入,无需集成 SDK。一次性配置 [传感器配置](#quick-start) 即可启用您所需的 hooks。 - **双层 Hooking。** 使用 `sys.meta_path` 监控每一次模块导入(带有 SHA256 验证),使用 `wrapt` 监控 MCP 协议。[完整版](https://www.bluerock.io/try-bluerock)中提供了额外的 hook 层(进程派生、ctypes、HTTP 框架、LLM API)。 - **全面的 MCP 覆盖。** 覆盖 stdio、HTTP 和 SSE 下的工具调用、资源访问、提示请求、会话生命周期和传输连接。 - **在代码运行前进行 Hook。** 检测机制在 Python 启动时激活。您的代码、依赖项以及它们的传递依赖所产生的操作都会发出事件。 - **开源。** Apache 2.0 许可证。检查这些 hooks,贡献新的 hooks,与您自己的工具链集成。 ## 工作原理 BlueRock 通过两种机制在运行时检测您的 Python 应用程序: - **针对 MCP 协议库的 `wrapt` 猴子补丁 (monkey-patching)**。Hooks 通过 `@wrapt.when_imported()` 进行延迟应用,因此您未使用的包不会产生任何开销。 - **用于供应链可见性的 `sys.meta_path` 导入 hooks**。每个导入的模块都会记录其 SHA-256 哈希值、版本和文件路径。 每个被 hook 的操作都会向位于 `~/.bluerock/event-spool/` 的 NDJSON 日志文件发出一个结构化 JSON 事件。事件包含完整的上下文:调用了什么、使用了什么参数、来自哪个模块以及进程 ID。 ``` ┌──────────────────────────────────────────────────────────────┐ │ python -m bluepython --oss your_app.py │ │ │ │ ┌──────────────┐ ┌──────────────────┐ │ │ │ import hooks │ │ MCP hooks │ │ │ │ (SHA256, │ │ (tool calls, │ │ │ │ versions) │ │ sessions, etc.) │ │ │ └──────┬───────┘ └────────┬─────────┘ │ │ └──────────────┬────────────────┘ │ │ ▼ │ │ ┌─────────────────┐ │ │ │ bluerock-oss │ Rust DSO (libacoustic_oss) │ │ │ NDJSON writer │ │ │ └────────┬────────┘ │ │ ▼ │ │ ~/.bluerock/event-spool/*.ndjson │ └──────────────────────────────────────────────────────────────┘ │ ┌─────────────┼──────────────────┐ ▼ ▼ ▼ jq / grep Grafana + Loki Datadog / Splunk / SIEM (included) (via OTLP forwarding) ``` ## 安装 ### 选项 A:从 PyPI 安装 ``` python3 -m venv venv && source venv/bin/activate pip install bluerock[oss] python -m bluepython --help python -c "import bluerock_oss; print('DSO:', bluerock_oss.get_dso_path())" ``` 这会安装两个包: - `bluerock` — Python 传感器(hooks、检测、CLI) - `bluerock-oss` — 负责处理事件写入的 Rust DSO 后端(`libacoustic_oss.so`) ### 选项 B:从 GitHub Release Wheels 安装 对于离线安装,或者当您的平台没有可用的 PyPI wheel 时,请从 [最新发布版](../../releases/latest) 下载两个 `.whl` 文件——选择与您的 Python 版本和平台相匹配的 `bluerock_oss` wheel: ``` python3 -m venv venv && source venv/bin/activate # 从 release wheels 安装 bluerock (pure Python sensor) + bluerock-oss (Rust DSO) pip install bluerock--py3-none-any.whl pip install bluerock_oss---.whl python -m bluepython --help python -c "import bluerock_oss; print('DSO:', bluerock_oss.get_dso_path())" ``` ### 选项 C:从源码构建 适用于开发、贡献代码,或者当您的平台没有预构建的 wheel 时。 **前置条件:** Python >= 3.10、Rust 工具链、git、平台开发工具(见下方第 2 步)。 ``` # 1. 克隆仓库 git clone https://github.com/bluerock-io/bluerock.git cd bluerock # 2. 安装平台开发工具 # Amazon Linux 2023: sudo dnf groupinstall "Development Tools" # Ubuntu / Debian: sudo apt install build-essential # openSUSE: sudo zypper install -t pattern devel_basis # 3. 安装 Rust toolchain(如已安装则跳过) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh export PATH="$HOME/.cargo/bin:$PATH" rustup toolchain install stable --profile minimal # 4. 创建 virtualenv 并安装 Python sensor python3 -m venv venv && source venv/bin/activate pip install -e "acoustic/python/[test]" # 5. 构建并安装 bluerock-oss(从源码编译 Rust DSO) pip install setuptools-rust pip install acoustic/python-oss/ # 6. 安装 MCP + framework 依赖以运行示例和测试 pip install mcp fastmcp # 7. 验证 python -m bluepython --help ``` 两种安装方式都会产生相同的结果:一个正常运行的 `bluerock` + `bluerock-oss` 安装。传感器会通过已安装的 `bluerock_oss` Python 包自动发现 DSO。 ## 卸载 对于标准的 venv 安装(推荐设置),只需一条 pip 命令即可卸载: ``` pip uninstall -y bluerock-oss bluerock ``` ### 如果您启用了持久化安装 如果您还运行过 `python -m bluepython.installer install --oss` 以将传感器接入 Python 解释器启动过程(通过 `.pth` 文件,以及可选的 sitecustomize 块),请先移除它们,然后再执行 pip uninstall: ``` python -m bluepython.installer uninstall pip uninstall -y bluerock-oss bluerock ``` 两种卸载流程都会故意保留 `~/.bluerock/` 下的用户数据(传感器配置、事件池)。如果您想要彻底清除,请手动删除: ``` rm -rf ~/.bluerock ``` ## 快速入门 创建一个传感器配置以启用所需的 hooks: ``` mkdir -p ~/.bluerock cat > ~/.bluerock/bluerock-oss.json << 'EOF' { "enable": true, "imports": {"enable": true, "fileslist": true}, "mcp": true } EOF ``` 在 BlueRock 下运行任何 Python 脚本: ``` python -m bluepython --oss --cfg-dir ~/.bluerock your_script.py ``` 或者运行一个 MCP 服务器模块: ``` python -m bluepython --oss --cfg-dir ~/.bluerock your_mcp_server.py ``` 有关所有传感器选项,请参阅 [CONFIG.md](acoustic/python/CONFIG.md)。在此版本中,仅激活了 **MCP** 和 **Imports**。CONFIG.md 中列出的其余选项需要 [完整版](https://www.bluerock.io/try-bluerock)。 事件将写入 `~/.bluerock/event-spool/python-{pid}-{tid}.{generation}.ndjson`。可以使用 `jq` 读取它们: ``` # 所有 events(每行格式为 {"ts": "...", "event": {...}}) cat ~/.bluerock/event-spool/python-*.ndjson | jq .event # 仅 imports cat ~/.bluerock/event-spool/python-*.ndjson | jq '.event | select(.meta.name == "python_import")' # 仅 MCP events cat ~/.bluerock/event-spool/python-*.ndjson | jq '.event | select(.meta.name | startswith("python_mcp_"))' ``` ### 示例:NDJSON 事件追踪 运行 MCP 服务器会生成类似如下事件(每行一个 JSON 对象,包含在 `{"ts", "event"}` 中): ``` // sensor startup (lifecycle event) {"ts":"2026-04-02T10:00:00Z","event":{"meta":{"name":"sensor_startup","origin":"bluepython","sensor_id":1,"type":"sensor_lifecycle"},"pid":24241}} // MCP server initialized {"ts":"2026-04-02T10:00:00Z","event":{"context":{"process":{"pid":24241}}, "meta":{"name":"python_mcp_server_init","origin":"bluepython","sensor_id":1,"type":"event"}, "server":{"name":"test-mcp-server","version":"0.0.1"}}} // tool registered on the server {"ts":"2026-04-02T10:00:00Z","event":{"context":{"process":{"pid":24241}}, "meta":{"name":"python_mcp_server_add","origin":"bluepython","sensor_id":1,"type":"event"}, "element":{"type":"tool","name":"add","description":"Add two numbers."}}} ``` ## CLI 参考 ``` python3 -m bluepython --oss [OPTIONS] [script.py | -m module] [args...] Options: --oss Use the OSS backend (required for pip-installed bluerock) tip: auto-detected when bluerock-oss is installed if you forget. --cfg-dir DIR Load sensor config from DIR/bluerock-oss.json (see CONFIG.md) -m MODULE Run a Python module instead of a script --debug Print debug logs to stderr --install Install bluerock autostart (sitecustomize) --uninstall Remove bluerock autostart ``` ### 编程式使用 您也可以直接在 Python 代码中导入 bluepython。当您想要检测特定的入口点,而不想从命令行封装整个进程时,这非常有用: ``` import bluepython # 你的 MCP server 代码 from mcp.server.fastmcp import FastMCP mcp = FastMCP("my-server") @mcp.tool() def add(a: int, b: int) -> int: return a + b mcp.run(transport="stdio") ``` 导入后,bluepython 会在当前进程中激活其 hooks。事件照常写入到 `~/.bluerock/event-spool/`。 ### 持久化安装 (sitecustomize) ## 监控内容 ### 本版本中已激活 | 类别 | 事件 | 捕获内容 | |----------|--------|-----------------| | **MCP** | `python_mcp_server_init`, `python_mcp_server_add`, `python_mcp_event`, `python_mcp_session_created`, `python_mcp_session_terminated`, `python_mcp_client_connect` | 工具调用、资源访问、提示请求、会话生命周期、传输连接 | | **Imports** | `python_import` | 每次带有名称、路径、版本和 SHA256 的模块导入 | 框架 hooks 使用 `@wrapt.when_imported()`。Hook 模块仅在您的应用程序实际导入该框架时加载。结合针对每个功能的配置开关(`cfg.sensor_config.enabled("mcp")`),这意味着: - 未安装的框架 = 零开销(wrapt 门控) - 已禁用的功能 = 接近零开销(配置门控) - 已启用 + 已安装 = 完整监控 ### MCP 事件详情 BlueRock 捕获覆盖完整协议生命周期的 6 种 MCP 事件类型: | 事件 | 触发时机 | 显示内容 | |-------|---------------|-------------| | `python_mcp_server_init` | 服务器启动时 | 服务器名称、版本 | | `python_mcp_server_add` | 注册工具/资源/提示时 | 元素名称、类型、参数 | | `python_mcp_event` | 任何请求、响应或通知时 | 带有会话 + 方向的完整协议消息 | | `python_mcp_session_created` | 客户端或服务器会话打开时 | 会话 ID | | `python_mcp_session_terminated` | 会话关闭时 | 会话 ID | | `python_mcp_client_connect` | 客户端连接到服务器时 | 传输类型 (stdio/http/sse)、URL 或命令 | `python_mcp_event` 包含覆盖双向的 10 种子类型——完整的属性模式请参阅 [EVENTS.md](acoustic/python/EVENTS.md)。 ### 导入事件详情 每条 `import` 语句都会生成一个 `python_import` 事件: | 字段 | 显示内容 | |-------|-------------| | `fullname` | 完全限定的模块名称(例如,`urllib3.util.retry`) | | `path` | 传递给导入系统的查找路径 | | `file` | 解析后的模块的绝对文件系统路径 | | `pkg` | 顶级包名(例如,`urllib3`) | | `version` | 来自元数据的已安装包版本(如果可用) | | `sha256` | 磁盘上模块文件的 SHA-256 哈希值——检测运行间的篡改 | | `hash_changed` | 当 SHA-256 与此模块上次看到的哈希值不同时为 `true` | 这涵盖了您的代码、您的依赖项及其传递依赖项。一条简单的 `import requests` 就会为 `requests`、`urllib3`、`charset_normalizer`、`certifi` 等生成事件——每个都带有自己的 SHA-256 指纹。 请参阅 [导入监控示例](examples/core-hooks/import-monitoring/),获取带有 `jq` 查询的可运行演示。 ## 仪表盘 (Grafana + Loki) BlueRock 附带了一个 Grafana 仪表盘,可实时可视化事件。它通过 Docker Compose 在本地运行。 **您需要:** Docker、Docker Compose、Docker buildx 插件 >= 0.17.0,以及 [`just`](https://github.com/casey/just)(一个命令运行器)。 ``` # 安装 just(如尚未安装) # macOS brew install just # Linux curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin ``` ### 快速演示(无需传感器) 重放样本事件,这样您无需运行任何 MCP 服务器即可查看仪表盘: ``` cd observe/spoolfile2loki just build # or: docker build -t spoolfile2loki:latest . cd ../deploy ./deploy.sh mock # start Grafana + Loki + sample data ``` 打开 [http://localhost:3000](http://localhost:3000)(登录:`admin` / `admin`)。“BlueRock Acoustic”仪表盘会显示事件时间线、工具调用细分和会话生命周期面板。 ### 实时模式(来自传感器的真实事件) 将仪表盘指向您的实际事件池: ``` cd observe/deploy ./deploy.sh dir ~/.bluerock/event-spool ``` 现在,在另一个终端中运行 BlueRock 下的任何脚本——事件会在几秒钟内出现在 Grafana 中。 ### 停止并移除 ``` cd observe/deploy ./deploy.sh down # removes containers and volumes ``` ## 事件格式 NDJSON 日志中的每一行都是一个封装了事件并带有时间戳的信封: ``` { "ts": "2026-04-02T10:00:00.123456Z", "event": { "meta": { "name": "python_mcp_server_add", "type": "event", "origin": "bluepython", "sensor_id": 1, "source_event_id": 5 }, "context": { "process": { "pid": 12345 } }, "element": { "type": "tool", "name": "add", "description": "Add two numbers.", "parameters": { "a": "integer", "b": "integer" } } } } ``` 在读取事件时,请使用 `jq .event` 解开信封。 - `event.meta.name` — 事件类型(见上表) - `event.meta.type` — `"event"`(可操作的)、`"nonactionable"`(遥测)或 `"sensor_lifecycle"`(信息性) - `event.meta.source_event_id` — 每个进程单调递增的计数器 - `event.context.process.pid` — 进程 ID - 其余字段为特定于事件的(见 [EVENTS.md](acoustic/python/EVENTS.md)) ## 实用手册 有关可运行的演示,请参阅 [`examples/`](examples/) 目录: - **[导入监控](examples/core-hooks/import-monitoring/)** — 使用 SHA-256 哈希和版本追踪每一次模块导入 - **[MCP 示例](examples/mcp/)** — 多传输示例(stdio、带认证的 HTTP、SSE),通用客户端,天气服务器 - **[MCP 监控](examples/ai-hooks/mcp-monitoring/)** — 用于快速测试的简单客户端/服务器对 每个示例都是一个独立的脚本,您可以使用 `python -m bluepython --oss