Claude Code Tool System 与 Permission 机制深度解析

代码解析

Claude Code Tool System 与 Permission 机制深度解析


0. 背景与定位

Claude Code 是一个运行在终端的 Agentic 编码工具,其核心能力来自工具系统(Tool System)------AI 通过调用工具与文件系统、Shell、网络、子 Agent 交互。而**权限系统(Permission System)**则是这套能力的安全护城河,决定哪些工具调用可以自动执行、哪些需要用户确认、哪些被永久拒绝。

理解这两个系统,是在企业内安全部署 Claude Code、或基于 SDK 构建自定义 AI Agent 的前提。 1


1. 核心概念速览

概念 说明
Tool AI Agent 可调用的能力单元,如 BashToolFileReadTool
ToolRegistry 工具注册表,管理所有可用工具的生命周期
PermissionChecker 权限检查器,每次工具调用前执行
Permission Mode 全局权限模式:default / acceptEdits / auto / bypassPermissions
Hook 工具执行前后的生命周期钩子,可拦截、修改、阻断
Sandbox 针对 BashTool 的沙箱隔离层,控制网络与文件系统访问
Settings Hierarchy 配置优先级链:managed-settings.json > settings.json > settings.local.json

2. 工具系统架构

2.1 工具分类总览

Claude Code 内置以下核心工具类: 2

分类 工具 核心能力
文件操作 FileReadTool 读取文件,支持 token 感知截断
FileWriteTool 创建/覆盖文件,含路径安全校验
FileEditTool 行级 diff 编辑,含符号链接检查
Shell 执行 BashTool 执行 Shell 命令,支持沙箱模式
PowerShellTool Windows 环境专用 Shell
网络 WebFetchTool 抓取 URL 内容
WebSearchTool 执行网络搜索
Agent 编排 TaskTool 派生子 Agent(支持 Worktree 隔离)
EnterWorktree 切换 Claude 管理的 Git Worktree
交互 AskUserQuestion 向用户提问
扩展 MCP Tools 通过 Model Context Protocol 接入外部工具

注意: sandbox 属性仅作用于 BashTool,不影响 Read、Write、WebFetch、MCP 等其他工具。

2.2 工具执行全链路流程


3. 权限系统深度解析

3.1 权限判断链路(Settings Hierarchy)

权限规则按以下优先级从高到低依次检查,高优先级规则可覆盖低优先级:
#mermaid-svg-kK9dA6rkD5pb5VVZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kK9dA6rkD5pb5VVZ .error-icon{fill:#552222;}#mermaid-svg-kK9dA6rkD5pb5VVZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kK9dA6rkD5pb5VVZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .marker.cross{stroke:#333333;}#mermaid-svg-kK9dA6rkD5pb5VVZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kK9dA6rkD5pb5VVZ p{margin:0;}#mermaid-svg-kK9dA6rkD5pb5VVZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .cluster-label text{fill:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .cluster-label span{color:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .cluster-label span p{background-color:transparent;}#mermaid-svg-kK9dA6rkD5pb5VVZ .label text,#mermaid-svg-kK9dA6rkD5pb5VVZ span{fill:#333;color:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .node rect,#mermaid-svg-kK9dA6rkD5pb5VVZ .node circle,#mermaid-svg-kK9dA6rkD5pb5VVZ .node ellipse,#mermaid-svg-kK9dA6rkD5pb5VVZ .node polygon,#mermaid-svg-kK9dA6rkD5pb5VVZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .rough-node .label text,#mermaid-svg-kK9dA6rkD5pb5VVZ .node .label text,#mermaid-svg-kK9dA6rkD5pb5VVZ .image-shape .label,#mermaid-svg-kK9dA6rkD5pb5VVZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-kK9dA6rkD5pb5VVZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .rough-node .label,#mermaid-svg-kK9dA6rkD5pb5VVZ .node .label,#mermaid-svg-kK9dA6rkD5pb5VVZ .image-shape .label,#mermaid-svg-kK9dA6rkD5pb5VVZ .icon-shape .label{text-align:center;}#mermaid-svg-kK9dA6rkD5pb5VVZ .node.clickable{cursor:pointer;}#mermaid-svg-kK9dA6rkD5pb5VVZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .arrowheadPath{fill:#333333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kK9dA6rkD5pb5VVZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kK9dA6rkD5pb5VVZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kK9dA6rkD5pb5VVZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kK9dA6rkD5pb5VVZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .cluster text{fill:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ .cluster span{color:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kK9dA6rkD5pb5VVZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kK9dA6rkD5pb5VVZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-kK9dA6rkD5pb5VVZ .icon-shape,#mermaid-svg-kK9dA6rkD5pb5VVZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kK9dA6rkD5pb5VVZ .icon-shape p,#mermaid-svg-kK9dA6rkD5pb5VVZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kK9dA6rkD5pb5VVZ .icon-shape .label rect,#mermaid-svg-kK9dA6rkD5pb5VVZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kK9dA6rkD5pb5VVZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kK9dA6rkD5pb5VVZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kK9dA6rkD5pb5VVZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 交互式确认选项
Deny
Allow
无匹配
allowManagedPermissionRulesOnly: true
命中 deny
命中 allow
命中 ask
无匹配
命中规则
无匹配
工具调用请求
① 检查 managed-settings.json

