소개
공급망 증거는 배포 전에 검증할 때만 의미가 있습니다. 릴리스 번들에는 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
나열되지 않은 배포가 생성되지 않았는지 확인합니다:
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 매니페스트만 배포했습니다. 이것이 공급망 증거 워크플로우의 핵심입니다: 배포 전에 무결성과 신원을 검증하십시오.



