討論 API Key 的安全時,我習慣多往後想一步:如果它已經外洩了,系統會允許對方做多少事?我們多久會發現,又能多快停止?

保護秘密本身很重要,但「不要外洩」不能是唯一一道防線。原先在 Threads 的討論,我用備用柴油的存量作類比:需要有足以維持運作的餘裕,也需要知道餘裕有多大、由誰補充,以及異常消耗時怎麼處理。

先決定這把鑰匙應該開哪些門

一把用來查詢資料的 key,是否同時能修改、刪除或建立新的憑證?測試環境的 key,是否能存取正式資料?不同服務是否共用同一把?

這些問題決定了外洩的影響範圍。依功能與環境拆分權限,也讓後續撤銷比較精確:停止一個有問題的用途,不必同時讓所有服務停擺。OWASP 的秘密管理指引也將最小權限、輪替與撤銷視為秘密生命週期的一部分。

額度要連到能承受的損失

速率限制、每日用量和金額上限,處理的是不同問題。短時間大量呼叫可能先拖垮服務;緩慢但持續的濫用,則可能在沒觸發瞬間速率門檻的情況下累積費用。

我不認為存在一個對所有服務都正確的「平常用量乘幾倍」。原貼文用倍數表達預留餘裕,但真正設定時,至少需要看正常尖峰、批次工作、告警延遲,以及超限後停機的代價。

也要確認供應商的「預算」到底是通知門檻,還是會真正拒絕後續請求的硬上限。帳單介面上的數字,未必等於執行中的攔截機制;這一點必須以使用中的服務文件和測試確認。

以下是我會拿來評估的問題,不是一組可以直接套用的數值:

問題 需要確認的事情
正常尖峰是多少? 用量資料是否包含月底、活動或批次工作?
多久才會有人處理? 告警有沒有負責人?非上班時間怎麼辦?
等待處理期間會損失多少? 計費延遲、並行請求和額度重置是否會擴大損失?
超限之後怎麼運作? 停止服務、降級或人工核准,各自會影響誰?

發現與撤銷,也要真的做得到

告警應該讓人知道哪個服務、哪把憑證、哪種行為需要處理,同時避免把完整秘密再次寫進日誌或通知。平時就知道如何替換 key、更新依賴服務及確認舊 key 已失效,事件發生時才不需要臨時找人猜。

輪替也不是刪掉原 key 就算結束。若新的 key 被放回同一個洩漏位置,或仍保留原本過大的權限,問題很容易重演。

我希望系統能回答的,是一個具體的損失範圍:這把 key 就算出事,也只能影響哪些資源;超出什麼程度會停止;由誰決定恢復。把這些決定事先做完,才有機會讓一次外洩停留在可處理的事件。