工芸品の制作

このページでは、各 SLSA レベルでアーティファクトを生成するための詳細な技術要件について説明します。対象読者は、プラットフォーム実装者とセキュリティ エンジニアです。

すべての対象者を対象としたレベルの有益な説明については、レベル を参照してください。背景については、用語を参照してください。要件の背後にある理由をよりよく理解するには、脅威と緩和策 を参照してください。

この文書のキーワード「しなければならない」、「してはならない」、「必須」、「しなければならない」、「してはならない」、「すべきである」、「すべきではない」、「推奨」、「してもよい」、「任意」は次のとおりです。 RFC 2119 に記載されているように解釈されます。

概要

ビルドレベル

特定のビルド レベルのアーティファクトを生成するには、プロデューサー と [ビルド プラットフォーム] の間で責任が分担されます。ビルド プラットフォームは、特定のレベルを達成するためにセキュリティ制御を強化しなければなりません (MUST)。一方、プロデューサーは、希望のビルド レベルを達成できるビルド プラットフォームを選択して採用し、選択したプラットフォームで指定された制御を実装しなければなりません (MUST)。

実装担当者 要件 学位 L1L2L3
プロデューサー 適切なビルド プラットフォームを選択する
一貫したビルド プロセスに従う
来歴を配布する
ビルド プラットフォーム 来歴の生成 存在する
真正である
偽造不可能である
分離の強度 ホストされた
分離された

セキュリティのベストプラクティス

安全なプラットフォームを構成するものの正確な定義はこの仕様の範囲を超えていますが、すべての実装は、この仕様に準拠するために業界のセキュリティのベスト プラクティスを使用しなければなりません。これには、適切なアクセス制御の使用、通信の保護、暗号秘密の適切な管理の実装、頻繁な更新の実行、既知の脆弱性の迅速な修正が含まれますが、これらに限定されません。

この問題については、CIS Critical Security Controls などのさまざまな関連規格やガイドを参照できます。

プロデューサー

パッケージのプロデューサーは、ソフトウェアを所有し、リリースする組織です。それは、オープンソース プロジェクト、企業、企業内のチーム、さらには個人の場合もあります。

注: 初期の ドラフト バージョン (v0.1) には、プロデューサーに対する追加の要件があり、パッケージのビルド方法に影響を与えていました。これらは v1.0 仕様で削除され、将来の方向性 に示されているように再評価され、再追加される予定です。

適切なビルド プラットフォームを選択する

プロデューサーは、希望する SLSA ビルド レベルに到達できるビルド プラットフォームを選択しなければなりません。

たとえば、プロデューサーがビルド レベル 3 のアーティファクトを生成したい場合、ビルド レベル 3 の来歴を生成できるビルダーを選択しなければなりません。

一貫したビルドプロセスに従う

プロデューサーは、検証者がビルド プロセスについての期待を形成できるように、一貫した方法でアーティファクトをビルドしなければなりません (MUST)。一部の実装では、プロデューサーは、ビルドプロセスに関する明示的なメタデータを検証者に提供してもよい(MAY)。他の場合には、検証者は暗黙的に期待を形成します (例: 最初の使用時の信頼)。

プロデューサーが、構成ファイルの形式でビルドプロセスに関する明示的なメタデータを必要とする [パッケージエコシステム] を通じてアーティファクトを配布したい場合、プロデューサーは構成ファイルを完成させ、最新の状態に保たなければなりません (MUST)。このメタデータには、アーティファクトのソース リポジトリおよびビルド パラメータに関連する情報が含まれる場合があります。

来歴を配布する

生産者は、アーティファクトの消費者に来歴を配布しなければなりません (MUST)。パッケージ エコシステムが来歴を配布できる場合、プロデューサーはこの責任を パッケージ エコシステム に委任することができます。

プラットフォームを構築する

