RenovateでGitHub ActionsのSHA Pinningを手軽に行う
SHA Pinningとは
GitHub Actionsでサードパーティのアクションを利用する際、バージョンをタグで指定しているケースをよく見かけるが、セキュリティの観点からは推奨されない。GitHub公式ドキュメントでは、アクションを不変なリリースとして利用する唯一の方法として、SHA Pining、つまりコミットSHAにピン留めすることを推奨している。
Security hardening for GitHub Actions - GitHub Docs
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4タグは可変であり、悪意のあるコードに書き換えられる可能性がある。SHA Pinningは、コミットSHAを直接指定することで、Actionを不変な状態で固定できる。
Renovateで自動化する
RenovateのpinDigests設定を使うと、タグで指定されたActionを自動的にSHA形式に変換してくれるようになる。
{ "packageRules": [ { "matchDepTypes": ["action"], "matchPackageNames": ["!actions/{/,}**", "!me-or-my-orgs/{/,}**"], "pinDigests": true } ]}この設定では、matchPackageNamesのネガティブパターン(先頭に!)を使って、特定のownerまたはrganization配下のActionを除外している。自組織やGitHub公式のActionなど、信頼できるものは除外しておくと便利。
Dependabotとの比較
Dependabotには現状RenovateのpinDigestsに相当する機能が存在しない。Dependabotはpackage-ecosystem: "github-actions"でActionsのバージョン更新は可能だが、タグからSHAへの自動変換はできない。
SHAの更新自体はサポートしているため、事前にSHA PinningしておけばDependabotでも更新が可能。
代替手段: pinact
CLIツールのpinactを使えば、既存のワークフローファイルを一括でSHA Pinningできる。
https://github.com/suzuki-shunsuke/pinact
より堅牢にするのであればローカルでの変更にフックさせて、pinactを実行するなどの対応が考えられる。