資安筆記 作者 Hsin,Head of Product English

秘密儲存被整包撈走的那一天:加密邊界,不是防火牆

某 PaaS 平台環境變數外洩,一堆人的 OpenAI、Anthropic API Key 直接躺在外面。 這篇想講三件事:事發第一小時該做什麼為什麼「加強防火牆」救不了這類事件, 以及我們蓋 Containarium 時遵守的七條安全邊界規則

如果你的 Key 可能在外流名單裡,先別急著往下讀。 在你開始輪替金鑰之前,先做一件五分鐘的事:去 AI 服務商後台把日/月支出設成 硬上限——「超過就停用」,不是「超過就通知」。 這是憑證已經外流的情況下,唯一還能把損失壓住的措施。做完,再回來談根因。

洩漏路徑不是你以為的那條

事件一出來,很多人的第一反應是「加強 cluster 之間的防火牆」。方向不能算錯, 但這類多租戶平台外洩的路徑,通常不是 A cluster 橫向打到 B cluster。

而是單一控制平面或秘密儲存,被一次撈走全部租戶。 一個過權的 token、一個沒鎖好的內部 API、一份備份檔——攻擊者根本不需要碰你的網路邊界, 他直接站在所有租戶資料匯集的那一點上。

網路隔離擋不住這件事。租戶之間的封包被擋得再乾淨, 都改變不了「秘密以明文形態集中放在一個地方」這個事實。 隔離做在網路層,洩漏發生在儲存層——兩件事根本不在同一個軸上。

2026 年 8 月 31 日更新:這一段講得太滿。 調查細節顯示,走匯集點的那條路徑本身就是橫向移動—— 從一個正在停用、卻仍握著核心資料庫內部存取權的共享叢集走出去的。 正確的講法是「光靠網路隔離擋不住」:那是兩道閘門的其中一道,而我們低估了另一道。 上面這段文字原樣保留,沒有改寫。

真正的隔離軸是加密邊界

對付「儲存被整包偷走」,有效的軸不是更多防火牆,而是加密邊界。它說穿了只有三個性質:

加密邊界的三個性質

  1. 1. 每租戶獨立金鑰——一個租戶出事就是一個租戶,不是全平台。
  2. 2. 控制平面只搬密文——管理面被打穿,拿到的是密文。
  3. 3. 解密發生在使用點、綁工作負載身分——平台工程師可以重啟你的服務,但看不到你的秘密。

自測題:如果你的秘密儲存今晚被整包拷走,明天是公關災難,還是一則 status page 公告?

做到這三件事,「儲存被整包偷走」才會從災難降級成事件: 攻擊者拿走的是一堆密文,而解開它們的金鑰在另一個信任邊界裡。

順帶一提,把 Key 從環境變數搬進 Vault,卻在服務啟動時又整包展開成環境變數, 等於白做——秘密還是以明文形態躺在每一個 process 的記憶體和 /proc 裡, 你只是多養了一套 Vault。加密邊界的重點是解密的位置和身分,不是儲存的品牌。

帶著這五題去問你的 PaaS

  1. 我的秘密有沒有自己的金鑰,還是全平台共用一把?
  2. 誰、用什麼身分,有能力解開我的秘密?
  3. 解密發生在哪裡——控制平面,還是我的工作負載旁邊?
  4. 你們的備份被偷走,偷到的是明文還是密文?
  5. 你們的管理 token 讀得到租戶秘密嗎?

答得最不順的那一題,就是你真正的邊界所在。

第二步:把長期真 Key 換成短期憑證

加密邊界處理的是「儲存被偷」。第二個該做的是 AI Gateway,處理的是「執行環境被打」: 把「長期真 Key 散落在 N 個客戶容器」, 換成「真 Key 只存在單一受控邊界,容器拿到的是可即時撤銷的短期憑證」。

一個動作解掉四件事:

  • 容器被打下來,攻擊者拿到的是一張幾分鐘後過期、隨時可撤銷的票,不是真 Key。
  • 帳單有硬上限:配額是強制執行的,不是事後對帳。
  • 出事之後平台自己就有取證資料,不用叫客戶去上游服務商後台撈 log。
  • 所有模型流量過同一個點,可觀測。

