Claude Code 和 Agent SDK 是強大的工具,可以代替您執行程式碼、存取檔案並與外部服務互動。與任何具有這些功能的工具一樣,周全地部署它們可確保您在獲得好處的同時維持適當的控制。
與遵循預定程式碼路徑的傳統軟體不同,這些工具會根據上下文和目標動態生成其操作。這種靈活性正是它們有用的原因,但這也意味著它們的行為可能受到所處理內容的影響:檔案、網頁或使用者輸入。這有時被稱為提示注入。例如,如果一個儲存庫的 README 包含不尋常的指令,Claude Code 可能會以操作者未預期的方式將這些指令納入其操作中。本指南涵蓋了降低此風險的實用方法。
好消息是,保護代理部署不需要特殊的基礎設施。適用於執行任何半信任程式碼的相同原則在此同樣適用:隔離、最小權限和縱深防禦。Claude Code 包含多項安全功能,有助於解決常見問題,本指南將逐一介紹這些功能以及為有需要者提供的額外強化選項。
並非每個部署都需要最高安全性。在筆記型電腦上執行 Claude Code 的開發人員與在多租戶環境中處理客戶資料的公司有不同的需求。本指南提供從 Claude Code 內建安全功能到強化生產架構的各種選項,讓您可以選擇適合自己情況的方案。
代理可能因提示注入(嵌入在其處理內容中的指令)或模型錯誤而採取非預期的操作。Claude 模型被設計為能抵抗此類攻擊,正如我們在模型卡中分析的那樣,我們相信 Claude Opus 4.6 是目前最強健的前沿模型。
不過,縱深防禦仍然是良好的實踐。例如,如果代理處理了一個惡意檔案,該檔案指示它將客戶資料發送到外部伺服器,網路控制可以完全阻止該請求。
Claude Code 包含多項安全功能來解決常見問題。完整詳情請參閱安全文件。
對於需要超越 Claude Code 預設值進行額外強化的部署,以下原則指導可用的選項。
安全邊界將具有不同信任等級的元件分隔開來。對於高安全性部署,您可以將敏感資源(如憑證)放置在包含代理的邊界之外。如果代理環境中出現問題,該邊界之外的資源仍然受到保護。
例如,與其直接給予代理 API 金鑰的存取權,您可以在代理環境之外執行一個代理伺服器,將金鑰注入請求中。代理可以進行 API 呼叫,但它永遠看不到憑證本身。這種模式對於多租戶部署或處理不受信任的內容時非常有用。
在需要時,您可以將代理限制為僅具有其特定任務所需的功能:
| 資源 | 限制選項 |
|---|---|
| 檔案系統 | 僅掛載所需目錄,優先使用唯讀 |
| 網路 | 透過代理伺服器限制為特定端點 |
| 憑證 | 透過代理伺服器注入而非直接暴露 |
| 系統功能 | 在容器中移除 Linux capabilities |
對於高安全性環境,分層多重控制提供額外保護。選項包括:
正確的組合取決於您的威脅模型和營運需求。
不同的隔離技術在安全強度、效能和營運複雜度之間提供不同的權衡。
在所有這些配置中,Claude Code(或您的 Agent SDK 應用程式)在隔離邊界內執行——沙箱、容器或虛擬機。下面描述的安全控制限制了代理從該邊界內可以存取的內容。
| 技術 | 隔離強度 | 效能開銷 | 複雜度 |
|---|---|---|---|
| 沙箱執行環境 | 良好(安全預設值) | 非常低 | 低 |
| 容器(Docker) | 取決於設定 | 低 | 中等 |
| gVisor | 優秀(正確設定下) | 中/高 | 中等 |
| 虛擬機(Firecracker、QEMU) | 優秀(正確設定下) | 高 | 中/高 |
對於不需要容器的輕量級隔離,sandbox-runtime 在作業系統層級強制執行檔案系統和網路限制。
主要優勢是簡單性:不需要 Docker 配置、容器映像或網路設定。代理伺服器和檔案系統限制是內建的。您提供一個設定檔來指定允許的網域和路徑。
運作方式:
bubblewrap,macOS 上的 sandbox-exec)來限制對配置路徑的讀寫存取設定:
npm install @anthropic-ai/sandbox-runtime然後建立一個配置檔來指定允許的路徑和網域。
安全考量:
共用主機核心:與虛擬機不同,沙箱化的程序共用主機核心。核心漏洞理論上可能允許逃逸。對於某些威脅模型這是可以接受的,但如果您需要核心層級的隔離,請使用 gVisor 或獨立的虛擬機。
無 TLS 檢查:代理伺服器允許列出網域但不檢查加密流量。如果代理對允許的網域具有寬鬆的憑證,請確保無法使用該網域來觸發其他網路請求或洩漏資料。
對於許多單一開發人員和 CI/CD 使用案例,sandbox-runtime 以最少的設定顯著提高了安全門檻。以下章節涵蓋了需要更強隔離的部署的容器和虛擬機方案。
容器透過 Linux 命名空間提供隔離。每個容器都有自己的檔案系統、程序樹和網路堆疊視圖,同時共用主機核心。
安全強化的容器配置可能如下所示:
docker run \
--cap-drop ALL \
--security-opt no-new-privileges \
--security-opt seccomp=/path/to/seccomp-profile.json \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--tmpfs /home/agent:rw,noexec,nosuid,size=500m \
--network none \
--memory 2g \
--cpus 2 \
--pids-limit 100 \
--user 1000:1000 \
-v /path/to/code:/workspace:ro \
-v /var/run/proxy.sock:/var/run/proxy.sock:ro \
agent-image以下是每個選項的作用:
| 選項 | 用途 |
|---|---|
--cap-drop ALL | 移除 NET_ADMIN 和 SYS_ADMIN 等可能允許權限提升的 Linux capabilities |
--security-opt no-new-privileges | 防止程序透過 setuid 二進位檔獲取權限 |
--security-opt seccomp=... | 限制可用的系統呼叫;Docker 預設阻止約 44 個,自訂設定檔可以阻止更多 |
--read-only | 使容器的根檔案系統不可變,防止代理持久化變更 |
--tmpfs /tmp:... | 提供一個可寫的暫存目錄,在容器停止時清除 |
--network none | 移除所有網路介面;代理透過下面掛載的 Unix socket 進行通訊 |
--memory 2g | 限制記憶體使用以防止資源耗盡 |
--pids-limit 100 | 限制程序數量以防止 fork 炸彈 |
--user 1000:1000 | 以非 root 使用者身份執行 |
-v ...:/workspace:ro | 以唯讀方式掛載程式碼,使代理可以分析但不能修改。避免掛載敏感的主機目錄,如 ~/.ssh、~/.aws 或 ~/.config |
-v .../proxy.sock:... | 掛載連接到容器外部執行的代理伺服器的 Unix socket(見下文) |
Unix socket 架構:
使用 --network none 時,容器完全沒有網路介面。代理到達外部世界的唯一方式是透過掛載的 Unix socket,它連接到主機上執行的代理伺服器。此代理伺服器可以強制執行網域允許清單、注入憑證並記錄所有流量。
這與 sandbox-runtime 使用的架構相同。即使代理透過提示注入被入侵,它也無法將資料洩漏到任意伺服器——它只能透過代理伺服器通訊,而代理伺服器控制哪些網域是可達的。更多詳情請參閱 Claude Code 沙箱部落格文章。
額外強化選項:
| 選項 | 用途 |
|---|---|
--userns-remap | 將容器 root 映射到非特權主機使用者;需要守護程序配置,但限制容器逃逸的損害 |
--ipc private | 隔離程序間通訊以防止跨容器攻擊 |
標準容器共用主機核心:當容器內的程式碼進行系統呼叫時,它直接到達執行主機的同一核心。這意味著核心漏洞可能允許容器逃逸。gVisor 透過在使用者空間攔截系統呼叫來解決此問題,在它們到達主機核心之前,實作自己的相容層來處理大多數系統呼叫,而不涉及真正的核心。
如果代理執行惡意程式碼(可能由於提示注入),該程式碼在容器中執行並可能嘗試核心漏洞利用。使用 gVisor,攻擊面要小得多:惡意程式碼需要先利用 gVisor 的使用者空間實作,並且對真正的核心存取有限。
要將 gVisor 與 Docker 一起使用,請安裝 runsc 執行環境並配置守護程序:
// /etc/docker/daemon.json
{
"runtimes": {
"runsc": {
"path": "/usr/local/bin/runsc"
}
}
}然後使用以下命令執行容器:
docker run --runtime=runsc agent-image效能考量:
| 工作負載 | 開銷 |
|---|---|
| CPU 密集型運算 | ~0%(無系統呼叫攔截) |
| 簡單系統呼叫 | ~2 倍慢 |
| 檔案 I/O 密集型 | 對於大量 open/close 模式最高可達 10-200 倍慢 |
對於多租戶環境或處理不受信任的內容時,額外的隔離通常值得這些開銷。
虛擬機透過 CPU 虛擬化擴展提供硬體層級的隔離。每個虛擬機執行自己的核心,建立強大的邊界——客體核心中的漏洞不會直接危害主機。然而,虛擬機並非自動比 gVisor 等替代方案「更安全」。虛擬機安全性在很大程度上取決於虛擬機管理程式和裝置模擬程式碼。
Firecracker 專為輕量級微型虛擬機隔離而設計——它可以在 125 毫秒內啟動虛擬機,記憶體開銷不到 5 MiB,去除不必要的裝置模擬以減少攻擊面。
使用此方法,代理虛擬機沒有外部網路介面。相反,它透過 vsock(虛擬 socket)進行通訊。所有流量透過 vsock 路由到主機上的代理伺服器,代理伺服器在轉發請求之前強制執行允許清單並注入憑證。
對於雲端部署,您可以將上述任何隔離技術與雲端原生網路控制結合使用:
credential_injector 過濾器的 Envoy)來驗證請求、強制執行網域允許清單、注入憑證並轉發到外部 API代理通常需要憑證來呼叫 API、存取儲存庫或與雲端服務互動。挑戰在於提供此存取權而不暴露憑證本身。
建議的方法是在代理的安全邊界之外執行一個代理伺服器,將憑證注入到外發請求中。代理發送不帶憑證的請求,代理伺服器添加憑證,然後將請求轉發到目的地。
此模式有幾個好處:
Claude Code 支援兩種方法將取樣請求路由到代理伺服器:
選項 1:ANTHROPIC_BASE_URL(簡單但僅適用於取樣 API 請求)
export ANTHROPIC_BASE_URL="http://localhost:8080"這告訴 Claude Code 和 Agent SDK 將取樣請求發送到您的代理伺服器,而非直接發送到 Anthropic API。您的代理伺服器接收明文 HTTP 請求,可以檢查和修改它們(包括注入憑證),然後轉發到真正的 API。
選項 2:HTTP_PROXY / HTTPS_PROXY(系統範圍)
export HTTP_PROXY="http://localhost:8080"
export HTTPS_PROXY="http://localhost:8080"Claude Code 和 Agent SDK 遵循這些標準環境變數,將所有 HTTP 流量路由到代理伺服器。對於 HTTPS,代理伺服器建立加密的 CONNECT 通道:如果不進行 TLS 攔截,它無法查看或修改請求內容。
您可以自行建構代理伺服器或使用現有的:
credential_injector 過濾器除了從 Anthropic API 取樣外,代理通常需要對其他服務的認證存取——git 儲存庫、資料庫、內部 API。有兩種主要方法:
透過 MCP 伺服器或自訂工具提供存取,將請求路由到在代理安全邊界之外執行的服務。代理呼叫工具,但實際的認證請求發生在外部——工具呼叫代理伺服器,代理伺服器注入憑證。
例如,git MCP 伺服器可以接受來自代理的命令,但將它們轉發到主機上執行的 git 代理伺服器,該代理伺服器在聯繫遠端儲存庫之前添加認證。代理永遠看不到憑證。
優勢:
對於 Anthropic API 呼叫,ANTHROPIC_BASE_URL 讓您將請求路由到可以以明文檢查和修改它們的代理伺服器。但對於其他 HTTPS 服務(GitHub、npm 註冊表、內部 API),流量通常是端對端加密的——即使您透過 HTTP_PROXY 將其路由到代理伺服器,代理伺服器也只看到不透明的 TLS 通道,無法注入憑證。
要修改到任意服務的 HTTPS 流量而不使用自訂工具,您需要一個 TLS 終止代理伺服器來解密流量、檢查或修改它,然後在轉發之前重新加密。這需要:
HTTP_PROXY/HTTPS_PROXY 將流量路由到代理伺服器此方法無需編寫自訂工具即可處理任何基於 HTTP 的服務,但增加了憑證管理的複雜性。
請注意,並非所有程式都遵循 HTTP_PROXY/HTTPS_PROXY。大多數工具(curl、pip、npm、git)會遵循,但有些可能會繞過這些變數直接連接。例如,Node.js fetch() 預設忽略這些變數;在 Node 24+ 中,您可以設定 NODE_USE_ENV_PROXY=1 來啟用支援。為了全面覆蓋,您可以使用 proxychains 來攔截網路呼叫,或配置 iptables 將出站流量重定向到透明代理伺服器。
透明代理伺服器在網路層級攔截流量,因此客戶端不需要配置為使用它。常規代理伺服器要求客戶端明確連接並使用 HTTP CONNECT 或 SOCKS 協定。透明代理伺服器(如透明模式下的 Squid 或 mitmproxy)可以處理原始重定向的 TCP 連接。
兩種方法仍然需要 TLS 終止代理伺服器和受信任的 CA 憑證——它們只是確保流量確實到達代理伺服器。
檔案系統控制決定代理可以讀取和寫入哪些檔案。
當代理需要分析程式碼但不需要修改時,以唯讀方式掛載目錄:
docker run -v /path/to/code:/workspace:ro agent-image即使對程式碼目錄的唯讀存取也可能暴露憑證。掛載前需要排除或清理的常見檔案:
| 檔案 | 風險 |
|---|---|
.env、.env.local | API 金鑰、資料庫密碼、密鑰 |
~/.git-credentials | 明文的 Git 密碼/權杖 |
~/.aws/credentials | AWS 存取金鑰 |
~/.config/gcloud/application_default_credentials.json | Google Cloud ADC 權杖 |
~/.azure/ | Azure CLI 憑證 |
~/.docker/config.json | Docker 註冊表認證權杖 |
~/.kube/config | Kubernetes 叢集憑證 |
.npmrc、.pypirc | 套件註冊表權杖 |
*-service-account.json | GCP 服務帳戶金鑰 |
*.pem、*.key | 私密金鑰 |
考慮僅複製所需的原始碼檔案,或使用類似 .dockerignore 的過濾方式。
如果代理需要寫入檔案,根據您是否希望變更持久化,有幾個選項:
對於容器中的臨時工作區,使用僅存在於記憶體中且在容器停止時清除的 tmpfs 掛載:
docker run \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--tmpfs /workspace:rw,noexec,size=500m \
agent-image如果您想在持久化之前審查變更,overlay 檔案系統讓代理可以寫入而不修改底層檔案——變更儲存在單獨的層中,您可以檢查、套用或丟棄。對於完全持久化的輸出,掛載專用卷但將其與敏感目錄分開。
Was this page helpful?