網誌
架構

發佈日期 更新日期

Arag 及 Shouryamaan

多租戶 AI 代理基礎設施:隔離、限制和共享狀態

以 Markdown 閱讀

多租戶代理基礎設施必須從已驗證的情境取得租戶範圍,並把它一路帶到工具、數據庫、佇列、快取、產物、憑證和日誌。提示或模型產生的參數中的 tenant_id 並不能構成隔離。

代理會增加後端操作的數量和種類,因此遺漏任何一道邊界,都可能在沒有人員透過受限制介面操作的情況下跨越租戶。即使模型產生混淆、檢索內容帶有惡意,或兩項資源使用相同顯示名稱,控制措施仍必須有效。

接受資源輸入前先綁定身份

從工作階段或應用程式憑證解析租戶,把該身份傳入代理控制平面,再利用伺服器端資源紀錄授權所要求的操作。

flowchart LR
    Request[Agent tool call] --> Session[Authenticated session]
    Session --> Scope[Tenant and delegated scope]
    Scope --> Policy{Authorize resource and action}
    Policy -->|allow| Tool[Execute scoped tool]
    Policy -->|deny| Audit[Record denial]
    Tool --> DB[(Tenant-scoped data)]
    Tool --> Queue[(Tenant-scoped work)]
    Tool --> Artifacts[(Tenant-scoped artifacts)]

不能讓工具參數覆寫已驗證的租戶。即使資源 ID 在全域唯一,也應在目前租戶之下查詢,令授權規則保持明確。

有意識地選擇數據庫隔離模型

模型 邊界 營運結果
共用數據表 租戶數據欄加上數據列層級政策和限定範圍的查詢 遷移簡單,但每條存取路徑都依賴正確的政策和連線角色
每個租戶一個 schema 同一數據庫內的獨立命名空間 命名邊界更強,但必須處理每個 schema 的遷移和連線配置
每個租戶一個數據庫 獨立的數據庫和憑證 儲存邊界最強,但增加佈建、連線池、備份和遷移工作

當應用程式角色無法繞過數據列層級安全性,而且租戶情境由伺服器端設定時,RLS 可以提供穩健保護。它不一定比應用程式 WHERE 子句弱,實際保證取決於政策、角色和每一條替代連線路徑。

如有法規要求、租戶規模特別大、客戶管理加密或獨立還原需要,可以採用隔離程度更高的模型。不要只因呼叫者是代理,便選擇每個租戶一個數據庫。

數據庫模式指南示範複合租戶鍵和操作約束。

把範圍帶到每一個共用子系統

數據庫隔離只是多道邊界之一:

  • 快取鍵前綴應使用不受用戶控制的租戶識別碼,失效處理也要包含該識別碼。
  • 從已驗證的伺服器情境把租戶範圍放入佇列訊息,並在 worker 使用訊息時重新授權。
  • 為物件鍵和向量集合建立命名空間,在簽發 signed URL 或搜尋前檢查擁有權。
  • 瀏覽器和 sandbox 工作階段應由租戶擁有,並使用不同的檔案系統和憑證。
  • 把工具工作階段和 OAuth 授權限制在其代表的租戶和用戶範圍內。
  • 按租戶、代理和高影響操作分開速率和支出限制。

使用兩個擁有相同資源名稱的租戶進行測試。production、orders 或 main 等顯示名稱,在模型從情境中選擇資源時經常造成衝突。

讓憑證和日誌識別租戶

把供應商憑證儲存為由租戶擁有的密鑰參照。工具 worker 只應取得自己有權解析的參照。即使多個租戶共用供應商帳戶,仍需要按租戶計費和撤銷權限。

日誌和追蹤數據需要租戶欄位才能進行調查,但可觀察性系統本身的存取也必須限制租戶範圍。匯出前先遮蔽提示、工具參數和結果。能搜尋所有租戶的內部儀表板或許適合小型且可信任的營運團隊,但它仍然是特權介面。

NIST 的零信任架構把存取視為以身份和資源為基礎、逐次請求作出的決定,而不是按網絡位置判斷。這很適合背景 worker 和內部工具呼叫,因為它們不應只因在平台內執行便獲得廣泛權限。

限制循環,但不要把配額當成權限

按租戶限制並行執行、工具呼叫、模型支出、儲存空間和重複失敗,並為具破壞性或高成本的工具設定更嚴格限制。循環應暫停該租戶受影響的任務,並留下可供人員檢查的操作紀錄。

限制只能控制數量,不能令未獲授權的呼叫變得可以接受。請先執行授權,再計入配額,並傳回穩定的錯誤類別,避免代理重試政策拒絕。

為整張租戶資源圖設計刪除流程

租戶刪除路徑應清查數據庫、快取值、佇列工作、產物、記憶、索引、瀏覽器工作階段、sandbox、憑證、日誌、備份和進行中的操作。請決定哪些資源立即刪除、稍後到期,或因法律及安全理由保留。

刪除數據前,先停止新工作並撤銷憑證。刪除應可恢復且具冪等性,因為很可能只完成部分清理。請記錄每項資源的完成狀態,但不要保留已刪除的內容本身。

使用有意相似的數據測試隔離

建立兩個測試租戶,使用重疊的名稱和相近的 ID,並嘗試透過每項工具、worker、快取、佇列和產物路徑存取。加入一份指示模型切換租戶 ID 的檢索文件。無論模型輸出甚麼,伺服器都應拒絕該操作。

下方提示會把這項測試轉化為儲存庫專用計劃。它會先找出租戶範圍的來源,因為單看數據庫圖並不能證明隔離有效。