如何在伺服器上安全執行 Claude Code
Claude Code 可執行使用者能執行的任何命令。了解 skip permissions flag 移除了什麼,以及如何透過 sandbox、容器或一次性 VPS 限制錯誤操作的影響範圍。
在伺服器上安全執行 Claude Code 的含義
若要在伺服器上安全執行 Claude Code,請保持權限提示開啟,使用專用的非特權使用者執行,並為無人值守的執行環境建立實際的隔離邊界,而不是仰賴信任:可使用內建 sandbox、容器,或不存放重要資料的一次性 VPS。--dangerously-skip-permissions flag 會移除模型與 shell 之間的核准步驟。對無人值守的工作而言,這項取捨可能合理,但只能在能限制單一錯誤指令影響範圍的隔離邊界內使用。本指南說明此 flag 實際變更的內容,以及如何逐步建立隔離程度更高的邊界。
Claude Code 在你的主機上可以執行的操作
Claude Code 是在終端機中執行的程式碼代理程式。它會以啟動它的使用者身分讀取檔案、寫入檔案及執行 shell 命令。這就是此工具的全部價值:它可以複製 repository、編輯程式碼、執行測試、讀取失敗訊息,並持續修正程式碼,而不必由你逐一輸入每個命令。如果你尚未在伺服器上設定它,使用 tmux 在 VPS 上執行 Claude Code 會說明安裝與工作階段管理。本頁說明它在主機上執行後,你授予它的權限。
風險可由同一句話重新檢視。以你的使用者身分執行 shell 命令的程序,可以執行你的使用者能執行的任何操作。它可以讀取 ~/.ssh/id_ed25519、~/.aws/credentials,以及你的使用者能開啟的所有 .env 檔案。它可以執行 curl,並將資料傳送到伺服器可連線的任何主機。它可以執行 git push --force。代理程式本身沒有動機。危險在於工作執行錯誤,或它在工作期間讀到由他人寫入的指示,例如它擷取的網頁,或要求它修正的 issue 中的註解。後一種情況稱為 prompt injection,因此「模型通常能合理處理」不能算是安全計畫。指示也可能來自更接近主機的來源,因為同一台主機上的兩個 Claude Code 工作階段可以互相傳送文字,而來自另一個工作階段的訊息,對接收訊息的代理程式而言也只是它會讀取的更多文字。你必須針對錯誤執行進行規畫,而不是只依賴平均情況。
以白話理解權限系統
Claude Code 預設會在執行操作前先詢問。讀取專案內的檔案會靜默完成,但編輯檔案或執行 shell command 時,會先顯示確切的修改內容或 command,然後等待確認。您可以核准單一操作,也可以核准同類型操作,直到本次 session 結束。這些核准只適用於目前的 session:退出 CLI 後,下一個 session 會再次採用謹慎模式。若要保留規則,settings file 可保存 allow、ask 和 deny 清單。例如:允許 git status、對 git push 詢問、拒絕讀取 .env。deny 規則永遠優先。這項基準本身也正在變動,因為 auto mode 將在 14 August 2026 成為預設值。因此,在決定無法持續監看的伺服器應採用哪種模式前,建議先了解各種權限模式實際允許的操作。
這項設計假設有人正在查看終端機;在 laptop 上通常如此。但在伺服器上,通常正是沒有人監看的情況。您在 tmux 中啟動長時間工作後就去睡覺,而 agent 若停下來提問,直到早上都不會繼續執行。這種暫停不只浪費時間,也會增加成本,因為閒置的 Claude Code session 會失去 warm prompt cache,下一個 turn 必須付出成本重新建立。這就是人們在伺服器上使用 skip flag 的實際原因,而它要解決的問題確實存在。本指南接下來將說明如何解決這個問題,同時保留部分防護措施。
--dangerously-skip-permissions 會變更什麼
claude --dangerously-skip-permissions 會關閉核准步驟。編輯會直接執行,不再顯示提示。Shell 命令也會直接執行,不再顯示提示。通常用來保護敏感位置的受保護路徑檢查也會略過。您明確設定的 deny 規則仍然有效,少數極端操作仍會停止並要求確認,但整體原則很簡單:模型決定執行的任何操作,都會直接執行。
在伺服器上,這個旗標有兩點需要注意。第一,在 Linux 和 macOS 上,Claude Code 以 root 或透過 sudo 執行時會封鎖這個旗標,因為沒有提示的 root 可以變更機器上的任何檔案或服務。代理程式本來就應使用自己的非特權帳號,而這個旗標會強制執行這項要求。第二,這個旗標不會以任何方式變更模型的行為。它只會將人員移出核准流程,其他部分完全不變,因此原本可能被提示攔下的每個錯誤,現在都會直接執行。
因此,實際的評估方式如下。略過權限後,安全性問題會從「代理程式是否會執行不當操作」變成「一次錯誤操作可能造成多大損害」。您不再試圖控制每個決策,而是開始控制影響範圍。答案是進行隔離,而隔離可分成多個層級。
內建的 Claude Code sandbox
在進入各個階梯前,請先了解 Claude Code 現在已為其執行的命令提供 OS 層級的 sandbox,這消除了多數人使用 skip flag 的理由。在 Linux 上,它使用 bubblewrap 進行檔案系統隔離,並搭配 socat 透過 proxy 轉送 network traffic。在 sandbox 內,命令只能寫入 project directory 和 session temp directory,且只能透過 proxy 存取 network;proxy 會將每個 domain 與 allow list 比對。命令第一次需要存取新的 domain 時,Claude Code 會詢問你。
在 session 內執行 /sandbox 命令即可啟用。在 Ubuntu 和 Debian 上,請先安裝所需的 2 個套件:
sudo apt install bubblewrap socat在 Ubuntu 24.04 和更新版本中,預設的 AppArmor policy 會阻止 bubblewrap 建立所需的 user namespace。sandbox panel 會告知你缺少哪些項目,而 Claude Code sandboxing documentation 提供可修正此問題的簡短 AppArmor profile。
sandbox 提供 auto-allow mode:sandboxed command 不會顯示提示,因為現在由強制執行的隔離邊界取代原本提示所提供的控制。無法在 sandbox 內執行的命令會回到一般 permission flow,因此真正不尋常的操作仍會要求確認。對大多數 server workflow 而言,這是 skip flag 的正確替代方案,因為你會在 OS 強制執行隔離邊界的情況下大幅減少問題,而不是完全沒有隔離。
請務實看待其限制。依預設,sandboxed command 仍可讀取檔案系統的大多數內容,包括 credential files,除非你拒絕這些路徑;sandbox.credentials 設定正是用於此目的。network proxy 會檢查 domain name,但不會檢查 traffic 本身,因此像 github.com 這類寬鬆的 allow 仍可能讓資料外傳。Docker 無法在其中運作。sandbox 能大幅提高基本安全性,但不是完整的 isolation boundary,因此下方的各個階梯仍然重要。
隔離層級
共有3個層級,隔離程度依序增加。請根據伺服器上還有哪些內容,選擇符合需求的最低層級。
層級1:專用的非特權使用者。 為 agent 建立專用帳號、專用家目錄與專用專案目錄,且不授予 sudo 權限:
sudo adduser --disabled-password --gecos "" agent帳號邊界可讓 agent 無法存取你的檔案,包括 SSH keys 以及機器上的其他專案。這也讓 skip flag 能夠使用,因為該 flag 拒絕以 root 身分執行。這與讓每項服務都以非特權使用者執行的原則相同,只是套用在 agent 上。層級1無法限制網路,以及伺服器上所有使用者都可讀取的內容。
層級2:容器。 Anthropic 提供參考用的 devcontainer,讓 Claude Code 以非 root 使用者執行,並透過防火牆規則限制 agent 可連線的主機。自行建立的容器也能達到相同效果。檔案系統會縮小為你掛載的 volumes,對外連線範圍則縮小為容器規則允許的內容。當伺服器還承載其他重要服務時,這是適合的中間層級。其限制在於容器共用主機 kernel,而一個不慎設定的掛載就可能破壞這道邊界;將 /var/run/docker.sock 提供給容器後,它就能存取整台主機。
層級3:專用 VPS。 最強的層級也是最直接的做法:提供一台完整機器給 agent,且其中不包含任何重要內容。小型 VPS 每月只需幾美元。依照新 VPS 上線後前10分鐘的執行手冊完成設定,建立乾淨狀態的 snapshot,然後讓 agent 執行工作。該伺服器不放置其他內容。不放個人 SSH key,只放限定於單一 repository 的 deploy key。不放 cloud credentials,也不放 production data。執行失敗時,或只是想重新開始時,可以在幾分鐘內還原 snapshot,或銷毀並重建伺服器。爆炸半徑就是 VPS 租金。在這種設定中,--dangerously-skip-permissions 不再令人擔心,因為最壞的實際結果只是重建伺服器並撤銷一個 token。
這些層級可以疊加。讓 agent 在 disposable VPS 上以非特權使用者執行並套用 sandbox,幾乎不會增加成本,也能讓失敗情境變得單調。單調正是目標。
保護憑證
這條規則是其他所有措施的基礎:agent 的使用者不得讀取屬於其他項目的 secret。
只將 API key 提供給 agent,不要提供給其他項目。將它存放在由 agent 使用者擁有且模式為 600 的檔案中,並在 shell 啟動時載入:
install -m 600 /dev/null /home/agent/claude.env
echo 'export ANTHROPIC_API_KEY=your-key-here' >> /home/agent/claude.env
echo 'source ~/claude.env' >> /home/agent/.bashrc接著限制另一個方向。在 Debian 和 Ubuntu 上,home directory 通常會以主機上所有使用者都可讀取的權限建立,因此請收緊自己的權限:chmod 750 /home/youruser。使用 ls -ld /home/* 檢查,並修正 agent 帳號可以列出的任何項目。
限制每個 token 的權限範圍。將細緻權限的 GitHub token 限制於單一 repository,或使用每個 repository 專用的 deploy key,表示憑證外洩時只會影響一個專案,而不是整個帳號。如果使用 sandbox,請加入其憑證設定,讓 ~/.ssh 和 ~/.aws 即使在讀取時也遭到拒絕。此外,請完全不要將 production 憑證放在該主機上,因為從未存在的 secret 不可能被 agent 外洩。如果這些 secret 存放在自架的 password manager 中,請將它部署在不同於 agent 的主機上,並另外進行安全檢視,因為 Vaultwarden 的弱點在於 admin token 和備份檔案,而不是加密的 vault 本身。
Git 是安全網
代理程式進行的每項變更都應可供檢視與還原。如果代理程式在分支上工作,git 可免費提供這兩項能力:
git switch -c agent/refactor-auth事後使用 git diff main...agent/refactor-auth 檢視執行結果,合併有用的變更;如果這次執行沒有產生結果,就刪除該分支。只修改 3 個檔案的執行結果,遠比重寫半個模組的結果容易閱讀;實務上可使用要求代理程式採用可行最小變更的 skill。在 forge 端保護 main 分支,讓代理程式的 token 無法推送到該分支,也無法在任何位置執行 force-push。提交歷程同時也是你休息期間所發生事件的稽核日誌,其價值高於任何數量的終端機捲動內容。
網路屬於影響範圍
代理程式可以執行 curl。這句話說明了完整的對外連線問題:代理程式能讀取的任何內容,也能傳送到其他位置,而且遭到提示注入的代理程式可能真的會這麼做。一般未具特殊權限的使用者完全無法限制這件事,因為任何使用者都能連線到伺服器可連線的所有位置。沙箱可透過代理伺服器,依網域限制對外連線。容器可透過自己的防火牆規則限制對外連線。專用 VPS 則從一開始就限制可外洩的資料,這是三者中最穩健的做法。
不要只依賴 ufw 解決對外連線問題。ufw 預設允許所有對外流量,而撰寫同時允許 apt、npm、git 和 Claude API 的對外規則相當繁瑣,也可能在未明顯提示的情況下失效。應在沙箱、容器或機器層級設定界線,讓網域允許清單或獨立機器乾淨地完成相同工作。
如果你是直接使用 API 建立自己的代理程式,而不是執行 Claude Code,同樣的思考方式仍然適用。在 VPS 上使用 Claude 建立 AI 代理程式涵蓋這條路徑,而該代理程式同樣應使用專用使用者、範圍受限的 token,以及可丟棄的機器。
先強化主機
無論選擇哪一級,agent 部署前仍須先完成主機的基本防護:僅允許 SSH key 登入、停用 root 登入、設定預設拒絕的防火牆,以及啟用自動安全更新。在此產生檢查清單,並依序完成一次:
FAQ
在伺服器上使用 --dangerously-skip-permissions 是否安全?
單獨使用並不安全。此旗標會移除所有核准提示,因此模型產生第一個錯誤指令時,該指令就會立即執行。當爆炸半徑受到限制時,這才可能是合理的取捨:至少使用專用的非特權使用者;若要真正無人值守地執行,則使用只存放一個專案和一個具有限定範圍 token 的容器或一次性 VPS。絕不要在存放正式環境憑證或不可遺失資料的機器上使用。
Claude Code 有 sandbox 嗎?
有。Claude Code 提供內建 sandbox,可使用 /sandbox command 開啟。在 Linux 上使用 bubblewrap,在 macOS 上使用 Seatbelt;它會限制對專案目錄的寫入,並透過只允許核准網域的 proxy 傳送網路存取。其 auto-allow mode 會在不顯示提示的情況下執行 sandbox command,因此在維持作業系統強制隔離邊界的同時,也能像 skip flag 一樣減少中斷。這不是完整的隔離邊界,因此對於無人值守的執行,仍應搭配專用使用者或專用機器。
為什麼 skip flag 拒絕以 root 執行?
因為 root 在沒有權限提示的情況下,可以修改系統上的任何檔案與服務。Claude Code 在 Linux 和 macOS 上以 root 或 sudo 執行時,會封鎖 --dangerously-skip-permissions。正確作法不是繞過這項檢查,而是為 agent 建立非特權使用者,並以該使用者執行;這個帳號邊界是最先應採用、成本最低的隔離層。
Claude Code 能讀取我的 SSH keys 和 .env files 嗎?
它可以讀取執行該程式的使用者能讀取的所有內容。即使是 sandbox 的預設政策,在你拒絕之前,也允許讀取 credential paths。因此,請讓 agent 以專用使用者執行,將自己的 home directory 權限設為 mode 750 或更嚴格,在 sandbox settings 中拒絕 credential paths,並將正式環境 secrets 完全移出該機器。機器從未存放過的 secret,就不可能被讀取或外洩。
無人值守執行 Claude Code 的最安全方式是什麼?
使用僅供 agent 工作的低價專用 VPS:在 10 分鐘內完成強化設定,建立乾淨 snapshot,讓 Claude Code 以開啟 sandbox 的非特權使用者執行;使用 mode-600 檔案存放 API key,為每個 repository 使用專屬 deploy key,並將所有工作放在合併前由你審查的 branch 上。如果執行出錯,只需撤銷一個 token 並還原 snapshot,不會影響你擁有的其他資源。