本页面是包开发基础的姊妹页面。前提是你已了解 GitHub Actions 的基本用法。
GitHub Actions 的安全风险
基于标签引用的隐患
通常,GitHub Actions 会像下面这样通过标签引用:- 标签可移动 — 标签可被删除后重新创建,保持同名
- 篡改风险 — 仓库所有者账号被劫持后可注入恶意代码
- 供应链攻击 — 若你依赖的 Action 被攻击,你的工作流也会受损
官方 Laravel 项目的做法
laravel/laravel 与 laravel/framework 都将所有 Action 固定到提交哈希(SHA)。固定的落地策略
第 1 步:创建 Dependabot 配置文件
在包仓库中创建.github/dependabot.yml。可以直接复用 Laravel 的文件。
- 自动扫描 — 扫描 GitHub Actions 的新版本
- 自动创建 PR — 当有更新可用时,自动创建更新 PR
- 控制更新方式 — 未固定的 Action 按版本更新,已固定的按 SHA 更新
第 2 步:将现有 Action 固定到 SHA
将现有工作流中所有 Action 的引用改为 SHA 哈希。可以借助 pinact 等工具自动化。使用 pinact 工具自动化
手动修改
若无法使用pinact,可以在 GitHub 的 Lookup latest version 页面查找每个 Action 的提交 SHA 并手动替换。
第 3 步:启用 Dependabot 设置
将.github/dependabot.yml 提交并推送到仓库后,Dependabot 会自动开始扫描。
Dependabot 的自动更新机制
Dependabot 会根据dependabot.yml 的配置采用不同更新策略。
未固定的 Action
已固定的 Action
工作流实现示例
以下是多个工作流共同使用 Action 的完整示例。处理 Dependabot 的更新 PR
Dependabot 创建的更新 PR 可按下面的方式处理。单个 Action 的更新 PR
- 确认工作流执行结果
- 确认是否有破坏性变更
- 合并完成
安全更新 PR
多个 Action 的分组更新
当在dependabot.yml 中配置了 groups 时,多个 Action 会在同一个 PR 中一并更新。
固定的收益与代价
收益
| 收益 | 说明 |
|---|---|
| 抵御供应链攻击 | 引用具体的提交哈希,可对抗 Action 的篡改 |
| 可审计性 | 能追踪每个 Action 何时从哪个版本更新 |
| 显式更新 | Dependabot 会以 PR 形式提出更新,必然经过人工审核 |
| 可复现性 | 同一提交哈希执行时,环境完全一致 |
代价
| 代价 | 应对方式 |
|---|---|
| 初始需要手工设置 | 使用 pinact 工具自动化 |
| 更新管理成本上升 | 通过 Dependabot 自动创建 PR,把成本降到最低 |
| 可读性下降 | 在注释中并列版本号以保持可读性 |
安全审计检查清单
在启动新包项目时可参考的检查清单。初始设置
初始设置
- 创建
.github/dependabot.yml - 将所有现有 Action 固定到 SHA
-
pinact或手动核对完毕 - 确认工作流可正常执行
定期维护
定期维护
- 每周至少审查一次 Dependabot 的更新 PR
- 优先合并安全相关的更新
- 新增 Action 时务必以 SHA 引用
- 每月检查一次全部工作流的状态
审计
审计
- 确认所有 Action 引用均为 SHA
- 确认 Dependabot 已启用
- 确认过去 6 个月的 Dependabot PR 都已合并
相关页面
包开发基础
以 Service Provider 为核心讲解 Laravel 包的开发方式。
包的版本兼容性管理
应对 Laravel 主版本升级的包维护策略。