← До програми курсу

Модуль 14 / 18

Supply chain: SBOM, сканування, підпис і provenance

DOCKER

Зміст
01

1. Цілі та ланцюг довіри

Після модуля ви зможете пов’язати digest, SBOM, vulnerability report, provenance, signature та admission policy.

  • digest фіксує bytes
  • SBOM перелічує компоненти
  • scanner зіставляє advisories
  • provenance описує збірку
  • signature пов’язує digest з identity
  • policy приймає artifact
02

2. Теорія: загрози supply chain

Ризики виникають у source, dependency, builder, registry та deployment: dependency confusion, підміна tag, витік secret, compromised runner.

Потрібні мінімальні права, isolated build, immutable digest, attestations і policy до запуску.

03

3. Теорія: SBOM та VEX

SBOM у SPDX або CycloneDX описує packages, versions, licenses і relationships. Це inventory, не доказ безпеки й не vulnerability report.

VEX повідомляє exploitability для продукту та потребує evidence, expiration і signature.

04

4. Теорія: vulnerability scanning

Результат залежить від advisory DB, distro backports, detection та reachability. Vendor severity важливіша за просте зіставлення version.

Gate враховує fix available, exploitability, age та environment; exceptions мають owner і expiration.

05

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.

06

6. Теорія: signature та verification

Cosign підписує digest; keyless пов’язує signature з OIDC identity і transparency log. Verification обмежує issuer та точну identity.

Keys захищають KMS/HSM, rotation і revocation. Signed vulnerable image не стає safe.

07

7. Методичні вказівки

  • Просувайте за digest
  • Генеруйте SBOM/provenance в CI
  • Не кладіть secrets до ARG
  • Скануйте OS та app dependencies
  • Фіксуйте DB timestamp
  • Перевіряйте issuer/identity
  • Exceptions мають строк
  • Зберігайте release evidence
08

8. Лабораторна робота: OCI attestations

Створіть isolated builder та OCI archive з SBOM і max provenance.

terminal
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-builder
terminal
docker 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.

terminal
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}'
terminal
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.

09

9. Діагностика supply-chain gate

Розділяйте resolution, attestation discovery, identity, freshness і policy.

terminal
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

10. Контроль і cleanup

  • Що доводить digest?
  • Чого не доводить SBOM?
  • Навіщо VEX?
  • Чому scanner помиляється?
  • Що містить provenance?
  • Чому classic store губить attestations?
  • Що verify у keyless?
  • Чому signed не safe?
terminal
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.