企业 MDM 下发的托管策略
执行被阻断 ❌
直接执行 ✅
② 检查 settings.json

用户/项目级配置
交互式确认
③ 检查 settings.local.json

本地覆盖配置
仅此一次允许
始终允许

(持久化到 settings.json)
拒绝

3.2 三种权限规则类型

json 复制代码
// settings.json 示例
{
  "permissions": {
    "allow": [
      "Bash(git log:*)",
      "Bash(npm test)",
      "Read(**)"
    ],
    "ask": [
      "Bash"
    ],
    "deny": [
      "WebSearch",
      "WebFetch"
    ]
  }
}
规则类型 行为 典型场景
allow 自动批准,无需确认 只读命令、安全的 git 操作
ask 每次都弹出确认 高风险工具如 Bash
deny 永久拒绝,不可绕过 禁止网络访问、禁止特定工具

通配符语法示例:

  • Bash(npm *) --- 匹配所有 npm 子命令
  • Bash(git * main) --- 匹配操作 main 分支的 git 命令
  • Read(**) --- 匹配所有文件读取
  • Edit(/src/**) --- 仅允许编辑 src 目录

3.3 四种全局权限模式

#mermaid-svg-Aw2ffjBN3q6y0bXK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Aw2ffjBN3q6y0bXK .error-icon{fill:#552222;}#mermaid-svg-Aw2ffjBN3q6y0bXK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Aw2ffjBN3q6y0bXK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .marker.cross{stroke:#333333;}#mermaid-svg-Aw2ffjBN3q6y0bXK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Aw2ffjBN3q6y0bXK p{margin:0;}#mermaid-svg-Aw2ffjBN3q6y0bXK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .cluster-label text{fill:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .cluster-label span{color:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .cluster-label span p{background-color:transparent;}#mermaid-svg-Aw2ffjBN3q6y0bXK .label text,#mermaid-svg-Aw2ffjBN3q6y0bXK span{fill:#333;color:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .node rect,#mermaid-svg-Aw2ffjBN3q6y0bXK .node circle,#mermaid-svg-Aw2ffjBN3q6y0bXK .node ellipse,#mermaid-svg-Aw2ffjBN3q6y0bXK .node polygon,#mermaid-svg-Aw2ffjBN3q6y0bXK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .rough-node .label text,#mermaid-svg-Aw2ffjBN3q6y0bXK .node .label text,#mermaid-svg-Aw2ffjBN3q6y0bXK .image-shape .label,#mermaid-svg-Aw2ffjBN3q6y0bXK .icon-shape .label{text-anchor:middle;}#mermaid-svg-Aw2ffjBN3q6y0bXK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .rough-node .label,#mermaid-svg-Aw2ffjBN3q6y0bXK .node .label,#mermaid-svg-Aw2ffjBN3q6y0bXK .image-shape .label,#mermaid-svg-Aw2ffjBN3q6y0bXK .icon-shape .label{text-align:center;}#mermaid-svg-Aw2ffjBN3q6y0bXK .node.clickable{cursor:pointer;}#mermaid-svg-Aw2ffjBN3q6y0bXK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .arrowheadPath{fill:#333333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Aw2ffjBN3q6y0bXK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Aw2ffjBN3q6y0bXK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Aw2ffjBN3q6y0bXK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Aw2ffjBN3q6y0bXK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .cluster text{fill:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK .cluster span{color:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Aw2ffjBN3q6y0bXK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Aw2ffjBN3q6y0bXK rect.text{fill:none;stroke-width:0;}#mermaid-svg-Aw2ffjBN3q6y0bXK .icon-shape,#mermaid-svg-Aw2ffjBN3q6y0bXK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Aw2ffjBN3q6y0bXK .icon-shape p,#mermaid-svg-Aw2ffjBN3q6y0bXK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Aw2ffjBN3q6y0bXK .icon-shape .label rect,#mermaid-svg-Aw2ffjBN3q6y0bXK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Aw2ffjBN3q6y0bXK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Aw2ffjBN3q6y0bXK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Aw2ffjBN3q6y0bXK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 权限模式 (Shift+Tab 循环切换)
Shift+Tab
Shift+Tab
Shift+Tab
Shift+Tab
default

默认模式

每次工具调用均需确认
acceptEdits

接受编辑模式

文件操作自动批准

Bash 仍需确认
auto

自动模式

内置分类器自动判断

危险操作仍会拦截
bypassPermissions

跳过权限模式

⚠️ 危险:跳过所有检查

安全提示: bypassPermissions 模式可通过 disableBypassPermissionsMode: "disable" 在企业策略中永久禁用。 10


4. Hook 系统:工具执行的生命周期拦截

Hook 是权限系统的重要扩展点,允许在工具执行的各个阶段注入自定义逻辑。

4.1 Hook 生命周期全景

渲染错误: Mermaid 渲染失败: Parse error on line 28: ...最终响应```11(#0-10) ### 4.2 Hook 事件类型速 ----------------------^ Expecting '()', 'SOLID_OPEN_ARROW', 'DOTTED_OPEN_ARROW', 'SOLID_ARROW', 'SOLID_ARROW_TOP', 'SOLID_ARROW_BOTTOM', 'STICK_ARROW_TOP', 'STICK_ARROW_BOTTOM', 'SOLID_ARROW_TOP_DOTTED', 'SOLID_ARROW_BOTTOM_DOTTED', 'STICK_ARROW_TOP_DOTTED', 'STICK_ARROW_BOTTOM_DOTTED', 'SOLID_ARROW_TOP_REVERSE', 'SOLID_ARROW_BOTTOM_REVERSE', 'STICK_ARROW_TOP_REVERSE', 'STICK_ARROW_BOTTOM_REVERSE', 'SOLID_ARROW_TOP_REVERSE_DOTTED', 'SOLID_ARROW_BOTTOM_REVERSE_DOTTED', 'STICK_ARROW_TOP_REVERSE_DOTTED', 'STICK_ARROW_BOTTOM_REVERSE_DOTTED', 'BIDIRECTIONAL_SOLID_ARROW', 'DOTTED_ARROW', 'BIDIRECTIONAL_DOTTED_ARROW', 'SOLID_CROSS', 'DOTTED_CROSS', 'SOLID_POINT', 'DOTTED_POINT', got 'NEWLINE'


6. 企业部署配置参考

6.1 三种典型配置对比 [15](#6.1 三种典型配置对比 15)

配置项 settings-lax.json settings-strict.json settings-bash-sandbox.json
禁用 --dangerously-skip-permissions
屏蔽插件市场
禁止用户自定义权限规则
禁止用户自定义 Hook
拒绝 WebFetch/WebSearch
Bash 工具需要审批
Bash 工具必须在沙箱内运行

6.2 安全加固关键配置

json 复制代码
// managed-settings.json (企业 MDM 下发)
{
  "permissions": {
    "disableBypassPermissionsMode": "disable",
    "deny": ["WebSearch", "WebFetch"],
    "ask": ["Bash"]
  },
  "allowManagedPermissionRulesOnly": true,
  "allowManagedHooksOnly": true,
  "sandbox": {
    "enabled": true,
    "network": {
      "allowedDomains": ["registry.npmjs.org", "api.github.com"]
    }
  }
}

7. 架构设计建议

7.1 安全性维度

#mermaid-svg-K96KKUMApJ7giGSu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-K96KKUMApJ7giGSu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-K96KKUMApJ7giGSu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-K96KKUMApJ7giGSu .error-icon{fill:#552222;}#mermaid-svg-K96KKUMApJ7giGSu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-K96KKUMApJ7giGSu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-K96KKUMApJ7giGSu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-K96KKUMApJ7giGSu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-K96KKUMApJ7giGSu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-K96KKUMApJ7giGSu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-K96KKUMApJ7giGSu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-K96KKUMApJ7giGSu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-K96KKUMApJ7giGSu .marker.cross{stroke:#333333;}#mermaid-svg-K96KKUMApJ7giGSu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-K96KKUMApJ7giGSu p{margin:0;}#mermaid-svg-K96KKUMApJ7giGSu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-K96KKUMApJ7giGSu .cluster-label text{fill:#333;}#mermaid-svg-K96KKUMApJ7giGSu .cluster-label span{color:#333;}#mermaid-svg-K96KKUMApJ7giGSu .cluster-label span p{background-color:transparent;}#mermaid-svg-K96KKUMApJ7giGSu .label text,#mermaid-svg-K96KKUMApJ7giGSu span{fill:#333;color:#333;}#mermaid-svg-K96KKUMApJ7giGSu .node rect,#mermaid-svg-K96KKUMApJ7giGSu .node circle,#mermaid-svg-K96KKUMApJ7giGSu .node ellipse,#mermaid-svg-K96KKUMApJ7giGSu .node polygon,#mermaid-svg-K96KKUMApJ7giGSu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-K96KKUMApJ7giGSu .rough-node .label text,#mermaid-svg-K96KKUMApJ7giGSu .node .label text,#mermaid-svg-K96KKUMApJ7giGSu .image-shape .label,#mermaid-svg-K96KKUMApJ7giGSu .icon-shape .label{text-anchor:middle;}#mermaid-svg-K96KKUMApJ7giGSu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-K96KKUMApJ7giGSu .rough-node .label,#mermaid-svg-K96KKUMApJ7giGSu .node .label,#mermaid-svg-K96KKUMApJ7giGSu .image-shape .label,#mermaid-svg-K96KKUMApJ7giGSu .icon-shape .label{text-align:center;}#mermaid-svg-K96KKUMApJ7giGSu .node.clickable{cursor:pointer;}#mermaid-svg-K96KKUMApJ7giGSu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-K96KKUMApJ7giGSu .arrowheadPath{fill:#333333;}#mermaid-svg-K96KKUMApJ7giGSu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-K96KKUMApJ7giGSu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-K96KKUMApJ7giGSu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-K96KKUMApJ7giGSu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-K96KKUMApJ7giGSu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-K96KKUMApJ7giGSu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-K96KKUMApJ7giGSu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-K96KKUMApJ7giGSu .cluster text{fill:#333;}#mermaid-svg-K96KKUMApJ7giGSu .cluster span{color:#333;}#mermaid-svg-K96KKUMApJ7giGSu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-K96KKUMApJ7giGSu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-K96KKUMApJ7giGSu rect.text{fill:none;stroke-width:0;}#mermaid-svg-K96KKUMApJ7giGSu .icon-shape,#mermaid-svg-K96KKUMApJ7giGSu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-K96KKUMApJ7giGSu .icon-shape p,#mermaid-svg-K96KKUMApJ7giGSu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-K96KKUMApJ7giGSu .icon-shape .label rect,#mermaid-svg-K96KKUMApJ7giGSu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-K96KKUMApJ7giGSu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-K96KKUMApJ7giGSu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-K96KKUMApJ7giGSu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 防御纵深
managed-settings 锁定基线
PreToolUse Hook 二次校验
Sandbox 网络隔离
最小权限原则
默认 deny 所有网络工具
按需 allow 特定域名
Bash 工具默认 ask
仅 allow 只读命令

  • 永远不要 在 CI/CD 中使用 --dangerously-skip-permissions,除非在完全隔离的沙箱容器内
  • 使用 allowManagedPermissionRulesOnly: true 防止项目级配置绕过企业策略
  • PreToolUse Hook 可作为命令注入的最后防线

7.2 可扩展性维度

  • MCP 工具:通过 Model Context Protocol 接入内部系统(数据库、CI、监控),无需修改 Claude Code 核心
  • Hook 中间件PreToolUse 返回 updatedInput 可实现工具输入的透明改写(如自动注入项目前缀)
  • PermissionRequest Hook :可实现自定义审批逻辑(如 Slack 审批流) 17

7.3 企业部署维度

#mermaid-svg-SxSiEi9UrPrSRlob{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SxSiEi9UrPrSRlob .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SxSiEi9UrPrSRlob .error-icon{fill:#552222;}#mermaid-svg-SxSiEi9UrPrSRlob .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SxSiEi9UrPrSRlob .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SxSiEi9UrPrSRlob .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SxSiEi9UrPrSRlob .marker.cross{stroke:#333333;}#mermaid-svg-SxSiEi9UrPrSRlob svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SxSiEi9UrPrSRlob p{margin:0;}#mermaid-svg-SxSiEi9UrPrSRlob .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SxSiEi9UrPrSRlob .cluster-label text{fill:#333;}#mermaid-svg-SxSiEi9UrPrSRlob .cluster-label span{color:#333;}#mermaid-svg-SxSiEi9UrPrSRlob .cluster-label span p{background-color:transparent;}#mermaid-svg-SxSiEi9UrPrSRlob .label text,#mermaid-svg-SxSiEi9UrPrSRlob span{fill:#333;color:#333;}#mermaid-svg-SxSiEi9UrPrSRlob .node rect,#mermaid-svg-SxSiEi9UrPrSRlob .node circle,#mermaid-svg-SxSiEi9UrPrSRlob .node ellipse,#mermaid-svg-SxSiEi9UrPrSRlob .node polygon,#mermaid-svg-SxSiEi9UrPrSRlob .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SxSiEi9UrPrSRlob .rough-node .label text,#mermaid-svg-SxSiEi9UrPrSRlob .node .label text,#mermaid-svg-SxSiEi9UrPrSRlob .image-shape .label,#mermaid-svg-SxSiEi9UrPrSRlob .icon-shape .label{text-anchor:middle;}#mermaid-svg-SxSiEi9UrPrSRlob .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SxSiEi9UrPrSRlob .rough-node .label,#mermaid-svg-SxSiEi9UrPrSRlob .node .label,#mermaid-svg-SxSiEi9UrPrSRlob .image-shape .label,#mermaid-svg-SxSiEi9UrPrSRlob .icon-shape .label{text-align:center;}#mermaid-svg-SxSiEi9UrPrSRlob .node.clickable{cursor:pointer;}#mermaid-svg-SxSiEi9UrPrSRlob .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SxSiEi9UrPrSRlob .arrowheadPath{fill:#333333;}#mermaid-svg-SxSiEi9UrPrSRlob .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SxSiEi9UrPrSRlob .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SxSiEi9UrPrSRlob .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SxSiEi9UrPrSRlob .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SxSiEi9UrPrSRlob .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SxSiEi9UrPrSRlob .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SxSiEi9UrPrSRlob .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SxSiEi9UrPrSRlob .cluster text{fill:#333;}#mermaid-svg-SxSiEi9UrPrSRlob .cluster span{color:#333;}#mermaid-svg-SxSiEi9UrPrSRlob div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SxSiEi9UrPrSRlob .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SxSiEi9UrPrSRlob rect.text{fill:none;stroke-width:0;}#mermaid-svg-SxSiEi9UrPrSRlob .icon-shape,#mermaid-svg-SxSiEi9UrPrSRlob .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SxSiEi9UrPrSRlob .icon-shape p,#mermaid-svg-SxSiEi9UrPrSRlob .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SxSiEi9UrPrSRlob .icon-shape .label rect,#mermaid-svg-SxSiEi9UrPrSRlob .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SxSiEi9UrPrSRlob .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SxSiEi9UrPrSRlob .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SxSiEi9UrPrSRlob :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 下发
最高优先级
提交
次高优先级
本地调整
最低优先级
MDM 系统

(Jamf/Intune/Kandji)
managed-settings.json

/Library/Application Support/Claude/
Claude Code 实例
项目管理员
.claude/settings.json

项目级配置
开发者
.claude/settings.local.json

本地覆盖 (gitignore)

  • managed-settings.json 通过 MDM 统一下发,开发者无法覆盖
  • settings.json 提交到 Git,团队共享项目级规则
  • settings.local.json 加入 .gitignore,允许开发者本地个性化

8. 总结

Claude Code 的 Tool System 与 Permission 机制构成了一套分层、可扩展、企业就绪的安全执行框架:

复制代码
用户意图
  ↓
Agent 推理 → 选择工具
  ↓
Hook (PreToolUse) → 自定义拦截/改写
  ↓
PermissionChecker → managed > user > local 规则链
  ↓
Sandbox → 网络/文件系统隔离 (仅 BashTool)
  ↓
系统执行
  ↓
Hook (PostToolUse) → 结果处理/日志

对于 AI Agent 前端架构师而言,核心落地路径是:

  1. managed-settings.json 锁定安全基线(企业场景)
  2. PreToolUse Hook 实现业务级命令校验
  3. 用 MCP 扩展工具边界,而非直接暴露 Bash
  4. auto 模式 + 精细 allow 规则 平衡效率与安全 19 20
相关推荐
运维栈记1 小时前
Remotion + Claude Code:用自然语言创作视频的革命性突破
人工智能·ai·音视频
aqi001 小时前
15天学会AI应用开发(三)把历史对话作为提示词会怎样
人工智能·python·大模型·ai编程·ai应用
俯首甘为孺子刘x1 小时前
AI时代的焦虑与思考
人工智能·ai编程·codex·ai-agent
Jing_jing_X2 小时前
从 Prompt 对话到 OpenClaw:Agent 是怎么一步步发展出来的?
ai·prompt·个人开发·ai应用开发
踏着七彩祥云的小丑2 小时前
AI学习——记忆系统
人工智能·学习·ai
ipad协议开发2 小时前
基于企业微信/泛原生协议的聚合SCRM系统架构设计与核心技术实现
系统架构·企业微信
Likelong~2 小时前
Agent vs Workflow
ai
俊哥V2 小时前
每日 AI 研究简报 · 2026-05-30
人工智能·ai