發表文章

新創資安事件啓示錄:當環境變數變成整個平台的信任根

主打 AI Agent 整合的 PaaS 新創平台爆發資安事件:攻擊者從一把雲端管理憑證出發,一路打穿到主資料庫,把所有租戶存在環境變數裡的第三方金鑰整批查出來、匯出去。問題的根源不是「被駭」這件事本身,而是架構設計把太多信任集中在同一個地方——環境變數欄位是整個平台唯一的機密儲存層,一次控制平面層級的入侵,就足以讓所有租戶的金鑰在同一時間曝險。因此想寫這篇文章討論金鑰該怎麼存。 (一) 從攻擊鏈看金鑰為什麼能走這麼遠 該平台官方在事故發生後陸續更新的攻擊鏈,是這起事件最值得拆解的部分:攻擊者取得一把 AWS 管理層級的憑證,先進入東京的一個共用叢集,再從叢集摸到控制平面的 VPN,最後連上主資料庫,把使用者存在環境變數裡的金鑰查出來、匯出去。時間軸上,平台在 8 月 28 日凌晨建立事故頁,一開始只說是「內部服務憑證」被用來查詢環境變數紀錄;直到隔天晚間,才更新出「AWS 管理憑證 → 共用叢集 → 控制平面 VPN → 主資料庫」這條完整路徑。 如果那把 AWS 憑證的有效權限,本身就同時涵蓋叢集存取、VPN 素材、資料庫連線——那麼圖面上的四個箭頭,實際上可能從頭到尾只被同一個身分牽著走,中間沒有一關是「前一個身分拿不到、簽不出、也改不掉」的獨立授權。 要驗證一組雲端身分的真實影響範圍,不能只看掛了哪些 policy 名稱,而要直接查它的 effective permissions: aws accessanalyzer list-findings \ --analyzer-arn <analyzer-arn> \ --filter '{"resource":{"contains":["<role-or-user-arn>"]}}' 這個指令會列出該身分實際可觸及的資源,而不是政策文件上「看起來」授權了什麼——這正是重建這類事故攻擊面時,第一件該做的事。 (二) 問題不在用環境變數,而在把它當成信任根 環境變數本身不是問題。幾乎所有 PaaS——Heroku、Render、Vercel 等——都用環境變數當作應用程式讀取設定的方式,這是產業慣例,沒有問題。真正的問題,是把環境變數當成金鑰的「長期儲存層」與「信任根」:如...

SRE 視角解讀:Uber Software Factory 如何治理 AI Agent 時代的 Token 成本

AI coding agent 在過去兩年間,從輔助工具演變為軟體開發生命週期中的主要生產力來源,也讓 AI 支出從可預測的授權費用,轉變為隨用量複合成長的變動成本。Token 計費模式沒有天然的用量上限——工程師平行執行多個 agent、對整個 codebase 進行重構、或把重複性作業自動化,都會讓消耗量隨活躍度倍增。這個轉變,正把「AI 支出治理」推成一個新的工程管理課題。 Uber Engineering 在 2026 年 8 月發布的〈Running a Software Factory Efficiently at Uber Scale〉,公開了該公司如何在用量快速擴張的同時壓低單位成本。根據該文披露,從 2 月到 8 月中,全公司 agentic 功能的週活躍用戶成長 7 倍,agent 請求量成長 9.4 倍;若把模型版本固定下來比較,每千次請求的成本從高峰下降約 34%,每個 session 的成本從 6 月高峰下降 52%。 若拉開一層來看,這套框架並不是全新的方法論,而是把 SRE 領域行之有年的容量規劃與 error budget 治理,搬進了 AI agent 這個新的資源類型。過去容量規劃談的是運算資源與流量成長的關係,error budget 談的是可用性與變更速度的平衡;Uber 這篇文章處理的問題結構完全相同,只是把「運算資源」換成了「token」、把「可用性」換成了「單位成本」。理解這層對應關係,有助於判斷哪些做法是換皮的舊經驗,哪些才是 AI agent 帶來的新變數。以下先整理該文揭露的治理框架,再回頭對照這層關係。 分層治理模型:掌控力隨專用程度遞增 該文將公司內的 agent 使用場景分為四層,由最泛用到最受管理。層級愈高、愈受管理,團隊對成本、輸出品質與模型選擇的掌控力也愈強。互動式的個人 coding session 屬於最泛用的一層,routing 與模型選擇多半由工程師臨時決定;相對地,把工作交給「受管理的 agent」(例如自動 code review、CI 失敗自我修復、on-call alert 分診),則讓平台方能統一決定模型版本與執行環境。該文將此描述為核心策略轉向——從優化個別終端 session,轉向優化一支專門化的 managed agent 艦隊。 成本方程式:六個變數,三個...