這裡有個容易被忽略的推論:egress 白名單救不了已經在容器裡的 Key。 模型服務商的 endpoint 本來就在允許清單上,Key 要外流,走的就是那條被允許的路。 所以理想的 Gateway 不只是一個 proxy——它必須是唯一的路。 做不到「擋掉直連模型商」的 Gateway,只是一條建議路線,繞過去就沒了。 解法不是把網路關得更緊,而是讓 Key 從頭到尾不進容器、讓直連的路不存在

Gateway 該盯什麼

有了單一受控邊界,偵測才有落點。值得盯的訊號,按強度排:

應變也不要只有「正常/停用」兩態。 觀察 → 降速 → 告警 → 熔斷 → 撤銷—— 中間層很重要,因為誤判一次就把付費客戶整個切掉,你會學到再也不敢開自動應變。

一個誠實的提醒:順序不能反

Gateway 集中了所有租戶的真 Key, 它本身就是全平台最高價值的目標。 沒先做好加密邊界,Gateway 只是把風險換個位置,而且更集中—— 你等於親手蓋了一個更值得打的秘密儲存。 這對「平台不動、先買一個 AI Gateway 產品補洞」的做法,同樣成立。

所以順序是:先讓「儲存被整包偷走」只偷得到密文,再把真 Key 收進單一受控邊界。反過來做,是自找的。

安全邊界的七條規則

我們是多租戶平台,上面那段威脅模型就是我們自己的威脅模型。 與其列功能清單,不如把我們用來蓋 Containarium 的規則寫下來—— 這些規則不需要我們的產品也成立,你拿去蓋自己的平台、或拿去審你正在用的平台,都一樣好用。

  1. 一、爆炸半徑以租戶為單位設計。任何一把金鑰、一個 token、一條權限,最大能打開的範圍就是一個租戶。「全平台能解開一切」的東西,不是待改進項目,是不該存在的東西。
  2. 二、秘密只以密文移動。控制平面搬運、備份、複製的永遠是密文;解密權綁在工作負載身分上,發生在使用點。管理員的權力是「操作服務」,不是「閱讀秘密」。
  3. 三、執行環境裡只有短命憑證。真 Key 集中在唯一受控點,容器拿到的憑證以分鐘計、可即時撤銷。偷到一張快過期的票,不算贏。
  4. 四、繞過的路不能存在。一個控制點要算數,網路層就必須讓它是唯一的路。擋不掉直連的 Gateway 只是一條建議路線。
  5. 五、Fail closed。加密機制不可用時,拒絕啟動、拒絕服務,永遠不默默退回明文。寧可停機,不要裸奔。
  6. 六、邊界要用攻擊來證明——把紅隊放進 CI。隔離不是設定完就相信。紅隊也不該只是一年一次的滲透測試報告,而是一個住在 pipeline 裡的常駐攻擊者:每一次改動,它都真的嘗試跨租戶一次,一得手就擋下 merge。防守的人會累、會輪調、會離職;寫進 CI 的攻擊者不會。用宣稱的邊界,等於沒有邊界。
  7. 七、連「存在」都不洩漏。跨租戶的存取要回「不存在」(404),不是「沒權限」(403)。錯誤訊息也是資料。

我們用這七條要求自己——和所有平台一樣,做得並不完美。而且任何平台在任何一天的真實狀態, 都變得比一篇部落格快。這正是規則比功能清單重要的原因:功能會過時, 規則隨時可以拿出來檢驗、對任何一家都成立。拿這七條來問我們,也拿去問任何你正在評估的平台。

利益揭露:Containarium 是我們做的。開源版是 Apache 2.0, 這些規則的實作——信封加密、eBPF 隔離、跨租戶 sentry——都在開源 daemon 裡看得到, 可以自架、不靠我們驗證。 另外,這個領域每一家(包含我們)的架構文件都寫得比現實漂亮—— 所以判斷一個平台的方法不是看它宣稱什麼,而是看它怎麼談自己還沒做到的部分

去看一下,你系統裡的資料安全邊界到底在哪。

上面那五題不用花錢就能問,答案幾乎就是你要知道的全部。想要有人陪你走一遍——邊界現在畫在哪、到底是什麼在保護什麼——我們提供免費的健檢諮詢。