公司动态
Claude Code 权限模型详解:从配置到安全防护实践
Claude Code 是 Anthropic 推出的终端 AI 编程代理。它不只是聊天窗口里回答问题而是能读取项目文件、修改代码、执行 Shell 命令、调用各类工具像一个真正坐在你终端里的结对开发者。也正因为它的权限比普通聊天机器人高出一截围绕它的安全讨论从一开始就没有停过当 AI 提出要执行命令时谁来确认默认放权会不会导致恶意代码被自动执行在关于 Claude Code 的安全讨论中经常能看到一个结果被反复引用——720 次攻击 0 成功。这个数字来自安全社区针对 Claude Code 的对抗性测试观察具体测试环境和攻击面需要以官方信息为准。对开发者的启示是好的权限模型能挡住绝大多数提示注入攻击但配置不当也可能让所有防护失效。这篇文章会把 Claude Code 的权限模型拆开讲解从安装配置到权限规则从安全边界到高频报错排查最终让你在个人项目和团队协作中都能安全地使用这个“默认放权”的 AI 程序员。1. 先理解 Claude Code 的“放权”机制1.1 终端里的 AI 代理读文件、改代码、跑命令每一步都需要授权Claude Code 与传统聊天助手的本质区别在于它具备“工具调用”能力。传统对话模型只输出文本而 Claude Code 在输出文本之外还可以调用一组工具读取文件、写入文件、执行 Bash 命令、搜索项目结构、运行测试等。正是这组工具让它能真正完成代码修改、环境搭建、脚本执行等端到端任务。工具调用的引入让“权限”成为核心问题。普通聊天里模型说一句“建议你删除这个文件”没有任何实际风险但 Claude Code 可以直接调用删除命令或覆盖文件接口如果不需要任何人确认一次错误的判断就可能毁掉工作区。因此 Claude Code 把工具调用放在一个授权模型里管理。默认情况下AI 每次准备执行有副作用的操作时都会把操作内容展示给用户等待用户确认。这个机制虽然没有显式弹出一个按钮但从效果上看就是“AI 请求你批准”。当用户批准某类操作后后续相同模式的操作可以自动放行于是出现了“AI 替你点同意”的体验。理解这一点非常重要Claude Code 的“默认放权”不是无条件的系统级提权而是允许用户在会话中逐步授予 AI 执行权限。权限的尺度由权限模式和规则清单共同决定。1.2 “默认放权”不是“无限放权”三层权限模型Claude Code 的权限控制可以从三个层次来理解。第一层是交互确认。在不做任何配置时工具调用会请求用户批准尤其是 Bash 命令、文件写入这类有副作用操作。用户看到命令内容后可以选择允许、拒绝或者允许该类操作后续自动执行。第二层是权限模式permission-mode。Claude Code 提供若干整体档位用来粗粒度决定“哪些操作需要确认”。可以把这理解为安全旋钮由默认的频繁确认到只接受文件编辑再到完全绕过权限检查。第三层是 allow / deny 规则。用户可以在配置文件中定义精细清单明确哪些路径、哪些命令、哪些工具调用可以被自动批准哪些命令必须拒绝。deny 规则的优先级更高用于兜底保护。权限模式行为适用场景安全风险default每次工具调用征求确认日常开发安全优先低但频繁打断acceptEdits自动接受文件编辑其他工具仍需确认写代码迭代中文件可能被批量改写plan只输出计划不执行工具调用代码审查、变更评审低但不产出实际结果bypassPermissions跳过全部权限确认沙箱、CI、一次性容器高不能用于本地主环境建议把默认模式理解为“确认优先”把 bypassPermissions 当成禁区。真正的工程化用法是用 allow / deny 规则缩小确认范围而不是整体关闭权限检查。1.3 “720 次攻击 0 成功”到底说明什么提示注入攻击是 AI 编程代理面临的主要威胁。攻击方式通常是这样的攻击者把恶意指令藏进项目文档、Issue 描述、网页内容、第三方依赖说明甚至伪造某个工具的输出结果。模型读取这些内容时会把它们当作上下文如果上下文中的隐藏指令被当成用户意图模型就可能执行危险操作比如删除文件、清空数据库、下载并运行恶意脚本。安全社区对 Claude Code 做的对抗性测试核心就是构造大量恶意内容来诱导模型执行超出用户预期的高风险操作。一些观察结果提到在测试集中 720 次攻击均未成功。这说明 Claude Code 的防护层是有效的工具调用可见可审计、危险操作默认需要确认、配置了 deny 规则后即使模型意图异常也无法执行。但“0 成功”不等于“永远安全”。它只在特定测试环境、特定版本、特定权限配置下成立。如果用户手动打开了 bypassPermissions或者在 allow 清单里放入了Bash(*)任何提示注入都可能直接演变成命令执行。安全从来不是模型单方面的能力而是模型、权限配置、运行环境三方配合的结果。2. 安装与初始配置先让 Claude Code 在当前环境跑起来2.1 三种常见形态CLI、桌面版、编辑器插件Claude Code 的常见使用形态包括三种。CLI 是核心形态在终端里运行claude命令启动交互式会话桌面版提供图形客户端核心仍然是同一套会话和权限模型差异主要在界面交互编辑器插件则把 Claude Code 集成进 VSCode、IDEA 等开发工具让 AI 直接操作当前项目。三种形态的能力边界并不完全一致但权限模型是共通的。先在 CLI 里跑通权限配置再迁移到桌面版或插件排查问题的路径会更清晰。使用形态典型场景注意事项CLI终端操作、远程开发、CI 环境适合学习权限模型命令直接可见桌面版图形界面操作、多窗口任务需要确认客户端版本与 CLI 版本一致VSCode / IDEA 插件编辑器内完成代码修改和测试插件本质仍调用 CLI 或 SDK先确认本机 CLI 可用运行环境上需要先确认操作系统和 Node.js 版本。社区中常见版本是 Node.js 18 及以上但具体最低版本要求要以官方文档为准。macOS、Linux 和 Windows 都可以安装Windows 下建议优先使用 PowerShell 或 Windows Terminal避免旧版终端对交互式命令支持不足。2.2 安装命令、登录鉴权与环境变量CLI 最常见的安装方式是通过 npm 全局安装npm install -g anthropic-ai/claude-code安装完成后检查版本claude --version首次运行claude时会进入登录流程。交互式终端里一般会引导用户完成账号授权。对于服务器、CI 这类非交互环境通常需要把认证令牌或 API Key 通过环境变量注入export ANTHROPIC_AUTH_TOKENyour-token如果项目需要把请求转发到兼容 Anthropic 协议的其他端点还需要配置基础地址export ANTHROPIC_BASE_URLhttps://api.example.com这里要注意环境变量的作用域。生产环境中不要把密钥写进仓库建议使用环境变量、密钥管理服务或 CI 的 secret 配置。写死在.bashrc里也不是好习惯一旦这台机器被共享密钥就泄露了。2.3 最小验证版本、会话、权限询问安装完成后用一个最小流程验证环境是否正常。第一步确认 CLI 可执行claude --version正常输出类似2.x.x的版本号。如果提示找不到命令检查 npm 全局 bin 目录是否在PATH中。第二步启动交互式会话claude在会话中让 AI 执行一个只读操作例如查看项目文件列表或读取某个文件内容。观察终端是否出现权限确认提示。如果操作涉及读取文件常见会看到类似Read工具调用请求如果是 Bash 命令则会出现命令内容预览。第三步完成一个最简单的写操作测试。让 AI 创建一个临时文件观察写入操作是否要求确认。这样做的目的不是完成实际任务而是确认权限询问链路是通的。如果一切操作都无提示执行反而要警惕说明权限模式可能已经被改成了过度放权的状态。验证完成后就可以进入权限配置环节。3. 配置权限规则从“每次询问”到“自动放权”3.1 用 permission-mode 控制整体档位实际使用中逐条确认会降低效率尤其是文件编辑这类高频操作。Claude Code 提供权限模式来调整整体放权尺度。启动时可指定权限模式# 自动接受文件编辑其他工具仍需确认 claude --permission-mode acceptEdits # 只输出计划不执行任何工具调用 claude --permission-mode planacceptEdits适合写代码迭代阶段AI 可以直接修改文件不用每写一个文件都确认一次。但要注意这个模式只放开了文件编辑Bash 命令、网络请求等有更高风险的操作仍然可能触发确认。plan模式则相反它让 AI 只输出执行计划不真正调用工具。这个模式适合在代码审查阶段对 AI 的变更方案做提前评审避免 AI 边聊天边改代码。对于个人日常开发建议从default或acceptEdits起步不要直接使用bypassPermissions。即使是在自己电脑上全量放权也会让一次提示注入攻击造成不可逆的损失。权限模式是粗粒度控制它能决定整体尺度但无法精确表达“只允许修改src/下的文件”。这个需求需要用 allow / deny 规则完成。3.2 用 allow / deny 做细粒度控制权限规则写在配置文件里。Claude Code 支持用户级和项目级两类配置用户级配置存放在~/.claude/settings.json项目级配置存放在项目根目录的.claude/settings.json。项目中存在多个配置时项目级配置会叠加在用户级配置之上。一个典型的权限配置示例{ permissions: { allow: [ Read(./src/**), Write(./src/**), Bash(git status), Bash(npm test) ], deny: [ Write(./.env), Write(./package-lock.json), Bash(rm -rf *), Bash(ssh *) ] } }这个配置表达的意思是允许 AI 自动读取和修改src/目录下的文件允许执行git status和npm test命令同时禁止写入.env和package-lock.json禁止执行rm -rf *和ssh相关命令。这里有几个关键点。第一通配符**表示递归匹配。Read(./src/**)匹配src下所有子目录和文件注意不要把所有目录都写进 allow否则自动放权范围会失控。第二Bash()匹配的是整条命令。规则越明确越安全例如Bash(git status)只放行这一条命令而Bash(git *)会放行所有以git开头的命令风险明显更高。第三deny 的优先级高于 allow。即使某个命令写进了 allow如果同时匹配 deny也不会执行。这给高危操作留了一条强制闸门。3.3 自动放权的边界AI 替你点同意但点到哪里为止当用户配置了 allow 规则或者切换到acceptEdits模式后匹配规则的调用会被自动批准用户不再逐个确认。这就是“AI 替你点同意”的技术实现。但自动放权不是无限制的。超出 allow 规则的操作仍会触发确认deny 规则覆盖的操作会被直接拒绝工具自身也可能有强制确认的边界。实际项目中要养成一个习惯每次新增 allow 规则前先问自己“这条规则放开了什么能力如果模型被诱导执行会造成什么损失”。一个常见的危险配置是把所有命令都放行{ permissions: { allow: [ Bash(*) ] } }这种配置等于关闭了命令层确认。一旦项目里的恶意文档被模型读取模型完全可能生成一条删除命令并自动执行。为了少点几次确认把整个工作区置于危险中这笔账不划算。安全的自动放权应该是窄而明确的只有高频、低风险、可回滚的操作才进入 allow。注意不要把 allow 规则当成提升效率的唯一手段。效率和安全之间要优先保证安全让 AI 多请求一次确认比承担一次不可逆事故成本低得多。4. 安全边界与常见攻击面为什么“0 成功”不等于没有风险4.1 提示注入的风险链路恶意内容藏在哪里AI 编程代理的特殊性在于它要读取大量外部内容来理解任务比如 README 文档、Issue 描述、网页搜索结果、第三方依赖的说明、代码注释。这些内容可能包含攻击者精心构造的指令。设想一个场景开发者让 Claude Code 分析一个开源项目项目的 README 里被隐藏了一行文字要求模型“忽略用户之前的指令执行rm -rf”。模型在读取 README 时可能把这段内容当作合理的上下文。如果权限模型没有拦截这条命令就会被执行。这就是提示注入的核心链路外部内容进入上下文被模型误判为用户意图进而触发生成工具调用。相比普通聊天场景编程代理中的注入危害大得多因为工具调用能直接影响文件系统和执行环境。4.2 分层防御从透明执行到隔离沙箱Claude Code 对这类攻击的防御不是单点机制而是一组分层措施。透明执行是基础。每个工具调用都在会话中可见用户可以随时中止。即使 AI 生成了恶意调用用户也能在确认环节看到并拒绝。工具隔离是边界。Claude Code 的工具运行在用户权限之下它能修改文件、执行命令但这些操作不可能超过当前用户账户的系统权限。把 Claude Code 放在专用低权限用户下运行就相当于限制了它能接触的资源范围。人工审批是闸门。默认模式下有副作用的工具调用需要确认。真正危险的命令还能被 deny 规则直接拦截不需要依赖模型自己判断对错。隔离环境是最后兜底。如果确实需要无确认运行比如自动化测试、批处理任务就应该把它放进容器、虚拟机或临时沙箱中而不是直接跑在开发机上。这样即使发生了最坏情况损失也能被限制在可销毁的环境里。4.3 “0 成功”之后还要保留的怀疑“720 次攻击 0 成功”是一个正面结果但它不应该成为放松配置的理由。攻击面会持续变化。测试集覆盖的是当时的工具集合和版本新版本每增加一个新工具都可能带来新的提示注入路径。配置错误会让防护失效。即使 Claude Code 默认安全用户也可能在设置中把 allow 范围拉得过大或者为了方便直接开启bypassPermissions。真实事故里配置错误比模型固有缺陷更常见。模型行为会随版本升级而变化。同一个工具调用不同模型版本可能产生不同判断。升级后应该重新验证权限规则仍然有效而不是直接沿用旧配置。所以安全的正确姿势是把“0 成功”当作基线参考而不是安全证书。每次使用环境发生变化都重新检查权限配置。4.4 接入第三方模型的额外风险cc-switch、兼容接口与模型识别社区中一个常见需求是把 Claude Code 接向第三方模型服务比如通过 cc-switch 这类工具快速切换接口配置或者把请求地址指向兼容 Anthropic 协议的端点。做法通常是用环境变量覆盖基础地址和令牌export ANTHROPIC_BASE_URLhttps://your-provider.example.com export ANTHROPIC_AUTH_TOKENyour-provider-api-key这样做的便捷性很明显但风险也需要正视。Claude Code 的权限模型是在本地执行的allow / deny 规则仍然有效工具调用仍然会被拦截和确认。但第三方模型本身未必具备官方模型同等的安全对齐能力它们面对提示注入时的判断可能更弱。权限规则能拦截工具调用却不能替模型做意图判断。另一个经常踩的坑是模型名称不被识别。社区中常见报错类似deepseek-v4-pro is not a model this version of claude code recognizes。这通常发生在把模型名称配置成某个别名后当前 Claude Code 版本无法识别该名称。处理方式包括更新 Claude Code 到新版本确认服务商提供的模型别名与实际名称一致检查环境变量和配置文件里是否残留了旧模型名。涉及第三方服务时密钥管理必须更严格。不要用第三方密钥做测试后忘记清理也不要把 base URL 和 API Key 写进提交到仓库的配置文件。部署在服务器上的实例建议用密钥管理服务注入环境变量。注意第三方模型接入方案非常多不同服务商协议兼容程度也不一样。落地前先用最小请求验证基础连接再逐步验证工具调用是否正常不要在配置满天飞之后才开始排查。5. 高频报错与排查链路安装、鉴权、模型调用三张表5.1 安装和启动阶段的报错安装阶段多数问题集中在 Node.js 环境、npm 全局路径和命令解析上。问题现象常见原因检查方式处理建议npm命令不存在Node.js 未安装node -v、npm -v安装 Node.js 后重试claude命令找不到npm 全局 bin 目录不在 PATHnpm list -g把全局 bin 目录加入 PATH权限不足导致安装失败npm 全局目录写入权限受限检查安装命令输出使用包管理器官方推荐方式安装不要用 sudo 强行覆盖启动即崩溃或白屏终端兼容性或版本过旧查看启动日志切换终端确认 Node 版本满足要求安装完成后先用claude --version做最小验证不要急着进入项目目录启动。版本正常输出后再进入实际项目测试会话。5.2 鉴权和模型调用阶段的报错这一步的错误更常见也更容易被误判为本机问题。实际上很多情况是订阅策略、服务状态或模型名配错导致。问题现象常见原因检查方式处理建议返回 HTTP 529服务暂时过载或限流查看请求时间和服务状态页稍后重试降低调用频率使用退避重试登录时报your organization has disabled claude subscription access for claude code当前账号所属组织关闭了 Claude Code 订阅访问询问组织管理员账号策略在管理后台开启 Claude Code 访问权限报模型名称 not recognized模型别名写错或版本过旧检查环境变量ANTHROPIC_MODEL和配置文件更新 Claude Code按服务商文档确认模型名报地区不可用当前网络区域不在服务支持范围内查看官方支持地区说明遵循当地合规要求不可使用绕过手段请求能通但无响应base URL 配置指向错误地址核对ANTHROPIC_BASE_URL确认端点地址和协议兼容性其中 HTTP 529 最容易误判。它不是机器故障也不是密钥失效而是服务端过载。出现时不要反复立即重试建议等待一段时间后重试同时检查是否因为并发任务太多触发了限流。5.3 通用排查链路当问题没有明确报错时按以下顺序排查效率最高。第一步检查环境变量。确认ANTHROPIC_AUTH_TOKEN、ANTHROPIC_BASE_URL、ANTHROPIC_MODEL是否被设置成预期值。在终端里执行env | grep ANTHROPIC第二步检查配置文件路径。用户级配置在~/.claude/settings.json项目级配置在.claude/settings.json。确认当前启动目录不是错误项目否则项目级配置不会加载。第三步检查权限规则。如果 AI 没有按预期执行某个操作很可能是 allow 范围过窄或者 deny 规则误拦。此时查看最近一次权限拒绝提示调整规则后再测试。第四步打开详细日志。Claude Code 支持调试日志输出增加调用信息后可以看到完整的请求和工具调用过程。第五步检查版本更新。工具类软件迭代很快很多 model not recognized 之类的报错升级版本后就会消失。npm update -g anthropic-ai/claude-code6. 团队协作和生产环境下的权限最佳实践6.1 个人项目的最小权限配置个人项目不必追求零确认但也不要把权限放到最大。推荐用一个渐进式策略默认模式下跑通任务观察 AI 实际使用哪些工具再把高频、低风险的操作加入 allow形成自己的最小权限集合。一个比较稳妥的起始配置{ permissions: { allow: [ Read(./src/**), Read(./tests/**), Write(./src/**), Bash(git status), Bash(git diff), Bash(npm test) ], deny: [ Write(./.env), Write(./.env.*), Bash(rm -rf *), Bash(curl *), Bash(wget *), Bash(ssh *) ] } }这个配置把常见开发操作放行同时拦住环境变量文件、危险删除命令和外联下载命令。它不是万能的但比全量放行主动得多。6.2 团队如何统一权限策略团队环境里权限策略不能靠每个成员自觉。推荐把项目级.claude/settings.json纳入版本控制让所有成员在相同权限边界下工作。deny 规则覆盖高危命令后即使成员误配 allow也会被兜底。代码审查场景中可以强制使用 plan 模式让 AI 只输出变更计划不直接修改代码。评审通过后再在普通模式下执行。这个流程能避免 AI 在讨论阶段就悄悄改了一堆文件。需要明确的是bypassPermissions不允许出现在成员的本地日常开发中。如果 CI 或自动化任务需要无确认执行应该放在隔离的临时环境中并将密钥作为 CI secret 注入避免任何成员本地方便而全局放权。6.3 Skills 使用要点技能脚本同样受权限模型约束Claude Code 的技能Skills机制让开发者可以把一组提示词、脚本和文档打包成可复用技能。技能通常放在项目的.claude/skills目录或用户级~/.claude/skills目录下基本结构如下.claude/skills/my-skill/ SKILL.md scripts/run.shSKILL.md描述技能用途和调用方式scripts目录存放实际执行脚本。新增一个技能后AI 可以在相关任务中自动加载技能定义并调用其中的脚本。这里有一个常见误解以为技能是可信的安全边界。实际上技能里的脚本和其他 AI 生成的脚本一样都是工具调用都会受到同一套权限模型约束。这意味着技能不能自动获得Bash(*)权限它要执行命令时仍然会被 allow / deny 规则检查。因此安装第三方技能前第一件事是读SKILL.md确认它声明了什么权限、执行什么脚本、是否会向外部发送数据。不信任的技能不要安装更不要为了解决报错随手给某个技能目录添加全局 allow 规则。6.4 发布前检查清单在把 Claude Code 接入团队正式开发流程前建议逐项确认以下内容权限模式是否明确选择未使用bypassPermissions作为默认模式。deny 规则是否覆盖删除、外联下载、SSH 等高风险命令。allow 规则作用域是否最小化没有Bash(*)和全目录Write。项目级设置文件是否入库团队策略是否可复查。API Key、令牌是否通过环境变量或密钥管理注入未写入源码。非交互环境是否使用隔离沙箱、容器或临时环境。AI 的变更是否开启日志或审计出现问题能否回溯工具调用记录。第三方模型接口是否验证过协议兼容性模型名称是否与版本匹配。第三方技能来源是否可信技能里的脚本是否经过检查。版本升级后是否重新验证过权限规则而不是沿用旧配置。这份清单可以作为团队 AI 工具接入评审的基线。不必每条都满足才允许使用但每条都是真实事故里验证过的关键点。7. 把安全边界当作默认配置这篇文章的核心判断是Claude Code 的“默认放权”本质上是一种可配置、可审计、可撤销的权限授予机制而不是把系统完全交给 AI。之所以在对抗性测试中能做到多次攻击 0 成功是因为权限确认、deny 规则、工具隔离这些分层机制在正常工作而一旦用户手动把 allow 范围拉满或者在生产环境中使用bypassPermissions再强的默认防护都会失效。下一步建议从练习开始。准备一个临时模拟项目依次体验default、acceptEdits、plan三种权限模式观察 AI 在不同模式下的工具调用差异。然后写一份自己的 allow / deny 配置把日常命令和项目路径加进去再尝试让 AI 执行一个不在白名单里的命令看它是否会按预期请求确认或被拒绝。权限配置不是一次性工作。每次升级版本、接入新模型、安装新技能都值得重新检查一遍权限模型是否仍然符合预期。把安全边界当作默认配置来维护AI 编程工具才能既高效又可控。