*.delete。對那些,你
想要一個人在迴圈中:保留呼叫、讓一個人查看,然後只在一個「是」上
才繼續。那正是
pending_approval 裁決所做的。
本頁端到端涵蓋人工介入的代理審批流程:一個被保留的呼叫如何
浮現、一位審查者如何從主控台或一個 webhook 解決它,以及代理如何
重新提交被批准的呼叫。關於該裁決在規則文法中的位置,參見
防火牆規則;關於圍繞它的政策模型,
參見防火牆總覽。
1. 一個被保留的呼叫的樣子
當一條規則解析為pending_approval 時,引擎會排入一筆審批記錄,
而該呼叫不會抵達工具。中繼會傳回 HTTP 400,帶有 error.code
firewall_approval_pending;代理將輪詢的審批 id 攜帶在人類可讀的
error.message 中:
error.metadata(存在時)攜帶該裁決的原因細節——
reason_code、factors、risk_score——而非審批 id。從訊息中解析出
該 id,或從下方的 SDK 輔助函式取得它。
保留是立即的——沒有一個內聯的 long-poll 封鎖你的請求。代理拿回
那個 id,呼叫在伺服器端被停泊在 pending 狀態,而解決發生在頻道外。
一個被保留的呼叫會被記錄為一個裁決為
pending_approval 的防火牆
事件,所以它能在事件記錄中與
deny 事件並排篩選——你總是能看見什麼被保留,以及透過該審批記錄,
什麼被解決。2. 一個具體範例
撰寫一條規則,為一個人類保留任何對一個生產連線的寫入:一個人類(或你的系統)審查
一位審查者解決該審批——在主控台中或透過一個簽署的 webhook 回呼
(參見 §3)。
代理輪詢直到被解決
代理輪詢該審批 id,直到它的狀態不再是
pending(參見
§4)。3. 解決一個審批
有兩種方式把一個pending 審批變成 approved 或 rejected。兩者
都共享一個先決定者勝出的保證——第一個落地的解決會被原子性地
套用,而任何稍後的解決(或一個重複的)是一個冪等的 no-op,傳回
200。
主控台 — 一位審查者點擊批准/拒絕(Developer+)
主控台 — 一位審查者點擊批准/拒絕(Developer+)
Approvals 分頁以最舊在前列出待處理的保留,每一個都帶有工具名稱
與一行指名觸發的政策與規則子句的「Held because…」。(原始呼叫
引數不儲存在審批記錄上——只有工具名稱、來源,與一個 args 雜湊——
所以審查者從工具加上匹配到的子句做決定。)一位審查者用以下方式
解決一個:
decision 必須是 approved 或 rejected。這個路由是
UserAuth(審查者的主控台工作階段)且把關到 Developer+——
你審查者的身份就是授權,所以不涉及任何共享密鑰。解決會被寫入
工作區稽核記錄。Webhook — 你自己的系統決定,HMAC 簽署
Webhook — 你自己的系統決定,HMAC 簽署
要把審批接進一個外部系統(一個 Slack 審批、一個工單工作流程),
為工作區設定一個審批 webhook 密鑰,然後把決定 POST 回來:該回呼以 HMAC-SHA256 驗證:將
X-Orca-Signature: sha256=<hex>
標頭設為 <approval_id>\n<raw_body> 以你工作區審批 webhook 密鑰
設鍵的 HMAC。該 id 是被簽署材料的一部分,所以一個被擷取的簽章
無法被重放到一個不同的審批上。沒有設定密鑰時,回呼驅動的解決
會被拒絕——改透過主控台 PATCH 解決。4. 輪詢,然後重新提交
代理那一側是一個輪詢迴圈,後面跟著一次重新提交。 以一個防火牆閘道範圍的權杖輪詢審批狀態:/evaluate 與
MCP 閘道的同一個專用閘道金鑰);
一般中繼金鑰會得到 403。它傳回審批文件——等到 state 是
approved 或 rejected 而非 pending。一個跨工作區或未知的 id 會
傳回 404,絕不向另一個租戶揭露它存在。
一旦狀態是 approved 就重新提交:重新發出同一個工具呼叫,把
審批 id 攜帶在一個一次性的標頭中:
rejected 的審批永遠不可被認領,所以
代理應該把拒絕當作一個終端的 deny 處理並挑選另一條路徑。
5. 狀態與角色一覽
| 狀態 | 意義 | 代理動作 |
|---|---|---|
pending | 已保留,等待一個決定 | 持續輪詢 |
approved | 審查者說是 | 帶著標頭重新提交一次 |
rejected | 審查者說否 | 當作一個 deny 處理 |
| 動作 | 路由 | Auth · 角色 |
|---|---|---|
| 列出佇列 | GET /api/workspace/firewall/approvals | UserAuth · Developer+ |
| 解決 | PATCH /api/workspace/firewall/approvals/:id | UserAuth · Developer+ |
| Webhook 回呼 | POST /api/v1/firewall/approvals/:id/callback | HMAC 簽署 |
| 輪詢狀態 | GET /api/v1/firewall/approvals/:id | 閘道權杖 |
6. 審批的定位
一個pending_approval 裁決是防火牆裁決之一
——它與一個政策中的其他一切組合。兩個值得知道的互動:
- 技能隔離升級為一個保留。 如果一個被保留的工具呼叫由一個
被隔離的技能擁有,任何未達 deny
的東西都會被自動升級為
pending_approval——隔離與審批是同一個審查 閘門的兩個方向。 - 影子模式會壓平它。 在影子模式下,
一個
pending_approval裁決會被降級為audit並記錄為[shadow] would …,所以你能在一個保留開始把關真實流量之前,衡量 它會多常觸發。
接下來去哪裡
裁決
所有六個防火牆裁決與預設裁決。
閘道金鑰
鑄造用於輪詢審批的防火牆閘道權杖。
影子模式
在一個保留把關真實流量之前衡量它。
規則參考
撰寫產生一個 pending_approval 裁決的規則。
