← Back to notes

SLSA и подпись артефактов:
provenance, cosign, attestations


Теория

SLSA v1.2

SLSA (Supply-chain Levels for Software Artifacts) v1.2 — текущая approved-спецификация. Она сохраняет Build Track с уровнями L1L3 и добавляет 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 log Rekor;
  • key-basedcosign generate-key-pair, KMS (AWS/GCP/Vault).

Для CI рекомендуется keyless: нет долгоживущих ключей, identity = OIDC subject, аудит через Rekor.


Типичные ошибки

  • подписывать, но не верифицировать на admission (policy-controller, Kyverno verifyImages);
  • не закреплять --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 или Kyverno verifyImages блокирует pod без валидной подписи/provenance;
  • pin identity по конкретному репозиторию/workflow, не «любой OIDC».

Ссылки

SLSA и подпись артефактов: provenance, cosign, attestations | Aleksandr Suprun