跳轉到主要內容
密鑰總會跑到它們不該在的地方。一位開發者為了「協助除錯」而把一個 .env 檔案貼進提示詞。一份擷取來的文件挾帶了一個內嵌的 API 金鑰。 一個被要求「顯示設定」的模型,把一個 AWS 存取金鑰直接回吐給客戶端。 一個代理建構了一個工具呼叫,把一個有效的權杖烘焙進引數裡。其中每一項 都是讓憑證脫逃的一條路徑——進入上游供應商的日誌、進入一份客戶端 逐字稿,或進入一個第三方工具。 本頁說明 OrcaRouter 的 防護欄代理防火牆如何讓你防禦 llm secret leakage——無需更動你的應用程式碼。
偵測發生在閘道處,位於每個綁定金鑰之前——所以單一政策就能涵蓋每個 供應商、每個模型與每個代理,無需任何 SDK 變更。

1. 密鑰會在哪裡外洩

一個憑證可以在一個請求的三個不同點脫逃:
在模型運行之前,憑證就已在請求中——一個貼上的金鑰、一段 .env 片段、一個擷取來的 RAG 區塊裡的權杖。若不加以檢查,它會抵達上游 供應商並可能落入他們的日誌。用 Secrets Blocker 輸入防護欄阻止它 (§2)。
模型把一個密鑰回吐給你的客戶端——它從其情境複述一個金鑰,或幻覺出 一個憑證形狀的字串。用一條輸出密鑰規則捕捉它 (§3)。
你的代理建構了一個引數中帶有權杖的工具呼叫。防火牆的 sanitize 裁決會在呼叫派發之前,從引數中遮蓋掉匹配到的子字串 (§4)。
前兩個是內容檢查(防護欄);第三個是動作檢查(防火牆)。把三者疊起來 以實現縱深防禦。

2. Secrets Blocker——阻止提示詞中的憑證

Secrets Blockersecrets 類別下的一個防護欄預設集,在 input 介面執行。它會掃描請求尋找憑證形狀——AWS 存取金鑰、OpenAI 風格的金鑰, 以及 GitHub 權杖——並在呼叫離開閘道之前封鎖它。憑證永遠不會抵達 模型。 在主控台中撰寫它一次,附加一個金鑰,那個金鑰的每個請求就都會被審查:
1

建立防護欄

在主控台中,開啟 /console/guardrails,按一下 New guardrail, 並套用 secrets 類別中的 Secrets & API-Key Blocker 預設集。它會 為常見的憑證形狀植入帶有輸入介面封鎖規則的防護欄——從那裡可自由 編輯。
2

附加一個金鑰

開啟 /console/token,編輯一個 API 金鑰,並從 Guardrail 下拉選單 挑選該防護欄——或把它設為工作區預設值,這樣每個未附加的金鑰都會 繼承它。
3

送出一個請求

用那個 sk-orca-... 金鑰完全照之前的方式呼叫閘道:
curl https://api.orcarouter.ai/v1/chat/completions \
  -H "Authorization: Bearer sk-orca-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o-mini",
    "messages": [
      {"role": "user", "content": "why is AKIAIOSFODNN7EXAMPLE rejected"}
    ]
  }'
那個 AWS 金鑰形狀觸發了防護欄,請求被以 HTTP 400 guardrail_blocked 拒絕。金鑰永遠不會抵達模型。
一個被封鎖的請求不消耗配額——一個輸入介面封鎖會在計量之前觸發 ——並被標記為 skip-retry,所以重跑同一個提示詞只會再次被封鎖,而不會 燒掉一個回退通道。
需要更廣的涵蓋?secrets 類別也提供一個 Private Keys & Cloud Tokens 預設集,封鎖 PEM 私鑰、Slack 與 Stripe 權杖、Google API 金鑰, 以及 JWT。兩者都套用——一個防護欄可以持有任意數量的規則。若要把 JWT 與憑證形狀當作帶型別的實體捕捉(帶有 [JWT] / [AWS_ACCESS_KEY] 標籤), 一條涵蓋 jwtaws_access_keyapi_key_openaipii 規則是 實體驅動的替代方案;參見 防護欄參考
防火牆的 tight 自主等級 會把 Secrets Blocker 防護欄作為其姿態的一部分打開,與 PII Shield 及 破壞性 shell 拒絕並列。如果你想要一個開關而不是手動撰寫規則,那就是 那條快速路徑。憑證檢查本身始終是防護欄——而不是防火牆的引數掃描器。

3. 封鎖模型輸出中的密鑰

