Anthropic 把一个所有 Claude Code 重度用户都已经感受到的问题量化了:用户批准了大约 93% 的权限提示,而公司也承认,提示越堆越多,人的注意力就越容易下降(Anthropic)。这就是审批疲劳,它会把“human in the loop”变成“人肉按回车”。
错误的做法,是在自己的笔记本上跑 --dangerously-skip-permissions,然后祈祷模型别乱来。正确的做法,是无聊但有效的安全工程:把 Claude Code 放进 dev container,只给它仓库访问权限,限制出站流量,用策略禁掉 bypass mode,并且只在真正受支持的地方使用 auto mode。
这篇指南给你一套今天就能丢进仓库运行的配置。它也会回应当前社区里的争论:开发者希望 agent 更自主,但不想要看不见的护栏,也不想要黑箱式文件爬取。务实的答案不是“更用力地相信 Claude”。而是“把爆炸半径缩到足够小,小到自主性变得可以接受”。

这场争论真正关乎可观测性和爆炸半径
围绕“Anthropic tries to hide Claude’s AI actions”的 Hacker News 讨论,并不只是抱怨表演。有位评论者总结了开发者真正害怕的事:如果 agent 开始打开过期配置,或者爬取无关文件,操作者必须能足够快地发现并阻止它(Hacker News)。另一条关于“危险地”运行 Claude Code 的讨论,也收敛到同一个实用模式:让 agent 自由运行,但只能在文件和网络访问都受限的沙箱里运行(Hacker News)。
Anthropic 自己的工程文章也落在同一个结论上。它把防护拆成环境、模型和外部内容三层。环境是你能做成确定性的那一层。如果凭据从不进入沙箱,那么无论原因是提示注入、模型越界,还是糟糕的用户指令,Claude 都无法把它们外传(Anthropic)。
auto mode 适合放在这里,但它不是魔法。Anthropic 表示,auto mode 会用一个单独的分类器在操作执行前进行审查;文档也把它称为 research preview,而不是敏感操作审查的替代品(Claude Code docs)。这个区别很重要。auto mode 减少提示。容器减少后果。
我建议团队采用这样的立场:
| Mode | 适合用来做 | 不要用来做 |
|---|---|---|
plan | 不熟悉的仓库、有风险的改动 | 长时间无人看管的编辑 |
acceptEdits | 常规功能开发 | 部署、密钥、基础设施变更 |
auto | 带出站流量控制的隔离 dev container | 生产系统或未知仓库 |
bypassPermissions | 仅限一次性 VM | 开发者笔记本 |
Anthropic 文档说,auto mode 需要 Claude Code v2.1.83 或更高版本。在 Anthropic API 上,受支持的模型包括 Claude Opus 4.6 或更高版本以及 Sonnet 4.6。在 Bedrock、Vertex AI 和 Microsoft Foundry 上,文档列出的 auto mode 支持模型只有 Opus 4.7 和 Opus 4.8(Claude Code docs)。
构建 Dev Container
在你的仓库里创建三个文件:
.devcontainer/
devcontainer.json
Dockerfile
managed-settings.json
从 .devcontainer/devcontainer.json 开始:
{
"name": "claude-code-safe",
"build": {
"dockerfile": "Dockerfile"
},
"remoteUser": "node",
"mounts": [
"source=claude-code-config-${devcontainerId},target=/home/node/.claude,type=volume"
],
"runArgs": [
"--cap-add=NET_ADMIN",
"--cap-add=NET_RAW"
],
"containerEnv": {
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
"DISABLE_AUTOUPDATER": "1",
"ANTHROPIC_BASE_URL": "https://api.onehop.ai/anthropic",
"ANTHROPIC_API_KEY": "${localEnv:ONEHOP_API_KEY}"
},
"postCreateCommand": "sudo /usr/local/bin/init-firewall.sh"
}
Anthropic 的 dev container 文档建议把 Claude Code 放在容器里运行,这样命令会在远离宿主机的环境中执行,而编辑结果仍会出现在挂载的仓库里(Claude Code docs)。它也提醒不要挂载宿主机密钥,比如 ~/.ssh 或云服务凭据文件。照做。如果 Claude 需要一个仓库级 GitHub token,就通过环境变量传入一个短期 token。不要因为方便就把整个 home 目录 bind-mount 进去。
接着是 Dockerfile:
FROM mcr.microsoft.com/devcontainers/javascript-node:22
RUN npm install -g @anthropic-ai/claude-code@latest
COPY managed-settings.json /etc/claude-code/managed-settings.json
COPY init-firewall.sh /usr/local/bin/init-firewall.sh
RUN chmod +x /usr/local/bin/init-firewall.sh
Anthropic 文档也提供了一个 Dev Container Feature,但通过 Dockerfile 安装,会让团队仓库里的策略和版本管理更容易推理。如果你想要可复现性,就把 @anthropic-ai/claude-code 固定到具体版本,并保留 DISABLE_AUTOUPDATER=1。
在启用 Auto Mode 之前锁死权限
创建 .devcontainer/managed-settings.json:
{
"permissions": {
"defaultMode": "auto",
"disableBypassPermissionsMode": "disable",
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Read(./config/credentials.json)",
"Bash(curl *)",
"Bash(wget *)",
"Bash(git push *)",
"Bash(kubectl *)",
"Bash(terraform apply *)",
"WebFetch(domain:169.254.169.254)"
],
"ask": [
"Bash(npm publish *)",
"Bash(docker push *)",
"Bash(gh release *)"
],
"allow": [
"Bash(npm install)",
"Bash(npm test *)",
"Bash(npm run lint *)",
"Bash(git diff *)",
"Bash(git status *)"
]
},
"autoMode": {
"environment": {
"trustedDomains": [
"registry.npmjs.org",
"github.com"
]
}
}
}
这里有两个细节在真正发挥作用。
第一,disableBypassPermissionsMode 会阻止 bypassPermissions,并且在通过 managed settings 强制执行时禁用 --dangerously-skip-permissions 标志。Anthropic 在它的设置参考里明确记录了这个控制项(Claude Code docs)。
第二,即使在 auto mode 下,deny 规则仍然重要。Anthropic 说 auto mode 会阻止那些超出请求范围、指向未识别基础设施,或看起来由恶意内容驱动的操作,但你不应该把团队策略外包给一个分类器。如果任何人都不应该从 agent 会话里运行 terraform apply,那就把它编码成 deny 规则。
一个注意点:仓库托管的策略,可以被任何能编辑仓库的人修改。Anthropic 文档说,在 Linux 内部,/etc/claude-code/managed-settings.json 具有很高的优先级;但如果你需要开发者不能通过编辑仓库文件绕过的策略,就使用 server-managed settings 或 MDM(Claude Code docs)。对创业团队来说,把策略提交进仓库仍然是一个好基线。对企业级 rollout 来说,不要停在这里。

