用 Microsoft Agent Governance Toolkit 构建生产级 AI 代理安全体系
随着 AI 编码代理(Claude Code、Codex、Cursor Agent 等)进入日常开发流程,一个关键问题浮出水面:如何确保 AI 代理在自主执行时不越过安全边界?
单纯的 prompt 安全(”请遵守规则”)本质上是对随机系统的礼貌请求。Microsoft 开源的 Agent Governance Toolkit(下称 AGT)提供了一种确定性的治理方案——在每次工具调用、消息发送、任务委派之前,用代码级别的策略引擎进行拦截,从根本上杜绝越权行为。该项目在 GitHub 上已获得 2700+ stars,覆盖 Python、TypeScript、.NET、Rust、Go 五种语言 SDK,并支持 Claude Code、Copilot CLI 等主流开发工具的即插即用集成。
AGT 的核心架构
AGT 不是一个单一工具,而是一套完整的治理栈,覆盖了 AI 代理从策略执行到审计合规的全流程:
Agent ──► Policy Engine ──► Identity ──► Audit Log
(YAML/OPA) (SPIFFE) (防篡改记录)
│ │
├── Allowed ──► Tool executes │
└── Denied ──► 策略拒绝 │
▼
决策记录
每一层都是可选的。 大多数团队从策略执行+审计日志开始,随着风险等级提升再逐步叠加更多层。
核心包包括:
| 包名 | 功能 |
|---|---|
| Agent OS | 策略引擎、能力模型、审计日志、MCP 网关 |
| Agent Mesh | 零信任身份、信任评分、A2A/MCP/IATP 桥接 |
| Agent Runtime | 四环特权隔离、Saga 编排、终止控制 |
| Agent SRE | 终止开关、SLO 监控、混沌测试、断路器 |
| Agent Compliance | OWASP 验证、策略 lint、完整性检查 |
| Agent Hypervisor | 执行计划验证、可逆性检查、增量引擎 |
| Agent Marketplace | 插件生命周期管理和信任评分 |
五分钟快速上手
安装
pip install agent-governance-toolkit[full]
或者按需安装单个包,比如只需要策略引擎的话:
pip install agent-os-kernel
策略定义
用 YAML 编写治理策略是最直观的方式:
apiVersion: governance.toolkit/v1
name: production-policy
default_action: allow
rules:
- name: block-destructive
condition: "action.type in ['drop', 'delete', 'truncate']"
action: deny
description: "破坏性操作需人工审批"
- name: require-approval-for-send
condition: "action.type == 'send_email'"
action: require_approval
approvers: ["security-team"]
两行代码集成
from agentmesh.governance import govern safe_tool = govern(my_tool, policy="policy.yaml")
如果代理尝试执行删除操作,策略引擎会立即抛出 GovernanceDenied:
>>> safe_tool(action="drop", table="users") GovernanceDenied: Action denied by policy rule 'block-destructive': Destructive operations require human approval
程序化 API
需要更精细控制时,可以使用完整的 PolicyEvaluator API:
from agent_os.policies import (
PolicyEvaluator, PolicyDocument, PolicyRule,
PolicyCondition, PolicyAction, PolicyOperator, PolicyDefaults
)
evaluator = PolicyEvaluator(policies=[PolicyDocument(
name="my-policy", version="1.0",
defaults=PolicyDefaults(action=PolicyAction.ALLOW),
rules=[PolicyRule(
name="block-dangerous-tools",
condition=PolicyCondition(
field="tool_name",
operator=PolicyOperator.IN,
value=["execute_code", "delete_file"]
),
action=PolicyAction.DENY, priority=100,
)],
)])
result = evaluator.evaluate({"tool_name": "web_search"}) # Allowed
result = evaluator.evaluate({"tool_name": "delete_file"}) # Blocked
场景实践:为 Claude Code 添加治理
如果你的团队使用 Claude Code 作为编码代理,AGT 提供了专门的治理插件:
claude --plugin-dir ./agent-governance-claude-code
这样,Claude Code 在执行任何工具调用前都会经过 AGT 策略引擎审核。例如,你可以配置策略阻止 AI 代理执行生产数据库操作:
rules:
- name: prod-db-readonly
condition: "environment == 'production' and action.type in ['write', 'delete', 'alter']"
action: deny
description: "生产库只读,写入操作需人工介入"
团队还可以配置多级信任策略——对低风险操作(文件读取、代码搜索)完全放行,中风险操作(git push、包发布)需要人工确认,高风险操作(生产数据库写入、删除文件)直接拦截。
MCP 安全网关
对于使用 MCP 的代理,AGT 的 MCP Security Gateway 能检测以下安全威胁:
- 工具投毒 —— 检测 MCP 工具的返回内容是否被篡改
- 域名抢注 —— 发现与合法工具名称相似的恶意工具
- 隐藏指令扫描 —— 检测工具描述中的隐藏指令注入
- 配置漂移监测 —— 发现 MCP 服务器配置的意外变更
在 .NET 环境中集成 MCP 治理也很简洁:
builder.Services.AddMcpServer()
.WithGovernance(options => options.PolicyPaths.Add("policies/mcp.yaml"));
CLI 工具链与 CI/CD 集成
AGT 提供了完善的 CLI 工具链,方便集成到开发工作流:
agt doctor # 检查安装状态 agt verify # OWASP 合规检查 agt verify --evidence ./agt-evidence.json --strict # CI 严格模式 agt red-team scan ./prompts/ --min-grade B # prompt 注入审计 agt lint-policy policies/ # 策略文件语法校验
在 CI pipeline 中加入 agt verify --strict,每次代码推送都会自动进行 Agentic AI 安全合规检查。配合 Shadow AI Discovery 功能,还能扫描仓库中所有未注册的代理进程和配置文件。
为什么需要确定性治理?
社区中常有声音认为”prompt 足够好就能管住 AI 代理”。但现实是:
- JailbreakBench 显示,自适应攻击对安全对齐模型的成功率接近 100%
- Andriushchenko et al., 2024 报告了 GPT-4、Claude 3、Llama-3 的 100% 攻击成功率,仅用简单的 prompt-only 攻击
- OWASP LLM01:2025 明确声明:”不存在 fool-proof 的 prompt 注入防御方法”
AGT 的哲学是:不要在 prompt 层面赢这场必输的战争。 在确定性应用代码中拦截每个工具调用,让越权行为从”不太可能”变成结构上不可能。这正是 OWASP Agentic Top 10 推荐的最佳实践,而 AGT 已经实现了对这 10 项安全威胁的全面覆盖。
最佳实践总结
- 最小权限原则:默认
deny,按需开放工具权限 - 分层治理:从策略引擎开始,逐步叠加身份认证、沙箱、监控
- CI 集成:将
agt verify --strict加入 CI 管道 - 审计日志:保留所有决策记录,便于事后追溯
- 渐进采用:先在开发环境试用,确认策略正确后再推至生产
AGT 已经在 GitHub 上开源(MIT 许可证),值得每个深度使用 AI 编码代理的团队关注和尝试。