用 MCP 治理收据为 Agent 工具调用建立可验证审计链:agent-governance-toolkit 的 mcp-receipt-governed 集成实战
2026/9/18 15:48:20 网站建设 项目流程

用 MCP 治理收据为 Agent 工具调用建立可验证审计链:agent-governance-toolkit 的 mcp-receipt-governed 集成实战

【免费下载链接】agent-governance-toolkitAI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. Covers 10/10 OWASP Agentic Top 10.项目地址: https://gitcode.com/GitHub_Trending/ag/agent-governance-toolkit

本指南围绕 agent-governance-toolkit 仓库中的 mcp-receipt-governed 集成包展开,讲解如何让每一次 MCP 工具调用在通过 Cedar 策略评估后,自动产生一张加密签名的治理收据(signed governance receipt),从而把"策略决策"与"工具调用"这两个事实绑定为可验证的审计凭证。读完本文,你将掌握该包从安装、策略配置、工具调用治理、收据签名验签、哈希链完整性校验到离线审计脚本的完整用法,并理解其背后的源码实现原理。

为什么 MCP 工具调用需要"治理收据"

在 Agent 系统中,MCP(Model Context Protocol)服务器暴露的工具调用是 Agent 执行实际副作用(读写数据、删除文件、访问外部系统)的入口。传统的日志只能记录"谁在什么时间调用了什么",却无法证明:

  • 这次调用当时是否通过了策略评估(allow/deny 结论是什么);
  • 调用发生时绑定的是哪一版策略(policy id);
  • 记录本身是否被事后篡改或删改

mcp-receipt-governed 的解法是:在工具调用路径上插入一个McpReceiptAdapter,它先执行 Cedar 策略评估,再把"工具名、Agent DID、策略 ID、决策结论、参数哈希、时间戳"等字段打包成一张 GovernanceReceipt,用 Ed25519 私钥签名后存入收据存储。任何一方拿到收据,都可以独立验签、验证哈希链,从而得到抗抵赖、可审计、可复现的 Agent 操作凭证。

快速开始:让第一个工具调用产生签名收据

README 中的 Quick Start 可以直接运行。核心入口是McpReceiptAdapter,构造时传入 Cedar 策略文本、策略 ID 和 Ed25519 签名种子:

