Aller au contenu principal
友田 陽大
Dependabot & dependency automation
Dependabot
GitHub Actions
サプライチェーンセキュリティ
DevSecOps
CI/CD
セキュリティ

GitHub Actions を SHA ピン留めして Dependabot で更新する:サプライチェーン攻撃を防ぐ実践

GitHub Actions の `uses:` を可変タグからコミットSHAへピン留めし、Dependabot で安全に更新し続ける実践ガイド。公式のセキュリティ強化指針(2026年6月時点)に忠実に、なぜタグ参照が危険か、SHAピン留め+バージョンコメント、Dependabot が SHA とコメントを同時更新する挙動、既存リポジトリの一括ピン留め、最小権限 GITHUB_TOKEN・信頼できるアクションのみ許可・SHA固定の強制ポリシーまで、多層防御を実コードで解説します。

Published
Last updated
Updated
Reading time
7 min read
Author
友田 陽大
Partager

uses: actions/checkout@v4 ——あなたの CI のほぼすべての行が、こう書かれているはずです。けれどこの @v4 は“可変”です。タグはいつでも別のコミットに付け替えられる。つまり今日監査して信頼したアクションが、明日には別のコードに化けているかもしれない。これが GitHub Actions のサプライチェーンリスクの核心で、過去の実際の侵害(人気アクションのタグ書き換えによる秘密情報の窃取)はまさにこの構造を突きました。

対策は明確です。アクションをコミットSHAにピン留め(不変化)し、Dependabot で安全に更新し続ける。この記事はDependabot 本番運用ガイドの各論として、その実践を解説します。

この記事のルール:推奨パターンは GitHub 公式のセキュリティ強化ガイド(2026年6月時点) に基づきます。CI のセキュリティは攻撃手法も対策も進化が速いので、本番適用前に必ず公式の Secure use referenceで最新を確認してください。


0. なぜタグ参照が危険か

GitHub Actions の参照には3段階あり、不変性(immutability)が違います

参照不変かリスク
メジャータグ@v4✗ 可変いつでも別コミットを指せる。最も危険
完全版タグ@v4.2.0✗ 可変セマンティックだが、タグは付け替え可能
コミットSHA@a1b2c3...(40桁)不変監査済みコードに固定。推奨

タグはただのポインタです。攻撃者がアクションのリポジトリを乗っ取れば、v4バックドア入りのコミットに向け直せます。あなたは何も変えていないのに、次の CI 実行で悪性コードが走る——これが「タグの可変性」を突く攻撃です。


1. SHA ピン留め=唯一の不変参照

対策は、フルのコミットSHAで固定することです。

# Before(可変・危険)
- uses: actions/checkout@v4

# After(不変・推奨)— SHA に固定し、末尾コメントで版を可読に
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0

なぜ安全か:

  • 不変:SHA はコミット内容のハッシュ。指す先のコードは未来永劫変わりません。あなたが監査して信頼した瞬間のコードに固定されます。
  • 改ざん耐性:別のコードを同じSHAに見せかけるには SHA-1 衝突を有効な Git オブジェクトで作る必要があり、現実的に困難です。
  • 可読性:末尾の # v5.0.0 コメントで、人間は一目で版が分かります。そしてこのコメントは Dependabot が更新時に書き換えてくれます(次章)。

短縮SHAやタグ参照ではなく、40桁のフルSHAを使ってください。これが「不変なリリース」としてアクションを使う唯一の方法です。


2. Dependabot は SHA ピン留めを更新できる

「SHA で固定したら、もう更新されないのでは?」——よくある誤解です。Dependabot は SHA ピン留めを理解します

新しいバージョンが出ると、Dependabot はSHA と末尾のバージョンコメントを同時に更新するPRを開きます。タグ参照のときとまったく同じ更新体験で、しかも常に不変参照のままでいられます。

# Dependabot が開くPRの差分イメージ
- - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+ - uses: actions/checkout@<新しいSHA> # v5.1.0

設定はpackage-ecosystem: github-actions を足すだけです。

version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"           # .github/workflows/ を見る
    schedule:
      interval: "weekly"
    commit-message:
      prefix: "ci"
    groups:
      actions:
        patterns: ["*"]      # アクション更新を1PRに束ねる

「不変性(SHAピン)」と「鮮度(Dependabot)」はトレードオフではなく、両立できる——これがこの記事の最重要ポイントです。ピン留めの安全性を取りつつ、更新は自動で追いつく。


3. 既存リポジトリを一括ピン留めする

数十のワークフローを手でSHA化するのは現実的ではありません。自動ピン留めツールを使います。

  • pinact(OSS CLI):uses: のタグを解決してフルSHA+バージョンコメントへ一括変換。
  • StepSecurity の Secure Workflows / Harden-Runner などのサービスも、ピン留めと監査を提供します。
# 例:pinact でリポジトリ内のアクションを一括ピン留め
pinact run

導入後は Dependabot がコメント付きSHAを維持・更新してくれるので、一度ピン留めすれば運用は回り続けます。CI に「ピン留めされていないアクションを検出したら落とす」チェックを入れると、リグレッションも防げます。


4. 多層防御:SHA ピンだけに頼らない

SHA ピン留めは強力ですが、単独では万能ではありません。重ねます。