パッケージの ビルド プラットフォーム は、ソフトウェアをソースからパッケージに変換するために使用されるインフラストラクチャです。これには、ビルドに影響を与える可能性のあるすべてのハードウェア、ソフトウェア、個人、および組織の推移的閉包が含まれます。ビルド プラットフォームは、ホストされたマルチテナント ビルド サービスであることがよくありますが、複数の独立したリビルダーのシステム、単一のソフトウェア プロジェクトで使用される専用のビルド プラットフォーム、さらには個人のワークステーションである場合もあります。理想的には、消費者が [信頼できるプラットフォームの数を最小限に抑える] (principles.md) ことができるように、1 つのビルド プラットフォームが多くの異なるソフトウェア パッケージで使用されます。詳細については、「モデルの構築」(terminology.md#build-model) を参照してください。

ビルド プラットフォームは、来歴の生成ビルド間の分離 という 2 つのことを提供する責任があります。ビルド レベル は、これらの各プロパティがどの程度満たされるかを示します。

来歴の生成

ビルド プラットフォームは、パッケージがどのように作成されたかを説明する来歴を生成する責任があります。

SLSA ビルド レベルは、次の最小要件に従って、全体的な来歴の整合性を記述します。

  • 完全性: 来歴にはどのような情報が含まれていますか?
  • 信頼性: 来歴は建設者とどの程度強く結び付けられますか?
  • 精度: 来歴生成は、ビルド プロセス内での改ざんに対してどの程度耐性がありますか?
要件説明L1L2L3
来歴が存在します

ビルド プロセスは、暗号ダイジェストによって出力パッケージを明確に識別し、そのパッケージがどのように作成されたかを説明する来歴を生成しなければなりません (MUST)。形式は パッケージ エコシステム および/または 消費者 に受け入れられなければなりません。

[SLSA Provenance] 形式と [associated suite] は、SLSA に使用する際に相互運用可能、汎用的、および明確になるように設計されているため、使用することが推奨されます。要件と実装ガイドラインについては、その形式のドキュメントを参照してください。

代替形式を使用する場合は、各レベルで SLSA 来歴と同等の情報が含まれていなければならず (MUST)、SLSA 来歴に双方向に変換可能である必要があります (SHOULD)。

  • 完全性: ベストエフォート。L1 の来歴には、間違いを発見し、改ざんがない場合に高いレベルでユーザー エクスペリエンスをシミュレートするのに十分な情報が含まれている必要があります (SHOULD)。言い換えれば、来歴の内容はすべてのビルド レベルで同じであるべきです (SHOULD) が、実装に法外な費用がかかる場合、いくつかのフィールドが L1 に存在しなくてもよい (MAY)。
  • 真正性: 要件はありません。
  • 精度: 要件はありません。
来歴は本物です

信頼性: 消費者は、次のことを行うために、来歴証明書の信頼性を検証できなければなりません。

  • 整合性の確保: 来歴証明書のデジタル署名が有効であり、来歴がビルド後に改ざんされていないことを確認します。
  • 信頼の定義: 生成されたアーティファクトを信頼するために信頼する必要があるビルド プラットフォームとその他のエンティティを特定します。

これは、来歴証明書を生成したビルド プラットフォーム コンポーネントのみがアクセスできる秘密鍵からのデジタル署名を介する必要があります (SHOULD)。

署名方法の選択には多くの制約が影響しますが、ビルド プラットフォームでは、透明性ログや、透明性が適切でない場合はタイムスタンプ サービスに依存する方法など、鍵の侵害を検出して修復する能力を向上させる署名方法を使用することが推奨されます。

信頼性により、消費者はビルド プラットフォームの ID などの来歴証明書の内容を信頼できます。

正確性: 以下に記載する場合を除き、来歴はコントロール プレーン (つまり、[来歴で識別される] 信頼境界内) によって生成されなければならず、ビルド プラットフォームのテナント (つまり、信頼境界の外側) によって生成されることはありません。

  • 来歴のデータは、ジェネレーターがビルド プラットフォームであるため、または来歴ジェネレーターがビルド プラットフォームからデータを直接読み取るため、ビルド プラットフォームから取得する必要があります。
  • ビルド プラットフォームには、テナントによる来歴の改ざんを防ぐために、何らかのセキュリティ制御が必要です。ただし、強度に下限はありません。その目的は、法的または財務的リスクに直面する可能性のある敵対者が規制を回避するのを阻止することです。
  • ビルド プラットフォームのテナントによって生成される可能性があるフィールドの例外:
    • 出力アーティファクトの名前と暗号ダイジェスト、つまり [SLSA Provenance] の「件名」。これが許容される理由の説明については、来歴の出力ダイジェストの出力 を参照してください。
    • ビルド L2 に必須としてマークされていないフィールド。たとえば、[SLSA Provenance] の resolvedDependency は、ビルド L2 でテナント生成される場合があります (MAY)。ビルダーは、テナント生成フィールドのそのようなケースを文書化する必要があります。

完全性: 完全であるべきです。

  • 来歴で十分に捕捉されていない 外部パラメータ が存在する可能性があります。
  • 解決された依存関係の完全性はベストエフォートです。
来歴は偽造不可能です

精度: 来歴はテナントによる偽造に対して強力な耐性を持たなければなりません。

  • 来歴の認証に使用される秘密マテリアル (デジタル署名の生成に使用される署名キーなど) は、そのマテリアルに適した安全な管理システムに保管し、ビルド サービス アカウントのみがアクセスできるようにする必要があります。
  • このような秘密マテリアルは、ユーザー定義のビルドステップを実行している環境からアクセスできてはなりません。
  • 来歴のすべてのフィールドは、信頼できるコントロール プレーンのビルド プラットフォームによって生成または検証されなければなりません。Provenance は Authentic に記載されている場合を除き、ユーザー制御のビルド ステップでは、コンテンツを挿入したり変更したりしてはなりません (MUST NOT)。(ビルド L3 では、L2 のフィールドを超える追加のフィールドは必要ありません。)

完全性: 完全であるべきです。

  • 外部パラメータ は完全に列挙する必要があります。
  • 解決された依存関係の完全性はベストエフォートです。

注: この要件は、最初の draft version (v0.1) では「反証不可能」と呼ばれていました。

絶縁強度

ビルド プラットフォームは、同じテナント プロジェクト内であっても、ビルド間を分離する責任があります。言い換えれば、外部の影響なしにビルドが実際に正しく実行されたという保証はどのくらい強いのでしょうか?

SLSA ビルド レベルは、分離強度の最小基準を示します。ビルド プラットフォームの分離強度の評価の詳細については、「ビルド プラットフォームの検証」(verifying-systems.md) を参照してください。

要件説明L1L2L3
ホスト型

すべてのビルド ステップは、個人のワークステーションではなく、共有インフラストラクチャまたは専用インフラストラクチャ上のホストされたビルド プラットフォームを使用して実行されました。

例: GitHub Actions, Google Cloud Build, Travis CI.

孤立

ビルド プラットフォームにより、意図しない外部からの影響を受けずに、隔離された環境でビルド ステップが実行されることが保証されました。言い換えれば、ビルドに対する外部の影響は、ビルド自体によって明確に要求されたものです。これは、同じテナント プロジェクト内のビルド間でも当てはまらなければなりません。

ビルド プラットフォームは次のことを保証する必要があります。

  • 来歴の信憑性が損なわれるため、ビルドが来歴署名キーなどのビルド プラットフォームの秘密にアクセスすることは不可能であってはなりません。
  • 同じマシン上で実行されている別のビルド プロセスのメモリを変更するなど、時間的に重なる 2 つのビルドが相互に影響を及ぼしてはなりません。
  • 1 つのビルドが持続したり、後続のビルドのビルド環境に影響を与えたりすることはできません。言い換えれば、一時的なビルド環境はビルドごとにプロビジョニングする必要があります。
  • あるビルドが、別のビルドで使用されるビルド キャッシュに誤ったエントリを挿入すること (「キャッシュ ポイズニング」とも呼ばれる) を起こしてはなりません。言い換えれば、キャッシュが使用されるかどうかに関係なく、ビルドの出力は同一でなければなりません。
  • ビルド プラットフォームは、そのようなすべての対話が来歴の externalParameters としてキャプチャされない限り、リモート影響を可能にするサービスを開いてはなりません (MUST NOT)。

ビルド自体にはサブ要件はありません。ビルド L3 は、善意のビルドが安全に実行されることを保証することに限定されています。ビルド プラットフォームがプロデューサーによる危険なビルドや安全でないビルドの実行を妨げる必要はありません。特に、「分離」要件は、ビルドがビルド プラットフォームの信頼境界の外側にあるリモート実行サービスまたは「セルフホスト ランナー」を呼び出すことを禁止するものではありません。

注: この要件は、初期の ドラフト バージョン (v0.1) では「分離環境」と「一時環境」に分割されていました。

注: この要件を「密閉」と混同しないでください。これは、ネットワーク アクセスなしでビルドが実行されたことを大まかに意味します。このような要件には、ビルド プラットフォームと個々のビルドの両方に大幅な変更が必要であり、将来の方向性 で検討されています。