Модуль 14 / 18
Supply chain: SBOM, сканування, підпис і provenance
Зміст
1. Цілі та ланцюг довіри
Після модуля ви зможете пов’язати digest, SBOM, vulnerability report, provenance, signature та admission policy.
- digest фіксує bytes
- SBOM перелічує компоненти
- scanner зіставляє advisories
- provenance описує збірку
- signature пов’язує digest з identity
- policy приймає artifact
2. Теорія: загрози supply chain
Ризики виникають у source, dependency, builder, registry та deployment: dependency confusion, підміна tag, витік secret, compromised runner.
Потрібні мінімальні права, isolated build, immutable digest, attestations і policy до запуску.
3. Теорія: SBOM та VEX
SBOM у SPDX або CycloneDX описує packages, versions, licenses і relationships. Це inventory, не доказ безпеки й не vulnerability report.
VEX повідомляє exploitability для продукту та потребує evidence, expiration і signature.
4. Теорія: vulnerability scanning
Результат залежить від advisory DB, distro backports, detection та reachability. Vendor severity важливіша за просте зіставлення version.
Gate враховує fix available, exploitability, age та environment; exceptions мають owner і expiration.
5. Теорія: provenance та SLSA
BuildKit створює SLSA provenance: builder, parameters, materials і timestamps. mode=max може розкрити sensitive build args.
Attestations є OCI manifests image index. Classic image store їх не зберігає; потрібні registry, containerd store або OCI output.
6. Теорія: signature та verification
Cosign підписує digest; keyless пов’язує signature з OIDC identity і transparency log. Verification обмежує issuer та точну identity.
Keys захищають KMS/HSM, rotation і revocation. Signed vulnerable image не стає safe.
7. Методичні вказівки
- Просувайте за digest
- Генеруйте SBOM/provenance в CI
- Не кладіть secrets до ARG
- Скануйте OS та app dependencies
- Фіксуйте DB timestamp
- Перевіряйте issuer/identity
- Exceptions мають строк
- Зберігайте release evidence
8. Лабораторна робота: OCI attestations
Створіть isolated builder та OCI archive з SBOM і max provenance.
mkdir -p /tmp/docker-module-14/out
printf '%s\n' '# syntax=docker/dockerfile:1' 'FROM alpine:3.21' 'RUN apk add --no-cache ca-certificates' 'USER 65532:65532' 'CMD ["/bin/true"]' > /tmp/docker-module-14/Dockerfile
docker buildx create --name docker-m14-builder --driver docker-container --use --bootstrap
docker buildx inspect docker-m14-builderdocker buildx build --builder docker-m14-builder --sbom=true --provenance=mode=max --output type=oci,dest=/tmp/docker-module-14/image.tar /tmp/docker-module-14
sha256sum /tmp/docker-module-14/image.tar | tee /tmp/docker-module-14/image.tar.sha256
tar -tf /tmp/docker-module-14/image.tar | sort | head -30
tar -xf /tmp/docker-module-14/image.tar -C /tmp/docker-module-14/out
jq . /tmp/docker-module-14/out/index.jsonЗнайдіть in-toto predicates, attestation reference і materials.
find /tmp/docker-module-14/out/blobs/sha256 -maxdepth 1 -type f -print0 | xargs -0 grep -l 'https://spdx.dev/Document'
find /tmp/docker-module-14/out/blobs/sha256 -maxdepth 1 -type f -print0 | xargs -0 grep -l 'https://slsa.dev/provenance'
grep -Rhl 'SPDXRef-DOCUMENT' /tmp/docker-module-14/out/blobs/sha256 | head -1 | xargs jq '{predicateType,subject,predicate:{name:.predicate.name,packages:(.predicate.packages|length)}}'
grep -Rhl '"predicateType":"https://slsa.dev/provenance' /tmp/docker-module-14/out/blobs/sha256 | head -1 | xargs jq '{predicateType,subject,predicate:{buildType:.predicate.buildDefinition.buildType,materials:.predicate.buildDefinition.resolvedDependencies}}'
grep -Rhl 'vnd.docker.reference.digest' /tmp/docker-module-14/out/blobs/sha256 | head -1 | xargs jq '{annotations,layers}'base_ref=$(grep -Rho 'pkg:docker/alpine@[^" ]*' /tmp/docker-module-14/out/blobs/sha256 | head -1)
printf 'resolved_material=%s\n' "$base_ref"
sha256sum --check /tmp/docker-module-14/image.tar.sha256
docker buildx imagetools inspect alpine:3.21
docker buildx imagetools inspect alpine:3.21 --raw | jq '.mediaType, (.manifests | length)'Критерій: checksum валідний; знайдені SPDX і SLSA; attestation descriptor та base material мають digest.
9. Діагностика supply-chain gate
Розділяйте resolution, attestation discovery, identity, freshness і policy.
docker buildx inspect docker-m14-builder
docker buildx du --builder docker-m14-builder
jq . /tmp/docker-module-14/out/index.json
find /tmp/docker-module-14/out/blobs/sha256 -type f -printf '%f %s bytes\n' | sort
sha256sum --check /tmp/docker-module-14/image.tar.sha256- tag перетворити на digest
- перевірити subject
- знайти media types
- перевірити issuer/identity
- перевірити DB freshness
- прочитати policy rule
- не обходити gate іншим tag
10. Контроль і cleanup
- Що доводить digest?
- Чого не доводить SBOM?
- Навіщо VEX?
- Чому scanner помиляється?
- Що містить provenance?
- Чому classic store губить attestations?
- Що verify у keyless?
- Чому signed не safe?
docker buildx rm docker-m14-builder
rm -rf /tmp/docker-module-14/out
rm -f /tmp/docker-module-14/Dockerfile /tmp/docker-module-14/image.tar /tmp/docker-module-14/image.tar.sha256
rmdir /tmp/docker-module-14
docker buildx lsМодуль засвоєно, якщо artifact перевіряється як digest + identity + attestations + policy evidence.