434文字
2分
編集

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を実行するなどの対応が考えられる。