SBOM とチェックサムの証拠を検証する

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

はじめに

サプライチェーンの証拠は、デプロイ前に検証して初めて意味を持ちます。リリースバンドルには、Kubernetes マニフェスト、SBOM(ソフトウェア部品表)、イメージメタデータ、およびチェックサムファイルが含まれている場合があります。チェックサムは、リストされたファイルが改ざんされていないことを証明します。SBOM とイメージメタデータは、リリースに含まれると主張されているイメージやパッケージの証拠を確認するのに役立ちます。

この実験では、sha256sum と jq を使用してローカルのリリースバンドルを検証し、SBOM とイメージメタデータが承認済みのワークロードを記述していることを確認します。また、検証結果をコンパクトな JSON 形式で記録し、承認されたマニフェストのみをデプロイします。この実験では、外部からのダウンロードや署名ツールは必要ありません。リリース成果物を信頼する前にローカルの証拠を検証するという、CKS の核心的な習慣に焦点を当てます。

リリースバンドルの調査

このステップでは、検証コマンドを実行する前にリリースバンドルを調査します。チェックサムファイルは内部にリストされているパスのみを対象とするため、バンドル内にファイルが存在していても、承認されたリリースセットに含まれていない可能性があるため、この確認は重要です。

プロジェクトディレクトリに移動し、メモを確認します。

cd /home/labex/project
sed -n '1,180p' RELEASE_VALIDATION_NOTES.md

バンドル内のファイルをリストアップします。

find release-bundle -path release-bundle/evidence -prune -o -type f -print | sort | tee release-bundle/evidence/bundle-files.txt

バンドル内に移動し、チェックサムファイルを確認します。

cd /home/labex/project/release-bundle
cat checksums.sha256 | tee evidence/checksum-file-review.txt

manifests/receipt-ledger-approved.yaml、sbom.json、および image-metadata.json のチェックサムが表示されるはずです。リストにないマニフェストもバンドル内に存在するはずですが、checksums.sha256 には含まれていないはずです。

チェックサムの検証と未リスト候補の除外

このステップでは、sha256sum -c を使用してリストされた成果物を検証します。-c オプションは、チェックサムファイルから期待されるハッシュ値を読み取り、現在のファイルと比較します。結果が成功であれば、リストされたファイルが承認済みのチェックサムと一致していることを意味します。

チェックサムの検証を実行します。

sha256sum -c checksums.sha256 | tee evidence/checksum-verification.txt

リストにないマニフェストが承認済みのチェックサムの証拠に含まれていないことを確認します。

if grep -q 'receipt-ledger-unlisted.yaml' checksums.sha256; then
  echo "unlisted manifest is unexpectedly approved" | tee evidence/unlisted-check.txt
else
  echo "unlisted manifest is not in the approved checksum list" | tee evidence/unlisted-check.txt
fi

最初のコマンドは、リストされた 3 つのファイルに対して OK を出力するはずです。2 番目のコマンドは、リストにないマニフェストが承認済みのチェックサムリストに含まれていないことを示すはずです。

SBOM メタデータとイメージメタデータの照合

このステップでは、SBOM とイメージメタデータを調査します。チェックサムはファイルが変更されていないことを証明しますが、SBOM がデプロイ予定のイメージを正しく記述しているかどうかまでは説明しません。そのため、両方のファイルに含まれるイメージ名とダイジェストを比較します。

SBOM のコンポーネントメタデータを抽出します。

jq '.metadata.component' sbom.json | tee evidence/sbom-component.json

SBOM に期待されるパッケージエントリが含まれていることを確認します。

jq '.components[] | select(.name == "busybox")' sbom.json | tee evidence/sbom-required-package.json

イメージメタデータを調査します。

jq . image-metadata.json | tee evidence/image-metadata-review.json

次に、調査した証拠からコンパクトな検証用 JSON を作成します。シェル変数を使用して、承認済みマニフェストのチェックサムとイメージダイジェストをバンドルから読み取ります(ハードコーディングは避けます)。

approved_sha="$(awk '$2=="manifests/receipt-ledger-approved.yaml" {print $1}' checksums.sha256)"
image_digest="$(jq -r '.digest' image-metadata.json)"

cat > evidence/validation.json <<EOF
{
  "checksum_status": "verified",
  "approved_manifest": "manifests/receipt-ledger-approved.yaml",
  "approved_manifest_sha256": "${approved_sha}",
  "sbom_name": "receipt-ledger",
  "sbom_version": "1.8.4",
  "sbom_image": "busybox:1.36",
  "sbom_package": "busybox",
  "image_digest": "${image_digest}",
  "rejected_manifest": "manifests/receipt-ledger-unlisted.yaml",
  "rejection_reason": "not-listed-in-checksums"
}
EOF
jq -M . evidence/validation.json

この JSON は単なるレポートではなく、デプロイ前に確認すべき検証事実を記録した、機械可読な小さなレコードです。

承認済みマニフェストのみのデプロイ

このステップでは、チェックサム検証に合格したマニフェストのみをデプロイします。リストにない候補はバンドル内に存在しますが、承認済みのチェックサムファイルには記載されていないため、クラスターにはデプロイされないようにします。

承認済みマニフェストを適用します。

kubectl apply -f manifests/receipt-ledger-approved.yaml

デプロイメントの完了を待ちます。

kubectl -n cks-prep-sbom rollout status deployment/receipt-ledger --timeout=120s

リストにないデプロイメントが作成されていないことを確認します。

if kubectl -n cks-prep-sbom get deployment receipt-ledger-unlisted >/dev/null 2>&1; then
  echo "unlisted deployment exists" | tee evidence/unlisted-deployment-check.txt
else
  echo "unlisted deployment is absent" | tee evidence/unlisted-deployment-check.txt
fi

承認済み Pod からランタイムステータスを読み取ります。

pod="$(kubectl -n cks-prep-sbom get pod -l app=receipt-ledger --field-selector=status.phase=Running -o jsonpath='{.items[0].metadata.name}')"
kubectl -n cks-prep-sbom exec "$pod" -- cat /release/status.txt | tee evidence/runtime-status.txt

ランタイムステータスは以下のようになるはずです。

release-status=approved

まとめ

ローカルのリリースバンドルを調査し、承認済みのチェックサムを検証し、リストにない候補が承認済みリリースセットに含まれていないことを確認しました。また、SBOM メタデータとイメージメタデータを照合し、コンパクトな JSON 検証証拠を記録した上で、承認された Kubernetes マニフェストのみをデプロイしました。これがサプライチェーンの証拠を扱う核心的なワークフローです。つまり、デプロイ前に整合性と同一性を検証することです。