traPtitech のリポジトリを対象にした、サプライチェーンハードニング用の共通 GitHub Actions 集。
- pinning: GitHub Actions の
uses:を 40 桁 commit SHA に、Docker イメージ参照を@sha256:digest に固定する - cooldown: 公開から日が浅い依存バージョンの混入を防ぐ(bot 経由・手動 bump を問わず)
背景と全体設計は 監査レポートと整備計画(security-review リポジトリ)を参照。
| ワークフロー | 役割 | トリガー |
|---|---|---|
pin-support.yaml |
PR 内の未固定参照を検出し、修正を suggestion または直接コミットで返す(作業の肩代わり) | pull_request |
pin-check.yaml |
未固定参照があれば fail する退行防止 lint(--verify-comment でコメント偽装も検出) |
pull_request |
cooldown-check.yaml |
PR で追加/変更された依存に公開 N 日未満の版があれば fail。違反内容は sticky な PR コメント(bot コメント1つを更新)でも通知され、解消すると ✅ に変わる | pull_request |
pin.yaml |
リポジトリ全体を固定して PR を作成。update: true で bot なしリポジトリの追従更新も担う |
schedule / workflow_dispatch |
| action | 内容 |
|---|---|
actions/cooldown-check |
cooldown ゲート本体(Node 製・依存なし)。対象: npm 系 lockfile(package-lock / pnpm-lock / yarn.lock / bun.lock)・package.json 厳密指定・go.mod / go.sum・workflows の uses: |
actions/pin-docker |
Dockerfile FROM / compose image: の digest 固定。解決は frizbee(単一参照モード)、書き換えは同梱スクリプト |
actions/setup-tools |
pinact / frizbee を checksum 検証付きでインストール(内部用) |
workflows/security-checks.yaml— PR チェック一式の caller(各リポジトリに配置)workflows/pin.yaml— 週次 pin PR の callerdependabot.yml— cooldown 設定済みの標準 Dependabot 設定client-cooldown/— 開発端末側 cooldown(.npmrc/pnpm-workspace.yaml/bunfig.toml)
templates/workflows/security-checks.yamlを.github/workflows/にコピー- (bot なしリポジトリ)
templates/workflows/pin.yamlもコピーし、update: trueにする templates/dependabot.ymlを参考に.github/dependabot.ymlを整備(Renovate リポジトリは renovate-config を extends)- パッケージマネージャに応じて
templates/client-cooldown/の設定をコミット
初回の一括固定は pin.yaml の workflow_dispatch を手動実行するのが早い。
| 層 | 仕組み | 効く範囲 |
|---|---|---|
| 開発端末 | npm min-release-age(日)/ pnpm minimumReleaseAge(分・v11 からデフォルト1日)/ Bun minimumReleaseAge(秒) |
手元の install / add |
| PR ゲート | cooldown-check(このリポジトリ) |
すべての PR |
| bot | Dependabot cooldown(2026-07 からデフォルト3日)/ Renovate minimumReleaseAge |
bot の更新 PR |
しきい値の標準: npm 7日 / その他 3日。自 org 産(@traptitech/*, traPtitech/*)はデフォルト除外。
緊急のセキュリティ修正は PR に cooldown-override ラベルを付けるとスキップできる(Dependabot のセキュリティアップデートはもともと cooldown 対象外)。
すべての機能はリポジトリ単位で独立してオプトイン/オプトアウトできる。全部入りは強制しない。
| 機能 | オンにする方法 | オフにする方法 / 部分無効化 |
|---|---|---|
| pin-support | caller に job を書く | job を書かない。pin-docker: false で Docker 部分のみ無効化 |
| pin-check | caller に job を書く | job を書かない。pin-docker: false / verify-comment: false |
| cooldown-check | caller に job を書く | job を書かない。npm-min-age-days: 0 等でエコシステム単位に無効化(0 のエコシステムはレジストリ照会もしない)。pr-comment: false で PR コメント通知のみ無効化 |
| pin.yaml(定期固定PR) | caller を配置 | 配置しない。update: false(デフォルト)で追従更新のみ無効化 |
| クライアント側 cooldown | templates/client-cooldown/ の設定をコミット |
コミットしない/ファイルを消す(CI 側の cooldown-check とは独立) |
| dependabot.yml | テンプレを参考に配置 | cooldown ブロックを消せばデフォルト(3日)に、cooldown: {default-days: 0} で無効に |
| renovate-config | extends: ["github>traPtitech/renovate-config"] |
extends しない。一部だけ無効化する場合は extends の後に上書き(renovate-config の README 参照) |
- PR のコードは実行しない: pin-support はファイルの静的書き換えのみ。
pull_request_targetは使わない - 公開日時はレジストリ側の記録のみを信頼: npm registry
time/ Go proxy.info/ GitHub Releasespublished_at。コミット日時・タグ日時は作者が偽装できるため使わない(確認できない場合は fail ではなく warn) - ツールは checksum 検証付きで導入: pinact / frizbee のバージョンと SHA256 は
actions/setup-toolsにコミットされ、更新は PR レビューを通る - 維持更新は bot に任せる:
pin.yamlのupdate: trueは Dependabot / Renovate 非導入リポジトリ専用(併用すると bump PR が競合する)
- cooldown-check の Docker イメージ tag 更新の日時照会は未対応(v2 予定)。
@v6のような可動メジャータグも日時が取れないため warn になる(pin-check が SHA + 具体バージョンコメントへ誘導するので実運用では問題になりにくい) - bun.lockb(バイナリ lockfile)は未対応。テキストの
bun.lockを使うこと(bun install --save-text-lockfile) - npm の
min-release-ageはパッケージ単位の除外が未対応(@traptitech/*を頻繁に入れるリポジトリでは端末側の値を短くし、CI 側の除外で担保する)
$ node --test actions/cooldown-check/test/check.test.mjs # cooldown-check のユニットテスト
$ python3 tests/pin_docker_test.py # pin-docker の回帰テスト(ネットワーク不要)自リポジトリの CI でも同じテストと pin-check の dogfood を実行している。