ガイド更新を承認した配布元を確認する

サイバーセキュリティBeginner
オンラインで実践に進む

はじめに

Waymark はウォーキングフェスティバルのガイドを公開しています。供給元から複数の更新パッケージが届きました。あなたの仕事は、チェックサムが一致するだけでパッケージを信用せず、主催者が要求したリリースを受け入れることです。

独立して提供された配布元の公開鍵を使用し、Cosign で実際の署名を検証し、要求された製品とバージョンを比較し、アーカイブのダイジェストを確認します。基本的なターミナル操作とパスの知識が必要です。プログラミングやクラウドアカウントは不要です。この実習では更新を選びます。次のガイド付き実習では、この判断を再利用可能な受信スクリプトにします。

フェスティバルガイドと更新要求を確認する

このステップでは、更新を選ぶ前に稼働中のサービスを見て、主催者の要求を確認します。Event Guide タブを開いてください。現在の event-guide の版は 2.0 です。Old Mill Walk を開くと、集合時刻は 11:00 です。ページの All walks リンクで戻り、ルート表をダウンロードしてください。Web サイトと CSV は同じ 2 つのウォーキングコースを説明しています。

ガイドのホームページでは、見出しの上に版が表示され、各コースのカードに集合時刻が表示されます。

更新前の稼働中の Waymark ガイド

次に Workspace に切り替えます。このターミナルはガイドと同じコンテナを共有しています。タブは異なる入口であり、別のマシンではありません。cd はターミナルのカレントディレクトリを変更します。次の絶対パスは、どのディレクトリからでも使えます。

cd /home/labex/project/waymark

cat は小さなテキストファイルを表示します。配布パッケージとは独立して主催者から渡された要求を読みます。

cat /opt/labex-waymark/trust/request.json

この JSON オブジェクトには、名前の付いた 2 つのフィールドがあります。

{
  "product": "event-guide",
  "version": "2.1"
}

製品は更新対象のガイドを識別し、バージョンは要求された版を識別します。本物でも旧版は今回の更新ではありません。独立して固定された公開鍵は /opt/labex-waymark/trust/publisher.pub です。この鍵と要求は変更しないでください。

ls はディレクトリの項目を一覧表示します。配布ディレクトリを確認します。

ls candidates

パッケージには parcel-101 などの配送ラベルが付いていますが、名前は承認の証拠ではありません。各パッケージには manifest.json、manifest.sigstore.json、guide.tar.gz、SHA256SUMS が含まれます。マニフェストは製品、バージョン、アーカイブのダイジェストを記述します。バンドルは署名を保持します。アーカイブには実際のガイドファイルが入っています。元のパッケージ、現在のガイド、以前のリリース、来訪者向けのお知らせをそのまま保ってください。選んだパッケージのコピーは accepted/ に置きます。

コマンドで No such file or directory が出たら、上の絶対パスの cd コマンドを実行し、ls candidates で綴りを確認してから再実行してください。この実習で環境をリセットする必要はありません。

チェックサムの一致から分かることを理解する

このステップでは、隣接するチェックサムの検証に両方とも合格する 2 つのパッケージを比較します。Workspace を使い続けてください。

SHA-256 ダイジェストは、ファイルのバイト列から計算する指紋のようなものです。期待する指紋そのものを信頼できる場合、指紋の一致はバイト列の変更検出に役立ちます。sha256sum -c はチェックサムの一覧を読み、指定されたファイルと比較します。ここで -c は「check」を意味します。一覧には相対ファイル名が使われているので、パッケージ内で実行します。

cd candidates/parcel-103
sha256sum -c SHA256SUMS

guide.tar.gz: OK と表示されるはずです。プロジェクトに戻り、別のパッケージを試します。

cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS

こちらも guide.tar.gz: OK となるはずです。どちらの一覧も、アーカイブと同じ配布物に含まれていました。アーカイブを置き換えた人は、隣に置くチェックサムも新たに計算できます。OK はその 2 ファイルの一致を示すだけです。配布元の身元や、要求された更新であることは証明しません。

プロジェクトに戻ります。

cd /home/labex/project/waymark

次は、主催者がすでに信頼している公開鍵でマニフェストを検証します。そうすると、アーカイブの期待ダイジェストを、署名のない隣接一覧ではなく、検証済みのマニフェストから取得できます。

独立した公開鍵で配布元を検証する

このステップでは、正当な署名と、未承認の鍵で作られた署名を区別します。Workspace の /home/labex/project/waymark から始めてください。

配布元は秘密鍵でファイルに署名します。対応する公開鍵があれば、受信者は署名を検証し、署名対象ファイルの変更を検出できます。公開鍵は、すでに信頼している経路から入手する必要があります。パッケージが自分自身の鍵を承認することはできません。この演習では、/opt/labex-waymark/trust/ に別途提供された合成の配布元鍵を固定して使います。配布元の秘密鍵は提供されません。

Cosign は準備済みの署名ツールです。verify-blob はファイルを検証し、--key は信頼する公開鍵を、--bundle は署名バンドルを選びます。最後の引数は、署名されたバイト列を持つマニフェストそのものを指定します。

