發布前一週臨時增加一台雲端 Mac,最容易被忽略的往往不是編譯速度,而是存取邊界。開發者經常直接複製本機長期使用的 SSH 私鑰、儲存庫權杖和簽署材料,等任務結束後只刪除專案目錄。更穩妥的做法,是將每次租期視為獨立的安全週期:接入時建立基線,使用期間限制憑證,歸還前確認資料已遷出並驗證清理結果。
先定義本次租用的信任邊界
先記錄節點用途、負責人、租期結束時間,以及需要存取的資料。用於測試公開程式碼的機器,與需要處理簽署材料的建置節點,不應共用同一套憑證。多人協作時,應為每位成員配置獨立的登入方式,不共用私鑰,也不要將管理員憑證寫入團隊文件。
| 對象 | 建議邊界 | 租期結束時的處置 |
|---|---|---|
| SSH 密鑰 | 每台節點或每個租期獨立產生 | 撤銷公鑰並刪除臨時私鑰 |
| 儲存庫權杖 | 僅授予目標儲存庫與必要操作權限 | 在服務端撤銷並核對使用記錄 |
| 建置材料 | 僅在任務需要時匯入 | 刪除鑰匙圈項目與臨時副本 |
| 建置產物 | 輸出至獨立目錄 | 驗證後遷出,再刪除節點上的副本 |
短租節點的安全目標,不是讓憑證永遠有效,而是確保每份憑證都有明確用途、最小權限,以及可驗證的失效時間。
首次連線後的十五分鐘檢查
首次登入後不要立即匯入專案。先確認目前使用者、系統版本、遠端登入狀態與防火牆狀態,並保留檢查結果。是否立即執行系統更新,應依目前建置工具鏈的版本需求決定,以免在發布任務進行期間改變環境。
whoami
sw_vers
sudo systemsetup -getremotelogin
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
softwareupdate --list
建立租期專用的 SSH 密鑰
請在受控工作站上產生專用密鑰,不要複製既有的長期私鑰。將公鑰加入雲端 Mac 後,先開啟第二個終端機驗證新連線,再考慮調整原有的存取方式。
umask 077
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/armmacs-rental -C "temporary-build-node"
chmod 700 ~/.ssh
chmod 600 ~/.ssh/armmacs-rental
可在本機 ~/.ssh/config 中為節點設定獨立別名,並透過 IdentitiesOnly yes 防止 SSH 用戶端嘗試其他密鑰。節點位址、使用者名稱和密鑰路徑應以本次訂單記錄為準,不要將真實位址提交至程式碼儲存庫。
Host rented-mac
HostName <node-address>
User <node-user>
IdentityFile ~/.ssh/armmacs-rental
IdentitiesOnly yes
ServerAliveInterval 30
只在需要時提供秘密資訊
不要將權杖寫入指令碼、專案設定或 Shell 啟動檔。應優先使用互動式輸入、受限的環境變數或 macOS 鑰匙圈,並確保建置日誌不會回顯變數值。臨時檔案應放在權限受控的目錄中,預設僅允許目前使用者讀取。
umask 077
mkdir -p ~/secure-input
chmod 700 ~/secure-input
security add-generic-password -a build -s ci-token -w
使用完畢後,立即清除目前 Shell 中的變數。如果憑證只用於單次發布,就不要讓它跨工作階段長期保留。
unset CI_TOKEN
security delete-generic-password -a build -s ci-token
避免日誌與快取洩露秘密資訊
建置指令碼不要啟用會輸出完整命令的偵錯模式。分享錯誤日誌前,應檢查請求標頭、環境變數、節點位址、使用者名稱和檔案路徑。Derived Data、套件管理快取與測試附件可能包含專案名稱及內部路徑,是否保留應依任務的敏感程度決定,而不是預設全部封裝。
執行期間進行輕量稽核
至少應在人員異動、憑證輪替與關鍵發布前,檢查一次登入工作階段、監聽連接埠、背景程序和磁碟剩餘空間。發現陌生程序時,先記錄程序 ID、啟動使用者與命令路徑,再決定是否終止,以免誤殺正在執行的建置任務。
who
ps -axo user,pid,ppid,command
lsof -nP -iTCP -sTCP:LISTEN
df -h
find ~/work -type f -perm -004
最後一行用於找出工作目錄中允許其他使用者讀取的檔案。這並非完整的權限稽核,但能快速發現明顯的設定錯誤。多人共用同一節點時,還應將共享目錄與個人目錄分開,並避免透過全域可寫目錄傳遞簽署材料。
租期結束前依序遷出與清理
先停止 Runner、建置代理程式和自訂背景工作,避免清理期間持續產生檔案。接著封裝需要保留的專案、日誌和產物,產生校驗值,並在另一台受控裝置上解壓縮抽查。只有確認資料已成功遷出後,才能刪除節點上的工作副本。
mkdir -p ~/export
ditto -c -k --keepParent ~/work/project ~/export/project.zip
shasum -a 256 ~/export/project.zip
git -C ~/work/project status --short
清理範圍至少應包含專案目錄、匯出目錄、建置快取、臨時目錄、鑰匙圈項目、SSH 授權、公鑰記錄,以及專用帳號的 Shell 歷史記錄。還必須從憑證簽發端撤銷儲存庫權杖,並從自己的工作站刪除本次租期專用的私鑰。在 SSD 上反覆覆寫單一檔案,不能取代平台端的節點回收流程,也不應將覆寫次數視為清理完成的證據。
離場前再進行一次反向檢查:專用密鑰是否仍能登入、臨時權杖是否已失效、背景程序是否仍在執行、匯出檔案是否還留在節點上,以及工作目錄是否存在未提交的變更。將結果寫入交接記錄,可避免「以為已刪除」與「實際仍可存取」之間的落差。
常見問題
短租雲端 Mac 是否應該沿用本機的長期 SSH 私鑰?
不應該。請為每個節點或租期建立獨立密鑰並標示用途,工作完成後撤銷對應公鑰,再刪除臨時私鑰,以縮小憑證外洩的影響範圍。
刪除專案目錄後是否就完成租期結束清理?
尚未完成。還要檢查鑰匙圈項目、SSH 設定、Shell 歷史、建置快取、暫存目錄、背景程序和匯出檔案。
應該在什麼時候收緊遠端存取設定?
先驗證第二條管理連線,再逐項調整。不要在唯一的 SSH 工作階段中直接修改關鍵設定,否則設定錯誤可能導致節點失聯。
ArmMacs 雲端 Mac
依專案週期使用獨享實體節點
選擇固定晶片、記憶體、儲存空間、租期與在售節點;庫存可用時即可進入交付流程。