自建Runner · 工作負載身分 · TTL與稽核 · 決策矩陣
平臺與行動端負責人在多地區遠端Mac叢集上跑CI時,失敗往往不是編譯器太慢,而是長效PAT、部署用私鑰、跨區複製腳本黏在每臺Runner上,離職與機器重新分配讓影響面像雪球愈滾愈大。本文將憑證風險收斂為三類敘事,以粒度、撤銷與可觀測性對照OIDC工作負載身分、長效PAT、部署金鑰,並給出從信任政策到Runner零長密六步Runbook、TTL與最低稽核欄位,以及託管型態×合規×對外登錄檔出口的決策矩陣。共享構建池、可觀測任務鏈、建置產物與快取在地性互鏈,讓身分邊界與位元組路徑落在同一張圖上。
跳板主機、簽章身分、暖快取都位在對的位置,事故仍可能指向美東磁碟映像裡三年未換的PAT、複製到新加坡節點的kubeconfig,或測試與正式共用的私鑰。根因是身分仍被當成人類憑證,尚未遷到綁定流水線與環境的機器工作階段。此缺口與冪等鍵及共享池互斥強耦合;沒有結構化宣告就只能在事後回答誰登入,無法說明哪次建置消費了哪個Audience。以下五項當成起飛前檢核,再進入OIDC與PAT對照表,才能把「我機器上可以」推進到「跨區可稽核」。
現場常把「先能跑」放在Runner標籤與金鑰盤點之前,網狀架構又讓地區數直接變成複製次數,僅靠加密磁碟與檔案權限600不足以縮小讀者集合,備份還原、鑑識取證、維運筆電讀取路徑都應納入威脅模型。先用SSH與VNC對照釐清互動式更新與無人值守更新的需求差,短效憑證的更新節奏才不會被錯置。
長效磁碟稅:組織PAT與kubeconfig寫進映像層、plist或點檔後,任何Shell工作階段都背著一大串通用鑰匙;權限位元擋不住備份與鑑識讀取。
跨區複製稅:同一密料rsync到三地,克隆只要偏離主幹一次,暴露面就線性放大;若與產物同步計畫交錯,外洩路徑更難還原。
輪替拖延稅:試算表追蹤在撞上發佈火車時把輪替往後推,人人知道該汰除卻不敢碰的殭屍憑證便堆積。
環境混線稅:單一Runner同時承接主線閘道與外部貢獻會讓多枚權杖共居環境變數;薄弱的作業隔離讓測試Audience溜進正式發佈步驟。
可觀測盲點稅:建置日誌若缺token_issuer、subject、ttl_remaining_sec,事後無法指認哪條信任鏈簽發了工作階段。
把五稅列成清單再估OIDC導入工時,會浮出「先掛OIDC」填不滿的觀測洞。尤其網狀環境裡各地STS與物件儲存區對齊若延後,頻寬與延遲優化都會被一紙403打回原形,下一節對照表請貼進架構備忘並於每次變更比對差分。
沒有單一最佳解,須對齊組織規模、稽核粒度、對外容器登錄檔政策。OIDC把會話綁在儲存庫與環境,較贴合多地區網狀;PAT上手快但稽核薄弱;部署金鑰在狹窄簽章流不可缺,卻難做細粒度撤銷。信任政策若未寫入地區親和,美東Audience被新加坡誤用時,值班只能猜時區。表格當共同語言留存,每季更新GitHub Actions與GitLab欄位名差異即可。
實務上「先用PAT過關」較易過簽核,日後再收斂到OIDC會讓Runner重新註冊與工作流程修改疊加;若早把共享構建池的Runner群組與Audience對照畫成一張圖並以環境著色,交接較不易迷路。
| 維度 | OIDC工作負載身分 | 長效PAT | 部署私鑰 |
|---|---|---|---|
| 粒度 | 儲存庫、環境、分支主體可附加宣告 | 常落在組織或使用者層,拆分即倍增權杖數 | 多半一槽一對金鑰,除非複製憑證 |
| 撤銷速度 | 停用信任政策或縮短TTL可全域生效 | 受控台與用戶端快取節奏牽制 | 需CRL或指紋拒絕名單外加用戶端行為 |
| 多地區適配 | 強,可把地區與Runner指紋寫進宣告 | 中等,複製等於廣播 | 中等,簽章必要但散佈面寬 |
| 可觀測性 | issuer、audience、jti易與日誌對齊 | 常只剩雜湊前綴與代理帳戶 | 需自架hook補鍵識別與簽章標的 |
| 營運成本 | 前期設定高,後續輪替便宜 | 起步低,稽核與撤銷昂貴 | 中等,憑證生命週期無法省略 |
網狀CI資安取決於「會話能否解釋建置」,而非「綠燈是否偶爾亮起」。
若已營運共享池,請把此表固定為設計審查附件,避免身分淪為走廊口頭約定。
步驟與供應商解耦,GitHub Actions或GitLab僅欄位名不同、交付物相同。每步對應可覆核的變更票;若搭配任務鏈交接,封包內務必帶上job_id與environment。無人Runner若默默吞掉更新失敗,團隊會養成悄悄退回長密的習慣,分頁與閘道要同時到位。
六步不必一次塞滿,先凍結Issuer與切開Audience,再補開機掃描、STS交換、TTL上限、撤銷演練,可把衝擊攤平到各迭代;各地區採同一順序,事故時的切分順序也一致。
凍結受信任Issuer:只允許組織掌握的Issuer網址,拒絕萬用字元主機名,並把差分寫進基礎設施變更紀錄。
依環境切Audience:測試、正式、合規分區各用不同字串,禁止跨環境重用同一Audience。
開機腳本遇明文中斷:掃到PAT檔名或kubeconfig樣式即中止註冊並退回金映像。
以OIDC換雲端STS:依各雲短會話慣例交換,憑證寫入記憶體檔案描述元而非持久路徑。
上限TTL與續租:會話長度覆蓋建置P95的一點五倍並設硬頂,續租失敗要告警且不得靜默退回長密。
撤銷演練:隨機停用一條信任政策,驗證各地區一分鐘內拒發新會話且執行中作業可預期失敗。
export RUNNER_FINGERPRINT="$(system_profiler SPHardwareDataType | shasum | awk '{print $1}')"
export OIDC_AUDIENCE="vpsmesh-ci-prod-${RUNNER_REGION}"
node scripts/exchange-oidc-for-sts.mjs \
--issuer "${ACTIONS_ID_TOKEN_REQUEST_URL}" \
--audience "${OIDC_AUDIENCE}" \
--runner-fingerprint "${RUNNER_FINGERPRINT}"
備註:STS結果留在程序記憶體或tmpfs並於作業收尾撤銷,勿把交換輸出寫回金映像。
網狀價值在於各城市跑同一條流水線,但身分必須與地區親和與登錄檔出口政策同設計,否則新加坡拉映像很快卻與STS地區不一致,或美東權杖對東京儲存區回傳四○三。先查Issuer與Audience,次查Runner指紋是否寫入宣告,最後才懷疑編譯快取;把順序Runbook化可縮短徹夜排錯。
多地區常見偽陽性是DNS、憑證、Proxy trio早於宣告驗證故障,但若日誌缺jti與剩餘TTL仍無法把雲端稽核與流水線接起來。回到快取鍵與分段發佈前,先確定手邊印得出宣告對照表。
宣告優先:驗證repository、environment、ref,檢查可重用範本是否漏參數。
親其次:挑與產物儲存區與登錄檔對齊的STS地區並符合合規允許清單。
快取最後:校驗碼或暫存發佈漂移時回到位元組路徑與核對欄位。
記錄jti與剩TTL:索引化jti以銜接雲端稽核軌跡。
故障域演練:斷一區網路,確認他區不繼承其會話檔或tmpfs掛載。
對齊互斥:在取得租約前完成憑證交換,避免半開會話占席。
警告:長密先解密到磁碟再刪仍可能留下當機殘渣;優先使用記憶體與核心金鑰圈並強制作業邊界回收。
下列三條帶寬來自跨區iOS與macOS流水線審閱的常用參考,並非保證值;請置換成自家直方圖並把原始分佈附在架構核准件。僅複製數字而丟棄情境會變成無法重現的「看起來專業的常數」。
背後假設包含Runner常時上線、網路短斷可收斂、作業隔離至少以容器或使用者分離守住底線,且稽核日誌匯入中央伺服器。任一假設鬆動時應同步縮短TTL並重新估算併發席與交換頻寬成本。
job_id、environment、jti之一綁定,問卷與驗證才能收尾。| 平臺 | 合規 | 登錄檔出口 | 首選 |
|---|---|---|---|
| GitHub Actions | 標準 | 公開登錄檔可 | Runner群組每環境Audience經OIDC換雲端STS |
| GitLab | 標準 | 私有登錄檔必要 | 綁IdP的CI_JOB_JWT配合同區快取 |
| 自訂排程器 | 高 | 嚴格限出口 | mTLS分割簽章服務,PAT僅緊急 |
| 大量Fork流量 | 中 | 混合 | 內部與Fork分Audience,禁共用工作區 |
借調筆電、誰有空誰SSH、睡眠與修補窗打斷更新的作法,難以滿足稽核要求的隔離與更新節奏;OIDC再完美也擋不住無人續租失敗後逃回長密。
常見誤區:只最佳化互動便利,忽略無人續租與磁碟殘留所需的反向控管。
要讓iOS與macOS持續交付且把OIDC會話對齊可稽核欄位,團隊常在採購與多據點佈線被卡住;借用硬體難以把強制撤銷與席位隔離寫進合約,政策辯論易落到無法量測的口頭承諾。若要在正式等級的網狀CI維持可旋轉的身分邊界,VpsMesh Mac Mini雲端租賃通常是較穩妥的選項:接近用量的帳期、可選地區、可寫進合約的專屬節點,能把稼動率爭議拉回可量測前提。請併讀三年TCO決策矩陣,把輪替人力一併納入比較。