選擇代理運算環境時,應依工作負載的程式碼信任程度、網路存取、憑證、生命週期、檔案系統、狀態及資源限制決定。範圍受限的 API 呼叫不需要 sandbox;不受信任的生成程式碼則需要一般應用程式程序或容器設定未必能提供的隔離。
升級階梯能避免單純的資料庫讀取取得檔案系統與 shell,同時讓有風險的程式碼遠離長效應用程式憑證。
使用能滿足工作的最低層級
flowchart TD
A[Scoped API call] -->|needs application logic| B[In-process function]
B -->|needs async or longer work| C[Background job]
C -->|needs package or process isolation| D[Isolated process or container]
D -->|runs untrusted code| E[Hardened sandbox]
E -->|needs full machine control or long-lived isolation| F[Dedicated VM]
升級會增加能力與維運工作,但不會自動提升安全性。有不受限網路存取及正式環境憑證的 sandbox,可能比範圍狹窄的伺服器端 API 更危險。
第 0 層:範圍受限的 API 呼叫
如果工作已能表達成資料庫查詢、物件讀取、電子郵件寄送或部署請求,就使用具型別的後端操作。代理只提供範圍明確的引數,伺服器則負責憑證、授權、驗證與稽核。
這一層沒有通用程式碼執行能力,適合一般產品動作,也符合語意工具設計。
第 1 層:程序內函式
對能在請求生命週期內完成的短時間、可信任轉換與協調工作,使用應用程式碼。限制可使用的模組,並讓供應商密鑰遠離模型可見輸入。
不要在這一層使用 eval、shell 或動態 import 執行生成程式碼。逾時可以停止等待請求,但不能可靠地終止每一個子程序或外部副作用。
第 2 層:背景工作
工作可能超過請求逾時、需要排程重試,或應獨立進行速率控制時,就移到佇列。保存操作記錄並讓工作具備冪等性,因為佇列可能重複傳送。
工作 worker 提供持久排程,但不是安全邊界。它通常執行可信任的應用程式碼,存取權與服務相近。持久執行指南涵蓋檢查點及未知結果。
第 3 層:隔離程序或容器
可信任程式碼需要套件、檔案系統,或不同的 CPU 與記憶體限制時,使用獨立程序或容器。移除多餘權限、可行時採用唯讀基礎檔案系統、只掛載必要檔案,並限制對外網路存取。
除非平台加入更強的邊界,容器會共用主機 kernel。將它視為工作負載封裝與程序隔離,再評估執行期設定是否符合威脅模型。
第 4 層:強化的 sandbox
不受信任或模型生成的程式碼應使用 sandbox。為每次執行提供暫時檔案系統、嚴格的 CPU、記憶體、程序及經過時間限制,以及對外網路允許清單。只注入工作專用憑證,執行後撤銷並銷毀環境。
清理前將核准的輸出保存到物件儲存。掃描成果,避免向模型回傳無限大小的 stdout 或二進位內容。Sandbox 指南涵蓋逃逸路徑及測試情況。
第 5 層:專用 VM
工作需要自己的 kernel 邊界、特權系統行為、特殊相依性、長效桌面或客戶專屬隔離時,使用專用虛擬機器。強化映像檔、控制中繼資料服務存取、套用修補,並定義銷毀方式。
不要只因代理曾使用某台 VM,就讓它永久存在。長效機器會累積憑證、檔案、套件及網路信任。若不需要持久保存,應從已知映像檔重新建立。
選擇層級前先分類六項需求
- 程式碼信任: 每一項指示與相依性是否都由團隊控制,或使用者及模型也能提供程式碼?
- 權限: 工作負載必須存取哪些憑證及資源?
- 網路: 它不需要網路、只需固定允許清單、需要公開網路,還是需要私有服務?
- 生命週期與狀態: 它會在幾秒內完成、等待數小時,或需要持久機器?
- 執行期介面: 它需要 shell、瀏覽器、套件安裝、可寫入檔案系統、kernel 功能或 GPU 嗎?
- 資源限制: 哪些 CPU、記憶體、程序、輸出及支出限制能阻止失控工作?
Cloudflare 的 Project Think說明代理工作負載的類似分層設計。實際產品對應會因供應商而異,但通用概念是只有需求確實需要時,才從範圍狹窄的操作逐步升級到隔離運算。
測試邊界,而不是名稱
驗證檔案系統掛載、網路輸出、密鑰可見性、程序限制、終止、成果匯出及清理。在隔離環境中嘗試連接禁止的主機及另一租戶的資源。確認平台會記錄是哪個映像檔、政策、身分及操作建立了這次執行。
下方提示詞會在提出基礎設施建議前,先分類目前的工作負載。它經常能找出完全不需要 shell 的工作,比把容器改名為 sandbox 更能改善安全性。