Tips on Dockerfile

Dockerfile 看似簡單,幾行 FROM、RUN、COPY 就能把應用打包成 image,但寫得好不好,直接牽動 build 速度、image 大小、安全性與日後的可維護性。本文整理幾個實務中最常用、卻也最常被忽略的 Dockerfile 撰寫訣竅。 (一)善用 layer cache , 指令由 變動較少 排到 容易變化 (由上到下) Docker build 是逐層(layer)快取的,只要某一層的指令或內容改變,該層之後的所有 layer 都會失效重建。因此在Dockerfile內容中,指令順序(由上到下)應該從「變動頻率低」排到「變動頻率高」。最典型的例子,是先複製相依清單、安裝套件,最後才複製原始碼: # 先處理相依,讓 cache 命中率最大化 COPY package.json package-lock.json ./ RUN npm ci COPY . . 如此一來,只要原始碼變動、相依沒變, npm ci 這一層就能命中 cache,不必重跑。 (二)用 multi-stage build 縮小 image 把「編譯環境」與「執行環境」分開,只把最終產物帶進 runtime image,可大幅縮小體積,也降低受攻擊面(attack surface): FROM golang:1.22 AS builder WORKDIR /app COPY . . RUN go build -o server . FROM alpine:3.20 COPY --from=builder /app/server /server ENTRYPOINT ["/server"] runtime image 不再包含 compiler 與原始碼,從數百 MB 降到數十 MB 是常態。 (三)合併 RUN 並在同一層清理 cache 每一個 RUN 都是一層。把相關指令用 && 串接成一層,並在同一層清掉套件快取,避免多餘體積殘留在 image 裡: RUN apk add --no-cache curl \ && rm -rf /var/cache/apk/* Debian/Ubuntu 則常見 apt-get install 之後接 rm -rf /var/l...

SRE 不是專案:價值、評估與治理

導讀摘要: 在企業管理會議上,「這個 SRE 專案什麼時候結束?」是財務長與執行長最常提出、也最容易誤導決策的問題。它反映了一種常見的認知失調——用「專案(Project)」的靜態思維,去管理一項本質上動態、連續、持續對抗系統熵增的工程實踐。本文從三個層面展開分析:為什麼傳統專案管理難以有效衡量 SRE、SRE 真正的核心價值何在、以及在沒有明確截止日期的前提下應如何評估其 ROI 並控制成本。核心觀點是:衡量 SRE 的正確標準,不是「何時完成」,而是「自動化的程度是否讓人力成本的成長率低於業務成長率」。 一、問題的起點:一個常被問錯的問題 當年度規劃討論到 SRE 或 DevOps 團隊時,最常出現的質疑往往是:「這個專案什麼時候會結束?既然沒有完工日,預算要如何控制?是否要無止盡地投入人力與軟體授權費用?」 這是一個合理、卻建立在錯誤前提上的問題。傳統的 IT 管理習慣以專案思維運作——明確的範圍、時間、預算與截止日期(Deadline)——藉此控管風險。然而,SRE 的本質是對抗複雜系統中的熵增(Entropy)與規模化挑戰,這是一個持續進行的過程,而非一次性的交付任務。 問題的根源不在 SRE,而在管理範式(Paradigm)的錯配。以靜態的專案框架衡量動態的維運工作,不僅難以正確評估績效,也容易導致資源錯置。要化解這個誤判,需要先釐清三件事:專案管理為何在此失效、SRE 的價值究竟該如何定義、以及該用什麼機制取代「截止日期」來控制成本。 二、為什麼傳統專案管理難以衡量 SRE? 軟體服務與建築工程有本質差異。建築物完工後,維護成本相對低廉且可預測;軟體服務則不同——只要業務在成長、流量在增加、新功能在發布,維運的複雜度就會持續上升。 若以「專案結案」的方式管理 SRE,通常會導向兩種結果。其一是 專案永遠無法結案 :由於系統的熵增不會停止,管理者容易因看不到終點而誤判團隊效率低落。其二是 強制結案、撤出人力 :系統隨後因缺乏維護而逐漸劣化,最終造成遠大於節省成本的商業損失。 兩種結果指向同一個結論:SRE 並非一個「有終點的導入計畫」,而是一種「持續運作的能力」。為它設定完工日,就如同為消防體系設定解散日——問題不在於效率,而在於這個提問的框架本身並不成立。承認這一點,是後續一...

熱門文章

Docker 環境下的 Proxy 配置