—— 金鑰不是保庇符,它是消耗品。
對象:平台工程 / 資安 / SRE / LLMOps
關鍵心法:最小曝光面(Least Exposure) × 短命憑證(Short‑Lived) × 自動輪替(Auto‑Rotate) × 全程審計(Audit)
生成式 AI 堆疊中到處都是秘密:模型供應商 API Key、向量庫金鑰、資料庫帳密、Webhook 簽章、雲端憑證……
而且這些秘密常常路過 Prompt、落在 Log、寫進前端、進到向量庫。
今天我們把「管理」與「輪替」做成工程化的機制,而不是祈禱與備忘錄。
類型 | 攻擊面 | 典型事故 |
---|---|---|
儲存外洩 | .env / K8s Secret 平文、Git commit | Key 外流、被濫用造成帳單爆炸 |
傳輸外洩 | 前端曝露、提示或錯誤訊息回傳 | 金鑰被前端抓包、被向量化後不可逆外傳 |
日誌外洩 | API 參數/回應被完整記錄 | 金鑰、Token、PII 被集中蒐集 |
共享過度 | 多租戶共用同一 Key | 無法追責、難以回收與輪替 |
輪替失敗 | 沒有雙金鑰/灰度管線 | 一次切換導致停機或功能壞死 |
[Workloads/Agents] ──► [Secret Broker] ──► (Vault/KMS/Secrets Manager)
│ │
│ ├─ STS/OIDC 換取短期憑證(5–15 分鐘)
│ ├─ A/B 金鑰發佈(Active/Next)
│ └─ 審計事件 → SIEM
▼
[LLM Provider / Vector DB / DB / Webhooks]
get("openai:api_key")
,並注入到期前自動刷新。Secret
當保險箱(它只是 base64)。請搭配 Sealed Secrets/External Secrets 或 Sidecar 注入。# external-secret.yaml
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: openai-api-key
spec:
refreshInterval: 5m
secretStoreRef:
name: corp-vault
kind: ClusterSecretStore
target:
name: openai-api
template:
engineVersion: v2
data:
- secretKey: api_key
remoteRef:
key: kv/data/llm/openai
property: ACTIVE # A/B 金鑰:ACTIVE / NEXT
應用程式只讀取
openai-api.api_key
;Broker 定時把NEXT
灰度切成ACTIVE
。
// secret-broker.ts
export class SecretBroker {
private cache = new Map<string, { v: string; exp: number }>();
constructor(private fetcher: (k: string) => Promise<{v:string,exp:number}>) {}
async get(key: string) {
const now = Date.now() / 1000;
const c = this.cache.get(key);
if (c && c.exp - now > 60) return c.v; // 提前 60s 刷新
const fresh = await this.fetcher(key);
this.cache.set(key, fresh);
return fresh.v;
}
}
// 用法:const openaiKey = await broker.get("openai:api_key");
NEXT
金鑰。NEXT
;監控錯誤率。NEXT
標記為 ACTIVE
,舊 ACTIVE
變 GRACE
。GRACE
一段時間(如 24h),便於回退。GRACE
;審計與報告(誰在舊 Key 上仍有請求)。關鍵:雙金鑰/雙端點兼容。供應商若只允許單金鑰,需以代理層模擬 A/B。
// 日誌濾鏡:遮罩可能的金鑰樣式
const SECRET_LIKE = /(sk-[A-Za-z0-9]{20,}|AIza[0-9A-Za-z_\-]{33}|AKIA[0-9A-Z]{16})/g;
export function safeLog(obj: any) {
let s = JSON.stringify(obj);
s = s.replace(SECRET_LIKE, "<REDACTED>");
console.log(s);
}
PM:這個 API Key 能不能先借我用一下?
你:可以,給你一把 15 分鐘到期、僅可讀、只限你租戶 的。
PM:哇,這叫借鑰匙,不是送房子。
金鑰是消耗品,不是傳家寶。
把輪替做成流水線、把存取做成代理、把審計做成預設值,你的 AI 平台就不怕「鑰匙被看見」。
講白名單回覆、提示切分、提示指紋、與 Prompt‑Leak Canary。