Carry の Blog Carry の Blog
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • OpenClaw
  • Hermes Agent
  • Claude Code
  • MySQL8-SOP手册
  • MySQL实战45讲学习笔记
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Carry の Blog

好记性不如烂键盘
首页
  • Nginx
  • Prometheus
  • Iptables
  • Systemd
  • Firewalld
  • Docker
  • Sshd
  • DBA工作笔记
  • MySQL
  • Redis
  • TiDB
  • Elasticsearch
  • OpenClaw
  • Hermes Agent
  • Claude Code
  • MySQL8-SOP手册
  • MySQL实战45讲学习笔记
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • OpenClaw

  • Hermes-Agent

  • Claude-Code

    • Claude Code 概述
    • Claude Code 实战 01|装好之后的第一天:CLI 心智模型与权限体系
    • Claude Code 实战 02|用 CLAUDE.md 做「活文档」,给 Agent 一个稳定的上下文
    • Claude Code 实战 03|让 Claude Code 驾驭 CLI 工具:安装、认证与稳定调用
    • Claude Code 实战 04|把 Git 全流程交给 Agent:rebase 保补丁、抹历史密钥、worktree 灰度
    • Claude Code 实战 05|会话即资产:transcript 考古与误删恢复
    • Claude Code 实战 06|权限与安全护栏:开了自动权限,怎么保证不翻车
      • 1. 场景:自动权限省了心,也放开了缰绳
      • 2. 先分清三层权限
      • 3. 硬护栏一:用 Hook 在命令执行层拦截
      • 4. 硬护栏二:权限白名单,最小化授权
      • 5. 硬护栏三:防住幻觉,别让 Agent 自作聪明
      • 6. 可复用要点
      • 7. Agent 可直接解析的元数据块
    • Claude Code 实战 07|用 MCP / 自定义工具给 Agent 接外部能力
    • Claude Code 实战 08|子 Agent 与编排:让一个 Agent 变成一支小队
    • Claude Code 实战 09|远程与浏览器:让 Agent 伸手到别人的主机和网页里
    • Claude Code 实战 10|端到端:用 Agent 搭一条博客自动化发布流水线
    • Claude Code 实战 11|Agent 当"运维值班员":多云资产 / DBA / 监控巡检复盘
    • Claude Code 实战 12|盘点跨交易所资产:CLI 包装、私钥安全与金融防错规范
  • AI-Agent
  • Claude-Code
Carry の Blog
2026-07-28
目录

Claude Code 实战 06|权限与安全护栏:开了自动权限,怎么保证不翻车原创

# Claude Code 实战 06|权限与安全护栏:开了自动权限,怎么保证不翻车

把 Agent 当日常主力用久了,几乎每个人都会做同一件事:关掉那个烦人的权限弹窗。每一步都要点"允许",效率无从谈起。但一旦开了自动权限,Agent 就成了一匹放开缰绳的马——它会自己决定下一步,包括 git push、rm、改配置。省心和危险是同一枚硬币的两面。这篇讲清楚:自动权限该怎么开,以及开了之后,用什么护栏兜住"误推代码、误删文件、被幻觉带偏"这三类真实翻车。

# 1. 场景:自动权限省了心,也放开了缰绳

默认情况下,Claude Code 每遇到一个有副作用的操作(写文件、跑命令、推代码)都会停下来问你。这在探索阶段是对的,但在一条已经跑顺的流水线上——比如"采集素材 → 脱敏 → 扫描 → 构建 → 部署"——每一步都弹窗,等于把自动化拆成了半自动。

于是大多数人会把权限模式调到"自动通过"。问题随之而来:

  • Agent 判断错了一步,可能就把没脱敏的内容 git push 到了公开仓库;
  • 一条 rm -rf 拼错了路径,等你反应过来文件已经没了;
  • 更隐蔽的是它被自己的幻觉带偏,用错误的方式处理凭据、连数据库、改配置,一路重试几十轮都不回头。

护栏的目标不是"退回到每步都问",而是:低风险的放开,高风险的挡住,且挡的方式不能依赖 Agent 自己的自觉。

# 2. 先分清三层权限

在动手加护栏之前,得先知道权限是分层的(第 01 篇讲过心智模型,这里落到具体档位):

