部落格
可靠性與正式環境

發布於 更新於

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. 在未核准情況下要求破壞性動作,確認不會發出下游呼叫。

正式環境檢查清單將這些控制與重試、追蹤及復原連接起來。

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