Проверка 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

Первая команда должна вывести OK для трех перечисленных файлов. Вторая команда должна подтвердить, что неуказанный манифест отсутствует в списке утвержденных контрольных сумм.

Сопоставление метаданных 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

Убедитесь, что неуказанное развертывание (Deployment) не было создано:

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="$(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. Это основной рабочий процесс обеспечения безопасности цепочки поставок: проверка целостности и подлинности перед развертыванием.