網誌
可靠性與生產環境

發佈日期 更新日期

Anshu 及 Arag

AI 代理安全:身份、權限、密鑰和審計日誌

以 Markdown 閱讀

AI 代理安全始於把每項操作綁定至所代表的身份、租戶、資源和權限。讓供應商憑證遠離模型情境、在下游服務執行授權、在高影響副作用前要求批准,並記錄決定和結果以供調查。

系統提示可以引導行為,但無法縮小工具程序可以取得的管理員權杖能力。

把身份帶到整個操作流程

一次代理執行可能涉及人員用戶、應用程式租戶、代理部署、工作階段和背景 worker。這些身份應分開保存。

flowchart LR
    User[Authenticated user] --> Session[Agent session]
    Session --> Policy{Tenant, resource, action}
    Policy -->|allow| Tool[Server-side tool]
    Tool --> Credential[Scoped provider credential]
    Credential --> Backend[Downstream service]
    Policy --> Audit[Decision record]
    Backend --> Audit

後端應取得足以授權所代表用戶和租戶的情境。如果無法避免共用 worker 憑證,工具 adapter 就必須在使用前補上缺少的資源規則。

代理控制平面指南說明這些決定和憑證參照應放在哪裏。

在憑證和 API 層縮小權限

只授予代理目前工作所需的操作和資源。分開讀取、寫入、佈建、計費和管理憑證,按租戶和環境限制範圍,並在供應商支援時縮短憑證有效期。

當任務層級操作已經足夠時,不要公開廣泛的 primitive。refund_order(order_id, amount) 可以執行擁有權、金額限制、批准和冪等性;通用 SQL 或供應商管理工具則會把這些決定全交給生成的參數。

OWASP 的 Excessive Agency 指南建議縮小工具功能、權限和自主程度。即使模型選擇了有效工具,後端仍要負責授權。

讓密鑰遠離模型路徑

把密鑰放在伺服器端管理系統,並透過應用程式碼傳遞參照。把工作專用憑證注入需要它的最小執行環境,之後撤銷憑證或讓它到期。

密鑰經常從以下地方洩漏:

  • 提示和檢索到的情境;
  • 工具參數或描述;
  • URL 和查詢字串;
  • 例外訊息和 stdout;
  • 追蹤、重播數據和客戶服務匯出內容;
  • sandbox 檔案和繼承的環境變數。

匯出前先遮蔽數據,並刻意測試錯誤。絕不能要求模型重複或轉換密鑰。對 MCP 連線而言,目前的授權規格要求把存取權杖放在 Authorization 標頭,並規定伺服器必須拒絕 URI 中的權杖。

在副作用前加入批准

具破壞性、涉及財務、可從外部看見或範圍異常廣泛的操作都要取得批准。顯示確切的資源、參數和後果,把批准綁定至這些值,並設定到期時間。

執行時重新檢查權限。操作等待期間,用戶角色或資源擁有權可能改變。批准不能授予批准者本身沒有的權限。

Railway 的 2026 年 4 月事故報告記載了一宗代理找到帳戶權杖後呼叫舊版即時刪除 API 的事件。Railway 復原了 volume,並把 API 刪除改為保留 48 小時的軟刪除。結論很具體:權杖範圍、API 行為和可復原性必須一併處理。

把檢索內容視為不受信任的輸入

網頁、電郵、issue 或文件可能包含針對模型的指示。請把數據與可信任的系統政策分開,不能讓檢索文字擴大工具權限。模型提出操作後,應重新檢查政策。

工作流程範圍較窄時,應對網絡目的地和資源類型使用允許清單。在追蹤中標記外部內容來源,讓調查人員看得出哪些內容影響了操作,同時不會把內容本身視為權威。

撰寫能支援限制範圍的審計記錄

記錄執行者、所代表的用戶、租戶、代理和工作階段、工具、資源、操作、政策版本、決定、批准參照、操作 ID、時間戳記和結果。把「允許」和「完成」分成不同事件。

不要在審計日誌中儲存密鑰或大小不受限制的模型內容。需要詳細情境時,應連結至受保護的追蹤。審計路徑應能回答要撤銷哪些憑證、哪些資源可能已改變,而無需依賴發生失敗的代理。

測試撤銷和跨租戶拒絕

在隔離環境中:

  1. 在工作等待期間撤銷工作階段,確認恢復執行會安全地失敗;
  2. 透過每一條工具路徑嘗試存取另一租戶的資源 ID;
  3. 把惡意指示注入檢索內容;
  4. 觸發供應商和驗證錯誤,再檢查日誌中是否出現密鑰;
  5. 在未獲批准的情況下要求具破壞性的操作,確認不會發出下游呼叫。

生產環境檢查清單把這些控制措施與重試、追蹤和復原連接起來。

下方提示會從程式碼建立實際權限矩陣。任何執行位置寫著「系統提示」的數據列,都代表安全工作尚未完成。