🐙
pinact-actionを使ってバージョンをハッシュで固定化
想定読者
CIのセキュリティ強化のため、GitHub Actionsで利用する各ライブラリのバージョンを、自動でSHAに置き換えてcommitまで自動化する仕組みを導入したい。
なぜ固定(SHA指定)するのか
Actionsでこういう記述があります。
uses: actions/checkout@v4
これは @v4 というタグ指定でしかなく、中身が書き換わる可能性があります。仮に悪意ある変更が含まれた場合、セキュリティ事故に繋がります。
そこで、以下のように SHAでバージョンを固定するのが望ましいです。
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
これにより、どのコミットが使われるかが明確になり、安全性が担保されます。
pinact-action
を使って自動で固定化
suzuki-shunsuke/pinact-action
というGitHub Actionを使うと、
.github/workflows/*.yml
や action.yaml
の uses:
を自動でSHA固定に書き換えてくれます。
自動的にチェックし、必要に応じてcommitまでやってくれる優れものです。
誰がcommitするか問題
pinact-actions
は修正後のファイルを commit
しますが、誰の権限で push
するかの方法によって問題があります。
方法 | 課題 |
---|---|
GITHUB_TOKEN |
権限足りない。 |
PAT(Personal Access Token) | 署名なし。漏洩リスクもある |
✅ GitHub App(今回採用) | ちょっと手間がかかる |
Verified Commit とは?
GitHub で commit メッセージの横に "✅ Verified" と出るやつです。
GitHub App を使うと、この Verified Commit が自動で実現できます。
GitHub App を使う準備
手順
- GitHub App を作成する。
-
Contents: write
,Workflows: write
のパーミッションを設定 - インストール対象を "Only select repositories" にし、対象のリポジトリを選択
- App ID / 秘密鍵 (PEM) を取得
-
APP_ID
,APP_PRIVATE_KEY
を 対象のリポジトリの Secrets に登録
実際のワークフロー例
name: Pinact
on:
pull_request: {}
permissions:
contents: write
pull-requests: write
jobs:
pinact:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
- uses: suzuki-shunsuke/pinact-action@d735505f3decf76fca3fdbb4c952e5b3eba0ffdd # v0.1.2
with:
app_id: ${{secrets.APP_ID}}
app_private_key: ${{secrets.APP_PRIVATE_KEY}}
ハマりどころ
- GitHub App を "作っただけ" ではダメ。リポジトリへのインストールを忘れると
404
になる -
APP_PRIVATE_KEY
のSecrets登録は、PEMの中身をそのまま貼ればOK(改行そのままでOK)
Discussion