← 全部文章
Guide

在 dev container 中安全執行 Claude Code:使用自動模式與鎖死權限

A secure developer workstation scene: a laptop connected to an isolated container box, outbound network arrows passing t

Anthropic 把每個 Claude Code 重度使用者早就有感的問題,直接量化了:使用者核准了大約 93% 的權限提示,而該公司表示,提示越堆越多,注意力就越下降(Anthropic)。這就是核准疲勞,會把「human in the loop」變成「按著 Enter 的人類」。

錯誤做法是在你的筆電上跑 --dangerously-skip-permissions,然後祈禱模型乖一點。正確做法是無聊但有效的安全工程:把 Claude Code 放進 dev container,只給它 repo,限制對外流量,用政策停用繞過模式,而且只在真正支援的地方使用自動模式。

這篇指南會示範一套今天就能丟進 repo 跑起來的設定。也會談到目前社群裡的爭論:開發者希望 agent 更自主,但不想要看不見的護欄,也不想要黑箱式地亂爬檔案。務實答案不是「更用力相信 Claude」。而是「把爆炸半徑縮小到讓自主性變得可以接受」。

封面風格架構草圖,顯示主機編輯器、dev container、以非 root 使用者執行的 Claude Code,以及管理

這場辯論真正關心的是可觀測性與爆炸半徑

圍繞「Anthropic tries to hide Claude’s AI actions」的 Hacker News 討論串,不只是抱怨大會。有位留言者總結了開發者的恐懼:如果 agent 開始打開過時設定,或爬一堆無關檔案,操作者必須快到足以察覺並阻止它(Hacker News)。另一串關於「dangerously」執行 Claude Code 的討論,也收斂到同一個實務模式:讓 agent 自由行動,但只限在檔案與網路存取都受限的沙盒裡(Hacker News)。

Anthropic 自己的工程文章也落在同一個結論。它把防線分成環境、模型與外部內容。環境是你能做成確定性的那一層。如果憑證從來不進沙盒,Claude 就無法外洩它們;不管原因是 prompt injection、模型越界,還是糟糕的使用者指令(Anthropic)。

自動模式適合放在這裡,但它不是魔法。Anthropic 表示,自動模式會用另一個分類器在動作執行前審查;它的文件也稱這是研究預覽,不是敏感操作審查的替代品(Claude Code docs)。這個差別很重要。自動模式減少提示。容器減少後果。

我建議團隊採取這個立場:

ModeUse it forDo not use it for
plan不熟悉的 repo、高風險變更長時間無人看管的編輯
acceptEdits一般功能開發部署、祕密、基礎架構變更
auto有出口流量控管的隔離 dev container生產系統或未知 repo
bypassPermissions僅限可丟棄 VM開發者筆電

Anthropic 的文件說,自動模式需要 Claude Code v2.1.83 或更新版本。在 Anthropic API 上,支援的模型包含 Claude Opus 4.6 或更新版本,以及 Sonnet 4.6。在 Bedrock、Vertex AI 和 Microsoft Foundry 上,文件列出的自動模式支援只有 Opus 4.7 與 Opus 4.8(Claude Code docs)。

建置 Dev Container

在你的 repo 中建立三個檔案:

.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,讓命令離開主機執行,同時編輯仍會出現在掛載的 repo 裡(Claude Code docs)。文件也警告不要掛載主機祕密,例如 ~/.ssh 或雲端憑證檔。照做就對了。如果 Claude 需要 repo 範圍的 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 安裝,會讓團隊 repo 中的政策與版本管理更容易理解。如果你想要可重現性,就把 @anthropic-ai/claude-code pin 到特定版本,並保留 DISABLE_AUTOUPDATER=1

啟用自動模式前,先鎖死權限

建立 .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)。

第二,即使在自動模式下,deny 規則仍然重要。Anthropic 說,自動模式會阻擋超出請求範圍的動作、針對未識別基礎架構的動作,或看似由惡意內容驅動的動作;但你不該把團隊政策外包給分類器。如果任何人都不該在 agent session 裡跑 terraform apply,就把它寫成 deny 規則。