from mcp_receipt_governed import McpReceiptAdapter adapter = McpReceiptAdapter( cedar_policy=""" permit(principal, action == Action::"ReadData", resource); forbid(principal, action == Action::"DeleteFile", resource); """, cedar_policy_id="policy:mcp-tools:v1", signing_key_hex="a" * 64, # Replace with real Ed25519 seed ) # Govern a tool call — produces a signed receipt receipt = adapter.govern_tool_call( agent_did="did:mesh:agent-1", tool_name="ReadData", tool_args={"path": "/data/report.csv"}, ) print(f"Decision: {receipt.cedar_decision}") print(f"Receipt ID: {receipt.receipt_id}") print(f"Signed: {receipt.signature is not None}")

运行这段代码会得到Decision: allow、一个 UUID 形式的receipt_id,以及Signed: True。参数说明:

参数类型含义与取值
cedar_policystrCedar 策略文本,支持permit(...)/forbid(...)规则
cedar_policy_idstr策略版本标识,会写入收据,默认"default"
signing_key_hexstr32 字节 Ed25519 私钥种子的十六进制串(64 个 hex 字符);传None则不签名
storeReceiptStore可选的共享收据存储,默认新建内存存储
session_idstr可选会话 ID,用于把同一会话的收据串成链,默认自动生成 UUID

signing_key_hex="a" * 64只是演示占位符,生产环境必须替换为真实的随机种子(可通过cryptographyEd25519PrivateKey.generate()导出)。

安装与运行环境

README 提供了两种安装方式,均从仓库根目录执行:

# From the repository root — 仅标准库,收据不签名 pip install -e agent-governance-python/agentmesh-integrations/mcp-receipt-governed # With Ed25519 signing support — 启用密码学签名 pip install -e "agent-governance-python/agentmesh-integrations/mcp-receipt-governed[crypto]"

从 pyproject.toml 可以看出该包的设计取向:

  • 包名为agentmesh_mcp_receipts,当前版本5.0.0,要求Python >= 3.11
  • dependencies = []:核心功能(策略解析、收据生成、内存存储、哈希)零第三方依赖,只用标准库即可运行;
  • [crypto]extra 安装cryptography>=46.0.7,<48.0,用于 Ed25519 签名与验签;
  • [dev]extra 额外包含pytest>=7.0,用于运行测试。

也就是说:不装cryptography也能完成策略评估与收据生成,但收据不带签名(signature is None);要获得非抵赖能力必须安装[crypto]

核心架构:一次工具调用的完整治理链路

README 给出了该适配器的内部架构,其数据流如下:

MCP Tool Call │ ▼ ┌────────────────────┐ │ McpReceiptAdapter │ │ ┌──────────────┐ │ │ │ Cedar Policy │──┼──▶ allow / deny │ │ Evaluator │ │ │ └──────────────┘ │ │ ┌──────────────┐ │ │ │ Receipt │──┼──▶ GovernanceReceipt │ │ Generator │ │ (tool, agent, policy, decision) │ └──────────────┘ │ │ ┌──────────────┐ │ │ │ Ed25519 │──┼──▶ Signed receipt │ │ Signer │ │ │ └──────────────┘ │ │ ┌──────────────┐ │ │ │ ReceiptStore │──┼──▶ Audit trail │ └──────────────┘ │ └────────────────────┘

对照 adapter.py 的McpReceiptAdapter.govern_tool_call实现,这条链路被拆为四个明确步骤:

  1. 策略评估CedarPolicyEvaluator.evaluate(tool_name, {"agent_did": ..., "resource": ...})得到 allow/deny;
  2. 收据生成:把tool_nameagent_didcedar_policy_idcedar_decisionargs_hashsession_idparent_receipt_hash组装成GovernanceReceipt
  3. 签名:若配置了signing_key_hex,调用sign_receipt()对规范化载荷做 Ed25519 签名;签名失败时抛出ReceiptSigningError(fail-closed,绝不静默放行);
  4. 入链存储store.add(receipt)追加到线程安全的审计存储。

源码级解析:收据的数据模型与密码学细节

GovernanceReceipt:收据到底记录了什么

GovernanceReceipt 是一个@dataclass,字段如下:

字段说明
receipt_idUUID v4,唯一标识本次收据
tool_name被治理的 MCP 工具名
agent_did发起调用的 Agent 去中心化标识(如did:mesh:agent-1
cedar_policy_id决策所用的策略版本 ID
cedar_decision"allow""deny"(默认"deny",即默认拒绝)
args_hash工具参数的 SHA-256 哈希
timestampUnix 时间戳
session_id可选会话 ID
parent_receipt_hash前一张收据的载荷哈希,构成哈希链
signature/signer_public_keyEd25519 签名与签名者公钥
error可选的执行错误信息

RFC 8785(JCS)规范化:让哈希可复现

签名与哈希的前提是"同一个收据在任何环境下序列化结果都完全一致"。canonical_payload()实现了 RFC 8785 JCS(JSON Canonicalization Scheme)风格序列化:

  • sort_keys=True按键排序,消除键序不确定性;
  • separators=(",", ":")紧凑输出,不带多余空白;
  • ensure_ascii=False,按 RFC 8785 §3.2.2.2 保留原始 UTF-8 字符而非\uXXXX转义;
  • 签名相关字段(signaturesigner_public_key)被排除在载荷之外,因为它们恰恰是被签名的对象,不能自引用。

payload_hash()即对规范化载荷取 SHA-256。测试 test_receipt.py 验证了载荷的确定性、键序排序、Unicode 原样保留(中文、阿拉伯文、emoji 均不转义)等性质。

工具参数的哈希由hash_tool_args()完成:同样先做 canonical JSON(sort_keys=True)再 SHA-256,None{}产生相同哈希,键序不影响结果,不同参数内容产生不同哈希。

Ed25519 签名与验签

sign_receipt()从 hex 编码的 32 字节种子恢复Ed25519PrivateKey,对canonical_payload()的字节串签名,并把签名与派生公钥写回收据;verify_receipt()则用收据自带的公钥验签,未签名或签名无效时返回False

从测试 test_receipt.py 的TestSignVerify可以看到关键对抗场景均被覆盖:篡改cedar_decision后验签失败、伪造签名失败、未签名直接返回False

哈希链:检测插入、删除与重放

每一张收据都记录parent_receipt_hash(前一收据的payload_hash())。verify_receipt_chain()对一个有序收据列表执行完整校验并返回错误列表(空列表 = 全部通过):

  • 首条收据不允许有parent_receipt_hash
  • 每条收据的父哈希必须等于前一条的payload_hash()连续性);
  • 不允许重复receipt_id(防止重放攻击);
  • 有签名则验签,公钥格式畸形或签名无效即报错;
  • 提供trusted_keys时,只接受列表内的可信签名者,否则拒绝。

测试TestVerifyReceiptChain演示了:删除中间收据[r1, r3])会被"哈希链断裂"捕获,插入伪造收据[r1, evil, r2, r3])同样被捕获,篡改工具名会使签名校验失败。这意味着审计方无需重放完整会话日志,仅凭哈希链即可发现任何增删改。

ReceiptStore:内存审计仓库

ReceiptStore 是线程安全(内部threading.Lock)的内存存储,提供:

  • add():追加收据,重复receipt_id直接抛ValueError(防重放);
  • query(agent_did, tool_name, cedar_decision):按 Agent、工具、决策结论组合过滤;
  • export():导出为字典列表(含payload_hash),可直接落盘;
  • get_stats():返回totalalloweddeniedunique_agentsunique_tools统计;
  • clear()/count:清空与计数。

多个适配器可共享同一个ReceiptStore(测试test_shared_store验证了两个 adapter 写入同一 store 的场景)。

收据与 SLSA 供应链凭证的衔接

