2026遠端 MacCISSHForwardAgentIdentitiesOnly跳板

2026 遠端 Mac/CI 該不該開 SSH Agent 轉發(ForwardAgent):IdentitiesOnly、專用金鑰與跳板威脅矩陣

ForwardAgent yes 能把本機 ssh-agent 暫借遠端;若經共用跳板、多人 sudo 節點或與 SFTP 產物帳號混用,借用就可能變成橫向跳躍。本文提供威脅模型、IdentitiesOnly、Match Host 分流與 deploy key 替代清單;並聯 ProxyJump、OIDC、known_hosts、並行 SFTP。

ForwardAgentIdentitiesOnly遠端 MacCI
cover

痛點拆解:看似無害的預設值

痛點 1:把便利寫成全域預設。教學片段中的 ForwardAgent yes 常被貼進共用 ssh_config,讓除錯與 Runner 共用策略;筆電 agent 混入個人 GitHub、套件登錄或多雇主金鑰時,暴露面難以盤點。

痛點 2:UNIX socket。遠端同一 Unix 帳號下的行程可向 agent 發起簽章請求;若再加上排程或供應鏈入侵,暴露時間被拉長。

痛點 3:跳板鏈。筆電→堡壘→遠端 Mac→Git:任一具 sudo 帳號都可能濫用轉發;面向不同於 ControlMaster 套接字。

痛點 4:與交付身分混淆。若為省事讓 CI 帳號同時 rsyncgit pull,ForwardAgent 一旦被濫用即同時踩到倉儲與產物路徑。

威脅模型:簽章決策能否外包

問題 A:遠端信任邊界?單租戶遠端 Mac 與共用跳板不等價;後者應預設關閉 ForwardAgent。

問題 B:Git 憑證可否下沉?唯讀 deploy key、GitHub App、短期 PAT + OIDC 通常比全域 ForwardAgent 更可稽核。

問題 C:堡壘日誌能否回答「誰用了哪枚指紋」?若做不到即不該轉發。

問題 D:是否已拆分 Host 別名?rm-dev / rm-ci 各自綁金鑰與轉發策略。

ForwardAgent 不等於協議漏洞,而是把簽章決策外包

可引用資料與對照實驗

跨國團隊常忽略堡壘所在區域與 Git 託管區域是否一致:ForwardAgent 並不解決資料落地條款,仍須搭配 OIDC、分支保護與審計紀錄。

ControlMaster 類似,請為「停用 ForwardAgent」保留獨立別名,並在季度演練時走完整流程。

若 CI 需要同時存取多個 Git 供應商,請先用組織級 OIDC 綁定縮小 deploy key 數量,再把 ForwardAgent 僅保留給無法短期移除的舊式主機。

資安演練時請刻意模擬「筆電遭植入惡意 shell 函式」的情境:ForwardAgent 並無法阻止這類橫向擴張,只能仰賴端點防護與帳號拆分。

若要把 ForwardAgent 例外寫進 SIEM 規則,請同步附上 SSH 指紋與 Git 組織對應表,避免告警噪音淹沒真實入侵。

決策矩陣

情境ForwardAgent收益風險替代
單租遠端 Mac短期可開免拷私鑰仍在筆電 agent短期憑證
共用跳板預設禁止稽核缺口ProxyJump + 分段金鑰
自架 Runner不建議看似省事Runner 失守即池化憑證OIDC + deploy key
僅 SFTP禁止上下文混用分拆 Unix 帳號
深子模組謹慎少配密鑰鏈路易盲鏡像 / vendor
高合規通常禁用難舉證SSH CA

表格可作為新進委外商時的清單:「共用跳板」列多半對應預設關閉轉發;「單租遠端 Mac」列僅在契約與監控能證明單一承租人時才放行窄小幅。

若情境落在表格列與列之間,請回到 rm-dev/rm-ci 帳號清單與子模組 URL,勿先把全域 ForwardAgent 打開。

實操片段(How-to):從分流組態到回滾別名

# ~/.ssh/config 片段:除錯用示例 Host,請勿直接貼上正式環境主機名
Host rm-dev
  HostName remote-mac.example
  User devuser
  ForwardAgent yes
  IdentitiesOnly yes
  IdentityFile ~/.ssh/id_ed25519_dev_org

# CI Runner:關閉轉發,限定單一金鑰與 HostKey 算法
Host rm-ci
  HostName remote-mac.example
  User ciupload
  ForwardAgent no
  IdentitiesOnly yes
  IdentityFile ~/.ssh/id_ed25519_ci_readonly

# 跳板鏈拆分 ControlPath/ForwardAgent(與 ProxyJump 指南一致)
Host bastion
  HostName bastion.example
  User jump
  ForwardAgent no

Host rm-via-bastion
  HostName internal.mac.example
  ProxyJump bastion
  User build
  ForwardAgent no

步驟 1:為人機/自動化/傳輸工作階段分別建立 Host 別名與指紋清單。

步驟 2:優先 deploy key + OIDC,先在不開 ForwardAgent 的前提跑通 checkout。

步驟 3:短期轉發僅限互動工作階段,結束後清除 SSH_AUTH_SOCK

步驟 4:IdentitiesOnly yes + 單一 IdentityFile,避免逐一嘗試 agent 觸發平台鎖帳。

步驟 5:固化 known_hosts,禁止暫時 StrictHostKeyChecking=no

步驟 6:原始碼與 產物 rsync 使用不同 Unix 帳號。

步驟 7:保留「停用 ForwardAgent」緊急別名並與 ControlMaster 回滾演練並列。

延伸閱讀與站內 CTA

ProxyJumpOIDCknown_hosts並行 SFTP首頁 / 方案 / 說明

先釐清跳板拓樸再談轉發,較容易向稽核說明簽章權曾出現在哪些跳點;OIDC 短命憑證若先落地,可減少倚賴全域 agent 的組態膨脹。

鎖定 known_hosts 後閱讀並行 SFTP,便能看到連線競合與 keepalive 視窗——這些常被「共用 agent」掩蓋的維運成本。

FAQ

與連接埠轉送差異?

前者決定簽章權;後者只搬位元組。

FIDO2 sk?

遠端常無法穩定互動;請改用 CI 金鑰。

IdentitiesOnly 會拖慢?

比鎖帳風險便宜。

子模組一定要開轉發?

多半不必;鏡像與 monorepo 先收斂上游,再以 deploy key/OIDC 覆蓋較穩。

SOC2 怎麼舉證?

堡壘錄影或稽核紀錄須能對上 CI 流水線編號與時間戳;對不上就不要開。

總結:ForwardAgent 短暫外包簽章;不信任遠端即預設關。

限制:ssh_config 無法修復遭植入的終端機惡意程式。

對照:SFTPMAC 租賃遠端 Mac 將隔離與 SLA 寫進合約。

將例外清單與 OIDC/deploy key 輪替並列於變更紀錄。