一個密鑰也可以在回應中離開——模型從其情境複述一個金鑰,或發出一個 憑證形狀的字串。在 output 介面上加一條規則,在模型的回覆返回客戶端 之前審查它。 secrets 類別正為此提供一個 Code Secret in Output 預設集:針對 PEM 私鑰、AWS 存取金鑰與 OpenAI 風格密鑰權杖的輸出介面封鎖規則。
{
  "type": "regex",
  "stage": "output",
  "action": "block",
  "pattern": "AKIA[0-9A-Z]{16}"
}
輸出 block 在非串流與串流回應上都強制執行——在串流上,掃描器會在 任何被封鎖內容抵達客戶端之前於傳輸中途切斷回應。一個輸出封鎖會 退還預先消耗的配額。
輸出 masking(把一個匹配替換成一個帶型別的標籤,而不是拒絕整個回應) 目前僅套用於非串流回應。對於輸出中的憑證,block 動作是串流流量上 可靠的選擇。在依賴它之前,先在防護欄 Test 分頁中驗證你的介面/串流 組合。

4. 從工具呼叫引數中淨化密鑰

當你的代理建構一個工具呼叫時,一個憑證可能會搭便車進入引數。防火牆的 sanitize 裁決會從工具呼叫引數中遮蓋掉匹配到的子字串,並轉送 清理後的呼叫——在 responsemcp 介面上,那裡有即時的呼叫時引數 可供改寫。 一條 sanitize 規則會在其 sanitize_json 設定中指名要遮蓋哪些偵測器 ——一組內建的預設集加上可選的自訂 regex。匹配到的素材會被替換成 [redacted:<preset>](自訂匹配則為 [redacted:custom]):
{
  "priority": 10,
  "label": "Redact AWS keys from tool args",
  "stage": "response",
  "tool_name_glob": "*",
  "verdict": "sanitize",
  "sanitize_json": {
    "presets": ["aws_access_key", "aws_secret_key", "openai_key", "anthropic_key", "bearer_token"],
    "custom": []
  }
}
可供淨化器使用的密鑰形狀預設集是 aws_access_keyaws_secret_keyopenai_keyanthropic_keybearer_token(加上用於 PII 的 emailssn_uscredit_card)。一條 sanitize 規則必須指名至少一個預設集或 自訂模式——一個空的淨化器在儲存時會被拒絕。
Sanitize 遮蓋的是引數,而不是結果。 它清理的是你的代理所撰寫的 工具呼叫的引數;它不會清洗一個工具回傳的內容。而在 inbound 介面 上——那裡尚無呼叫時引數——sanitize 會升級為 deny。匹配語言請參見 防火牆規則參考
Secrets Blocker 防護欄(§2) 仍然是你針對請求主體中憑證的主要防線——防火牆淨化器則是針對特別出現在 工具呼叫引數內部的密鑰的動作層補充。

5. 把三道防禦疊起來

密鑰在哪裡阻止它的層動作
在提示詞中Secrets Blocker(輸入防護欄)block
在模型的回覆中輸出密鑰規則(輸出防護欄)block
在工具呼叫引數中防火牆淨化器sanitize
任何新規則都先以影子模式(防火牆)或以 flag 動作(防護欄)上線。 觀察 events / Matches 動態,確認它在真實憑證上觸發、而不在無害的相似物上 觸發,然後再切換到強制執行的動作。

6. 觀察觸發了什麼

每一條觸發的防護欄規則都會記錄一個匹配——規則型別、動作、介面, 以及一個細節字串——到工作區 Matches 動態(GET /api/guardrail/match, Member)。匹配到的子字串只在「Log raw content」打開時才會被記錄, 而它預設關閉——這是隱私保守的姿態,所以 Matches 動態本身不會變成一個 密鑰累積之處。除非你特別需要那個子字串來做分流,否則對憑證規則就讓它 保持關閉。 防火牆 sanitize 決策會落入防火牆 Events 動態(GET /api/workspace/firewall/events,Developer+),密鑰與規則 blob 永不被記錄。

7. 下一步去哪裡

防護欄參考

完整的規則型別、PII 實體、預設集、測試沙盒,以及評估工具。

防火牆規則參考

匹配語言——工具 glob、引數子句與淨化器。

PII 外洩

同胞內容威脅:提示詞與回應中的個人資料。

資料外洩

當一個外洩的憑證成為一次外送外洩呼叫的酬載時。

防護欄與防火牆

哪個平面阻止哪一類外洩,以及它們如何組合。

安全代理基準

把這些防禦一起打開的起始姿態。