supply-chain-audit について
supply-chain-audit は、CI/CD、コンテナ、複数の言語エコシステムを対象にソフトウェアサプライチェーンを監査するコーディングエージェント向けスキルです。重大度、ファイルと行番号、修正テンプレートを含む構造化レポートを作成します。
主な機能
- 01対象エコシステムの検出
- 02CI/CDとコンテナ設定の監査
- 03各言語の依存関係チェック
- 04重大度による評価
- 05修正案付き構造化レポートの生成
活用シーン
- 01GitHub Actionsワークフローのレビュー
- 02コンテナイメージとビルド設定の確認
- 03複数言語の依存関係の評価
- 04マージ前の問題修正の優先順位付け
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rysweet/ amplihack --skill supply-chain-auditインストール後、Claude Code で/supply-chain-auditを入力して読み込まれたか確認します。
詳細
サプライチェーン監査スキル
CI/CD パイプライン、コンテナイメージ、言語パッケージのエコシステム全体にわたって、ソフトウェアサプライチェーンのセキュリティを監査します。重大度評価、file:line 形式の参照、実行可能な修正テンプレートを含む構造化された検出結果を生成します。
このスキルを使用する場面
- CI/CD セキュリティレビュー:アクションの参照先が固定されていない、過剰な権限、シークレットの漏えい
- 依存関係の固定:ロックファイルの欠落、ハッシュ検証の不在、変更可能な semver 参照
- コンテナサプライチェーン:変更可能なベースイメージのタグ、非 root での実行、SBOM の生成
- 認証情報の衛生管理:長期間有効なシークレットから OIDC への移行、サブジェクト制約の不足
- コンプライアンス対応付け:SLSA L1-L4 の準備状況の評価、SBOM 生成のガイダンス
- マージ前ゲート:サプライチェーンの High/Critical なリグレッションを持ち込む PR をブロック
前提条件 — 外部ツールの確認
監査を実行する前に、不足している外部ツールを確認し、インストールを提案してください。
from supply_chain_audit.external_tools import check_missing_tools, install_tool
missing = check_missing_tools()
if missing:
# Show the user what's missing and what each tool does
for tool in missing:
print(f"Missing: {tool['name']} — {tool['description']}")
for opt in tool['install_options']:
print(f" Install: {opt}")
# Ask the user if they want to install
# If yes, install each one:
for tool in missing:
success, msg = install_tool(tool['name'])
print(f" {tool['name']}: {msg}")
これらのツールがなくても監査は実行できます(オフライン/縮退モード)が、検出結果は少なくなります。
| ツール | ツールがない場合にできないこと |
|---|---|
gh | GitHub API を使ってアクションのタグを SHA に解決できません |
crane | コンテナイメージのダイジェストを解決できません |
syft | SBOM(SPDX/CycloneDX)を生成できません |
grype | 既知の CVE をスキャンできません |
cosign | イメージの署名またはアテステーションを検証できません |
エコシステムの検出
チェックを実行する前に、該当する監査対象の側面を検出します。
| シグナル | エコシステム | 対象となる監査項目 |
|---|---|---|
.github/workflows/*.yml | GitHub Actions | 1、2、3、4 |
Dockerfile / docker-compose.yml | コンテナ | 5、12 |
secrets.* を含む .github/workflows/ | 認証情報 | 6 |
*.csproj / NuGet.Config | .NET / NuGet | 7 |
requirements*.txt / pyproject.toml / setup.cfg | Python | 8 |
Cargo.toml / Cargo.lock | Rust | 9 |
package.json / package-lock.json / yarn.lock | Node.js | 10 |
go.mod / go.sum | Go | 11 |
該当するすべての監査項目を実行してください。スキップした監査項目は明示的に報告してください。
12 の監査項目
監査項目 1~4:GitHub Actions
reference/actions.md を参照してください。
| # | 名前 | チェック内容 |
|---|---|---|
| 1 | アクションの SHA 固定 | uses: の参照先を @<40-char-SHA> # vX.Y.Z にする必要があります |
| 2 | ワークフローの権限 | トップレベルは permissions: read-all、ジョブレベルは最小限の権限付与 |
| 3 | シークレットの露出 | run: の echo/env にシークレットを含めないこと。ACTIONS_STEP_DEBUG のガード |
| 4 | キャッシュポイズニング | actions/cache のキー衝突、restore-keys の範囲 |
監査項目 5、12:コンテナ
reference/containers.md を参照してください。
| # | 名前 | チェック内容 |
|---|---|---|
| 5 | ベースイメージの固定 | :latest や semver タグではなく FROM image@sha256:<digest> を使用 |
| 12 | Docker ビルドチェーン | マルチステージビルドの最終ステージは scratch/distroless にし、非 root の USER を使用 |
ディメンション 6:認証情報
reference/credentials.mdを参照してください。
| # | 名前 | 確認項目 |
|---|---|---|
| 6 | OIDC と長期有効なシークレット | id-token: write OIDC を優先し、サブジェクトの制約を確認する |
ディメンション 7:.NET / NuGet
reference/dotnet.mdを参照してください。
| # | 名前 | 確認項目 |
|---|---|---|
| 7 | NuGet のロックと監査 | RestoreLockedMode、承認済みソース、NuGetAudit の重大度ゲート |
ディメンション 8:Python
reference/python.mdを参照してください。
| # | 名前 | 確認項目 |
|---|---|---|
| 8 | Python の依存関係の完全性 | --require-hashes、--extra-index-url のリスク、タイポスクワッティングの兆候 |
ディメンション 9:Rust
reference/rust.mdを参照してください。
| # | 名前 | 確認項目 |
|---|---|---|
| 9 | Cargo のサプライチェーン | Cargo.lock がコミットされているか、build.rs のリスク、[patch]/[replace] の適用範囲 |
ディメンション 10:Node.js
reference/node.mdを参照してください。
| # | 名前 | 確認項目 |
|---|---|---|
| 10 | Node.js の完全性 | npm install ではなく npm ci を使用しているか、npx の解決方法、postinstall スクリプト |
ディメンション 11:Go
reference/go.mdを参照してください。
| # | 名前 | 確認項目 |
|---|---|---|
| 11 | Go モジュールの完全性 | go.sum が存在しコミットされているか、GONOSUMCHECK、replace ディレクティブの適用範囲 |
5 ステップの監査ワークフロー
ステップ 1:スコープの検出
# Detect active ecosystems
ls .github/workflows/*.yml 2>/dev/null && echo "GHA detected"
ls Dockerfile docker-compose.yml 2>/dev/null && echo "Containers detected"
ls requirements*.txt pyproject.toml 2>/dev/null && echo "Python detected"
ls package.json 2>/dev/null && echo "Node detected"
ls go.mod 2>/dev/null && echo "Go detected"
ls Cargo.toml 2>/dev/null && echo "Rust detected"
ls *.csproj 2>/dev/null && echo ".NET detected"
有効なディメンションを記録します。無効なディメンションはスキップし、レポートに注記します。
ステップ 2:静的解析(エコシステムごと)
各リファレンスファイルにあるディメンション固有のチェックを実行します。次の情報とともに、生の検出結果を収集します。
- ディメンション番号
- ファイルパスと行番号(
file:line) - 現在の値(問題のあるパターン)
- 期待される値(修正内容)
- 重大度:Critical/High/Medium/Info
ステップ 3:重大度のスコアリング
検出結果をCVSSに準拠した重大度の範囲に分類します。
| 重大度 | CVSS 範囲 | 例 |
|---|---|---|
| Critical | 9.0-10.0 | 書き込み権限とシークレットへのアクセス権がある、ピン留めされていないサードパーティ製アクション |
| High | 7.0-8.9 | 可変なアクション参照、:latest コンテナ、広い適用範囲を持つ長期有効なシークレット |
| Medium | 4.0-6.9 | permissions: read-all の欠落、Cargo.lock のコミット漏れ |
| Info | 0.1-3.9 | ファーストパーティ組織のアクションでのセマンティックバージョン参照、助言のみのNuGet検出結果 |
ステップ 4:レポートの生成
構造化されたMarkdownレポートを作成します。
## Supply Chain Audit Report
**Date**: YYYY-MM-DD
**Scope**: [list active ecosystems]
**Skipped**: [list inactive ecosystems with reason]
### Summary
| Severity | Count |
| -------- | ----- |
| Critical | N |
| High | N |
| Medium | N |
| Info | N |
### Findings
#### CRITICAL-001 · Dim 1 · Unpin third-party action
- **File**: `.github/workflows/release.yml:14`
- **Current**: `uses: actions/checkout@v4`
- **Expected**: `uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2`
- **Fix**: Look up SHA at https://github.com/actions/checkout/releases
### SLSA Readiness
[See reference/sbom-slsa.md for compliance table]
### Recommended Next Steps
1. Fix all Critical findings before next deployment
2. Delegate lock-file issues to `dependency-resolver` skill
3. Install SHA-pinning pre-commit hooks via `pre-commit-manager` skill
ステップ 5:修正の優先順位付け
修正を次の順に並べます。
- Criticalを最優先:ピン留め解除、書き込み権限、シークレットへのアクセスが組み合わさったもの
- High:本番ワークフローにおけるすべての可変参照
- 委任:ロックファイルの生成を
dependency-resolverに委任する - 自動化:
pre-commit-managerによるコミット前の適用 - コンプライアンス:SBOMの生成、SLSA来歴。reference/sbom-slsa.mdを参照してください。
出力形式の規約
- すべての指摘に
file:lineを含めます(例:.github/workflows/ci.yml:23) - 修正テンプレートは、推測が必要なプレースホルダーを含まず、そのままコピーして貼り付けられる形式にします
- SHA の照会では、必ず公式リリースページの URL を参照します
- 各指摘の重大度を明示します。暗黙にしてはいけません
- レポートの末尾に「次のステップ」セクションを設け、手動で行う修正と自動化可能な修正を区別します
統合ポイント
| スキル | 委任するタイミング |
|---|---|
dependency-resolver | ロックファイルの競合、古くなった間接依存関係、バージョンの非互換性 |
pre-commit-manager | SHA ピン留めフックのインストール、npm ci の適用、go mod verify フックの追加 |
cybersecurity-analyst | ランタイムの脅威モデリング、ネットワーク露出の分析、インシデント後のレビュー |
silent-degradation-audit | CI の信頼性の問題、セキュリティのリグレッションを見逃す不安定なテスト |
評価シナリオ
評価済みの 3 つのシナリオについては、reference/eval-scenarios.md を参照してください。
- シナリオ A:GitHub Actions のモノレポ — GHA + Python + Node(仕込まれた指摘 7 件)
- シナリオ B:コンテナー化された Go サービス — コンテナー + Go + 認証情報(指摘 5 件)
- シナリオ C:.NET + Rust の混在リポジトリ — .NET + Rust + SLSA 対応状況(指摘 6 件)
参考資料
- SBOM の生成、CVSS スコアリング、SLSA L1-L4 マッピング、修正 PR のワークフロー
- 呼び出しインターフェース、指摘スキーマ、スキル間の契約、エラー処理
- GitHub Actions の SHA 照会:
gh api repos/{owner}/{repo}/git/ref/tags/{tag} - SLSA フレームワーク:https://slsa.dev
- OpenSSF Scorecard:https://securityscorecards.dev
関連スキル
dependency-resolver— ロックファイルの競合解決pre-commit-manager— 品質を自動的に適用するフックcybersecurity-analyst— ランタイムセキュリティと脅威モデリングsilent-degradation-audit— CI の信頼性とリグレッション検出pr-review-assistant— サプライチェーンのチェックを含む、開発思想を考慮した PR レビュー