Перейти к содержанию

Цепочка поставок

Начиная с версии 1.0.0, образы контейнеров, публикуемые Turbo EA в GHCR, содержат верифицируемые метаданные цепочки поставок, позволяющие операторам убедиться, что образ получен из CI этого проекта, прежде чем разворачивать его в production.

На этой странице рассказывается, что подписывается, как это проверить, где находится SBOM и как встраивается сканирование Trivy (в настоящее время носящее информационный характер).


Что подписывается

Каждый образ, собранный .github/workflows/docker-publish.yml и опубликованный в ghcr.io/vincentmakes/turbo-ea/<образ>, подписан с помощью cosign методом keyless OIDC: долгосрочного ключа подписи не существует. Сертификат выдаётся Fulcio от Sigstore для удостоверения личности рабочего процесса, записывается в публичный журнал прозрачности Rekor и удаляется сразу после создания подписи.

Подписанные образы:

  • ghcr.io/vincentmakes/turbo-ea/db
  • ghcr.io/vincentmakes/turbo-ea/backend
  • ghcr.io/vincentmakes/turbo-ea/frontend
  • ghcr.io/vincentmakes/turbo-ea/nginx
  • ghcr.io/vincentmakes/turbo-ea/mcp-server

Образ ollama пересобирается вручную вне матрицы и в настоящее время не подписан. Если вы используете встроенный профиль Ollama и вам необходима верификация, соберите образ из исходников.

Подпись применяется к дайджесту списка манифестов OCI, поэтому одна подпись прозрачно охватывает как linux/amd64, так и linux/arm64.


Верификация образа

Установите cosign и выполните:

cosign verify \
  --certificate-identity-regexp 'https://github.com/vincentmakes/turbo-ea/.+' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  ghcr.io/vincentmakes/turbo-ea/backend:1.0.0

Что делают параметры:

  • --certificate-identity-regexp — принимает любой путь рабочего процесса внутри этого репозитория. Для более строгой проверки замените на --certificate-identity 'https://github.com/vincentmakes/turbo-ea/.github/workflows/docker-publish.yml@refs/tags/v1.0.0'.
  • --certificate-oidc-issuer — привязывает OIDC-издателя к конечной точке токенов GitHub. Подпись, выданная любым другим издателем (например, CI форка), не пройдёт верификацию.

Успешная верификация выводит подписанные данные и URL записи в журнале прозрачности Rekor. При ошибке завершается с ненулевым кодом — настройте ваш деплой на сбой в этом случае.

Можно также верифицировать по дайджесту — это самая строгая форма (невосприимчива к переназначению тегов):

DIGEST=$(docker buildx imagetools inspect ghcr.io/vincentmakes/turbo-ea/backend:1.0.0 --format '{{ .Manifest.Digest }}')
cosign verify \
  --certificate-identity-regexp 'https://github.com/vincentmakes/turbo-ea/.+' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  ghcr.io/vincentmakes/turbo-ea/backend@${DIGEST}

SBOM

Спецификация программного обеспечения SPDX автоматически генерируется buildkit (sbom: true в шаге сборки) и прикрепляется к каждому образу как OCI referrer. Ничего дополнительно устанавливать не нужно.

Получите её с помощью:

docker buildx imagetools inspect --format '{{ json .SBOM }}' \
  ghcr.io/vincentmakes/turbo-ea/backend:1.0.0 | jq .

SBOM перечисляет все пакеты, обнаруженные buildkit в финальном образе (пакеты apk, Python wheels, модули Node и т.д.), с версиями и URL источников.


Сканирование уязвимостей (Trivy)

Рабочий процесс публикации запускает Trivy для каждого собранного образа на предмет CVE уровня HIGH и CRITICAL и загружает результат в виде SARIF на вкладку Security репозитория.

Сканирование в настоящее время не блокирует (exit-code: 0). Если результаты Trivy важны для вашей среды, запустите собственный сканер на скачанном образе. Опубликованный SBOM является чистым исходным данным.

Для контрибьюторов: если вы обнаружили действительно эксплуатируемую уязвимость, сообщите о ней через приватный отчёт о безопасности, а не в публичном issue.


Закрепление SHA Actions

Каждый GitHub Action, используемый рабочим процессом публикации, закреплён за конкретным SHA коммита из 40 символов, а не за плавающим тегом основной версии. Обновления поступают через Dependabot экосистемы github-actions с ежемесячной периодичностью.