GitHub Actionsのロックファイルでワークフローを保護する
Lock Your GitHub Actions (hugovk.dev)
要約
GitHub Actionsは最近、ワークフローロックファイルをサポートするようになりました。これにより、タグの変更によるサプライチェーン攻撃のリスクを軽減し、ワークフローの依存関係を固定できます。`gh` CLIの拡張機能である`gh-actions-lock`を使用することで、簡単にロックファイルを生成・管理できます。
全文翻訳
GitHub Actionsのロックファイルでワークフローを保護する
2026年11月11日
[画像: スプロケットロック]
GitHub Actionsは現在、ワークフローロックファイルをサポートしています。
GitHub ActionsはGitからフェッチされるため、以前はタグではなく完全なSHAにピン留めすることが推奨されていました。これは、タグは変更可能であり、攻撃者が安全なタグを悪意のあるコードに向けるサプライチェーン攻撃の標的になりやすいためです。
例えば、古いワークフローは次のようになります。
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
ここでロックファイルをセットアップする方法を示します。
インストール #
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
ワークフローはvX.Y.Zタグを使用するようになり、次のようになります。
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
@@ -13,7 +13,7 @@ jobs:
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にロックファイルが生成されます。
# 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
変更されたワークフローと新しいロックファイルをコミットしてください。
RenovateとDependabot #
幸いなことに、どちらも既にロックファイルをサポートしています。定期的なアップデートでもロックファイルが更新されます。依存関係のクールダウン期間を設定することを忘れないでください。
検証 #
GitHubはCIでロックファイルを検証することを推奨しています。これにより、ロックファイルが最新であり、破損していないことを確認できます。
彼らはこのverify-lockfile.ymlをリポジトリにコピーすることを提案しています。私はこれを既存のLintワークフローに組み込みましたが、独立して並列実行されるように独自のジョブにしました。
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
# .github/workflows/actions.lock がワークフローと同期していない場合、
# またはロックされたピンが上流で検証できなくなった場合に失敗します。
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ランナーを使用していることに注意してください。また、v0.4.1にピン留めしていますが、これはいつか更新するか、自動化する方法を見つける必要があります。それはまた別の機会の話です。
ワークフロー内のアクションを変更したばかりなので、gh actions-lockで再ロックする必要があります。lint.ymlにactions/checkoutのロックを追加した場合は何も変更されませんが、verify-lockfile.ymlのような新しいファイルを作成した場合は、そのために再ロックする必要があります。CIが通知してくれます。
zizmor #
zizmorはGitHub Actions向けのセキュリティリンターであり、強く推奨します。使用していない場合は、ぜひ導入してください。
v1.32.0より前のバージョンではハッシュピンアクションの使用が推奨されていましたが、v1.32.0がロックファイルをサポートする最初のバージョンです。
私は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 (vol. XII no. 23, 2nd January 1896)』より) スミソニアン図書館・アーカイブ所蔵、著作権上の制限は特にない。