成果物の来歴とソフトウェア部品表(SBOM/SLSA)
ビルドの改竄やサプライチェーン攻撃を、来歴の署名記録で機械的に検証して防げます。SLSAのレベル定義、SBOMによる依存可視化、in-totoの多層防御を原理から整理します。
- 1.Provenance(来歴)は『どのソースをどのビルダーでどう作ったか』の署名付き記録。検証者は成果物のハッシュと来歴を照合し、改竄や差し替えを検出する。
- 2.SLSAはビルド完全性の成熟度をレベルで定義する。署名済み来歴(L1)→ホスト型ビルドの来歴生成(L2)→改竄耐性のある隔離ビルド(L3)と段が上がる。
- 3.SBOM(SPDX/CycloneDX)は依存を列挙する部品表で『何が入っているか』を答える。来歴は『どう作られたか』を答える。両者は補完関係で、in-totoが工程間の署名連鎖をつなぐ。
サプライチェーン攻撃と「来歴」という発想
ソフトウェアサプライチェーン攻撃は、アプリ本体のコードではなく 作る過程 を狙います。汚染されたビルドサーバー、改竄された依存、差し替えられた成果物——いずれも「最終的に配布されたバイナリ」を見ただけでは正規かどうか判別できません。署名されたリリースであっても、署名された 対象そのもの がビルド工程で汚染されていれば無力です。
ここで効くのが 来歴(provenance) という発想です。来歴とは「この成果物は、どのソースコードから、どのビルダーが、どんなコマンドで、いつ作ったか」を構造化して記録し、署名したものです。検証側は配布された成果物のハッシュを計算し、来歴に記録されたハッシュと突き合わせる。一致すれば「主張どおりの工程で作られた本物」と機械的に確認でき、不一致なら途中で差し替えられたと分かります。
署名による保護は段階があります。完全性(integrity) はハッシュで「中身が改竄されていない」を示す。真正性(authenticity) は署名で「誰が作ったか」を示す。来歴(provenance) はさらに「どのソースから・どの工程で作られたか」まで示す。リリース署名だけだと、攻撃者がビルドを乗っ取って汚染バイナリに正規署名を付けた場合を防げません。来歴はこの工程そのものを検証対象にします。
SLSA:ビルド完全性の成熟度レベル
SLSA(Supply-chain Levels for Software Artifacts、「サルサ」) は、来歴の信頼度を 段階的なレベル で定義するフレームワークです。一度に完璧を求めず、組織が段階的に堅牢化できるよう成熟度として刻んでいます。要点は「来歴を 出すか/誰が出すか/どれだけ改竄しにくい環境で出すか」が上がっていくことです。
| レベル | 要求の核心 | 防げる攻撃の例 |
|---|---|---|
| L1 | 来歴を生成し開示する(署名は必須でない) | 工程の不透明さ。最低限の出所表示 |
| L2 | ホスト型ビルドサービスが署名付き来歴を自動生成 | 開発者端末での偽造来歴・手作業による改竄 |
| L3 | ビルドを隔離し、来歴を改竄不能に生成(鍵への到達不可) | ビルド環境の乗っ取り・来歴自体の偽造 |
レベルが上がる本質は 「来歴を誰が・どこで作るか」の信頼基盤が強くなる ことです。L1 は単に来歴を出すだけで、開発者が手で書けてしまうため偽造に弱い。L2 は ホスト型ビルドサービス(CI 基盤)が来歴を自動生成し署名するため、人手の介入余地が減る。L3 はさらにビルドを 隔離(isolation) し、署名鍵がビルドスクリプトから触れない設計にする。これにより「ビルドを乗っ取った攻撃者が、汚染成果物に正規の来歴を付ける」経路を断ちます。
SLSA が保証するのは「この成果物が、主張どおりのソースとビルダーから作られた」という工程の完全性です。ソースに最初から脆弱な依存や悪意あるコードが入っていた場合、SLSA は防げません。「正しく汚染物を作った」ことは検証できてしまう。だから依存の中身を見る SBOM や依存性スキャンと組み合わせる必要があります。SLSA だけで安全になると考えるのは典型的な誤解です。
SBOM:何が入っているかの部品表
SBOM(Software Bill of Materials、ソフトウェア部品表) は、成果物に含まれる 全コンポーネントの一覧——名前・バージョン・ライセンス・ハッシュ・依存関係——を記述した文書です。製造業の部品表になぞらえた概念で、直接依存も推移的依存もすべて列挙します。
標準フォーマットは主に二つです。
| 項目 | SPDX | CycloneDX |
|---|---|---|
| 主導 | Linux Foundation(ISO/IEC 5962 標準) | OWASP |
| 元々の重心 | ライセンス・コンプライアンス記述 | セキュリティ・脆弱性管理 |
| 関係の表現 | コンポーネント間の関係を詳細に記述 | 依存ツリーと VEX 連携が得意 |
| 用途の傾向 | 法務・調達・監査 | 脆弱性影響範囲の即時特定 |
SBOM の価値が際立つのは 新たな脆弱性が公表された瞬間 です。「あのライブラリの特定版に重大な穴」と発表されたとき、SBOM があれば「自社のどの製品・どのリリースが該当するか」を即座に検索できます。SBOM がなければ全プロジェクトを手で洗い直すことになります。さらに VEX(Vulnerability Exploitability eXchange) を併用すると、「その脆弱な版を含むが、該当機能を呼んでいないため実質影響なし」といった 到達可能性の文脈 を付与でき、ノイズを減らせます。
重要なのは 来歴と SBOM が答える問いの違い です。来歴は「どう作られたか(プロセス)」、SBOM は「何が入っているか(中身)」を答える。両者は補完関係で、片方だけでは守れません。
in-toto:工程をつなぐ署名連鎖
SLSA の来歴を実際に運用する基盤として広く使われるのが in-toto です。in-toto は、サプライチェーンの 各工程(ステップ)に署名された証跡(attestation)を残し、それを連鎖させる 枠組みです。
考え方はこうです。あらかじめ「正しいパイプラインはどの工程をどの順で踏み、各工程の入出力ハッシュはどう連なるべきか」を レイアウト(layout) として定義し、署名しておく。各工程の実行者は、自分が受け取った成果物(入力)と生成した成果物(出力)のハッシュを記録し署名する。検証時には、
ステップA(出力ハッシュ) == ステップB(入力ハッシュ)
ステップB(出力ハッシュ) == ステップC(入力ハッシュ)
... 連鎖が途切れず、各署名が正しい鍵か
を全工程について確認します。途中で誰かが成果物を差し替えれば、隣接工程のハッシュ連鎖が切れて検出される。これはサプライチェーンの各受け渡しを暗号的に封緘する発想で、SLSA の来歴は in-toto の attestation 形式(in-toto Statement)として表現されることが多いです。
in-toto や来歴生成で署名する鍵が、ビルドスクリプトから読める場所にあると意味が薄れます。ビルドを乗っ取った攻撃者がその鍵で汚染成果物に署名できてしまうからです。SLSA L3 が要求する 隔離 の本質は、署名鍵をビルド実行コンテキストから到達不能にすること。OIDC ベースの短命トークンで署名サービスに委譲し、ビルダー自身は鍵の実体を持たない構成(keyless 署名)が現実解になります。
多層防御として組み立てる
これらは単独では穴が残り、重ねて初めて サプライチェーン全体を覆えます。攻撃面ごとに担当が違うことを押さえるのが要点です。
| 守る対象 | 主に効く仕組み | 残る穴(次の層で補う) |
|---|---|---|
| ソースの汚染 | コード署名・レビュー・依存性スキャン | ビルド工程の乗っ取り → SLSA |
| ビルド工程の改竄 | SLSA 来歴・in-toto 連鎖 | 依存の中身が悪性 → SBOM/SCA |
| 依存の脆弱性 | SBOM + VEX + 継続スキャン | 配布後の差し替え → 来歴検証 |
| 配布物の差し替え | ハッシュ照合・署名検証 | 鍵の漏洩 → 鍵隔離・短命トークン |
実装の勘所は、これらの検証を CI/CD パイプラインに強制する関所として組み込む ことです。来歴のないイメージや、SLSA レベルが基準未満の成果物は、デプロイ前のアドミッション制御で 拒否 する(CI/CD やGitOps のポリシーゲート)。「来歴を生成するだけ」で 検証しなければ 意味がない点に注意が要ります。生成と検証は別物で、防御になるのは後者です。
「リリースに正規署名があれば改竄は防げるか」。答え:防げない。リリース署名は 署名対象の真正性 を示すだけで、ビルド工程が汚染されていれば汚染物に正規署名が付く。工程まで保証するには SLSA 来歴が要る。もう一問、「SLSA L3 を満たせば脆弱な依存も安全か」。答え:いいえ。SLSA はビルド完全性であり、依存の中身は SBOM/SCA の領分。来歴は『どう作ったか』、SBOM は『何が入っているか』——問いが違う、と整理できれば十分です。
まとめ
- 来歴(provenance)は「どのソースをどのビルダーがどう作ったか」の署名付き記録。成果物ハッシュとの照合で改竄・差し替えを機械的に検出する。
- SLSA はビルド完全性の成熟度レベル。来歴開示(L1)→ホスト型ビルドの署名付き自動生成(L2)→隔離と鍵到達不能による改竄耐性(L3)と上がる。保証範囲はあくまでビルド工程。
- SBOM(SPDX/CycloneDX)は「何が入っているか」の部品表。VEX で到達可能性を補い、脆弱性公表時の影響範囲を即特定する。来歴とは補完関係。
- in-toto は工程ごとの署名済み attestation を連鎖させ、受け渡しの封緘を検証する。SLSA 来歴はこの形式で表現されることが多い。
- 各層は単独では穴が残る。署名鍵の隔離(keyless)と、CI/CD での 検証の強制 を含め、多層で重ねて初めて防御になる。
DevOps/インフラ Article
成果物の来歴とソフトウェア部品表(SBOM/SLSA)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
DevOps
比較で見る軸
難易度: advanced / カテゴリ: DevOps/インフラ / タグ数: 6
導入後に効く点
SLSAはビルド完全性の成熟度をレベルで定義する。署名済み来歴(L1)→ホスト型ビルドの来歴生成(L2)→改竄耐性のある隔離ビルド(L3)と段が上がる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- DevOps/インフラ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「DevOps / サプライチェーンセキュリティ」に近いか確認する。
- 強みである「Provenance(来歴)は『どのソースをどのビルダーでどう作ったか』の署名付き記録。検証者は成果物のハッシュと来歴を照合し、改竄や差し替えを検出する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。