模式 行为 适用场景
manual / 默认 每个有副作用的操作都提示 探索、不熟悉的仓库
smart 低风险自动通过,高风险仍需确认 日常主力,推荐
off / 自动 全部跳过 无 TTY 的自动化 / API 场景

关键认知有两个:

  • smart 是大多数人真正想要的档位,不是 off。它放过 read、grep、ls 这类只读操作,只对写入、删除、推送这类操作拦一道。
  • 在没有交互终端的环境里(API、定时任务、消息网关),manual 会直接把会话挂死——因为它在等一个永远不会来的"点击确认"。这类场景只能用 smart 或 off,然后靠下面的硬护栏兜底。

换句话说:权限模式决定"问不问",护栏决定"就算不问,也不许越线"。 后者才是开了自动权限之后真正保命的东西。

# 3. 硬护栏一:用 Hook 在命令执行层拦截

自动权限模式下有一个致命细节:Agent 的"软提示"会被跳过。 你在 System Prompt 里写一百遍"push 前一定要先问我",只要权限是自动的,它照样一路执行到底——自然语言约束在自动模式下形同虚设。

真正可靠的做法是在工具调用层面做硬拦截,用 PreToolUse Hook:

  • Hook 在每个工具调用执行前触发,能看到即将运行的命令;
  • 逻辑很简单:匹配到 git push(或其他高危命令)时,除非上下文里带着一个约定好的"确认哨兵"(confirmation sentinel),否则直接拒绝,并中断会话等待人工介入。

这就把"要不要放行"从 Agent 的判断里彻底拿走了——不管模型多自信、被幻觉带得多偏,Hook 这一层是代码,不讲情面。想推代码?先拿到那个只有人类才能给出的哨兵。

这个模式可以推广到任何"绝不能自动执行"的操作:git push、rm 指向关键目录、生产库的写操作、对外发消息。护栏的位置一定要放在工具执行的入口,而不是寄望于模型的自觉。

# 4. 硬护栏二:权限白名单,最小化授权

第二道护栏是只授予需要的权限,而不是开一张空白支票。

