2026 年 8 月 12 日,AWS 开源策略语言 Dogwood(Apache 2.0)——在自有授权语言 Cedar 的基础上增加时序条件(temporal condition)能力,目标是治理 AI 智能体的多步工具调用序列:不只判断「这一次调用允不允许」,还能判断「这一串调用整体合不合规」。典型场景包括防止 Agent 用并发请求绕过限额、约束调用顺序与资源配额。目前已集成到 Bedrock AgentCore Policy。本教程从语言基础、第一条策略、防并发绕行、顺序约束讲到集成与测试。
先搞懂:为什么「单请求授权」管不住智能体?
传统权限模型是「一次请求,一次判定」。但智能体会自主地连续调用一串工具:读文件 → 查数据库 → 调支付 → 发通知。单看每一次调用都合法,串起来却可能违规——比如 100 个并发请求绕过「每分钟 60 次」的限额,或先付款后审批这种顺序颠倒。Dogwood 的思路是把策略从「点」升级到「序列」:
| 维度 | Cedar(单请求) | Dogwood(序列治理) |
|---|---|---|
| 判定对象 | 单次动作 | 多步工具调用序列 |
| 时序感知 | 无 | 支持时间窗、先后顺序、计数约束 |
| 典型问题 | 单次是否越权 | 并发绕限额 / 顺序颠倒 / 配额超支 |
| 集成 | AWS 服务授权 | Bedrock AgentCore Policy 等 Agent 场景 |
Step 1:语言基础:Cedar 子集 + 时序条件
Dogwood 以 Cedar 为底座,学过 Cedar 的同学可以直接上手;核心新增是时序条件:
策略结构(概念):
permit (principal, action, resource)
when { 条件表达式 } ← 静态条件
when { 时序条件 } ← 新增:时间/顺序/计数
时序条件示例:
· 时间窗:仅在 09:00-18:00 允许
when { time_in_range(now(), "09:00", "18:00") }
· 顺序:必须先「审批」再「付款」
when { occurred_before(action.pay, action.approve) }
· 计数:同一 Agent 每分钟工具调用 ≤ 60 次
when { call_count(agent, window=60s) <= 60 }
Step 2:第一条策略:从「允许谁调什么」开始
先写最基础的动作级策略,再叠加时序:
示例:允许客服 Agent 读工单、拒绝删工单
permit (
principal in Agent::"cs_agent",
action in [Action::"ticket.read"],
resource in Ticket::*
);
deny (
principal in Agent::"cs_agent",
action in [Action::"ticket.delete"],
resource in Ticket::*
);
测试习惯:
· 正向:cs_agent 读工单 → 允许
· 反向:cs_agent 删工单 → 拒绝
· 边界:其他 Agent 读工单 → 拒绝
Step 3:防并发绕行:用计数条件堵住「拆单」漏洞
Agent 最经典的越限手法是并发拆单:单次不超限,100 个并发就绕过了限额。Dogwood 用时间窗计数治理:
防并发绕限策略(概念):
permit (principal, action, resource)
when {
call_count(principal, action.category,
time_window=1min) <= 60
};
效果:
· 同一 Agent 60 秒内同类调用超过 60 次 → 拒绝
· 并发请求在策略层被统一计数,而非各算各的
· 配额按 Agent / 按类别 / 按时间窗自由组合
监控:
· 拒绝次数与拒绝原因要进日志
· 高频触发阈值说明任务设计有问题,
应回到任务拆分而非一味放宽配额
别把阈值拍脑袋:先用两周真实调用数据画出分布,再定配额;定完要配套告警——「策略拒绝率突增」和「业务真实增长」要能区分开。
Step 4:顺序与依赖约束:管住「先斩后奏」
很多业务规则本质是顺序约束:先审批后付款、先备份后删除、先测试后发布。Dogwood 的时序条件直接表达:
顺序约束示例:
· 付款必须在审批之后
deny (principal, action, resource)
when { !occurred_before(action.pay, action.approve) };
· 删除前必须已有备份
deny (principal, action in [Action::"data.delete"],
resource)
when { !occurred_before(action.backup, action.delete) };
· 发布前必须通过测试
deny (principal, action in [Action::"app.deploy"],
resource)
when { !occurred_before(action.test_pass, action.deploy) };
Step 5:集成 Bedrock AgentCore Policy:把策略挂到 Agent 执行链上
Dogwood 已集成到 Bedrock AgentCore Policy——AWS 托管 Agent 运行时可以直接引用策略:
集成路径(概念):
① 在 AgentCore 中定义 Agent 与工具集
② 编写 Dogwood 策略(时序条件规则)
③ 挂载到 Agent 的 Policy 配置
④ Agent 每次工具调用前,运行时执行策略判定
· 单次动作 → 动作级判定
· 序列动作 → 时序/计数/顺序判定
⑤ 拒绝事件写入审计日志,可回放
适用场景:
· Bedrock 生态的多步骤工作流
· 需要「策略即代码」可版本化的企业治理
开源 ≠ 免集成:Dogwood 语言本身开源,但「谁执行策略、日志去哪、告警怎么接」取决于你的运行时。Bedrock 场景走 AgentCore;自建场景要自己接策略引擎与审计管道。
Step 6:测试与上线:策略也要有 CI
治理策略上线前,按软件工程的规格对待:
测试矩阵(每个策略至少 4 个用例):
· 正向:符合条件 → 允许
· 反向:违反条件 → 拒绝
· 边界:刚好等于阈值 → 按设计判定
· 时序:乱序/并发/超窗 → 拒绝
上线步骤:
① 模拟环境灰度:用回放流量跑一遍策略
(把真实调用日志喂给策略引擎,看误杀率)
② 小流量观察:策略拒绝率 vs 业务基线
③ 全量上线:拒绝原因可查、可申诉、可回滚
④ 周期性回归:Agent 新增工具时重跑测试矩阵
常见问题速查
| 你的疑问 | 参考答案 |
|---|---|
| Dogwood 是什么? | AWS 8-12 开源(Apache 2.0)的策略语言,在 Cedar 基础上增加时序条件,治理智能体多步工具调用序列 |
| 和 Cedar 什么关系? | Dogwood 以 Cedar 为底座扩展;学过 Cedar 可直接上手,核心新增是时间/顺序/计数类条件 |
| 能解决什么问题? | 并发请求绕限额、调用顺序颠倒、资源配额超支等「序列级」违规——单请求授权管不了的问题 |
| 必须用 AWS 吗? | 语言与实现开源;已集成 Bedrock AgentCore Policy,自建环境需自行接入策略引擎 |
| 策略能测试吗? | 可以,把策略当代码:配套正向/反向/边界/时序用例,支持 CI 回归 |
| 和沙箱(E2B/Modal)什么关系? | 沙箱管「代码在哪跑」,Dogwood 管「跑的动作合不合规」,两者是执行隔离与策略治理的互补层 |