GovernanceReceipt.to_slsa_provenance()可以把收据转换为in-toto Statement v1 / SLSA provenance v1谓词:subject是工具(pkg:agentmesh/tool/<name>,digest 为args_hash),resolvedDependencies指向父收据哈希,buildDefinition记录agent_didcedar_policy_idcedar_decision。这为把 Agent 操作纳入供应链可追溯体系(如 SBOM、凭证归档)提供了标准接口。

实战模式:治理后执行(govern_and_execute)

除"先治理、后由外部执行"的govern_tool_call外,适配器还提供govern_and_execute(),把策略检查、收据生成与工具执行封装为一个完整生命周期:

def read_data(path: str = "") -> str: return f"data from {path}" receipt, result = adapter.govern_and_execute( agent_did="did:mesh:agent-1", tool_name="ReadData", tool_fn=read_data, tool_args={"path": "/data/report.csv"}, ) print(receipt.cedar_decision, result)

从 adapter.py 的实现看,其语义是:

  • 决策为allow时才调用tool_fn(**tool_args)
  • 工具执行抛异常时,工具本身不再执行副作用denytool_fn根本不会被调用),异常会被捕获并写入receipt.error = "execution_failed: ...",收据仍然留档。

测试 test_adapter.py 的TestGovernAndExecute明确验证了三个关键断言:允许的工具正常执行并返回结果、被拒的工具call_count == 0(从未被调用)、执行异常被记录到收据。

策略评估的两种路径与默认拒绝语义

CedarPolicyEvaluator的评估逻辑分两层(源码 adapter.py):

  1. 首选 agentmesh 内置评估器:若环境中安装了agentmesh.governance.cedar.CedarEvaluator,则委托其做完整 Cedar 策略求值;
  2. 回退内联解析ImportError时退化为对策略文本的正则解析,按forbid优先于permit的顺序判断动作是否被允许,并支持permit(principal, action, resource);全放行规则。

需要特别强调的是**默认拒绝(default deny)**语义,测试TestPolicyEvaluation给出了四条明确结论:

  • 明确permit的动作 →allow
  • 明确forbid的动作 →deny
  • 策略未列出的动作 →deny
  • 空策略(cedar_policy="")→ 一律deny

这意味着策略的疏漏不会导致越权放行,符合 fail-closed 的安全基线。

离线审计:用 verify_receipts.py 验证收据链

仓库自带了离线验证脚本 verify_receipts.py,它无需网络即可从ReceiptStore.export()导出的 JSON 文件重建收据链并逐条校验:

# 将 ReceiptStore.export() 的列表保存为 receipts.json 后执行 python agent-governance-python/agentmesh-integrations/mcp-receipt-governed/scripts/verify_receipts.py receipts.json # 结构化输出,适合接入 CI/CD python agent-governance-python/agentmesh-integrations/mcp-receipt-governed/scripts/verify_receipts.py receipts.json --json

脚本对每条收据依次检查:哈希链是否连续(parent_receipt_hash是否等于上一条payload_hash)、导出时附带的payload_hash是否与重建值一致、Ed25519 签名是否有效。退出码约定:0= 全部通过、1= 链存在完整性错误、2= 文件加载失败。未签名的收据会给出⚠️ Unsigned receipt警告而不会误判为通过。这一工具让"事后审计"成为一条独立、可自动化、可入 CI 的检查线。

运行测试验证实现

README 给出的测试方式:

cd agent-governance-python/agentmesh-integrations/mcp-receipt-governed pip install -e ".[dev]" pytest tests/ -v

测试集 test_adapter.py 与 test_receipt.py 覆盖策略评估、收据字段、签名/验签往返、哈希链完整性(删除/插入/篡改/重放检测)、可信签名者白名单、存储查询统计与 SLSA 输出结构,可在不安装任何 MCP SDK 或 AgentMesh 的情况下独立验证适配器逻辑,是理解该包行为的活文档。

安全要点小结

  • 签名失败即失败关闭sign_receipt异常会向上抛ReceiptSigningError,不会产生未签名却宣称已治理的收据(测试test_signing_failure_raises验证了该路径);
  • 默认拒绝:未列出的动作、空策略一律deny,策略覆盖不足不会导致越权;
  • 哈希链防篡改:删除、插入、重放收据均可被verify_receipt_chain检测,配合trusted_keys可限定可信签名者;
  • 规范化保证可复现:RFC 8785 JCS 序列化 + SHA-256,任何环境重建的哈希一致;
  • 收据不泄露参数原文:工具参数只以args_hash形式入库,避免敏感参数明文落盘。

本文所述实现均可直接查看 mcp_receipt_governed 包源码 与其 测试目录 进行印证。该集成包遵循 MIT 许可(参见 agentmesh-integrations/LICENSE),并作为 AgentMesh 生态的平台插件之一维护,更多生态背景可参阅 agentmesh-integrations 总览。

【免费下载链接】agent-governance-toolkitAI Agent Governance Toolkit — Policy enforcement, zero-trust identity, execution sandboxing, and reliability engineering for autonomous AI agents. Covers 10/10 OWASP Agentic Top 10.项目地址: https://gitcode.com/GitHub_Trending/ag/agent-governance-toolkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询