これらの合成パッケージは、公開透明性ログを使わずに署名されています。--insecure-ignore-tlog は、ログへの記録の検証を意図的に省略します。ただし、選んだ鍵による有効な署名は必要です。このローカル演習では、公開 OIDC ID、証明書サービス、透明性ログを検証しません。それらのサービスを必要とするポリシーに、この例外をそのまま使わないでください。

次のパッケージは別の鍵で署名されています。この検証は失敗する想定です。 終了ステータスは非ゼロとなり、署名検証エラーが表示されます。

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json

echo は値を表示します。$? は直前のコマンドの終了ステータスです。ゼロは成功、非ゼロは失敗を表します。すぐに確認してください。

echo $?

次に、固定した配布元が署名したパッケージを検証します。

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json

透明性ログに関する警告と Verified OK が表示されるはずです。

WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK

直前の終了ステータスを確認します。

echo $?

0 となるはずです。マニフェストは信頼する鍵で署名されています。これで 1 つの判断はできましたが、マニフェストが何を承認しているかも確認する必要があります。

署名された製品・バージョン・アーカイブのダイジェストを確認する

このステップでは、検証済みマニフェストを使い、本物のパッケージが要求されたリリースかどうかを判断します。Workspace を使い続けてください。

まず、本物の旧リリースを検証します。このコマンドは成功する想定です。

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json

jq は JSON を読みます。フィルター .product, .version は、指定した 2 つのフィールドを表示します。単一引用符はフィルターを 1 つの引数に保ち、シェルが記号を解釈するのを防ぎます。

jq '.product, .version' candidates/parcel-101/manifest.json

"event-guide" と "2.0" が表示されるはずです。これは本物のガイドですが、要求された 2.1 ではありません。署名があっても旧リリースが自動的に適切になるわけではありません。

前のステップで検証した候補を確認します。

cat candidates/parcel-104/manifest.json

製品とバージョンは、独立した要求に一致しています。sha256 フィールドは guide.tar.gz の 64 文字の 16 進ダイジェストです。暗記する必要はありません。jq -r は JSON の引用符なしでフィールドを表示します。期待するダイジェストを表示します。

jq -r .sha256 candidates/parcel-104/manifest.json

次に、実際のアーカイブのダイジェストを計算します。

sha256sum candidates/parcel-104/guide.tar.gz

最初のフィールドは、検証済みマニフェストのダイジェストと一致する必要があります。その後に表示されるファイル名はダイジェストの一部ではありません。

先ほど確認した変更済みアーカイブにも本物の署名付きマニフェストがありますが、現在のバイト列はそのマニフェストと一致しません。マニフェストを検証してから 2 つのダイジェストを比較し、これを確認します。

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz

署名は合格しても、ダイジェストは異なります。このパッケージは拒否してください。判断は、信頼する署名者、要求された製品とバージョン、一致するアーカイブのバイト列の 3 つに分かれます。どれか 1 つでも失敗すれば、更新を受け入れる準備はできていません。

稼働中のガイドを変更せず要求されたパッケージを受け入れる

このステップでは、検証した要求どおりのパッケージを引き渡し用に保存します。Workspace の /home/labex/project/waymark から始めてください。

accepted/ はすでに存在します。cp はファイルをコピーし、最後の引数がコピー先ディレクトリです。検証したマニフェスト、署名バンドル、アーカイブをコピーします。

cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/

コピーすると、別のファイル一式ができます。前の検証が後から作ったコピーにも当てはまると考えず、その一式を検証してください。

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz

有効な署名、event-guide、2.1、一致するアーカイブダイジェストを確認します。準備済みの読み取り専用セルフチェックは、この実際のファイル、独立した鍵と要求、期待するガイド内容を使用します。

python3 /opt/labex-waymark/verify.py selected

次の表示になるはずです。

The accepted parcel is the independently signed, requested release with matching archive bytes.

失敗したら、3 つの判断のどこが失敗したかを確認し、正しい元パッケージから再度コピーして、そのコピーをもう一度検証してください。独立した信頼ファイルは変更しないでください。チェックはパッケージを代わりに選んだり、デプロイしたりはしません。

Event Guide に切り替え、ページを更新します。版は引き続き 2.0、Old Mill Walk の集合時刻も 11:00 のはずです。Visitor notice を開き、元の実用的な案内が残っていることを確認してください。この単元では引き渡し用の配布物を受け入れます。更新の公開は、次に学ぶ別の操作です。

まとめ

独立して信頼された配布元の鍵、主催者が要求した製品とバージョン、実際のアーカイブのダイジェストを組み合わせて、本物の署名付き配布物を受け入れました。また、隣にあるチェックサム、旧版の有効な署名、変更されたバイト列の隣にある署名済みマニフェストは、それぞれ単独では不十分であることも確認しました。

現在のガイドは引き続き利用できます。次のガイド付き実習では、これらの判断を再利用可能な受信スクリプトに組み込み、検証したアーカイブのバイト列だけが稼働中のガイドに届くようにします。