CI/CD 安全
CI/CD 管線安全檢查清單
CI/CD 管線持有憑證、執行來自網路的程式碼,並產出客戶安裝的軟體,因此它本身就是攻擊目標。請使用這份檢查清單審查 GitHub Actions 管線,從工作流程檔案一路檢查到最終交付的建置產物。
更新日期
工作流程
- 將第三方 action 固定到完整的 commit SHA。GitHub 稱這是「目前將 action 當作不可變版本使用的唯一方法」。標籤可以被改為指向其他程式碼。2025 年 3 月,CISA 通報 tj-actions/changed-files 的所有版本遭入侵長達三天。
- 只給
GITHUB_TOKEN最低權限。內容權限預設為唯讀,再依作業個別授予更多權限。 - 絕不在
pull_request_target中 checkout 不受信任的程式碼。這類工作流程會以機密與提升後的權限執行。 - 不讓不受信任的輸入進入腳本。標題、分支名稱等使用者可控制的值,應透過環境變數傳入,而不是直接展開到 shell 指令中。
- 審查工作流程檔案的變更。對
.github/workflows要求程式碼擁有者審查。
機密
- 優先使用短效憑證。使用 OpenID Connect,讓作業從雲端供應商取得短效、限定範圍的權杖,而非以機密形式儲存長期金鑰。
- 將機密限定於特定環境。將正式環境的憑證放在需經指定審查者核准的環境之後。
- 發生資安事件後輪替。tj-actions 遭入侵後,CISA 建議將外洩的機密視為已遭入侵,並立即輪替。
執行器
- 使用一次性執行器。每個作業使用全新的機器,不會留下任何東西給下一個作業。
- 不要在公開儲存庫使用自架執行器。GitHub 表示幾乎永遠不應在公開儲存庫使用自架執行器,因為任何人都能對該儲存庫開啟 pull request。
- 隔離作業。一個作業不應能讀取另一個作業的工作區或憑證。
網路
- 控管對外連線。只允許作業所需的套件來源與服務,封鎖其他一切,讓遭入侵的相依套件無法把機密送出。對外連線政策如何阻止資料外洩
- 記錄連線。保留每個作業連線對象的追蹤紀錄,方便日後調查。
相依套件
- 提交 lockfile。建置每次都應解析出相同的版本。
- 審查新的相依套件。在 pull request 合併前,檢查它新增了哪些套件。
- 依據發現結果把關建置。當建置引入含有已知重大漏洞的套件時,在建置產物交付前就封鎖該建置。
建置佐證資料
- 記錄建置實際取得內容的 SBOM。事後掃描檔案只能描述宣告了什麼,而非建置實際使用了什麼。
- 簽署來源證明。將每個建置產物連結到產生它的建置,日後即可確認實際執行的就是當初建置的內容。
- 監控已交付的內容。有新漏洞公布時,重新檢查已發布的建置。
哪些工具涵蓋哪些項目
掃描工具涵蓋相依套件項目,管線強化工具涵蓋工作流程項目,而執行器上的代理程式或安全執行器則涵蓋網路與佐證資料項目。CRACI 就是執行器:它強制執行失效即封鎖(fail closed)的對外連線政策,記錄每個作業所取得內容的 SBOM,讓政策關卡能依據發現結果封鎖建置,並透過 API 提供 SBOM、網路追蹤紀錄與來源證明。它不掃描程式碼或工作流程。各工具涵蓋範圍請參閱CI/CD 安全工具比較。
CI/CD 管線安全:常見問題
什麼是 CI/CD 管線安全?
這是指保護建置與交付軟體的系統:工作流程定義、其所使用的機密、執行工作流程的執行器、下載的相依套件,以及產出的建置產物。管線一旦遭入侵,即使原始碼完全沒被動過,也可能以您的名義交付惡意程式碼。
為什麼要將 GitHub Actions 固定到 commit SHA?
標籤可以被改為指向其他程式碼。GitHub 表示,將 action 固定到完整長度的 commit SHA,是目前將 action 當作不可變版本使用的唯一方法。2025 年 3 月,CISA 通報 tj-actions/changed-files 的所有版本遭入侵長達三天。
GITHUB_TOKEN 應該擁有哪些權限?
僅限每個作業所需的最低權限。將儲存庫內容的預設權限設為唯讀,只在作業確實需要時,針對該作業授予更多權限。
CI 需要控管對外連線嗎?
如果您的作業持有機密並執行第三方程式碼,答案是需要。大多數作業只需連線到一組已知的套件登錄庫與服務。對外連線(egress)政策會封鎖其他所有連線,讓遭入侵的相依套件無法將機密傳送到攻擊者的伺服器。