Chromium Chronicle #23: Chrome インフラにおける検証済みビルド

エピソード 23: Akash Mukherjee、カリフォルニア州マウンテンビュー(2021 年 7 月)
以前のエピソード

Chrome をビルドする際、アーティファクトの出力に影響を与える環境には多くの要素が影響します。OS から、インストールされているサポート ライブラリ、サードパーティの依存関係、インストール済みのツール、ランタイム環境自体。それぞれが、さまざまなセキュリティ衛生レベルで構築されています。

これまで Google では、内部でランタイム適用チェックであるバイナリ承認を使用していました。これは、Google にデプロイされた本番環境ソフトウェアと構成が適切にレビューされ、来歴が追跡できるようにすることで、インサイダー リスクを最小限に抑えるものです。

Google では、LUCI 上に構築されたアーティファクトのビルドとサプライ チェーンが検出されることなく一人でも侵害されないようにすることで、ユーザーに配布するソフトウェアのリスクを軽減しています。

昨年から、ビルドごとに、検証可能なビルド マニフェストが生成されます。これは、ビルドに使用したソース、生成されたバイナリとアーティファクトの暗号ハッシュ、完全なビルド パラメータを記述する署名済みの JWT です。このビルド マニフェストを使用すると、アーティファクトをソースまでトレースできるため、ビルドプロセスとその出力を検証できます。

さらに、マニフェストを使用すると、ビルドされたアーティファクトが変更されていないことを確認できます。変更すると署名が無効になるためです。全体として、これにより、アーティファクトが信頼できるシステム間を移動する際の処理チェーンが提供されます。

Binary Authorization は 2 段階のシステムとして実装されます。システムは、ビルド時の情報を含むprovenanceを生成します。ポリシーの適用は、ソフトウェアの署名またはインストールの前に行われます。

def CreateProvenance(self, build_manifest: Mapping[str, Any]):
  """Builder generates and signs provenance given build manifest. Signed JWT is placed
  alongside built artifact."""

Chrome の場合、Google の署名インフラストラクチャを使用して、生成されたソフトウェア アーティファクトに署名する前に、ビルドの特定の最小セキュリティ要件を満たすようにポリシーが適用されます。

def VerifyProvenance(self, artifact_hash: str, provenance: str):
  """Provenance is verified using a policy engine service before signing an artifact."""

要件は、大きく分けて次の 4 つに分類されます。

  • ソース管理: ビルドに組み込まれたデータを保護します。
  • ビルド: ソースをバイナリに変換するプロセスを保護します。
  • 来歴: 検証可能なビルド マニフェストを含む証明書。
  • ポリシー: 特定のアーティファクトが特定のコンテキストで適格かどうかを決定するルール。

Chrome とインフラストラクチャの CI および CD プロセスの一環としてポリシーの適用チェックを実装したことで、コードと構成がセキュリティに関する特定の最小基準を満たしていることを検証できました。これは、悪質な可能性のあるインサイダー アカウントや不正使用されたインサイダー アカウントがユーザーに配布するソフトウェアを変更することを制限するための重要な制御です。