fastrevmd-lab/rustpanosmcp

GitHub: fastrevmd-lab/rustpanosmcp

该异步 Rust MCP 服务器为 Palo Alto Networks PAN-OS 防火墙提供安全、可审计的远程配置与运维自动化能力,具备 bearer token 授权与候选配置生命周期管理。

Stars: 1 | Forks: 0

mechub mark

rust-panosmcp

用于 Palo Alto Networks PAN-OS 防火墙的异步 Rust Model Context Protocol 服务器
一个 mechub 项目 — 主权网络安全自动化

本仓库包含 v0.4.0 版本:一个具有结构化审计日志、受保护的 PAN-OS 候选配置生命周期、以及强化版发布打包的 bearer 保护型服务器,其身份验证和审计由共享的 [`mecmcp-auth`](https://github.com/fastrevmd-lab/mecmcp) 和 [`mecmcp-audit`](https://github.com/fastrevmd-lab/mecmcp) crate 提供。 本项目的目标是打造一个小巧、快速、面向生产环境的服务器,并具备与 `rust-junosmcp` 相同的安全态势:bearer token 身份验证、基于 token 的设备和工具作用域、TLS、严格的远程绑定拒绝规则、有限的输入和输出、可审计的更改操作,以及高效的连接复用。 架构和交付计划位于 [PLAN.md](PLAN.md)。安全边界和发布阻断控制在 [THREAT_MODEL.md](THREAT_MODEL.md) 中跟踪。 ## 工作区 ``` rust-panosmcp/ # MCP binary and stdio adapter rust-panosmcp-auth/ # bearer and secret-handling foundations rust-panosmcp-core/ # inventory, PAN-OS client, validation, tool logic config/ # secret-free inventory examples docs/ # operator guidance and phase notes fuzz/ # isolated cargo-fuzz workspace packaging/ # distroless/container and systemd assets scripts/ # release, matrix, fuzz, and benchmark gates ``` ## 快速开始 ### 安装 从三种安装路径中选择一种: #### 发布包 (Linux x86_64) 从 [GitHub releases](https://github.com/fastrevmd-lab/rustpanosmcp/releases) 下载最新版本。资产遵循 `rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz` 模式,并附带相应的 `.sha256` 文件。 ``` # 下载并验证 curl -LO https://github.com/fastrevmd-lab/rustpanosmcp/releases/download/v0.4.0/rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz curl -LO https://github.com/fastrevmd-lab/rustpanosmcp/releases/download/v0.4.0/rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz.sha256 sha256sum -c rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz.sha256 # 解压 tar xzf rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz cd rust-panosmcp-v0.4.0 # 安装二进制文件和 systemd assets sudo install -m 0755 bin/rust-panosmcp /usr/local/bin/rust-panosmcp sudo install -m 0644 packaging/systemd/rust-panosmcp.sysusers /usr/lib/sysusers.d/rust-panosmcp.conf sudo install -m 0644 packaging/systemd/rust-panosmcp.tmpfiles /usr/lib/tmpfiles.d/rust-panosmcp.conf sudo install -m 0644 packaging/systemd/rust-panosmcp.service /etc/systemd/system/rust-panosmcp.service # 创建服务用户和目录,然后启动 sudo systemd-sysusers sudo systemd-tmpfiles --create sudo systemctl daemon-reload sudo systemctl enable --now rust-panosmcp ``` 这将创建一个专用的 `rust-panosmcp` 系统用户,并配置 `/etc/rust-panosmcp`(配置目录,由 root 拥有)和 `/var/lib/rust-panosmcp`(状态目录)。解压后的压缩包在 `config/` 目录中包含配置示例 —— 在启动之前,请使用 `devices.example.json` 和 `tokens.example.json` 作为 `/etc/rust-panosmcp` 下的起始模板。有关单元详细信息,请参阅 [packaging/systemd/](packaging/systemd/)。 #### LXC (Debian 13) 对于 Proxmox 或独立 systemd-nspawn 上专用的非特权 LXC 容器,发布包包含一个幂等安装程序,可自动执行上述手动序列。 ``` # 下载并验证 curl -LO https://github.com/fastrevmd-lab/rustpanosmcp/releases/download/v0.4.0/rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz curl -LO https://github.com/fastrevmd-lab/rustpanosmcp/releases/download/v0.4.0/rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz.sha256 sha256sum -c rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz.sha256 # 解压并运行安装程序 tar xzf rust-panosmcp-v0.4.0-x86_64-unknown-linux-gnu.tar.gz cd rust-panosmcp-v0.4.0 sudo packaging/lxc/install.sh # 配置 inventory 并生成第一个 token sudo vi /etc/rust-panosmcp/devices.json sudo rust-panosmcp token add \ --tokens-file /etc/rust-panosmcp/tokens.json \ --name initial-token \ --devices fw-example \ --tools list_devices,gather_device_facts,execute_panos_op,get_panos_config # 启动服务 sudo systemctl enable --now rust-panosmcp.service ``` 该安装程序通过 `systemd-sysusers` 和 `systemd-tmpfiles` 创建 `rust-panosmcp` 用户和目录,安装二进制文件和单元,创建模式为 0600 的空 `tokens.json`,并且如果 `/var/lib/rust-panosmcp/mutation-state.json` 已存在,则永远不会覆盖它(变更集审计追踪)。端点默认监听 `http://127.0.0.1:30031/mcp`。有关环境变量覆盖和升级行为,请参见 `packaging/lxc/install.sh`。 #### Docker / GHCR 每次发布标签时,预构建的镜像都会发布到 `ghcr.io/fastrevmd-lab/rust-panosmcp`。有关构建流水线,请参见 [.github/workflows/release-image.yml](.github/workflows/release-image.yml)。 ``` # 拉取镜像 docker pull ghcr.io/fastrevmd-lab/rust-panosmcp:latest # 使用挂载的 config 运行(参见 compose.example.yaml) docker run --rm -i \ -v "$PWD/devices.json:/etc/rust-panosmcp/devices.json:ro" \ -v "$PWD/tokens.json:/etc/rust-panosmcp/tokens.json:ro" \ ghcr.io/fastrevmd-lab/rust-panosmcp:latest ``` 仓库中包含一个 `compose.example.yaml` 文件。 #### 从源码构建 需要 Rust 1.88 或更高版本 (MSRV)。 ``` git clone https://github.com/fastrevmd-lab/rustpanosmcp.git cd rustpanosmcp cargo build --release --locked ./target/release/rust-panosmcp --version ``` ### 运行 (stdio) 从 [config/devices.example.json](config/devices.example.json) 开始配置,将实际清单排除在 Git 之外,并提供所引用的环境密钥: ``` export PANOS_LAB_API_KEY='runtime-secret' cargo run --locked --release -- --device-mapping /absolute/path/devices.json ``` ### 运行(带身份验证的 streamable-http) 首先生成一个最小权限的 token,然后启动 TLS Streamable HTTP transport: ``` cargo run --locked --release -- \ --device-mapping /etc/rust-panosmcp/devices.json \ token add \ --tokens-file /etc/rust-panosmcp/tokens.json \ --name read-only-client \ --devices fw-example \ --tools list_devices,gather_device_facts,execute_panos_op,get_panos_config cargo run --locked --release -- \ --device-mapping /etc/rust-panosmcp/devices.json \ --transport streamable-http \ --host 0.0.0.0 --port 30031 \ --tokens-file /etc/rust-panosmcp/tokens.json \ --tls-cert /etc/rust-panosmcp/server.crt \ --tls-key /etc/rust-panosmcp/server.key \ --allowed-host mcp.example.net \ --allowed-origin https://client.example.net ``` 安全地捕获第一个命令的标准输出:这是新的 bearer 密钥的唯一显示。有关 token 轮换、重新加载、拒绝规则、反向代理部署和所有安全默认设置,请参见 [docs/PHASE2_OPERATIONS.md](docs/PHASE2_OPERATIONS.md)。第一阶段的清单和防火墙 TLS 详细信息保留在 [docs/PHASE1_OPERATIONS.md](docs/PHASE1_OPERATIONS.md)。 ## 状态 第一阶段实现了经过验证的清单和密钥提供程序、带有系统根证书/自定义 CA/确切叶证书锁定的严格 HTTPS、池化的异步 PAN-OS XML API 调用、类型化错误、超时、取消、输出上限以及每设备信号量。 第二阶段添加了仅摘要的 bearer token、确切的设备/工具作用域、原子化的清单/token 重载、TLS Streamable HTTP、Host/Origin 验证、有限的请求主体、IP/token 速率限制以及审计安全的请求追踪。两种 transport 都公开了四个只读工具:`list_devices`、`gather_device_facts`、`execute_panos_op` 和 `get_panos_config`。 第三阶段添加了可选的候选指纹、严格的 XPath 策略、PAN-OS 配置锁、每设备序列化、阶段/diff/完全验证、admin 作用域的部分提交/恢复、作业调节以及结构化的突变审计。写入工具需要明确的 token 作用域;`*` 保持只读。 第四阶段添加了摘要锁定的非 root 的 Distroless 镜像、强化的 systemd unit、只读部署指南、PAN-OS 发布系列矩阵、五个解析器模糊测试目标、逐字节可复现的存档、安全/运行手册文档以及发布的 Rust/Python 测量结果。 v0.2 添加了持久化的多操作变更集、特定于 token 的 XPath/操作授权和过期、规范端点序列化,以及绑定到确切所有者/设备/指纹/操作摘要的独立批准。批准的变更集在一个 PAN-OS 配置锁下应用,如果后续操作失败,则自动由 admin 恢复。然后,它们使用现有的 diff、完全验证、提交或丢弃生命周期。请参见 [docs/V0.2_CHANGE_SETS.md](docs/V0.2_CHANGE_SETS.md)。 v0.2.1 将 PAN-OS 配置锁释放变为已确认的状态转换:提交/丢弃记录仅在设备接受解锁后清除 `config_lock_held`,而失败解锁将作为 `indeterminate` 持久保存以进行显式调节。它还在 [docs/V0.2.1_ACCEPTANCE.md](docs/V0.2.1_ACCEPTANCE.md) 中记录了默认信任的 TLS 和实验室推广证据。 v0.2.2 更新了维护的 Rust 依赖图和 GitHub Actions,同时保留了 v0.2.1 的 PAN-OS 工具、授权、清单和突变状态接口。发布的发行版和受保护的实验室推广证据位于 [docs/V0.2.2_ACCEPTANCE.md](docs/V0.2.2_ACCEPTANCE.md)。Multi-vsys、HA 和 Panorama 的工作仍然推迟。 v0.3.0 将身份验证转移到了共享的 [`mecmcp-auth`](https://github.com/fastrevmd-lab/mecmcp) crate 上,退役了本仓库自己的 token、存储和 token 文件实现,转而采用一个共享的、经过独立测试的 crate。PAN-OS 工具接口、授权作用域、清单和突变状态接口保持不变。操作员可见的更改有两点:`tokens.json` 必须是模式 0600,否则服务器拒绝启动;并且磁盘上的信封版本现在在写入时会被保留,因此本版本涉及的文件对于以前的版本仍然可读。升级步骤请参见 [CHANGELOG.md](CHANGELOG.md)。 完整的 HTTPS 模拟、MCP 端到端以及显式配置的 `panosvm` 实验室防火墙验收套件均已通过。第一阶段已完成;可复现的证据记录在 [docs/PHASE1_ACCEPTANCE.md](docs/PHASE1_ACCEPTANCE.md) 中。 第二阶段验收证据记录在 [docs/PHASE2_ACCEPTANCE.md](docs/PHASE2_ACCEPTANCE.md) 中。配置突变验收位于 [docs/PHASE3_ACCEPTANCE.md](docs/PHASE3_ACCEPTANCE.md),操作员要求位于 [docs/PHASE3_OPERATIONS.md](docs/PHASE3_OPERATIONS.md)。 第四阶段发布证据位于 [docs/PHASE4_ACCEPTANCE.md](docs/PHASE4_ACCEPTANCE.md)。生产部署、轮换、备份/恢复和升级由 [docs/OPERATIONS.md](docs/OPERATIONS.md) 涵盖;另请参见 [docs/COMPATIBILITY.md](docs/COMPATIBILITY.md)、[docs/BENCHMARKS.md](docs/BENCHMARKS.md) 和 [SECURITY.md](SECURITY.md)。 ## MCP 工具参考 服务器公开了 15 个 MCP 工具,按操作类型分组: ### 只读工具 - **`list_devices`** — 列出已授权的 PAN-OS 设备和安全元数据;永远不返回 API 密钥。 - **`gather_device_facts`** — 从授权设备收集主机名、型号、序列号、版本、管理 IP 和正常运行时间。 - **`execute_panos_op`** — 在授权设备上执行根植于 `` 的只读 PAN-OS XML 命令,并带有输出上限。 - **`get_panos_config`** — 在授权设备上读取经过验证的 `/config` XPath 处的运行中或候选 PAN-OS 配置。 ### 候选生命周期工具(突变) - **`get_candidate_fingerprint`** — 返回所有操作员授权的候选子树上的 SHA-256 指纹。 - **`stage_panos_config`** — 使用预期的指纹暂存一个受策略限制的 PAN-OS 候选集/删除操作。 - **`diff_panos_candidate`** — 为确切暂存的候选指纹返回有限的 PAN-OS 更改摘要。 - **`validate_panos_candidate`** — 验证暂存的候选操作,并使相同指纹有资格进行提交。 - **`commit_panos_candidate`** — 使用确切的候选指纹仅提交已成功验证的操作。 - **`discard_panos_candidate`** — 通过 admin 作用域的部分候选恢复来丢弃暂存操作。 - **`get_panos_operation`** — 返回拥有的 PAN-OS 候选生命周期操作的安全状态。 ### 变更集工具 (v0.2+) - **`create_panos_change_set`** — 在清单和 token XPath/操作作用域下计划并持久化 1-64 个有序的 PAN-OS 候选操作。 - **`approve_panos_change_set`** — 批准未过期的确切变更集摘要;拒绝自我批准。 - **`get_panos_change_set`** — 返回确切的操作、摘要、批准、过期和操作状态,以供审查或恢复。 - **`apply_panos_change_set`** — 在一个端点/配置锁下应用独立批准的确切变更集,恢复部分失败的操作。 写入工具需要明确的 token 作用域;通配符 `*` 授权保持只读。 ## 配置 [config/](config/) 中的三个示例文件演示了配置接口: - **[`devices.example.json`](config/devices.example.json)** — 带有身份验证、TLS 验证模式(系统根证书、自定义 CA 或确切叶证书锁定)、设备级并发限制以及用于候选操作的可选 admin 覆盖的设备清单。 - **[`tokens.example.json`](config/tokens.example.json)** — Bearer token 存储结构:仅摘要存储、基于 token 的设备和工具允许列表、可选的突变授权(XPath 根、允许的操作)以及过期时间戳。 - **[`devices.mutation.example.json`](config/devices.mutation.example.json)** — 展示突变根配置和 admin 作用域候选工作流字段的清单变体。 清单文件绝不保存内联凭据:每个设备的 `api_key` 都是一个引用 — `{"type": "env", "name": "VAR_NAME"}` 用于环境变量,或 `{"type": "file", "path": "/protected/path"}` 用于模式受限的密钥文件。 ## 审计日志 v0.4.0 通过共享的 [`mecmcp-audit`](https://github.com/fastrevmd-lab/mecmcp) crate 引入了结构化的审计日志。每次工具调用都会发出一个事件,其中包含调用者归属、目标设备、结果和执行持续时间。 变更集生命周期审计提供了独立的批准证据:`approve_panos_change_set` 事件同时包含变更集 ID 和指纹摘要,证明第二个主体审查了后来通过 `apply_panos_change_set` 应用的确切摘要。 ### 审计配置标志 - **`--audit-format {json|pretty}`** — 选择 `json`(默认,机器可解析)或 `pretty`(人类可读)。 - **`--audit-log-file `** — 将审计事件写入文件路径。 - **`--audit-journald`** — 将审计事件发送到 systemd journal。 - **`--audit-redact`** — HMAC 伪匿名化已声明的字段(设备名称、调用者身份),以便日志可以发送到 SIEM,而不会泄漏操作标识符。 - **`--audit-hmac-key-file `** — 用于 HMAC 密钥的路径;启用 `--audit-redact` 时必需。 所有审计目标都是可选的,并且可以组合使用。如果未指定审计目标,则不会发出审计事件。 ## 安全性 有关完整的覆盖范围,请参见 [REAT_MODEL.md](THREAT_MODEL.md) 和 [SECURITY.md](SECURITY.md)。关键点: - **HTTP 需要身份验证** — 带有 SHA-256 摘要存储的 bearer token;不保留明文密钥。 - **默认仅支持回环** — 环回外的 HTTP 需要 TLS 或显式的 `--allow-insecure-bind`;环回外的 TLS 需要 `--allowed-host`。 - **TLS 验证始终开启** — 系统根证书、自定义 CA bundle 或确切的叶证书锁定;没有首次使用信任 (TOFU) 或禁用的验证。 - **有限的 I/O** — 输出上限(默认为 512 KiB,最大为 5 MiB)、请求主体限制(默认为 1 MiB)、所有 PAN-OS 调用的超时。 - **可审计的突变** — 候选操作按设备序列化,记录主体和指纹,在验证后需要显式提交,并持久化锁/作业状态以进行恢复。 ## CLI 参考 ``` Secure, async MCP server for PAN-OS firewalls Usage: rust-panosmcp [OPTIONS] [COMMAND] Commands: token Manage the digest-only bearer-token store state Perform offline recovery on the private mutation-state file help Print this message or the help of the given subcommand(s) Options: -f, --device-mapping Validated JSON device inventory [default: devices.json] -t, --transport MCP transport [default: stdio] [possible values: stdio, streamable-http] -H, --host Numeric bind address for Streamable HTTP [default: 127.0.0.1] -p, --port TCP port for Streamable HTTP [default: 30031] --tokens-file Absolute digest-only bearer-token file path --state-file Absolute private JSON file for persistent change-set and operation state --tls-cert Absolute PEM certificate path; requires `--tls-key` --tls-key Absolute PEM private-key path; requires `--tls-cert` --allow-no-auth Disable bearer auth for a loopback-only development listener --allow-insecure-bind Permit a non-loopback plaintext listener behind a trusted TLS proxy --allowed-host Additional accepted HTTP Host authority. Repeat for multiple values --allowed-origin Accepted browser Origin URL. Repeat for multiple values --ip-rate-per-minute Per-source-IP requests allowed per rolling minute window [default: 120] --token-rate-per-minute Per-authenticated-token requests allowed per rolling minute window [default: 240] --request-body-limit Maximum Streamable HTTP request body in bytes [default: 1048576] -h, --help Print help -V, --version Print version Token subcommands: add Mint a token, store only its digest, and print the secret once list List token names and scopes without secrets or digests revoke Revoke a named token rotate Replace a token secret while preserving its scopes State subcommands: resolve Mark an indeterminate operation terminal after manual PAN-OS reconciliation ``` ## 验证 ``` cargo fmt --all -- --check cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test --workspace --locked cargo check --manifest-path fuzz/Cargo.toml --bins --locked scripts/verify-packaging.sh ``` 使用 `scripts/build-release.sh` 创建确定性的发布存档,或者编译两次并使用 `scripts/verify-reproducible-build.sh` 要求字节一致性。容器/systemd 安装记录在操作员运行手册中。 ## 许可证 根据 [MIT](LICENSE) 授权。


a mechub project · deterministic decides · the model explains · a human approves
github.com/fastrevmd-lab

标签:Docker 部署, Rust, 可视化界面, 底层编程, 异步编程, 模型上下文协议(MCP), 网络安全, 网络流量审计, 网络运维, 请求拦截, 通知系统, 防火墙管理, 隐私保护