微软 Agent Governance Toolkit 拆解:把「请 AI 守规矩」换成「让 AI 没法不守规矩」
一、速览
★★★★☆(4/5)。微软开源的 AI Agent 运行时管控套件 —— 在每次工具调用前插一道确定性闸门,让被拒绝的动作变成结构上不可能,而不是「不太可能发生」。
它不做什么:不扫代码、不评配置、也不打算在提示词里赢下越狱攻防。README 的立意原话是 —— “Prompt-level safety is not a control surface. It is a polite request to a stochastic system.”(提示词层的安全不是控制面,只是对一个随机系统的礼貌请求。)
扣的那一星在哪(详见第七章):
- Public Preview,仅 7 个月历史 —— v4.1.0 刚把 45 个包砍成 5 个发行版,API 仍在漂移
- 策略没加载时默认
allow—— 治理层会静默失效,仪表盘照样显示 “governed” kill switch在 Go SDK 里不杀进程 —— 只是合作式断路器,跨 SDK 语义还不一致
结论:企业安全 / 平台团队 —— 目前开源里合规映射最完整的一套,立刻做 PoC;个人项目 —— 为「企业治理」设计,别上。
| 主语言 | Python(3.11+;Prerequisites 一节又写 3.10+) |
| 许可证 | MIT(核心包零 Azure / 微软依赖,可离线 / 气隙运行) |
| Star / Fork | 6,351 / 1,132 |
| Open issues / watchers | 82 / 91 |
| 首次提交 | 2026-03-02 |
| 最近一次推送 | 2026-09-28(PR 编号已到 #4168) |
| 提交数 | 2,751(约 7 个月,日均 13 次) |
| 版本状态 | Public Preview,最新 release v4.1.0(2026-06-09) |
| 仓库体积 | 约 46 MB |
| 语言 SDK | Python(全栈)/ TypeScript / .NET / Rust / Go(后四者仅 core:策略、身份、信任、审计) |
| 规范与测试 | 10 份 RFC 2119 规范、992 条一致性测试、29 份 ADR、60+ 教程 |
| 合规映射 | OWASP Agentic Top 10 / NIST AI RMF 1.0 / EU AI Act / SOC 2 / AARM R1–R9 / ATF 五要素 |
| 策略求值开销 | <0.1 ms(单进程全开销);多智能体网格 5–50 ms(密码学校验 + 网络主导) |
| 地址 | https://github.com/microsoft/agent-governance-toolkit |
适合谁(5 分制):
| 人群 | 分 | 理由 |
|---|---|---|
| 企业安全运营 / CISO / GRC | 5 | 唯一把 OWASP Agentic Top 10、NIST AI RMF、EU AI Act、SOC 2、AARM、ATF 六套标准同时做成可导出证据的开源项目;agt verify --evidence --strict 能直接卡 CI,审计链是 Merkle 结构 + Decision BOM |
| Agent 应用开发者 | 4 | govern() 两行接入、框架适配覆盖 14 个(AutoGen / LangGraph / CrewAI / Semantic Kernel / OpenAI Agents / Claude Code / Dify 等);代价是要写 YAML 策略、要理解 verdict 语义 |
| 平台 / SRE 团队 | 4 | Agent SRE 那层是真东西:kill switch、SLO、error budget、chaos 测试、circuit breaker;但 kill switch 跨 SDK 语义不一致(见第七章),不能直接当保命符 |
| 红队 / 渗透 | 3 | agt red-team scan --min-grade B 是 12 向量提示注入审计,MCP Security Gateway 能查工具投毒 / 漂移 / typosquatting;但它本质是防御侧,攻击面摸底还得自己来 |
| 个人 / 小项目 | 2 | 为「企业治理」设计。官方自己说 full stack(mesh 身份 + 执行环 + SRE)对简单场景是 overkill,建议走 AgentControl.from_path() 的最小路径 |
二次开发(MIT,三档难度):
| 档位 | 干什么 | 难度 |
|---|---|---|
| 改配置 | 写 YAML 策略(block-destructive / require_approval / blocked_patterns),接框架 adapter |
低,1 小时内 |
| 改集成 | 用 TypeScript / .NET / Rust / Go SDK 把 core governance 嵌进自有平台;接 MCP Security Gateway | 中,需读 spec + 992 测试的对应章节 |
| 改内核 | 动 Rust 版 ACS 策略运行时、特权环、Merkle 审计、跨 SDK DID 标准化 | 高,10 份 RFC 2119 规范 + 29 份 ADR 是前置阅读量 |
二、是什么,不是什么
不是提示词护栏(不是让 LLM「请遵守规则」)。不是模型安全 / 内容审核(不判幻觉、不判有害内容)。不是 OS 内核级隔离(官方明说策略引擎和 agent 共享同一进程边界,生产建议每 agent 一个容器)。不是托管云服务(是一个框架无关的库)。不是「即插即用的合规方案」(官方定位是 enforcement infrastructure,不是 turnkey compliance solution)。
官方给的一句话定位:Policy enforcement, identity, sandboxing, and SRE for autonomous AI agents. One pip install, any framework.
拆成四个关键词:确定性(deterministic,不是概率性的)、失败即关闭(fail-closed,求值出错就拒绝)、防篡改审计(tamper-evident,Merkle 结构)、分层可选(每层都能单独装,多数团队只跑策略 + 审计就够)。
README 用三个问题立论,我认为这是全篇最值得抄走的思路:
- 这个动作被允许吗? OAuth scope 和 IAM role 管的是「agent 能触达哪个服务」,管不了「连上之后它做什么」。有
send_email和query_database权限的 agent,不该能drop_table。 - 是哪个 agent 干的? 五个 agent 共用一个 API key 时,出事了「某个 agent 干的」不构成事件响应。
- 你能证明发生了什么吗? 审计和监管要的是防篡改记录:当时生效的是哪条策略、agent 请求了什么、为什么被允许或被拒绝。
它引用了三份硬材料给自己背书:Andriushchenko et al.(ICLR 2025)在 JailbreakBench 上对 GPT-4o / GPT-3.5 / Claude 3 / Llama-3 报告 100% 攻击成功率(自适应攻击 + logprob 访问 + 后缀优化);OWASP LLM01:2025 直言 “it is unclear if there are fool-proof methods of prevention for prompt injection”;微软自己的 AI Red Teaming Agent 把 ASR(Attack Success Rate) 形式化为这类失败的 canonical 指标。结论是:模型层防御在构造上就是概率性的,别在那儿打。
三、四层能力拆解
官方给的流水线是 Agent → Policy Engine → Identity → Audit Log,每层可选。
| 层 | 包 | 干什么 | 关键机制 |
|---|---|---|---|
| 策略执行 | Agent OS + Agent Control Specification(Rust 核心) | 每次工具调用前求值 | 无状态、确定性、fail-closed;verdict 四态:allow / deny / transform / require_approval |
| 零信任身份 | Agent Mesh | 谁在调用、能信多少 | SPIFFE / DID / mTLS,Ed25519 签名,信任评分,委托链 |
| 执行沙箱 | Agent Runtime | 在哪儿跑、能碰什么 | 四层特权环(privilege rings),saga 编排,命令黑名单 |
| 可靠性工程 | Agent SRE | 出问题怎么收场 | kill switch、SLO、error budget、chaos 测试、circuit breaker |
另外五项是横切能力,我觉得其中两个比主层更有即时价值:
- MCP Security Gateway —— 工具投毒检测、配置漂移监控、typosquatting、隐藏指令扫描。MCP 现在是 agent 生态事实标准,也是攻击面最集中的地方,这个网关是当前开源里少见的针对性产物(127 条一致性测试)。
- Shadow AI Discovery —— 扫进程、配置、仓库里的未注册 agent。多数企业第一次治理 agent 时的真实起点是「我不知道公司里跑着几个 agent」,这个能力直接对上。
- Governance Dashboard(Streamlit 实时舰队视图)、PromptDefense Evaluator(12 向量提示注入审计)、Contributor Reputation(PR/issue 作者社工筛查,做成了可复用的 GitHub Action)。
策略长这样,语义很直白:
1 | apiVersion: governance.toolkit/v1 |
被拦时抛的是带规则名的异常,不是含糊的拒绝:
1 | GovernanceDenied: Action denied by policy rule 'block-destructive': |
四、技术架构:两行代码怎么变成一道闸门
核心是 govern() 这个包装器:
1 | from agentmesh.governance import govern |
拦截点在确定性的应用代码里,位于模型意图到达 wire 之前。 这句话是全部价值所在 —— 它把「agent 会不会作恶」从模型行为问题降级成了一次函数调用的返回值问题。策略引擎不会因为 prompt 写得更巧妙而改变判定。
底下是 ACS(Agent Control Specification):一个无状态、确定性、fail-closed 的策略决策运行时,Rust 核心。它支撑整个策略层的判定语义,也提供 AgentControl.from_path(manifest.yaml) 这种不依赖 mesh 和身份的最小接入路径。
审计侧是 Merkle 审计链 + Decision BOM(157 条一致性测试),记录的是「当时生效的策略 + agent 请求了什么 + 判定结果」。注意:记的是 attempt(尝试),不是 outcome(结果) —— 这条边界官方写在 LIMITATIONS.md 第 2 条,第七章展开。
性能账官方给得很实在,没有只报好看的那个数:
| 组件 | 典型延迟 | 何时发生 |
|---|---|---|
| 策略求值 | <0.1 ms | 每次动作 |
| Ed25519 签名校验 | 1–3 ms | 跨 agent 消息 |
| 信任分查询 | <1 ms | 跨 agent 消息 |
| IATP 握手(首次接触) | 10–50 ms | 两个 agent 间第一条消息 |
| 网络往返(mesh) | 1–10 ms | 仅分布式部署 |
单 agent 单进程时 <0.1 ms 就是全部开销;多 agent 网格下每次受治理交互 5–50 ms,且主导项是密码学校验和网络,不是策略引擎。
五、合规与规范:这是它最厚的护城河
六套标准全部做成可导出证据,且每份都有 RFC 2119 规范 + 一致性测试兜底:
| 标准 | 覆盖 |
|---|---|
| OWASP Agentic AI Top 10 | 全部 ASI 风险类别映射到确定性控制 |
| NIST AI RMF 1.0 | GOVERN / MAP / MEASURE / MANAGE 全对齐 |
| EU AI Act | 合规映射 + 自动化证据 |
| SOC 2 | 控制映射 + 审计链导出 |
| AARM Extended | R1–R9 全满足,2026-06-14 验证 |
| ATF | 五要素全映射:Agent Mesh(身份)/ Agent OS(策略)/ Agent Compliance(治理)/ Agent Runtime(沙箱)/ Agent SRE(事件响应) |
CLI 把合规变成了 CI 门禁:
1 | agt verify # OWASP 合规检查 |
992 条一致性测试 / 10 份规范 / 29 份 ADR,这个数字在开源 agent 治理项目里是断层第一。工程纪律本身也是信号:CodeQL(Python + TypeScript SAST)、Gitleaks(密钥扫描,PR/push/周级)、ClusterFuzzLite 七个 fuzz target(策略、注入、MCP、沙箱、信任)、Dependabot 13 个生态、OpenSSF Scorecard 周级评分 + SARIF 上传。
一处口径不一致值得点名:仓库 description 写 “Covers 10/10 OWASP Agentic Top 10”,README 顶部的 badge 却写 “7 Full, 3 Partial”。两者并存没给解释。以 badge 为准更稳妥 —— 十项里七项完整覆盖、三项部分覆盖。
六、部署与集成
Python 一行(用 [full] extra,base wheel 只装合规 CLI):
1 | pip install "agent-governance-toolkit[full]" |
v4.1.0 把 45 个包合并成 5 个发行版,这是最近最大的一次结构变化:-core(策略引擎 / 能力模型 / 审计 / MCP 网关 / 零信任身份 / 信任评分 / A2A·MCP·IATP 桥)、-runtime(特权环 / saga / 终止控制 / 命令黑名单)、-sre(SLO / error budget / chaos / 断路器)、-cli(agt 命令 / OWASP 校验 / 策略 lint),[full] 是装齐的元包。旧包名(agent-os-kernel、agentmesh-platform、agent-sre 等)保留为重定向 stub。
注意 agent_os 已废弃:import 会发 DeprecationWarning,替代是 agent-governance-toolkit-core。v4 之前的 agent_os.policies 规则模型已删除,BREAKING_CHANGES.md 列了替换项。
五语言安装:
| 语言 | 包 | 命令 |
|---|---|---|
| Python | agent-governance-toolkit |
pip install "agent-governance-toolkit[full]" |
| TypeScript | @microsoft/agent-governance-sdk |
npm install @microsoft/agent-governance-sdk |
| .NET | Microsoft.AgentGovernance |
dotnet add package Microsoft.AgentGovernance |
| Rust | agent-governance |
cargo add agent-governance |
| Go | agent-governance-toolkit |
go get .../agent-governance-golang |
框架适配 14 个:Microsoft Agent Framework(原生中间件)、Semantic Kernel(原生 .NET + Python)、AutoGen / LangGraph / LangChain / CrewAI / Mastra / Google ADK(Adapter)、OpenAI Agents SDK / LlamaIndex(Middleware)、Haystack(Pipeline)、Dify(Plugin)、Azure AI Foundry(部署指南)。Claude Code 和 GitHub Copilot CLI 是一等开发者面,走 TypeScript SDK:
1 | /plugin marketplace add microsoft/agent-governance-toolkit |
七、边界与风险(诚实写短板)
这一章的分量比其他章都重,因为 docs/LIMITATIONS.md 是我在开源项目里见过最诚实的一份自曝文档 —— 408 行、13 条边界、每条都写清「今天怎么缓解 / 我们正在做什么」,还把外部对它的批评原样收录(附链接)。挑最要命的六条:
① 治理的是动作,不是推理。 策略允许 read_database 也允许 send_slack_message 时,agent 可以读完客户名单再发到公开频道 —— 两个动作各自都被允许。更麻烦的是跨会话变体:攻击状态借由持久记忆或持久工具(笔记、文件、日历)跨越会话边界,在权限隔离下传递,单看每个会话都合规,完整攻击链只在会话序列上才成形。Dai et al.(preprint, 2026-05)报告四种基座模型下 80–95% 攻击成功率(供应链 SFT 投毒)。官方承认这是今天还没补上的洞(workflow-level policies 在 roadmap 上)。
② 无策略加载时默认 allow。 这是最容易静默失效的一条:策略求值器没加载任何策略时默认动作是 allow;误用 permissive 模式同样等于全放行。开发者 import 了治理层却忘了加载策略文件时,仪表盘照样显示 “governed”,而零规则生效。好消息是运行时出错时它 fail-closed(拒绝),方向是对的。缓解:生产用 strict 模式(deny-by-default,每条许可动作都要显式 allow),用 agt audit 查实际加载的策略。这条源自外部红队分析 —— Periculo 报告了 15 个绕过向量。
③ 审计记 attempt,不记 outcome。 agent 调了个 Web API 返回 200 但数据是陈旧的,审计链照样写「action allowed, executed」,而 agent 的目标其实没达成。对「能证明发生了什么」这个立论目标来说,这是个实质缺口(缓解靠 SRE 的 SLO + 应用层结果校验;post-action verification hooks 在路上)。
④ 知识治理空白。 不管 agent 消费的知识 —— RAG 取回的文档 / 数据库 / 向量的来源、时效、授权一概不验。agent 检索到一份机密 HR 文档(策略允许),再摘要发到 Slack(策略也允许),两个动作各自受治理,但机密数据流向未授权通道这件事对 AGT 完全不可见。这条来自 Mojar AI 的外部分析。
⑤ kill switch 跨 SDK 语义不一致(最容易被误读的一条)。 「kill switch」在当前实现里不是一个跨 SDK 的统一终止契约,记录到一次 kill 不等于进程真的停了:
| 行为 | Python | TypeScript | Go |
|---|---|---|---|
| 模型 | 注册终止回调 + step handoff/补偿 | 注册终止 handler + 补偿 handler | 作用域内的合作式 allow/deny 注册表 |
| 终止成功信号 | KillResult.terminated |
KillSwitchResult.terminated(只表示 handler 跑完,无独立进程确认) |
无;KillSwitchDecision.Allowed 描述的是权限,不是进程终止 |
| 能否停掉不合作的执行 | 仅当回调真的停了它 | 仅当某个 handler 真的停了它 | 不能,消费方必须自己查 DecisionFor() |
Python 里还有个坑:kill() 失败或超时后目标回调会被无条件移除,重试前必须重新 register_agent()。别把 kill switch 当保命符,它是合作式机制。
⑥ 凭证持久化空白。 不管 agent 持有哪些 API key / OAuth token。Task A 拿到的邮件 token,切到不需要邮件的 Task B 后依然留着;此时 agent 被攻陷,攻击者就拿到了本该失效的邮箱访问权。
其余七条:性能口径(<0.1 ms 只测策略引擎,不含分布式开销)、复杂度光谱(简单场景 full stack 是 overkill)、供应商独立(MIT + 零 Azure 依赖,这条其实是优点)、物理 AI 不在范围内(不提供硬件急停、力限制、安全联锁,实时控制回路 <10 ms 也未必扛得住整套治理栈)、流式数据无持续保证(只管订阅动作,不管流内消息质量)、DID 方法跨 SDK 不一致(Python/.NET 用 did:mesh:*,TypeScript/Rust/Go 用 did:agentmesh:*,按前缀匹配的策略会漏掉另一半 —— 缓解是用 did:* 通配或在应用边界归一化)、应用层而非内核层(策略引擎和 agent 同进程,生产必须每 agent 一个容器)。
官方给的定位很清醒 —— AGT 是纵深防御里的一层,不是全部:模型安全层(Azure AI Content Safety / Llama Guard)管输入输出过滤,AGT 管动作强制,应用层管业务逻辑校验,基础设施层(容器 / 网络策略 / IAM)管逃逸。
八、上手
pip install "agent-governance-toolkit[full]"(Python 3.11+),跑agt doctor确认组件齐全 —— 它同时能验证所有包都不需要云连接。- 先走最小路径再考虑全栈:
AgentControl.from_path("policies/manifest.yaml")只做原生 ACS 策略求值,不依赖 mesh 和身份。多数团队到这里就够用。 - 先写三条策略再说:一条 deny 破坏性操作(drop/delete/truncate)、一条
require_approval外发动作(send_email)、一条blocked_patterns正则兜 PII。别一上来铺满规则表。 - 生产一律
strict模式(deny-by-default)。这是唯一能防住「策略没加载 → 静默 allow」的配置方式。 - 接框架:AutoGen / LangGraph / CrewAI 走 adapter,OpenAI Agents / LlamaIndex 走 middleware,Semantic Kernel 是原生。跑
examples/里对应目录(9 个,含 CrewAI 多 agent 角色策略、MCP 信任校验服务端、K8s agent-sandbox + 预派发命令策略)。 - 把
agt verify --evidence ./agt-evidence.json --strict和agt lint-policy policies/钉进 CI。策略文件本身必须像代码一样进评审。 - 用 Claude Code 的话:
/plugin marketplace add microsoft/agent-governance-toolkit+/plugin install agt-governance@agent-governance-toolkit,一条命令就有治理插件。 - 部署形态:每 agent 一个容器(官方生产建议)。支持 Azure / AWS / GCP / Docker Compose。气隙环境可跑 —— 核心包零云依赖,治理状态全是标准格式(YAML / JSON / Ed25519 key),没有被私有格式锁住。
- 上线前先读
docs/LIMITATIONS.md(408 行,13 条)+docs/security/threat-model.md。这份文档比 README 更值得先看。
九、一句话结论
这是目前开源里「AI Agent 运行时管控」这个位置上工程纪律最扎实、合规映射最完整的一套 —— 992 条一致性测试、10 份 RFC 2119 规范、29 份 ADR、六套标准可导出证据,加上一份把外部红队批评原样收录的自曝文档,光这份诚实度就值一个星。扣掉的一星很清楚:Public Preview 且只有 7 个月历史,v4.1.0 刚完成 45→5 的包大合并(API 仍在漂移);策略没加载时默认 allow,会静默失效;kill switch 在 Go SDK 里不杀进程,跨 SDK 语义不一致;外加动作治理管不了推理、知识流和凭证持久化三个实质空白。给企业安全 / 平台团队:立刻做 PoC,从最小路径 + strict 模式起步,别一上来铺 full stack。给个人项目:这套是为企业治理设计的,你的场景大概率用不上。第一动作:pip install "agent-governance-toolkit[full]" → agt doctor → 用三条策略包住你最有风险的那个工具函数。