4.1 最小権限の GITHUB_TOKEN

ワークフローの permissions明示して絞る。既定の広い権限を放置しない。

permissions:
  contents: read          # 既定を絞り、必要なジョブだけ昇格する

万一アクションが侵害されても、トークンでできることが小さければ被害は限定されます。これは Dependabot のauto-merge ワークフローでも同じ原則です。

4.2 信頼できるアクションだけを許可

Organization/リポジトリの Actions ポリシーで、使用可能なアクションを制限します。GitHub は SHA 固定を要求するポリシー(許可するアクションをSHA参照に強制)も提供しています。「誰でも好きなアクションを uses: できる」状態を絞るだけで、攻撃面が大きく減ります。

4.3 サードパーティの監査

  • **公式(actions/*github/*)**は比較的低リスク。
  • サードパーティ製アクションは、ピン留め前にソースを監査し、スター数・メンテナンス状況・権限要求を確認。
  • ピン留め後も、Dependabot PR で**メンテナ交代(後述)**を監視。

5. アクションの auto-merge は“慎重に”

アクションの patch/minor も auto-merge できますが、サプライチェーンの観点では一段慎重にします。理由は、アクションの更新はCI そのものの実行コードの変更だからです。

dependabot/fetch-metadatamaintainer-changes を使い、メンテナが交代した更新は人間レビューへ回します。メンテナ交代は乗っ取りの兆候になり得ます。

      - name: Hold actions PRs with maintainer changes
        if: |
          steps.meta.outputs.package-ecosystem == 'github_actions' &&
          steps.meta.outputs.maintainer-changes == 'true'
        run: |
          gh pr comment "$PR_URL" --body "⚠️ アクションのメンテナ変更を検知。供給網観点で人間レビュー必須。"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Auto-merge trusted first-party action patches
        if: |
          steps.meta.outputs.package-ecosystem == 'github_actions' &&
          steps.meta.outputs.maintainer-changes != 'true' &&
          steps.meta.outputs.update-type == 'version-update:semver-patch'
        run: gh pr merge --auto --squash "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

方針:公式アクションの patch は自動寄り、サードパーティや minor/major・メンテナ交代は人間。リスクに比例した自動化です。


6. チェックリスト

  • すべての uses:フル40桁SHA+バージョンコメントにピン留め(pinact 等で一括)
  • package-ecosystem: github-actionsdependabot.yml に追加し、groups で束ねる
  • ワークフローの permissions最小権限で明示
  • Actions ポリシーで許可するアクションを制限(可能なら SHA 固定を強制)
  • サードパーティ製は導入前に監査、導入後は maintainer-changes を監視
  • アクションの auto-merge は公式 patch に限定、それ以外は人間レビュー
  • 「未ピン留めのアクションを検出したら CI を落とす」ガードを入れる

Questions fréquentes

SHA ピン留めすると更新されなくなりませんか?
なりません。Dependabot は SHA ピン留めを理解し、新版が出るとSHAとバージョンコメントを同時更新するPRを開きます。不変性と鮮度は両立します。
`@v4` のままで Dependabot を使えば十分では?
更新は追えますが、**タグの可変性リスク**は残ります。タグはいつでも付け替え可能で、攻撃者が乗っ取れば `v4` を悪性コミットに向けられます。不変なのはSHAだけです。
公式アクション(actions/checkout 等)もSHA固定が必要?
リスクは相対的に低いですが、**一貫性のために全アクションをピン留め**するのが推奨です。Dependabot が更新を維持するので運用負荷は増えません。
既存の大量のワークフローをどう変換しますか?
`pinact` などの自動ツールで一括ピン留めできます。タグを解決してフルSHA+コメントに変換し、以後は Dependabot が維持します。
アクションも auto-merge してよいですか?
公式アクションの patch は自動寄りにし、メンテナ交代(`maintainer-changes`)やサードパーティ・minor/major は人間レビューにしてください。アクション更新はCI実行コードの変更なので一段慎重に。

Références

友田

友田 陽大

Créateur d’un produit lauréat du prix du ministre (METI). Avec TypeScript + Python + AWS, je livre SaaS, transformation numérique industrielle et IA générative (RAG) prête pour la production — des spécifications à l’infrastructure et à l’exploitation, seul.

I can take on the implementation from this article as an engagement

Dependency auto-updates & supply-chain defense, from design to production

From enabling alerts/security/version updates, to dependabot.yml design (groups, cooldown, monorepo directories, private registries), safe auto-merge via GitHub Actions + fetch-metadata (auto for patch/minor, human review for major), severity-based-SLA vulnerability response, and observability of the open count. With experience wiring dependency updates into CI quality gates, I implement automation that doesn't flood you with PRs or pile up technical debt.

Disponible en mission au forfait comme en conseil technique. Commencez par un échange gratuit de 30 minutes.

最短ルート:カレンダーから直接予約

相談内容が固まっている方は、フォーム送信よりその場で日程を確定する方がスムーズです。下記から空き時間をお選びください。

  • 30分のオンライン無料相談
  • Google Meet / Zoom / Microsoft Teams
  • NDA 商談前締結可・無理な営業はいたしません
無料相談の空き枠を予約する

À lire également