Теория
SLSA v1.2
SLSA (Supply-chain Levels for Software Artifacts) v1.2 — текущая approved-спецификация. Она сохраняет Build Track с уровнями L1–L3 и добавляет Source Track для контроля authoring/review/management source-кода.
Build L1— provenance существует и описывает, как был собран артефакт.Build L2— provenance подписана hosted build platform; подделка требует компрометации платформы.Build L3— build-runs изолированы (ephemeral, isolated), provenance unforgeable даже при компрометации build-задания.
Provenance публикуется как in-toto Statement с predicate type https://slsa.dev/provenance/v1.
Sigstore: keyless signing
cosign подписывает OCI-артефакты:
- keyless — короткоживущий x509-сертификат от
Fulcioчерез OIDC identity (GitHub Actions, GitLab, Google), запись в transparency logRekor; - key-based —
cosign generate-key-pair, KMS (AWS/GCP/Vault).
Для CI рекомендуется keyless: нет долгоживущих ключей, identity = OIDC subject, аудит через Rekor.
Типичные ошибки
- подписывать, но не верифицировать на admission (
policy-controller, KyvernoverifyImages); - не закреплять
--certificate-identityи--certificate-oidc-issuerпри verify — без них keyless-подпись бесполезна; - подписывать по
tag, а не поdigest(tag mutable, подпись не привязана к содержимому).
Практика
1. Keyless подпись образа
cosign sign --yes \
registry.example.com/app@sha256:<digest>
--yes подтверждает запись в Rekor. Подписывать по digest, не по tag.
2. Verify keyless подписи
cosign verify \
--certificate-identity-regexp "^https://github\.com/org/repo/" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
registry.example.com/app@sha256:<digest>
3. SLSA provenance attestation
cosign attest --yes \
--predicate provenance.json \
--type slsaprovenance1 \
registry.example.com/app@sha256:<digest>
cosign verify-attestation \
--type slsaprovenance1 \
--certificate-identity-regexp "^https://github\.com/slsa-framework/slsa-github-generator/" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
registry.example.com/app@sha256:<digest>
4. Admission-gate
- Sigstore
policy-controllerили KyvernoverifyImagesблокирует pod без валидной подписи/provenance; - pin identity по конкретному репозиторию/workflow, не «любой OIDC».