GitHub Actions workflow execution protections GA 怎麼設?用 ruleset 限制誰能觸發 CI
GitHub Actions 原本主要由 workflow 裡的 on、branch filter 和 job condition 決定何時執行。這些設定能縮小事件範圍,卻不能集中回答「哪一個人、哪一個 event,或哪一份 workflow 檔案可以讓 CI 進入 runner」。GitHub 已在 2026 年 9 月把 workflow execution protections 從 public preview 推進為正式 GA,讓管理員用 ruleset 在 workflow 開始前限制這些條件。
先講結論:把它當成 workflow 的前置准入層,不是 YAML 裡 on 的替代品,也不是 permissions 或 environment reviewer 的替代品。先用 evaluate mode 觀察會被擋住的 run,再啟用 active ruleset;同時檢查 public repository 對 pull_request_target 的預設政策變更。
GA 版本多了什麼
GitHub 官方公告的 GA 能力包含 workflow file path targeting、Insights,以及 REST API。它們分別解決「哪一份 workflow 要套政策」、「目前政策會影響哪些執行」,以及「如何把規則放進管理自動化」三個問題。
| 控制面 | 它回答什麼 | 適合怎麼用 |
|---|---|---|
| Workflow path rule | 哪一份 workflow 檔案要套用政策 | 先保護部署、雲端憑證與 OIDC workflow |
| Actor rule | 哪一個人、role、GitHub App 或 automation 可以觸發 | 明確列出 maintainer、Dependabot、Copilot 等必要來源 |
| Event rule | 哪一種 event 可以通過 | 優先盤點 pull_request_target、workflow_dispatch 與 release event |
| Evaluate mode 與 Insights | 啟用前會擋到什麼 | 先收集誤擋案例,再改成 active |
| REST API | 如何由平台程式建立、更新或盤點 policy | 納入 organization/enterprise 的設定漂移檢查 |
GA 不代表所有 workflow 都會自動變安全。它只是讓前置准入政策有較完整的 targeting、觀察和管理介面;workflow 內的 token、secret、checkout 與第三方 action 仍要各自 review。
這個 protection 解決哪一個邊界
workflow execution protections 會在 workflow 執行前評估 allow list;未通過的 actor、event 或 target 不會進入一般執行階段。這和 workflow 內的安全設定是不同層次:
| 控制面 | 它回答什麼 | 何時生效 |
|---|---|---|
on、branch/path filter | 哪些 repository event 會匹配 workflow | workflow 觸發判斷時 |
| Workflow execution protections | 哪個 actor、event、workflow path 可以通過 | runner 開始前 |
permissions | workflow 取得的 GITHUB_TOKEN 能做什麼 | job 執行時 |
| Environment reviewers | 哪個部署 job 需要人工核准、何時可讀取 environment secrets | job 進入環境前 |
例如 on: workflow_dispatch 只說明 workflow 支援手動執行;它不會單獨限制哪些 repository role 可以按下執行。execution protection 的 actor rule 才是在集中政策中處理「誰能觸發」的控制面。
先從高權限 workflow 做 ruleset
預設情況下,具有 repository write access 的使用者可能觸發 workflow。這不代表他一定能讀取 production secret 或推送程式碼,但它可能讓一份剛被修改的 workflow YAML 進入 runner;若該 workflow 有過寬權限,風險就會在執行時放大。
建議把導入範圍拆成三層:
- 先選 workflow path:列出會使用部署 token、cloud credential、OIDC 或 production environment 的 workflow,不要一開始對整個 repository 的所有檔案套同一種規則。
- 再限制 actor 與 event:針對
pull_request_target、手動workflow_dispatch和 release 流程做 allow list,並把必要的 Dependabot、Copilot 或 release automation 明確列入。 - 最後補最小權限:即使 actor 和 event 通過,仍在 workflow 明確設定
permissions,並讓 production environment 保留獨立 reviewer。
這種分層方式可以讓 policy 只保護真正有影響力的執行面,也比較容易從 Insights 判斷哪條規則造成誤擋。
設定位置與安全導入順序
官方文件的設定入口在 repository、organization 或 enterprise 的 Actions policy。以 repository 為例:
- 開啟 Settings > Actions > Policies。
- 建立 workflow execution protection ruleset,選擇要 targeting 的 workflow path。
- 加入 actor 和 event rules,先選 Evaluate。
- 透過 Insights 檢查將被拒絕或需要調整的 workflow run。
- 確認例外與維運流程後,再切換成 active;需要大量管理時,再評估 REST API。
Evaluate mode 是觀察工具,不是安全封鎖。正式啟用前,應把允許與拒絕案例都放進 rollout 紀錄,避免「看起來有規則」卻沒有真正阻擋。
pull_request_target 要提前做一次盤點
GitHub 已公告 public repository 的預設 workflow execution policy 將限制 pull_request_target,受影響的 repository 會在 2026 年 11 月 2 日開始套用這項變更。若現有流程依賴 pull_request_target,不要等到日期當天才看失敗訊息,現在就應檢查:
- 哪些 workflow 使用
pull_request_target,以及是否真的需要高權限上下文。 - workflow 是否 checkout 或執行來自不受信任 fork 的程式碼。
- 需要的權限是否可改成
pull_request加上明確的審查、artifact 或外部服務流程。 - repository 的 Actions policy 是否使用 GitHub 的 default policy,還是已經有自訂 ruleset。
這項預設政策不會取代 pull_request_target 的安全邊界。即使 actor 與 event 被允許,也不能在高權限上下文中直接執行不可信的 fork 程式碼。需要更完整的風險分層時,也可搭配 疑似惡意 workflow 的保留與核准檢查。
啟用前後怎麼驗證
至少留下以下五類測試案例:
| 測試 | 要觀察的結果 |
|---|---|
| 允許的 maintainer 手動觸發 | workflow 正常進入 run,token scope 沒有變寬 |
| 不允許的 role 觸發 | run 在執行前被 policy 擋住,沒有 runner side effect |
| Dependabot/Copilot 等自動來源 | 符合業務需求的 automation 沒被誤擋 |
| 被 targeting 的部署 workflow | 只有明確核准的 actor/event 能進入 workflow |
pull_request_target 流程 | 既有 PR、fork 與 secret 行為符合新的 default policy |
把被允許與被拒絕的案例都放進 rollout 紀錄。規則只改變「能不能進入 workflow」,不會替你驗證程式碼、secret 或第三方 action,因此仍應保留 build、test 和部署前檢查。
結論:先控准入,再控權限
GA 後的 workflow execution protections 已經不只是試用中的 actor/event 開關:workflow path targeting、Insights 與 REST API 讓它更適合放進組織級治理。不過安全導入順序仍相同:先盤點高權限 workflow,再用 Evaluate 收集誤擋案例,最後同時檢查 actor、event、permissions、environment reviewer,以及 pull_request_target 的安全邊界。
常見問題
Q: workflow execution protections 會取代 on 設定嗎?
A: 不會。on 仍然決定 workflow 監聽哪些事件與分支;execution protections 再往前加一層,限制哪些 actor、event 與 workflow path 可以通過准入。兩者應一起設定,而不是把所有事件交給 ruleset 後刪掉 workflow filter。
Q: GA 之後還能用 Evaluate mode 嗎?
A: 可以。GitHub 的 GA 公告保留 evaluate mode,讓管理員在正式 enforcement 前觀察政策影響。Evaluate 只用來收集案例,不能取代 active ruleset 的封鎖效果。
Q: 這項功能會讓 workflow 的 GITHUB_TOKEN 自動變成唯讀嗎?
A: 不會。它控制 workflow 能否被觸發,permissions 才是 GITHUB_TOKEN scope 的控制面。即使 ruleset 已啟用,也要在 workflow 明確設定最小權限,並對 production environment 使用獨立核准。
參考資料:
GitHub Changelog:Workflow execution protections are now generally available
GitHub Docs:Control workflow execution
回報錯字、失效連結,或告訴我你想看的延伸主題。