AI Native 手册
护栏与安全

三层护栏

应用层、权限规则、hook 三层叠加,任何一层失效都还有兜底

亲历小工具产品组织阶段 · 通用更新于 2026-10-16

破坏性操作要过三层护栏:应用层(脚本和 Makefile 自己先备份)、权限规则(settings.json 里的 deny 和 ask)、hook(PreToolUse 自动兜底)。三层各有盲区,叠在一起才可靠。但三层都会悄悄失效,所以还要第四件事:定期体检。

为什么要三层

写在 CLAUDE.md 里的“不要删库”只是建议。官方文档说得很清楚:权限规则由 Claude Code 执行,不由模型执行;提示词和 CLAUDE.md 影响的是 Claude 想做什么,改变不了 Claude Code 允许它做什么(原文)。所以能机械判断的规则,要写进系统。

但系统里的每一层也都有盲区:

层在哪管什么盲区
应用层脚本、Makefile、迁移工具不管谁来执行(你、agent、CI),都先备份、先校验只覆盖走这个入口的操作,agent 绕开 Makefile 直接敲 psql 就失效;fork 里的改动会被上游合并冲掉
权限规则settings.json 的 deny、ask、allowClaude Code 里哪些命令绝对不行、哪些必须你确认按命令文本匹配,换个写法就可能漏掉;只管 Claude Code;会被配置工具整份覆盖
hooksettings.json 的 hooks,或插件工具调用之前执行任意脚本:自动备份、按正则拦截只看得到 Claude Code 的工具调用;脚本在磁盘上但没挂载,就等于没有

三层的分工:应用层保证“不管谁来做都先有备份,备份失败就不执行”,权限规则负责“卡人”(让你来决定),hook 负责“兜底”:你没注意到的时候尽力多备份一份,但它不拦任何命令,也只覆盖它知道的那个库。真正能拦住破坏的,是前两层。

一次三层全部失效

本地数据库被一条 reset 命令清空过一次:几个演示用的工作区、几十个 agent 配置,没有任何备份。那个库里是真实的运营资产,不是测试数据。之后我加了三层防护:reset 脚本先备份,权限规则要求确认,PreToolUse hook 自动备份。

半年后,2026 年 10 月的一次环境排查,发现三层全没了:

  1. 应用层:Makefile 里的备份步骤,在一次上游大合并中被冲掉
  2. 权限规则:被一个模型供应商切换工具连同整个 settings.json 一起覆盖
  3. hook:脚本文件还在,但没有挂到任何事件上

整整一段时间,没有人发现。复盘里甚至写过检查命令,但它只是一段文字,没人去跑。完整经过见防护规则会悄悄失效。

教训:护栏不会报错,只会消失。每一层都要有体检。

按档位配置

档位应用层权限规则hook体检
小工具可选5 条 deny,见最小护栏可选改过配置后看一眼
产品破坏性脚本先备份,失败就退出deny,加上部署、删库、合并 PR 的 ask数据库兜底备份(尽力而为)会话开始自动检查
组织同上,共享文件加 CI 断言关键 deny 放托管设置同上,打包进组织插件会话开始检查、CI 断言、定期全面体检

应用层最简单:破坏性脚本的第一步就是备份,备份失败就停下。

#!/usr/bin/env bash
# scripts/db-reset.sh:先备份,备份失败就退出,后面的 reset 不会执行
set -euo pipefail
: "${DATABASE_URL:?DATABASE_URL 未设置,停止 reset}"
umask 077
dir="$HOME/db-backups"
mkdir -p "$dir" && chmod 700 "$dir"
tmp="$(mktemp "$dir/.pre-reset.XXXXXX")"
if ! pg_dump -Fc -d "$DATABASE_URL" -f "$tmp"; then
  rm -f "$tmp"
  echo "备份失败,停止 reset" >&2
  exit 1
fi
backup="$dir/pre-reset-$(date +%Y%m%d-%H%M%S)-$$.dump"
mv "$tmp" "$backup"
echo "已备份到 $backup"
# 从这里往下,才是真正的 reset 步骤

再把 Makefile 的 db-reset 目标改成调用这个脚本。这样不管是你、agent 还是 CI 执行 reset,都会先留一份备份;备份失败,reset 根本不会执行。文件名带时间戳和进程号,先写临时文件再改名,几次备份不会互相覆盖;目录 700、文件 600,只有你自己能读。这一层是否真的有效,用体检里的行为断言来守。

常见坑

相关

本页目录