三類痛點:長期 deploy key 如何同時傷害合規與事故覆盤
痛點 1:身份與流水線生命週期脫節。倉庫 rename、fork 繼承、複製粘貼的 workflow 可能仍在使用三年前生成的私鑰;當安全團隊追問「這把 key 對應哪條生產流水線」時,答案往往散落在個人筆記裡。對遠程 Mac託管場景,若多團隊共用同一 Unix 賬號,日誌裡只有 publickey 成功,卻無法映射到具體 GitHub Organization 或 GitLab Group。
痛點 2:Secrets 平面過大與日誌洩露面。把同一私鑰放在 organization 級 secret 會讓本不需要觸達生產目錄的實驗 workflow 也能認證;若有人在調試步驟裡 echo 了 base64 包裹的密鑰片段,搜索引擎與緩存層都會放大二次洩露。最小權限不僅是目錄層,也是「誰能讀到這份 secret」層。
痛點 3:輪換被推遲到事故。短期令牌常態到期;靜態密鑰依賴人工日曆。憑據治理應進入發佈閘門,與 傳輸校驗同級。
補充維度:合規常要求可證明撤銷與職責分離;OIDC claims 可把 staging/production 寫入令牌邊界;審計需要 run id、issuer、principal 與證書擴展對齊;高併發下同一私鑰複用會放大洩露半徑,應拆分賬號或密鑰。
憑據模型:OIDC、deploy key、PAT 與 SSH 用戶證書的分工
GitHub Actions OIDC / GitLab JWT 讓流水線向雲或自建簽發服務證明身份,再由該服務頒發短期 SSH 憑據或調用簽名 API;核心價值是把「信任根」從靜態文件遷到可審計的令牌交換鏈。落地時需要自建或託管一個接收 OIDC 的組件(如雲廠商 IAM、Vault、step-ca、或內部微服務)來把聲明映射為 sshd 可接受的公鑰/證書。
Deploy key 適合小團隊單倉單目錄且嚴守輪換;讀寫分離、禁複用,公鑰 comment 寫流水線與負責人。PAT 多用於 Git HTTPS,勿與 SSH 私鑰混同一 secret。SSH 證書綁定 TTL 與 Principal,可與 Chroot 疊加。
簽發交換端點與簽發私鑰同樣是高價值目標,需 MFA、補丁、限流與 SIEM;簽發失敗須告警,避免靜默退回本機手工上傳。
決策矩陣:合規等級、團隊規模與推薦組合
評審時把結論寫入變更單:誰持有簽發私鑰、誰審批 environment、誰保留吊銷記錄。
| 模型 | 適用場景 | 暴露窗口 | 運維成本 |
|---|---|---|---|
| 長期 deploy key(單倉庫) | 小團隊、低變更頻率、能接受季度輪換 | 高;洩露即長期有效 | 低起步,高長期 |
| OIDC → 短期 SSH 密鑰/證書 | 中大型企業、多環境、需審計 claims | 低;綁定 run 與環境 | 中高;需簽發組件 HA |
| SSH 用戶證書 + 專用賬號 | 已運行 sshd CA、需細粒度 Principal | 中低;證書 TTL 可控 | 中;與 CA 運維綁定 |
| 僅拆分 Unix 賬號無令牌 | 過渡方案;目錄隔離先行 | 中;密鑰仍可能共享 | 低中 |
憑據變細後仍須與 併發、MaxSessions 策略對齊。
實操:從 GitHub Actions 到 sshd 的最小權限路徑(至少六步)
在測試環境驗證;生產 sshd 重載時保留第二會話。將示例中的主機名、環境名與聲明鍵替換為你的 IDP 與運行器。
# 步驟 1:在 GitHub 中啟用 OIDC(倉庫或 org),限制 aud/issuer(按官方文檔)
# 步驟 2:簽發服務校驗 JWT 後,下發短期 ed25519 私鑰或用戶證書到 runner 文件系統
# 僅寫入當前 job 的工作目錄,job 結束即銷燬
# 步驟 3:生成專用 ~/.ssh/config_ci,禁止 Include 通配意外合併個人配置
Host mac-ci-prod
HostName 10.0.50.20
User sftp_ci_prod
IdentityFile "$RUNNER_TEMP/ci_ed25519"
StrictHostKeyChecking accept-new
ServerAliveInterval 60
ServerAliveCountMax 3
# 步驟 4:rsync 包裝
# RSYNC_RSH="ssh -F ~/.ssh/config_ci -o BatchMode=yes"
# 步驟 5:目標機 Match User sftp_ci_prod
# ForceCommand internal-sftp
# ChrootDirectory /srv/sftp/ci_prod
# 與《Chroot 多租戶》一致檢查 root:root 與屬主
# 步驟 6:authorized_keys 或 TrustedUserCAKeys
# 公鑰 comment 建議:gh:org/repo:workflow:environment
# 步驟 7:雙密鑰輪換——新公鑰追加後觀察 72h,再移除舊行並記錄工單號
生產 workflow 使用 environment 與 reviewers;日誌只打指紋與 RUN_ID。上傳配合 原子發佈,避免 in-place 與洩露疊加。
可引用數據:輪換窗口、並存期與 SIEM 字段
基線:(1)靜態 key 生產建議 30 天覆審。(2)雙鑰並存 72h。(3)簽發私鑰放 KMS/HSM,≤14 天做恢復演練。(4)SIEM 關聯 run_id、environment、key_fp、目標賬號。
人力緊張時簽發與跳板補丁易滯後,可考慮把網絡與目錄託管給專注遠程 Mac 交付的服務商以收斂值班面。
FAQ、內鏈收束與為何考慮租賃遠程 Mac
沒有云簽名服務也能用 OIDC 嗎?
可以自建輕量交換服務,但要承擔高可用與漏洞面;小團隊可先用強約束的 deploy key + environment protection + 短週期人工輪換過渡。
GitLab 與 GitHub 聲明差異大嗎?
字段名不同,簽發層應做歸一化;切勿把 GitHub 示例 audience 直接粘貼到 GitLab。
為什麼仍要拆分 Unix 賬號?
令牌再細,落盤層仍需目錄隔離;否則同一 chroot 內的誤路徑仍可能互相覆蓋。
總結:把 CI 身份從「永久文件」升級為「可審計、短壽命、可吊銷」的鏈條,並與僅 SFTP、chroot、併發與原子發佈對齊,才能通過 2026 年常見的供應鏈審計問題。
侷限:自建簽發與跳板仍耗運維;SFTPMAC 託管遠程 Mac可打包穩定入口與目錄隔離。自購硬件與憑據治理延遲疊加時常低估總成本。
若你希望減少跳板、密鑰與目錄隔離的疊加維護成本,可瞭解 SFTPMAC 套餐與區域,在受控遠程 Mac 上銜接 OIDC/證書與 SFTP/rsync。
