2026GitHub Actionsknown_hostsStrictHostKeyChecking遠端 Macrsync

2026 年 GitHub Actions 向遠端 Mac rsync/SFTP 前的 SSH 主機金鑰驗證:known_hosts 固定、StrictHostKeyChecking 與 UserKnownHostsFile 決策矩陣

暫存 CI Runner 常見捷徑是在 Job 內 ssh-keyscan 寫入 known_hosts,在不可信網路窗等同把主機身分交給當次路徑。本文提供 UserKnownHostsFile、指紋進 SecretsStrictHostKeyChecking 決策矩陣;並串聯 OIDCscp/SFTP 遷移並發SHA256 閘門;收束 SFTPMAC 託管遠端 Mac。

known_hostsStrictHostKeyCheckingUserKnownHostsFileGitHub Actionsrsync遠端 Mac
GitHub Actions CI SSH known_hosts 主機金鑰 StrictHostKeyChecking 遠端 Mac rsync

痛點拆解:離開代碼 0 仍可能連錯機器

痛點 1:把「連得上」當成「連對了」。工作流程中 rsyncsftp -bscp 只要具備使用者私鑰即可執行;若主機金鑰策略鬆散,DNS 污染、BGP 劫持、跳板誤設或暫時性 VIP 漂移都會放大風險。建置日誌只顯示傳輸位元組,無法揭露是否多了一跳中間人。

痛點 2:每個 Job 都重新 TOFU。GitHub 託管 Runner 檔案系統多為暫存,團隊常在步驟內動態 ssh-keyscan,等於每一趟流水線於不可控時刻重做「首次信任」,與內部維運在固定工作站手動確認一次完全不同。

痛點 3:多主機、多別名缺文件。正式區直連、預發佈經 ProxyJump、CI 專用上傳帳號對應不同 Host 行;指紋未與別名表綁定會出現「換了 DNS CNAME 卻悄悄換了金鑰」。

痛點 4:與 SSH CA 混談。SSH 使用者憑證回答「誰可登入」;known_hosts 回答「終端機以為在和誰通話」。僅上 CA 而不固定主機指紋,在惡意閘道情境仍可能被繞過;並發 Job 亦須與 MaxSessions 同冊管理,否則 MITM 與「連線額滿」日誌會混在一起。

威脅模型:為何仍要把主機金鑰納入變更管理

企業常將「建置產物上傳」視為高敏通道。主機金鑰驗證是 SSH 堆疊中將工作階段綁到具體機器的關鍵;放棄它等於把信任交給 DNS 與路由。StrictHostKeyChecking=accept-new 在互動式開發機尚可,在暫存 Runner 仍接近 TOFU;宜在流水線外覆核指紋後再把唯讀片段注入 Job。

UserKnownHostsFile 隔離 CI 與本機 known_hosts,利於稽核「誰核可了哪條指紋」。多跳 ProxyJump 應逐跳列出 Host 行與指紋來源,避免只驗證最末跳。

可量化基線

記錄 ssh -V 與主機金鑰相關版本說明;日誌列印不含金鑰材質Host 別名與 UserKnownHostsFile 路徑以利 Runbook 對照。

將「主機金鑰驗證失敗」獨立計數,勿與磁碟滿、權限拒絕合併。指紋輪換與系統重裝、映像重建綁定同一工單;並與 SHA256 產物清單OIDC 憑證納入同一發佈審查,避免「使用者身分很現代、主機身分很隨意」。

決策矩陣

策略適用效益風險
StrictHostKeyChecking=no封閉實驗網(仍不宜)摩擦最低利於 MITM;合規難過
Job 內 ssh-keyscan早期原型撰寫快信任當次網路;與暫存 Runner 疊加風險最大
accept-new低敏內網拒絕已記錄主機的突變對「每次新檔案」的 CI 幫助有限
固定片段+UserKnownHostsFileyes正式上傳、遠端 Mac 託管可稽核、可輪換需維護 Secrets 與流程
雲平台主機證明(若有)大量機器池自動化高依賴供應商能力

對照 跳板矩陣:多跳時逐跳撰寫 host key 策略,勿只寫最末行 rsync

實作步驟

# 離線採集(勿在 Runner 首次掃描正式指紋)
# ssh-keyscan -p 22 -H remote-mac.example.com > ci_known_hosts.fragment

# GitHub Secret:SSH_KNOWN_HOSTS
# mkdir -p ~/.ssh && chmod 700 ~/.ssh
# printf '%s\n' "${{ secrets.SSH_KNOWN_HOSTS }}" > ~/.ssh/ci_known_hosts
# export RSYNC_RSH="ssh -o StrictHostKeyChecking=yes -o UserKnownHostsFile=$HOME/.ssh/ci_known_hosts"
# rsync -av ./dist/ user@remote-mac:/Volumes/builds/app/dist/

建議封裝為 composite action 以降低複製貼上誤差。

閱讀順序

本文 → OIDC 與上傳帳號SSH CAscp/SFTPSHA256原子發佈首頁

聯合審查表應涵蓋別名、指紋、Secrets、輪換 RACI 與並發預算,避免「憑證完美但連錯機器」的假對立。

FAQ 與 SFTPMAC

指紋放 Secrets 算外洩嗎?

主機公鑰指紋屬公開資訊;仍應避免與使用者私鑰混於同一 Secret,並限制可見範圍。

重裝後流水線全紅?

正常,代表驗證有效;依工單更新 Secrets,可短暫並存雙指紋降低停機。

總結:主機金鑰驗證應升格為流水線設定,與 OIDC、專用帳號、完整性閘門並列。

限制:自建遠端 Mac 需自行維護映像、修補、指紋庫與 on-call;若希望穩定的 Apple 原生建置入口與可營運的 SFTP/rsync 面,SFTPMAC 託管遠端 Mac 讓團隊專注產物與發佈。

將 known_hosts、跳板與上傳工具寫入同一維運表,託管環境更易做到稽核與輪換。