有個但書:repo 管理的政策,任何能編輯 repo 的人都能改。Anthropic 文件說,在 Linux 裡 /etc/claude-code/managed-settings.json 具有高優先權;但如果你需要開發者不能透過改 repo 檔案繞過的政策,就使用伺服器管理設定或 MDM(Claude Code docs)。對新創團隊來說,簽入 repo 的政策仍是很好的基準。對企業部署來說,不要停在這裡。

前後對照面板:左側顯示主機筆電上的 Claude Code,可存取 home 目錄、SSH 金鑰,

用小型允許清單限制對外連線

新增 .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

這刻意保持簡單。它在啟動時解析允許的 hostname,並允許對那些 IP 的 TCP 443。若要生產等級控管,請把容器放在 proxy 後面,並記錄每個請求。但即使只是這種基本的預設拒絕規則,也比讓自主 coding agent 對整個網際網路開放好得多。

Anthropic 的網路文件列出必要網域,例如 api.anthropic.comclaude.aiplatform.claude.comdownloads.claude.aistorage.googleapis.comraw.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 定價為每百萬 input tokens 10 美元、每百萬 output tokens 50 美元,低於 Mythos Preview 價格的一半(Anthropic)。OneHop 將 Claude Fable 5 列為 anthropic/claude-fable-5,官方價格顯示為 $10/M input 與 $50/M output,OneHop 價格則顯示為 $3/M input 與 $15/M output,另有新使用者免信用卡 $10 免費額度(OneHop)。

目前的營運註記:OneHop 的 Fable 5 頁面表示該模型雖仍列出,但暫時不可用。設定可以先保留,但預期要等你的帳號與區域取得存取權後再使用。

若要透過 OneHop 直接呼叫 Anthropic Messages,請使用 OneHop 針對這個模型發布的 Anthropic-compatible endpoint:

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)

如果你的 app 已經使用 OneHop 的 OpenAI-compatible gateway,單行 base URL 變更是:

client = OpenAI(base_url="https://api.onehop.ai/v1", api_key="oh_your_key_here")

針對 Claude Code,請在 ANTHROPIC_BASE_URL 使用 Anthropic-compatible base URL,因為 Claude Code 使用的是 Anthropic Messages API。OneHop 的 Fable 5 模型頁面目前列出 Anthropic Messages 可在 https://api.onehop.ai/anthropic 使用,而 OpenAI Chat Completions 對此模型標示為不支援(OneHop)。

精簡價格比較圖,每個模型有三個長條:Fable 5 的 Anthropic 標價為 $10 input 與 $50 output,

運作模式:少一點信任,快一點出貨

最好的 Claude Code 設定,不是最寬鬆的那個。而是讓錯誤代價很低的那個。

當 Claude 正在探索新的 codebase 時,使用 plan 模式。只有在任務範圍明確後,才切到 auto。用政策停用 bypassPermissions。拒絕讀取祕密。拒絕部署、推送到受保護分支、雲端變更,以及 metadata endpoints。把 agent 放進非 root 的 dev container。預設封鎖對外連線。合併前審查 diff。

這聽起來可能比 YOLO 模式慢。實務上反而更快,因為沒有人需要盯著 40 個瑣碎提示,也不用懷疑剛剛那次核准是不是讓模型外洩了一個 token。Anthropic 自己的 containment 文章說,那個參考 dev container 的存在,就是為了讓 Claude Code 能在沒有逐動作核准的情況下無人看管地執行(Anthropic)。缺少的那一塊是團隊政策。

如果你想用最短路徑試試 Fable 級的 coding 工作,而不用重建你的 provider stack,可以透過 Claude Fable 5 on OneHop 路由。新帳號可以從 $10 免費額度開始。base URL 變更是簡單的部分。真正的勝利,是把它和一個讓自主性安全到足以使用的容器配在一起。