Цепочка поставок¶
Начиная с версии 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/dbghcr.io/vincentmakes/turbo-ea/backendghcr.io/vincentmakes/turbo-ea/frontendghcr.io/vincentmakes/turbo-ea/nginxghcr.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 с ежемесячной периодичностью.