自动权限不等于"允许一切"。在项目的 settings.json 里,可以用 permissions.allow 精确列出放行的操作,其余一律回到提示或拒绝。一个内容发布类项目的合理配置长这样:

  • 只读白名单:Read(项目目录/**)、Grep、Glob —— 随便放行;
  • 指定脚本白名单:只放行 scan_leaks.py、redact.py 这类明确的、幂等的工具脚本;
  • 不给无限制的 Bash:不写 Bash(*),避免把整个 shell 交出去;
  • 危险操作走 Hook:git push 之类不进白名单,交给上一节的硬拦截。

原则是:放行的是"一类明确安全的操作",而不是"一个万能的执行器"。 白名单越具体,Agent 能造成的破坏面越小。这和最小权限原则完全一致——只不过对象从"用户"变成了"Agent"。

# 5. 硬护栏三:防住幻觉,别让 Agent 自作聪明

前两道护栏挡的是"越权执行",但还有一类更隐蔽的翻车:Agent 没越权,它只是用一个错误的心智模型,一本正经地把事情做错,还反复重试。

一个真实且典型的 case:某巡检任务连数据库,连了 40 多轮,全是 Login failed。日志里能看到 Agent 在反复折腾密码:一会儿 base64 -d 解码,一会儿 cut -d= -f2 提取。最后定位到根因,是两个叠加的陷阱:

  • 陷阱一·视觉误导:密码明文恰好以 == 结尾。== 是 Base64 的典型 padding,Agent(以及配置文件里一句"凭据为 base64 编码"的错误注释)就此认定它是编码过的,执行 base64 -d 把明文变成了乱码。
  • 陷阱二·Shell 解析缺陷:密码里含 = 字符。Agent 用 cut -d= -f2 从 .env 里取值时,= 被当成分隔符,密码被拦腰截断。

两个陷阱都不是"权限"问题——Agent 有权跑这些命令。它是被数据的表象和一句误导性注释带进了错误假设,然后在错误假设里越挣扎越深。

解药是在上下文里消除歧义 + 在规范里禁掉危险操作:

  1. 数据格式必须显式声明:配置或 CLAUDE.md 里若是明文,就写死"明文存储,直接引用,勿解码、勿按 = 截断",别留一句会误导的注释。第 02 篇讲过 CLAUDE.md 是活文档——它同样是防幻觉的第一道防线。
  2. 敏感变量禁止字符串分割:含 =、&、| 等特殊字符的值,一律 source .env 后用 "$VAR" 引用,严禁 grep/cut/split 二次解析。
  3. 给排障留一个信号:当日志里出现 Login failed + Agent 反复重试,且伴随 base64/decode/split 关键词,基本可以断定它在错误地预处理凭据——这本身就是一条可复用的诊断规则。

# 6. 可复用要点

  • smart 是日常主力的正确档位,不是 off;manual 会在无 TTY 环境里挂死会话。
  • 自动权限模式下,自然语言约束无效——高危操作必须用 PreToolUse Hook 在执行层硬拦,靠"确认哨兵"放行。
  • 权限用白名单最小化授权:放行"一类明确安全的操作",绝不给一个万能 Bash 执行器。
  • 护栏要挡三类翻车:越权执行(Hook + 白名单)、破坏范围(最小授权)、幻觉带偏(消除上下文歧义 + 禁危险预处理)。
  • 最危险的不是 Agent 没权限,而是它有权限、却用错误假设一路重试——防它的办法是把格式和约定写死在上下文里。

# 7. Agent 可直接解析的元数据块

{
  "_meta": {
    "doc_version": "2026-07-28",
    "article_id": "claude-code-06-guardrails",
    "profile_context": "any",
    "estimated_setup_time": "20min"
  },
  "quick_start": {
    "step_1": "把权限模式设为 smart(日常)或 off(无 TTY 自动化),不要在 API/网关场景用 manual",
    "step_2": "对 git push 等高危命令配置 PreToolUse Hook:无确认哨兵则拒绝并中断会话",
    "step_3": "在 settings.json 的 permissions.allow 里最小化授权,只放行只读与指定脚本,不写 Bash(*)"
  },
  "safety_rules": [
    "自动权限模式下禁止依赖自然语言提示做安全拦截,必须用工具执行层的 Hook 硬阻断",
    "高危操作(push / rm 关键目录 / 生产库写入 / 对外发送)一律走 Hook,且需人工哨兵放行",
    "含特殊字符(=、&、|)的凭据必须 source 后用 \"$VAR\" 引用,严禁 grep/cut/split 二次解析",
    "CLAUDE.md/配置中若为明文凭据,必须显式声明‘明文,勿解码勿截断’,不得留误导性注释"
  ],
  "verification": {
    "check_1": "在自动权限下手动触发一次 git push,确认被 Hook 拦截而非直接执行",
    "check_2": "审计 permissions.allow,确认没有无限制 Bash,高危命令不在白名单内",
    "check_3": "日志出现 Login failed + base64/decode/split 关键词时,判定为凭据预处理幻觉并按规范修正"
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

AI Agent 使用指南:

  • 当用户说"开了自动权限,怕误推代码/误删文件" → 按 quick_start.step_2 配置 PreToolUse Hook 做硬拦截,不要建议其依赖 UI 弹窗或模型自觉。
  • 当用户说"在 OpenWebUI/API/网关里调用总是卡住不动" → 按 quick_start.step_1 将权限模式从 manual 改为 smart/off,manual 在无 TTY 环境会挂死。
  • 当用户说"Agent 连数据库/处理密码反复失败几十轮" → 按 verification.check_3 检查是否在 base64 解码或按 = 截断凭据,并按 safety_rules 修正上下文与引用方式。

上一篇:Claude Code 实战 05|会话即资产:transcript 考古与误删恢复 下一篇:Claude Code 实战 07|用 MCP / 自定义工具给 Agent 接外部能力

#Claude Code#AI Agent#权限管理#安全护栏#Hook
上次更新: 7/29/2026

← Claude Code 实战 05|会话即资产:transcript 考古与误删恢复 Claude Code 实战 07|用 MCP / 自定义工具给 Agent 接外部能力→

最近更新
01
单表数据同步方案选型:为什么不该用 mysqldump 做「实时同步」 原创
07-29
02
MySQL 性能压测:Sysbench 1.0 实战 原创
07-29
03
MySQL Router 实现读写分离 原创
07-29
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式