多租戶代理基礎設施必須從已驗證的情境取得租戶範圍,並把它一路帶到工具、數據庫、佇列、快取、產物、憑證和日誌。提示或模型產生的參數中的 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 的檢索文件。無論模型輸出甚麼,伺服器都應拒絕該操作。
下方提示會把這項測試轉化為儲存庫專用計劃。它會先找出租戶範圍的來源,因為單看數據庫圖並不能證明隔離有效。