
GitHub Actions 新增工作流锁文件支持
来源标题:Lock Your GitHub Actions
GitHub Actions 现已支持 workflow lockfiles,可将对 Action 的引用锁定,避免因标签可变带来的供应链攻击风险。此前建议把 Action 固定到完整 SHA,现在可通过 gh CLI 安装 github/gh-actions-lock 扩展并运行 gh actions-lock 生成锁文件,工作流中改用 vX.Y.Z 标签形式。该锁文件同样适用于 Renovate、Dependabot 及 zizmor 校验流程。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
目录 安装 锁定 它们 Renovate 与 Dependabot 验证 zizmor 锁定完成! 示例 GitHub Actions 现在支持 workflow lockfile。由于 GitHub Actions 是从 Git 获取的,之前的建议是固定到完整的 SHA 而不是 tag。这是因为 tag 是可变的,容易受到供应链攻击,攻击者可以把一个原本安全的 tag 指向恶意代码。
name: Lint
on: [push, pull_request, workflow_dispatch]
permissions: {}
env:
FORCE_COLOR: 1
RUFF_OUTPUT_FORMAT: github
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: j178/prek-action@44924fe9ef4a6f88253c4b6b1bf11c689d3ce53d # v3.1.0
以下是我配置 lockfile 的方法。为 gh CLI 安装 gh-actions-lock 扩展:
$ gh extension install github/gh-actions-lock
✓ Installed extension github/gh-actions-lock
锁定它们 # 在你的仓库中运行:
$ gh actions-lock
✓ All 1 workflows valid
workflow 现在使用 vX.Y.Z tag,看起来像这样:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 946971c..3503607 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - uses: actions/checkout@v7.0.1
with:
persist-credentials: false
- - uses: j178/prek-action@44924fe9ef4a6f88253c4b6b1bf11c689d3ce53d # v3.1.0
+ - uses: j178/prek-action@v3.1.0
并且它会在 .github/workflows/actions.lock 生成一个 lockfile:
# This file is machine-generated by `gh actions-lock`.
# Do not edit by hand; run `gh actions-lock` to update.
# Docs: https://gh.io/actions-lockfile
version: 'v0.0.3'
workflows:
'.github/workflows/lint.yml':
- 'actions/checkout@v7.0.1'
- 'j178/prek-action@v3.1.0'
dependencies:
'actions/checkout@v7.0.1':
ref: 'v7.0.1'
commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1'
owner_id: 44036562
repo_id: 197814629
'j178/prek-action@v3.1.0':
ref: 'v3.1.0'
commit: 'sha1-44924fe9ef4a6f88253c4b6b1bf11c689d3ce53d'
owner_id: 10510431
repo_id: 1052387486
提交修改后的 workflow 和新的 lockfile。好消息是,Renovate 和 Dependabot 都已经支持 lockfile!你的定期更新也会更新 lockfile。记得使用 cooldowns。GitHub 还建议在 CI 中验证 lockfile,以确保它是最新的且没有损坏。他们建议把这份 verify-lockfile.yml 复制到你的仓库中。我决定把它放进现有的 lint workflow,但放在单独的 job 里,这样它可以独立并行运行:
name: Lint
on: [push, pull_request, workflow_dispatch]
permissions: {}
env:
FORCE_COLOR: 1
RUFF_OUTPUT_FORMAT: github
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7.0.1
with:
persist-credentials: false
- uses: j178/prek-action@v3.1.0
# Fails when .github/workflows/actions.lock is out of sync with the
# workflows or a locked pin no longer verifies upstream.
lockfile:
runs-on: ubuntu-slim
env:
GH_TOKEN: ${{ github.token }}
steps:
- uses: actions/checkout@v7.0.1
with:
persist-credentials: false
- run: gh extension install github/gh-actions-lock --pin v0.4.1
- run: gh actions-lock --verify
注意我在这里使用了轻量级的 ubuntu-slim runner。另外,它固定到了 v0.4.1;我们总得在某个时候更新它,或者想办法自动化。那是以后的事了。别忘了我们刚刚修改了 workflow 中的 actions,所以需要用 gh actions-lock 重新锁定。如果只是添加到 lint.yml,实际上什么都不会变,因为它已经在锁定 actions/checkout 了。但如果你创建了像 verify-lockfile.yml 这样的新文件,就需要为它重新锁定。CI 会提醒你。zizmor 是一个 GitHub Actions 的安全 linter,强烈推荐使用。如果你还没用,请务必用上。v1.32.0 之前的版本会提示你对 actions 做哈希固定,而 v1.32.0 是第一个支持 lockfile 的版本。我在 prek 中使用 zizmor,所以在 .pre-commit-config.yaml 中添加/更新 zizmor:
- repo: https://github.com/zizmorcore/zizmor-pre-commit
rev: v1.32.0
hooks:
- id: zizmor
锁定完成! # 好,提交并推送!头图:Slaymaker Barry Co. Sprocket Locks,载于 The Bearings(第 XII 卷第 23 期,1896 年 1 月 2 日),现藏于 Smithsonian Libraries and Archives,无已知版权限制。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。