題幹與適用場景
一個多租戶平台的唯讀 API Key 被提交到公開儲存庫。金鑰可能已被複製,呼叫方分布在 200 個服務中,舊金鑰不能立即全部下線。請設計偵測、告警、撤銷、影響分析、輪替和驗證流程,要求盡量縮短攻擊窗口,又不能把正常租戶全部打掛。
這是一道面向後端、安全工程和平台工程職位的生命週期與故障處理題。唯讀權限、200 個呼叫服務和「不能立即全部下線」是面試假設,不是行業基準。重點是把洩露當成可觀測的安全事件,解釋偵測前移、撤銷傳播、受影響範圍和復原編排;不要求設計完整的密碼學金鑰管理平台。
面試官考察點
第一,能否區分「發現文字像金鑰」和「證明金鑰有效」。正規表示式或供應商指紋只能產生候選,必須透過安全的驗證介面、狀態查詢或內部中繼資料確認,不能把候選秘密直接印入日誌。
第二,能否把預防、偵測和回應串成閉環。提交前 push protection 降低進入儲存庫的機率,歷史掃描和公開儲存庫監控發現漏網項目,金鑰服務負責撤銷,呼叫日誌負責影響分析,部署系統負責輪替。
第三,能否定義撤銷語義。撤銷資料庫狀態不代表邊緣快取立刻拒絕,也不代表攻擊者手中的靜態金鑰已經失效;強回答會給出傳播目標、快取策略和下游輪替順序。
最後,能否在安全與連續性之間做有邊界的選擇:只撤銷洩露金鑰,不按租戶全量封禁;用雙金鑰短窗口支援輪替,但洩露事件不預設給予寬限期;每一步都可審計、可重試、可回滾。
回答前需要釐清的問題
- 這是什麼憑證:唯讀 API Key、寫入 Key、雲端憑證還是使用者權杖?權限和爆炸半徑會改變處置順序。
- 洩露位置是公開儲存庫、私有儲存庫、日誌、聊天還是建置產物?是否仍可存取,是否有提交歷史和鏡像?
- 如何確認候選有效?驗證請求能否在隔離帳戶、最小權限且不回傳秘密的前提下完成?
- 撤銷目標是「幾秒內拒絕新請求」還是「下游系統中的舊憑證也必須失效」?後者需要目標系統配合輪替。
- 200 個呼叫服務是否有統一部署、設定中心、sidecar 或 secret manager?哪些服務無法自動更新?
- 租戶能否接受短暫雙金鑰窗口?哪些寫入操作必須立即停用,哪些唯讀操作可先降級?
- 需要保留哪些審計證據,誰有權限批准例外和 break-glass?
30 秒回答框架
「我會先把候選當作潛在洩露處理,不在掃描器裡回顯秘密。先鎖定憑證公開識別碼、權限、租戶和最後使用時間,立即撤銷或縮小高風險權限,並讓撤銷在所有閘道達到可測的傳播目標。隨後按呼叫日誌確定時間窗、路由和異常來源,建立新 Key,透過 secret manager 分批部署,觀察新舊 Key 使用情況後回收舊 Key。提交前阻斷、歷史掃描、請求審計和輪替演練組成長期閉環;只有可證明無效的誤報才允許走審計過的例外。」
分步驟深入解答
第一步:建立事件狀態與證據邊界
把事件建模為 detected → triaged → contained → rotated → verified → closed,每次轉換記錄事件 ID、憑證公開識別碼、租戶、發現來源、權限、時間和負責人。掃描器保存雜湊、指紋和定位資訊,不保存完整秘密;分析人員使用權限受限的內部驗證路徑確認狀態。
候選偵測可以來自提交前掃描、儲存庫歷史、公開儲存庫事件、CI 日誌、產物掃描和供應商通知。GitHub 的 push protection 會在秘密進入儲存庫前阻斷推送,並為繞過行為產生告警;這能減少進入歷史的事件,但不能取代歷史掃描和執行期監控。
第二步:確認有效性並計算爆炸半徑
先根據前綴、長度、檢查位或供應商規則做本地篩選,再呼叫不會暴露秘密的驗證端點。驗證回應只回傳 valid/invalid/revoked/unknown 和憑證中繼資料。禁止讓掃描器用生產寫入權限發起業務請求;若必須驗證,使用唯讀、低成本、隔離租戶和專門的審計標記。
確認後讀取權限範圍、租戶、建立者、環境、到期時間、最後使用時間和 200 個服務的依賴清單。按「洩露時間到撤銷時間」查詢請求日誌,區分正常來源、未知網路、異常地區、非預期端點、拒絕率和高價值資源存取。日誌只能引用公開 Key ID、租戶和請求關聯 ID,不能保存 Authorization 標頭或秘密內容。
第三步:先遏制,再規劃遷移
高權限、可寫、可轉帳的 Key 先撤銷;唯讀 Key 也應按已洩露處理,不因尚未看到濫用就繼續有效。撤銷權威狀態後發布快取失效事件,閘道以短 TTL 作為遺失事件的後備。定義例如「全網閘道 5 秒內拒絕新請求」的目標,並在訊息遺失、節點重啟和分割情況下驗證。
不要為了 200 個服務的方便給洩露 Key 長時間寬限。可以讓未洩露的例行輪替擁有雙 Key 窗口;疑似洩露事件則先撤銷,必要時讓受影響的唯讀介面短暫回傳安全降級結果。安全降級不能洩露更多資料,也不能被客戶端誤認為寫入成功。
第四步:執行可審計的批量輪替
為每個呼叫服務生成獨立的新 Key,權限不超過舊 Key,優先使用短期或工作負載身分。透過統一 secret manager 或部署設定分批下發:先小規模 canary,再按服務組擴散。每個服務的狀態機至少包含 prepared → deployed → observed → old-revoked,重複執行不會生成無窮憑證,也不會把舊 Key 意外重新啟用。
Stripe 的官方建議是發現暴露就立即輪替,即使不能確定是否被看見;受限 Key 和來源 IP 限制可以降低爆炸半徑。OWASP 還要求記錄秘密的建立、使用、輪替、刪除、用途和責任人,並建議在可能時使用短期或動態憑證。
第五步:驗證關閉而不是只看部署成功
輪替完成後做四類檢查:舊 Key 在每個閘道都回傳一致拒絕;新 Key 只存取允許的租戶和端點;請求日誌中不再出現舊 Key ID 或異常來源;200 個服務的健康檢查、業務指標和錯誤預算恢復正常。對無法自動更新的服務,明確負責人、截止時間和臨時隔離策略,不要把「發送過新設定」當成完成。
關閉事件前保留不可逆的證據摘要、時間線、權限變化、審批和異常請求樣本。秘密本體按保留政策銷毀。復盤要回答偵測為何沒有前移、為什麼呼叫方共享 Key、哪些日誌缺少 Key ID、撤銷傳播是否達到目標,並把修復轉成可驗證的行動項。
高品質示範回答
「我會先把這個唯讀 Key 當成已經洩露。掃描器不會回顯秘密,只保存指紋和儲存庫位置;我會透過受限驗證介面確認 Key ID、租戶、權限和狀態。高風險憑證立即撤銷,權威狀態先寫入金鑰服務,再向閘道發布失效事件,目標是所有閘道在 5 秒內拒絕新請求,並用訊息遺失、快取和節點重啟測試這個目標。
接著按發現時間和撤銷時間查詢請求日誌,識別 200 個呼叫服務、使用端點、來源網路和異常存取。日誌只用公開 Key ID,不記錄 Authorization 標頭。新 Key 按服務獨立生成,權限不超過舊 Key,透過 secret manager 分批部署,先 canary,再觀察新舊 Key 的請求曲線。洩露事件不給長寬限;只有普通輪替才允許短暫雙 Key。
驗證不能只看部署成功。我會檢查舊 Key 在每個閘道都被拒絕,新 Key 的租戶和端點授權正確,舊 Key 流量歸零,服務錯誤率回到預算內。最後保留事件時間線和摘要,銷毀秘密本體,補上提交前阻斷、歷史掃描、執行期異常告警、獨立 Key 和輪替演練。這樣既縮短攻擊窗口,也避免把整個租戶或所有服務一次性打掛。」
常見錯誤
- 掃描命中後把完整 Key 寫入日誌 → 擴大二次洩露面 → 只保存指紋、Key ID 和定位資訊。
- 只靠正規表示式決定洩露 → 誤報和未知格式都會誤導處置 → 用受限驗證與供應商中繼資料確認。
- 看到異常才撤銷 → 靜態 Key 可能已被複製但尚未使用 → 暴露即潛在洩露,先控制再取證。
- 撤銷資料庫列就結束 → 閘道快取和下游系統仍可能接受舊 Key → 測量傳播、清快取並驗證下游輪替。
- 全租戶封禁 → 事故影響擴大且難以復原 → 按 Key、權限、端點和時間窗收斂範圍。
- 給洩露 Key 長期雙 Key 窗口 → 攻擊者保留有效憑證 → 雙 Key 只服務於未洩露的例行輪替。
- 所有服務同時切換 → 設定錯誤會造成全量中斷 → canary、分批、冪等狀態機和回滾。
- 把新設定發送成功當完成 → 服務可能未重載或仍引用舊 Key → 用舊 Key 拒絕、新 Key 授權和業務指標驗收。
追問及應對
追問一:掃描器無法確認 Key 是否有效,怎麼辦?
先按潛在洩露處理,縮短有效窗口;用不回傳秘密的驗證介面、公開儲存庫上下文和內部 Key 中繼資料補證。若誤報代價很高,可讓有權限的安全人員批准一次性例外,記錄理由和期限,不能讓掃描器自行放行。
追問二:一個舊系統無法熱載入新 Key,怎麼輪替?
先準備新部署或短暫雙程序,驗證新 Key 後切流,再撤銷舊 Key。若無法做到,隔離該服務的權限和網路出口,縮短截止時間,並把人工步驟納入審計;不能因為遺留系統而讓洩露 Key 長期有效。
追問三:撤銷傳播超過 5 秒,繼續服務還是全站關閉?
按權限和業務風險分層。寫入、支付和高價值端點在狀態不新鮮時 fail closed;低風險唯讀可採用明確標註的短暫降級。先擴大隔離和限流,修復失效通知或快取路徑,再決定是否擴大封鎖。
追問四:攻擊者已經用舊 Key 讀取資料,下一步是什麼?
保存證據並限定時間窗、租戶、端點和資料範圍,通知受影響方,評估是否需要資料洩露通報。撤銷與輪替只是阻止繼續使用;還要審查匯出、快取、非同步任務和下游複製,避免遺漏二次暴露。