allow
你预先批准的工具
像 Bash(git commit:*) 这样的规则,会让这条命令直接通过。规则约束的是命令本身,不是命令跑起来之后打开的东西。
Claude Code
权限系统决定 Claude Code 可以运行哪些工具。它完全没说这些工具能够到什么,而它们能够到的,是你机器上的每一个密钥。Sallyport 把密钥挪到智能体读不到的地方。
你没允许过的工具,Claude Code 会先问一声。规则写在 settings.json 里,分成 allow、ask、deny 三个列表,值得好好配一遍。
allow
像 Bash(git commit:*) 这样的规则,会让这条命令直接通过。规则约束的是命令本身,不是命令跑起来之后打开的东西。
ask
默认情况。Claude Code 把工具调用摆给你看,然后等着。你是在当下审查一个动作,凭的是凌晨两点手头恰好有的那点上下文。
deny
一条 deny 规则能把 Read 工具挡在 ./.env 之外。它挡不住一条被允许的 shell 命令去读同一个文件,对你的依赖启动的那些进程更是说不上话。
bypass
--dangerously-skip-permissions 这个开关把问题整个去掉了。下面有专门一节讲它。
这些规则管的都是智能体的工具,没有一条管得着工具去读的那个文件。你的 API 令牌在 .env 里,SSH 私钥在 ~/.ssh 里,任何以你的身份运行的进程都读得到,有没有提示都一样。
人们用它是有正当理由的:长时间的重构,通宵跑的任务,一个确认对话框就意味着活儿停到天亮。那就更值得弄清楚,你拿什么换了它。
Claude Code 本来就能读你的文件、用你的 shell、连出去访问网络。这个开关拿掉的,是那个本来能让你察觉的停顿。
提示是一个抓住智能体去开 .env 的机会,但它从来不是文件外面的一道墙。任何以你身份运行的进程都能读它,包括你正在看提示时 npm 刚装上的那个依赖。
抓取的网页里有一处提示注入,传递依赖里有一份被投毒的 README,这些指令就落进了一个握着你凭据、又不再有任何提示的会话里。
YOLO 模式让你失去了察觉的机会。把密钥放到伸手可及处的不是它,默认模式下它们也一样伸手可及。
安全审查
Claude Code 会读 diff 并指出里面的漏洞,这个该让它做。但那件事管的是你要发布的代码,它没有回答智能体自己在运行时能够到什么,而这才是本页在讲的暴露面。两个各自独立的问题,解决其中一个对另一个毫无帮助。
Sallyport 拿着凭据,由它来发起调用。Claude Code 要一个动作,拿回一个结果。密钥不会进入它的环境,所以被跳过的提示、被投毒的依赖、被注入的指令,都没有东西可以带走。
01
发往 api.stripe.com 的 http.request,或者在 prod-03 上的 ssh.exec。它通过 MCP 抵达,和 Claude Code 调用任何其他工具的方式一样。
02
密钥库锁着就一律拒绝。标记为逐次调用批准的密钥,每次都会弹出一张卡片。其余情况下每次智能体运行一张卡片,上面带着调用方的代码签名主体。
03
凭据是在 App 内部、执行的那一刻附加上去的。它不进入智能体的环境,跨主机跳转也不会把它带过去。
04
在动作发生的同时加密并做哈希链接。你可以查清跑过什么,而不必依赖智能体自己的说法。
之后,Claude Code 你想怎么跑就怎么跑,提示开着关着都行。真正要紧的那个决定,已经不在智能体手里了。
Sallyport 待在菜单栏里,密钥库就跑在它自己的进程中。没有守护进程,也没有账号。
引导流程会创建密钥库,并打开它的 Touch ID 门禁。
brew install --cask olegsotnikov/tap/sallyportClaude Code 由此拿到 http.request、ssh.exec,以及你经 Sallyport 代理的任何上游 MCP 服务器。
claude mcp add sallyport -- /Applications/Sallyport.app/Contents/MacOS/sp mcp把凭据放进密钥库,绑定到它对应的主机,然后从 .env 里删掉。让你心里发怵的那几个,标记成逐次调用批准。
stripe → api.stripe.com · 逐次调用批准大约两分钟。留下来的提示是 Sallyport 的,问的是要不要对真实基础设施动手,而不是哪个工具可以运行。
免费下载。需要 Apple Silicon、macOS 14 或更高版本。永远无需账户。
brew install --cask olegsotnikov/tap/sallyportmacOS 14+ · Apple Silicon