GitHub Actions: Enforce SHA Pinningの注意点と現状の最適解
TL;DR
- GitHub Actions に SHA commit pinning を強制できる"Enforce SHA Pinning"機能が追加された
-
actions/checkout@v4
のような Git tag/branch の指定がある場合は workflow の実行が停止される
-
- ただし、local action における挙動など使い勝手はまだまだ荒削り
- 現状は Renovate や pinact などのサードパーティツールで対応するのが丸そう
Enforce SHA Pinningとは
9月の夏をはじめて知ったので初投稿です。
先日 GitHub から Actions についてセキュリティ関連のアップデートが発表されました。
その中で"Enforce SHA Pinning"という設定が追加されています。
今までは GitHub 自体もセキュリティ向上のため SHA pinning を推奨していながらも[1]、それを強制するためにはサードパーティツールに頼る必要がありました。今回の機能追加により、SHA pinning を GitHub built-in の設定で強制することができるようになりました。
# OK ✅
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# NG ❌
# 実行しようとすると、errorでworkflowが走らない
- uses: actions/checkout@v4.2.2
有効化すると、以下のように workflow の実行が停止されます:
ただし実際に使ってみたところ、有用ではありつつもいくつか気になる点を見つけたので紹介していきます。
現時点での注意点
SHAの自動修正・更新には他ツールが必要
あくまで今回の Enforce SHA Pinning 設定は SHA pin されていない action の利用を ban するのみで、その修正・更新には他ツールを利用する必要があります。
Renovate の helpers:pinGitHubActionDigests
/helpers:pinGitHubActionDigestsToSemver
やpinactなどがこれらを実現できる代表的なツールです。
GitHub built-in と呼んで差し支えないであろう Dependabot も SHA の更新には対応していますが、既存の tag を修正する機能は現時点でありません。
サードパーティのcomposite actionも検査の対象
Enforce SHA Pinning 設定は設定された repository 内だけでなく、そこで呼び出されているサードパーティの composite action も検査の対象となります。
実際、自分がメンテナをやっている repository で設定を有効化してみたところ、このケースに遭遇し workflow が回らなくなりました[2]。
こちらの記事で紹介されているように、サードパーティの composite action で SHA pin されていない action の利用がある場合、セキュリティ的な懸念は残ることになります。
そう考えるとこのルールはよりセキュリティを強固にする良いものなのですが、一方で configurable な部分が少なく使い勝手の悪いものになっています(後述します)。
また、サードパーティ action の場合、SHA pin するような修正の反映に時間がかかり得る(その action のメンテナに依ってしまう)のも懸念点です。独自に fork するなど回避策はありますが、いずれにせよこれらの対応には時間がかかる場合も多く、その間 enforcement あるいは workflow の機能が停止するのは残念なところです。
粒度が荒い
上記 composite action の件や、一部の信頼できる action については bypass したい、あるいは一旦 warning くらいの level で受け取りたい、などといったニーズもあるかと思います。
現状では organization or repository の粒度でしか設定できず、また error として workflow の実行を止めることしか選択できません。段階的に導入していくには少しつらいところがあるように思います。
補足として、reusable workflow については tag での指定も許容されるようです:
When you enable Require actions to be pinned to a full-length commit SHA, all actions must be pinned to a full-length commit SHA to be used. This includes actions from your organization and actions authored by GitHub. Reusable workflows can still be referenced by tag.
ただ、Discussions には uses: ./.github/actions/argocd
のような local path の利用も ban されるとの報告があり、懸念が残ります。
現状の(個人的)最適解
以上が Enforce SHA Pinning 設定についての現時点での挙動です。
結局自動修正・更新にはサードパーティツールが必要で、それらツールを使えば enforcement も達成できます。
これらの事情を鑑みると、現状ではまだサードパーティツールを用いて enforcement を実現する方が柔軟性などの面を考慮してもより良い方針であるように映ります。
弊社でも GitHub Actions 及び pinact を利用しているのですが、軽く検証を行った結果今回の機能は有効化せず現状維持で行こうという判断をしました。
まとめ
以上、Enforce SHA Pinning 設定について紹介しました。
あげつらう格好になってしまいましたが、GitHub の機能として SHA pinning を賄えるととても嬉しいので、フィードバックを経て使い心地のいいものになってくれることを願います。
-
https://docs.github.com/en/actions/reference/security/secure-use#using-third-party-actions ↩︎
-
利用していた action に修正を投げたところすんなり merge してもらえました (∩´∀`)∩: https://github.com/actions-rust-lang/setup-rust-toolchain/pull/68 ↩︎
Discussion