Witness:ソフトウェアのビルド過程を検証するオープンソースフレームワーク

Witnessは、ソフトウェアがどのようにビルドされたかを記録して署名し、出荷前にポリシーと照合するオープンソースのコマンドラインツールです。TestifySecが開発し、Cloud Native Computing Foundation(CNCF)のin-totoエコシステムに寄贈しました。現在はオープンなコミュニティが保守しています。

Image

コンパイル済みのバイナリを見ても、どのマシンでビルドされたのか、どのコードが使われたのかは分かりません。Witnessを使えば、どのコマンドがそのファイルを生成したのか、どの素材が投入されたのか、各ステップに信頼できる鍵で署名されているかを確認できます。検証に失敗すると、witness verifyは終了ステータスを非ゼロにして理由を示します。CI(継続的インテグレーション)のジョブは、これを根拠に処理を止められます。

実行時に記録される内容

Witnessはビルドコマンドそのものをラップします。プロジェクトの入門チュートリアルでは、witness run --step buildがgo buildを実行し、アテステーション(証明)をまとめたJSONファイルを出力します。アテステーションとは、投入された素材、実行されたコマンド、生成された成果物に関する署名付きの声明です。このファイルはDSSEエンベロープ(署名付きデータの標準的なラッパー)の形式で、jqとbase64でデコードすれば内容を読めます。-a slsaを追加すると、SLSAプロベナンスを出力できます。チュートリアルによると、これはSLSAレベル1の必須要件です。SLSAは、ビルドの完全性を段階的に評価するフレームワークで、レベル1はその入門にあたる段階です。

ゲートを管理するのは誰か

ポリシーはJSONファイルで、各ステップの名前、そのステップに必要なアテステーションの種類、署名を許可する公開鍵を定義します。独自のルールは、Open Policy Agentの言語であるRegoをbase64でエンコードして組み込みます。Witnessは、ステップ内のすべてのアテステーションが検証を通過することを求めます。最後に、ポリシー自体にも署名します。

チュートリアルでは、ビルドの署名に使ったものと同じtestkey.pemでポリシーにも署名しています。デモならこれで問題ありません。しかし本番環境で同じことをすると、1つのファイルが盗まれただけで、証拠とそれを判定するルールの両方を書き換えられてしまいます。

デモの先へ

WitnessはGitHub、GitLab、AWS、GCPと連携し、コンテナ内でも、昇格権限のないホスト上でも動作します。SigstoreやSPIFFE/SPIREによるキーレス署名、RFC 3161のタイムスタンプ機関によるタイムスタンプ、in-totoの関連プロジェクトでアテステーションを保管するArchivistaへの格納にも対応しています。プロセストレースは、現時点でも実験的機能とされています。エアギャップ環境をまたいだ検証も可能です。ただし、検証側が署名済みポリシー、成果物、対応する公開鍵をそろえている必要があります。

WitnessはGitHubで無償公開されています。

翻訳元: https://www.helpnetsecurity.com/2026/10/26/witness-open-source-software-supply-chain-tool/

本記事は helpnetsecurity.com の記事を翻訳・要約したものです。