Permission System - 权限管道与行动控制
L07 要回答一个问题:如何在 L06 的基础上让 Agent 行动可靠可控,而不让恶意操作或误判穿透?
L06 给了我们骨架:三层压缩 + 连续性保护 + 控制权归属。但真实 Agent 执行时可能访问敏感文件、执行危险命令、误判操作后果。全部放行会失控,全部拦截会瘫痪。怎么做?
本章讲三个机制:
| 机制 | 解决什么问题 | 核心设计 |
|---|---|---|
| 权限管道 | 任何调用先过安全检查 | Deny → Mode → Allow → Ask |
| 三种模式 | 不同场景不同策略 | default/plan/auto |
| Bash特殊处理 | bash不是普通文本 | 独立前置检查 + 危险pattern过滤 |
这三个机制叠加在 L06 的 Context Compact 上,循环本身不变。理解 L07,就理解了 Agent 如何”行动可靠可控不穿透”。
一、权限管道:四层顺序检查
“权限系统不是为了让 Agent 更笨,而是让行动先经过可靠的安全判断。”
这句话概括了 Permission System 的本质。任何工具调用都不直接执行,必须先过权限管道。
管道顺序原则
四层顺序有深刻理由:
| 层级 | 检查内容 | 为什么优先级最高 |
|---|---|---|
| Deny | 禁止规则(危险pattern) | 安全优先——直接拦截,不问用户 |
| Mode | 模式约束(plan只读) | 策略层——会话风格控制 |
| Allow | 允许规则(白名单) | 效率层——命中直接放行 |
| Ask | 用户确认 | 兜底——未命中规则问用户 |
顺序为什么是 Deny → Mode → Allow → Ask?
- Deny 优先:安全高于效率。危险操作必须先拦截,不问用户意愿。
- Mode 第二:会话风格控制。Plan 模式下写操作必须拦截,不管 Allow 规则。
- Allow 第三:效率优化。白名单命中直接放行,不需要问用户。
- Ask 兜底:未知操作问用户。用户决策优于系统猜测。
管道执行流程
def permission_pipeline(tool_call): # Layer 1: Bash特殊检查(独立前置) if tool_call.tool == "bash": result = bash_validator(tool_call.input["command"]) if result == "deny": return PermissionDecision(behavior="deny", reason="Bash validator")
# Layer 2: Deny Rules if matches_deny_rules(tool_call): return PermissionDecision(behavior="deny", reason="matched deny rule")
# Layer 3: Mode Check if mode == "plan" and is_write_operation(tool_call): return PermissionDecision(behavior="deny", reason="plan mode blocks writes") if mode == "auto" and is_safe_read(tool_call): return PermissionDecision(behavior="allow", reason="auto mode allows reads")
# Layer 4: Allow Rules if matches_allow_rules(tool_call): return PermissionDecision(behavior="allow", reason="matched allow rule")
# Layer 5: Ask User(兜底) return PermissionDecision(behavior="ask", reason="no rules matched")关键点:管道在 dispatch map 和 handler 之间——找到 handler 后不直接执行,先过管道。
验证你的理解
Q1:Allow 规则命中后,还会 Ask 用户吗?
:::details 答案 不会。Allow 规则命中直接 allow,不问用户。
管道顺序:Deny → Mode → Allow → Ask。
Allow 是效率层——白名单命中表示”系统已判断安全”,不需要问用户。
如果 Allow 后还要 Ask,白名单就失去效率意义。每次都要问用户,流畅度下降。 :::
二、三种模式:不同场景不同策略
权限管道是通用机制,三种模式是场景策略。
| 模式 | 未命中规则时行为 | 适用场景 |
|---|---|---|
| default | Ask User | 日常交互,用户参与决策 |
| plan | 读操作 Allow,写操作 Deny | 分析/审查,只看不改 |
| auto | 安全操作 Allow,危险操作 Ask | 高流畅度探索,减少中断 |
default 模式:用户参与决策
适用场景:日常交互,用户希望参与关键决策。
特点:未知操作问用户,用户决策优于系统猜测。
plan 模式:只读约束
适用场景:分析代码、审查日志、查看配置——只看不改。
特点:写操作强制拦截,不问用户。这是会话风格控制,不是安全判断。
auto 模式:安全自动过
适用场景:高流畅度探索,减少确认中断。
特点:安全操作(read_file、search)自动放行,危险操作(write_file、bash危险命令)问用户。
验证你的理解
Q2:plan 模式下,Allow 规则命中的写操作会被放行吗?
:::details 答案 不会。plan 模式下写操作强制拦截,不管 Allow 规则。
管道顺序:Deny → Mode → Allow → Ask。
Mode 检查在 Allow 之前——plan 模式写操作在 Mode 层就被 Deny,不会到达 Allow。
设计理由:plan 模式是”只读约束”,是会话风格控制,高于白名单效率。用户说”只看不改”,系统必须遵守,不能因为白名单而放行写操作。 :::
三、Bash特殊处理:独立前置检查
bash 不是普通文本,是可执行动作描述。
为什么 bash 需要特殊处理?
| 工具 | 输入内容 | 检查方式 |
|---|---|---|
| read_file | 文件路径 | 路径检查(safe_path) |
| write_file | 文件路径 + 内容 | 路径检查 + 内容检查 |
| bash | 命令字符串 | 内容分析——危险pattern识别 |
bash 的输入是命令字符串,需要在内容层面检查,不只是路径层面。
Bash 危险 pattern
| Pattern | 拒绝理由 | 示例 |
|---|---|---|
| sudo | 权限提升风险 | sudo rm -rf / |
| rm -rf | 批量删除风险 | rm -rf src/ |
| 命令替换 | 嵌套执行风险 | $(cat file) |
| 可疑重定向 | 文件覆盖风险 | > /etc/passwd |
检查时机:bash 命令进入权限管道前,先过 Bash Validator。
def bash_validator(command: str) -> str: # 危险pattern检查 dangerous_patterns = ["sudo", "rm -rf", "$(", "> /etc/", "> ~/.ssh/"] for pattern in dangerous_patterns: if pattern in command: return "deny"
# 可疑重定向检查 if ">" in command and not is_safe_redirect(command): return "deny"
return "allow" # 通过,继续走后续管道Bash 读写分类
bash 命令需要判断读还是写操作:
| 命令类型 | 读操作 | 写操作 |
|---|---|---|
| 文件操作 | ls, cat, find, grep | rm, mv, cp, echo > file |
| git 操作 | git status, git log, git diff | git add, git commit, git push |
判断方法:内容分析——识别命令关键词。
def classify_bash_operation(command: str) -> str: read_keywords = ["ls", "cat", "find", "grep", "git status", "git log", "git diff"] write_keywords = ["rm", "mv", "cp", "git add", "git commit", "git push", ">"]
for kw in read_keywords: if kw in command: return "read"
for kw in write_keywords: if kw in command: return "write"
return "unknown" # 需进一步判断或问用户验证你的理解
Q3:git status 是读操作还是写操作?为什么?
:::details 答案 git status 是读操作。
git status 只查看状态,不修改 Git 工作区、暂存区、仓库。
常见误判:看到 “git” 就认为是写操作。正确分类需要理解命令语义:
命令 类型 原因 git status 读 只查看状态 git log 读 只查看历史 git diff 读 只查看差异 git add 写 修改暂存区 git commit 写 创建 commit git push 写 写入远程 plan 模式下,git status 可以执行,git add 被拦截。 :::
四、回顾:L07 在循环上叠加了什么
回到开头的问题:如何在 L06 的基础上让 Agent 行动可靠可控,而不让恶意操作或误判穿透?
答案:
| 叠加机制 | 代码位置 | 循环的变化 |
|---|---|---|
| 权限管道 | dispatch → handler 之间 | 不变——只是执行前检查 |
| 三种模式 | 会话启动时设置 | 不变——只是管道策略差异 |
| Bash特殊处理 | 管道第一层前置 | 不变——只是bash单独检查 |
循环本身仍是 L01 的 while True + stop_reason + messages[]。L07 只是在”执行控制层”叠加了权限管道。
与后续课程的关系
理解 L07 后,你会发现后续课程都在 Permission System 上叠加——循环本身始终不变:
| 课程 | 关系 |
|---|---|
| L02 Tool Use | 管道在 dispatch map 和 handler 之间 |
| L04 Subagent | 权限继承问题——子 Agent 是否继承父 Agent 权限? |
| L06 Context Compact | 权限判断占上下文?压缩后权限决策是否保留? |
| L08 Hook System | 权限 = 能不能执行;Hook = 执行前后插入什么 |
| L09 Memory System | 权限规则跨会话保留? |
核心洞察:Permission System 是”行动可靠可控”的机制。理解 L07,就理解了 Agent 如何”行动先过安全判断”。后续课程都在扩展权限机制——权限继承、跨会话保留、执行前后插入逻辑。
五、心智模型升级:从 L0 到 L2
读完这篇文章,你的理解经历了怎样的升级?
L07 核心概念的理解升级路径
| 概念 | L0(表面) | L1(关联) | L2(深层) |
|---|---|---|---|
| 权限管道 | ”调用先过检查" | "四层顺序:Deny→Mode→Allow→Ask" | "管道顺序原则——安全高于效率(Deny优先),策略高于白名单(Mode第二),效率优于猜测(Allow第三),用户决策兜底(Ask)。每层有深刻理由” |
| 三种模式 | ”default问用户,plan只读,auto自动过" | "不同场景不同策略" | "模式分离本质——default=用户参与(信任用户),plan=只读约束(信任策略),auto=流畅优先(信任系统判断)。决策主体不同” |
| Bash特殊处理 | ”bash危险要检查" | "独立前置检查 + 危险pattern" | "Bash特殊原则——bash不是普通文本,是可执行动作描述。内容层面检查,不只是路径层面。类比 SQL 注入防御——输入不是数据,是执行意图” |
| 读写分类 | ”判断是读还是写" | "plan模式下写操作拦截" | "读写分类本质——判断操作是否修改世界状态。git status 不修改状态(读),git add 修改暂存区(写)。需要语义理解,不只是关键词匹配” |
如何检验你达到了 L2?
用这个问题自测:
如果迁移到数据库 Agent,权限系统怎么设计?
:::details L2 层级回答 迁移设计:
Claude原则 数据库迁移 Bash特殊检查 SQL危险命令前置deny(DELETE TABLE、TRUNCATE) Deny→Mode→Allow→Ask 同样顺序架构 内容分析 Query内容分析 Plan=只读 Plan=SELECT only 困难点:
- 存储过程边界:存储过程读写性质判断困难,需要元数据标注。
- 数量级别预判:UPDATE 1 行 vs UPDATE 100万行,风险不同。
设计决策:
- 高敏感操作(DROP TABLE)硬编码 Deny
- 普通规则配置文件
- 存储过程需要元数据标注读写性质 :::
本章目标:让每个核心概念都从 L0 升级到 L2。理解 L07,不只是记住管道顺序,而是掌握”如何在循环上行动可靠可控”的设计原则。
六、复习可视化
权限管道流程
三种模式对比
Bash读写分类
数据库Agent迁移
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!