用小型 Allowlist 限制出站流量
添加 .devcontainer/init-firewall.sh:
#!/usr/bin/env bash
set -euo pipefail
ALLOWED_HOSTS=(
api.onehop.ai
api.anthropic.com
claude.ai
platform.claude.com
registry.npmjs.org
github.com
raw.githubusercontent.com
)
iptables -P OUTPUT DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
for host in "${ALLOWED_HOSTS[@]}"; do
for ip in $(getent ahostsv4 "$host" | awk '{print $1}' | sort -u); do
iptables -A OUTPUT -p tcp -d "$ip" --dport 443 -j ACCEPT
done
done
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
这段脚本刻意保持简单。它在启动时解析允许的主机名,并允许到这些 IP 的 TCP 443 连接。要做生产级控制,就把容器放到代理后面,并记录每一个请求。但就算只是这种基础的默认拒绝规则,也比让一个自主 coding agent 能访问整个互联网要好。
Anthropic 的网络文档列出了所需域名,例如 api.anthropic.com、claude.ai、platform.claude.com、downloads.claude.ai、storage.googleapis.com 和 raw.githubusercontent.com,具体取决于安装和认证路径(Claude Code docs)。如果你通过 npm 安装并禁用自动更新,运行时可能不需要下载域名。先把列表收紧,只有在构建因为明确原因失败时,再添加域名。
运行它:
export ONEHOP_API_KEY=oh_your_key_here
code .
# VS Code: Dev Containers: Rebuild and Reopen in Container
claude --permission-mode auto
在容器内验证:
whoami
claude --version
curl -I https://api.onehop.ai
curl -I https://example.com
OneHop 请求应该成功。除非你添加了 example.com,否则它应该失败。
通过 OneHop 路由 Claude Fable 5
Anthropic 于 2026 年 6 月 9 日发布了 Claude Fable 5 和 Claude Mythos 5,其中 Fable 5 的价格为每百万输入 token 10 美元、每百万输出 token 50 美元,不到 Mythos Preview 价格的一半(Anthropic)。OneHop 将 Claude Fable 5 列为 anthropic/claude-fable-5,官方价格显示为 $10/M 输入和 $50/M 输出,OneHop 价格显示为 $3/M 输入和 $15/M 输出,并且新用户无需绑卡即可获得 10 美元免费额度(OneHop)。
当前运维提示:OneHop 的 Fable 5 页面显示该模型虽然仍在列表中,但暂时不可用。配置可以先保留,但要等你的账号和地区获得访问权限后再使用。
如果要通过 OneHop 直接调用 Anthropic Messages,请使用 OneHop 为这个模型发布的 Anthropic 兼容端点:
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.onehop.ai/anthropic",
api_key="oh_your_key_here",
)
message = client.messages.create(
model="anthropic/claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Summarize this repo's test strategy."}],
)
print(message.content[0].text)
如果你的应用已经在使用 OneHop 的 OpenAI 兼容网关,那么一行 base URL 改动是:
client = OpenAI(base_url="https://api.onehop.ai/v1", api_key="oh_your_key_here")
对 Claude Code 来说,请在 ANTHROPIC_BASE_URL 中使用 Anthropic 兼容 base URL,因为 Claude Code 说的是 Anthropic Messages API。OneHop 的 Fable 5 模型页目前列出 Anthropic Messages 可通过 https://api.onehop.ai/anthropic 使用,而 OpenAI Chat Completions 对这个模型标记为不支持(OneHop)。

运行模型:少一点信任,快一点交付
最好的 Claude Code 配置,不是权限最大的那个。而是出错成本最低的那个。
当 Claude 探索一个新代码库时,用 plan mode。只有在任务边界清楚之后,才切到 auto。通过策略保持 bypassPermissions 禁用。拒绝读取密钥。拒绝部署、推送到受保护分支、云资源变更,以及访问元数据端点。把 agent 放进非 root dev container。默认阻断出站流量。合并前审查 diff。
这听起来可能比 YOLO mode 慢。实际却更快,因为没人需要盯着 40 个琐碎提示,也没人需要担心一次批准是不是刚刚让模型把 token 外传了。Anthropic 自己的 containment 文章说,参考 dev container 的存在,就是为了让 Claude Code 能在没有逐项审批的情况下无人值守运行(Anthropic)。缺的那块,是团队策略。
如果你想用最短路径试试 Fable 级别的 coding work,又不想重建整个 provider stack,可以通过 Claude Fable 5 on OneHop 路由。新账号可以从 10 美元免费额度开始。base URL 改动是最简单的部分。真正的收益,是把它和一个能让自主性安全到可以使用的容器配在一起。