Использование закрытого реестра контейнеров в Azure (Предварительная версия) для отправки и принудительного использования артефактов цепочки поставок

Используйте реестр контейнеров Azure для хранения графа артефактов и управления ими, включая подписи, программное обеспечение (СБОМ), результаты проверки безопасности или другие типы.

Graph артефактов, включая образ контейнера, подпись и подписанное программное обеспечение

чтобы продемонстрировать эту возможность, в этой статье показано, как использовать реестр OCI как служба хранилища (орас) для отправки и извлечения графа артефактов в реестр контейнеров Azure.

поддержка орас Artifacts является функцией предварительной версии и подчиняется ограничениям. для этого требуется избыточность зоны, доступная на уровне служб Premium. Ознакомиться с информацией об уровнях служб реестра и ограничениях можно в статье Уровни служб Реестра контейнеров Azure.

Предварительные требования

  • орас cli . интерфейс командной строки орас обеспечивает принудительную отправку, обнаружение и извлечение артефактов в реестр с поддержкой орас Artifacts.
  • Azure CLI — чтобы создать удостоверение, список и удалить репозитории, требуется локальная установка Azure CLI. Рекомендуется использовать версию 2.29.1 или более позднюю. Чтобы узнать версию, выполните команду az --version . Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.
  • DOCKER (необязательно) . для выполнения этого пошагового руководства используется ссылка на образ контейнера. Вы можете использовать DOCKER, установленный локально, для сборки и отправки образа контейнера или для ссылки на существующий образ контейнера. Docker предоставляет пакеты, которые позволяют быстро настроить Docker в системе под управлением macOS, Windows или Linux.

Ограничения предварительной версии

поддержка Artifacts орас ограничена юго-центральным регионом сша с поддержкой зоны доступности.

  • Геореплицированные реестры не будут реплицировать артефакты, на которые указывает ссылка, в другие регионы. так как дополнительные регионы поддерживают орас Artifacts, связанные с ней артефакты будут реплицированы.

Установка Орас

Скачайте и установите предварительную версию Орас для вашей операционной системы. инструкции по извлечению и установке файла для операционной системы, ссылки на сборку с предварительной версией альфа. 1 из репозитория орас GitHub см. в разделе орас Install .

Настройка частного реестра

Настройте переменные среды, чтобы легко копировать и вставлять команды в оболочку. Команды можно выполнять в Azure Cloud Shell

ACR_NAME=myregistry
REGISTRY=$ACR_NAME.azurecr.io
REPO=net-monitor
TAG=v1
IMAGE=$REGISTRY/${REPO}:$TAG

Создание группы ресурсов

При необходимости, чтобы создать группу ресурсов для реестра, используйте команду az group create.

az group create --name $ACR_NAME --location southcentralus

Создание реестра с поддержкой артефактов Орас

для поддержки предварительной версии Artifacts орас требуется избыточность зоны, для которой требуется уровень служб Premium, в юго-центральном регионе сша. выполните команду az запись контроля доступа, чтобы создать реестр орас с поддержкой Artifacts. Дополнительные параметры реестра см. в справке по команде az acr create.

az acr create \
  --resource-group $ACR_NAME \
  --name $ACR_NAME \
  --zone-redundancy enabled \
  --sku Premium \
  --output jsonc

В выходных данных команды обратите внимание на свойство zoneRedundancy реестра. Если этот параметр включен, реестр является избыточным в зоне, а артефакт Орас включен:

{
  [...]
  "zoneRedundancy": "Enabled",
}

Вход с помощью Azure CLI

Чтобы отправить артефакты в реестр контейнеров или извлечь их из него, войдите в Azure CLI.

Затем выполните команду Azure CLI az acr login, чтобы получить доступ к реестру.

az login
az acr login --name $ACR_NAME

Примечание

az acr login использует клиент Docker для сохранения маркера Azure Active Directory в файл docker.config. Для выполнения потока индивидуальной проверки подлинности необходимо установить и запустить клиент Docker.

Вход с помощью ORAS

В этом разделе приведены параметры для входа в реестр. Выберите метод, подходящий для вашей среды.

Выполните команду oras login для проверки подлинности в реестре. Вы можете передать учетные данные реестра , соответствующие вашему сценарию, например учетные данные субъекта-службы, удостоверение пользователя или маркер области репозитория (Предварительная версия).

  • Выполните аутентификацию с помощью индивидуального удостоверения Azure AD , чтобы использовать маркер AD.

    USER_NAME="00000000-0000-0000-0000-000000000000"
    PASSWORD=$(az acr login --name $ACR_NAME --expose-token --output tsv --query accessToken)
    
  • Выполните аутентификацию с помощью маркера области репозитория (Предварительная версия), чтобы использовать токены, отличные от AD.

    USER_NAME="oras-token"
    PASSWORD=$(az acr token create -n $USER_NAME \
                      -r $ACR_NAME \
                      --repository $REPO content/write \
                      --only-show-errors \
                      --query "credentials.passwords[0].value" -o tsv)
    
  • аутентификация с помощью субъекта-службы Azure Active Directory с разрешениями на вытягивание и принудительной отправки (роль акрпуш) в реестр.

    SERVICE_PRINCIPAL_NAME="oras-sp"
    ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)
    PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME \
              --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
               --role acrpush \
              --query "password" --output tsv)
    USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)
    

Вход с помощью ORAS

Укажите учетные данные для oras login .

oras login $REGISTRY \
  --username $USER_NAME \
  --password $PASSWORD

Чтобы прочитать пароль из Stdin, используйте --password-stdin.

Отправка образа контейнера

В этом примере граф артефактов связывается с образом контейнера. Создайте и отправьте образ контейнера или сослаться на существующий образ в частном реестре.

docker build -t $IMAGE https://github.com/wabbit-networks/net-monitor.git#main
docker push $IMAGE

Создание образца подписи для образа контейнера

echo '{"artifact": "'${IMAGE}'", "signature": "pat hancock"}' > signature.json

Отправка подписи в реестр в качестве ссылки на образ контейнера

Команда Орас отправляет подпись в репозиторий, ссылаясь на другой артефакт с помощью subject параметра. --artifact-typeПредоставляет для различения артефактов, подобно расширениям файлов, которые поддерживают различные типы файлов. Один или несколько файлов можно отправить, указав file:mediaType

oras push $REGISTRY/$REPO \
    --artifact-type 'signature/example' \
    --subject $IMAGE \
    ./signature.json:application/json

Дополнительные сведения о Орас Push см. в документации по Орас.

Отправка файла артефакта с несколькими файлами в качестве ссылки

Создание документации по артефакту

echo 'Readme Content' > readme.md
echo 'Detailed Content' > readme-details.md

Отправка многофайлового артефакта в качестве ссылки

oras push $REGISTRY/$REPO \
    --artifact-type 'readme/example' \
    --subject $IMAGE \
    ./readme.md:application/markdown \
    ./readme-details.md:application/markdown

Обнаружение ссылок артефактов

спецификация Artifacts орас определяет [API источников ссылок] [орас-артефакты-источники ссылок] для обнаружения ссылок на subject артефакт. oras discoverКоманда может отображать список ссылок на образ контейнера.

oras discoverПросмотр графа артефактов, которые теперь хранятся в реестре, с помощью.

oras discover -o tree $IMAGE

В выходных данных отображается начало графа артефактов, где подпись и документы просматриваются как дочерние элементы образа контейнера.

myregistry.azurecr.io/net-monitor:v1
├── signature/example
│   └── sha256:555ea91f39e7fb30c06f3b7aa483663f067f2950dcb...
└── readme/example
    └── sha256:1a118663d1085e229ff1b2d4d89b5f6d67911f22e55...

Создание глубоких диаграмм артефактов

спецификация орас Artifacts включает глубокие графы, включая оплачиваемое программное обеспечение с подписью (сбом) и другие типы артефактов.

Создание образца СБОМ

echo '{"version": "0.0.0.0", "artifact": "'${IMAGE}'", "contents": "good"}' > sbom.json

Отправка примера СБОМ в реестр

oras push $REGISTRY/$REPO \
  --artifact-type 'sbom/example' \
  --subject $IMAGE \
  ./sbom.json:application/json

Подпишите СБОМ

Artifacts, которые передаются как ссылки, обычно не имеют тегов, так как они считаются частью артефакта темы. Чтобы отправить сигнатуру артефакту, который является дочерним для другого артефакта, oras discover Используйте --artifact-type фильтрацию with для поиска дайджеста.

SBOM_DIGEST=$(oras discover -o json \
                --artifact-type sbom/example \
                $IMAGE | jq -r ".references[0].digest")

Создание подписи СБОМ

echo '{"artifact": "'$REGISTRY/${REPO}@$SBOM_DIGEST'", "signature": "pat hancock"}' > sbom-signature.json

Отправка подписи СБОМ

oras push $REGISTRY/$REPO \
  --artifact-type 'signature/example' \
  --subject $REGISTRY/$REPO@$SBOM_DIGEST \
  ./sbom-signature.json:application/json

Просмотр диаграммы

oras discover -o tree $IMAGE

Будут получены следующие выходные данные:

myregistry.azurecr.io/net-monitor:v1
├── signature/example
│   └── sha256:555ea91f39e7fb30c06f3b7aa483663f067f2950dcb...
├── readme/example
│   └── sha256:1a118663d1085e229ff1b2d4d89b5f6d67911f22e55...
└── sbom/example
    └── sha256:4280eef9adb632b42cf200e7cd5a822a456a558e4f3142da6b...
        └── signature/example
            └── sha256:a31ab875d37eee1cca68dbb14b2009979d05594d44a075bdd7...

Извлечение артефакта, на который указывает ссылка

Чтобы извлечь ссылочный тип, в команде обнаруживается дайджест ссылки oras discover

DOC_DIGEST=$(oras discover -o json \
              --artifact-type 'readme/example' \
              $IMAGE | jq -r ".references[0].digest")

Создание чистого каталога для загрузки

mkdir ./download

Извлечение документов в каталог загрузки

oras pull -a -o ./download $REGISTRY/$REPO@$DOC_DIGEST

Просмотр документов

ls ./download

Просмотр репозитория и списка тегов

орас Artifacts позволяет отвлекать, обнаруживать, получать и копировать графы артефактов без необходимости назначать теги. Это позволяет перечислить теги, чтобы сосредоточиться на артефактах, о которых думают пользователи, в отличие от сигнатур и Сбомс, связанных с образами контейнеров, Helm диаграммами и другими артефактами.

Просмотр списка тегов

az acr repository show-tags \
  -n $ACR_NAME \
  --repository $REPO \
  -o jsonc

Просмотр списка манифестов

Репозиторий может иметь список манифестов, которые помечены и не помечены

az acr repository show-manifests \
  -n $ACR_NAME \
  --repository $REPO \
  --detail -o jsonc

Обратите внимание, что манифесты образа контейнера имеют "tags":

{
  "architecture": "amd64",
  "changeableAttributes": {
    "deleteEnabled": true,
    "listEnabled": true,
    "readEnabled": true,
    "writeEnabled": true
  },
  "configMediaType": "application/vnd.docker.container.image.v1+json",
  "createdTime": "2021-11-12T00:18:54.5123449Z",
  "digest": "sha256:a0fc570a245b09ed752c42d600ee3bb5b4f77bbd70d8898780b7ab4...",
  "imageSize": 2814446,
  "lastUpdateTime": "2021-11-12T00:18:54.5123449Z",
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "os": "linux",
  "tags": [
    "v1"
  ]
}

Подпись не маркируется, но она будет записана как oras.artifact.manifest ссылка на образ контейнера.

{
  "changeableAttributes": {
    "deleteEnabled": true,
    "listEnabled": true,
    "readEnabled": true,
    "writeEnabled": true
  },
  "createdTime": "2021-11-12T00:19:10.987156Z",
  "digest": "sha256:555ea91f39e7fb30c06f3b7aa483663f067f2950dcbcc0b0d...",
  "imageSize": 85,
  "lastUpdateTime": "2021-11-12T00:19:10.987156Z",
  "mediaType": "application/vnd.cncf.oras.artifact.manifest.v1+json"
}

Удалить все артефакты в графе

поддержка спецификации Artifacts орас позволяет удалить граф артефактов, связанных с корневым артефактом. Чтобы удалить подпись, СБОМ и подпись СБОМ, используйте команду AZ запись в репозитории .

az acr repository delete \
  -n $ACR_NAME \
  -t ${REPO}:$TAG -y

Просмотр оставшихся манифестов

az acr repository show-manifests \
  -n $ACR_NAME \
  --repository $REPO \
  --detail -o jsonc

Дальнейшие действия

  • Дополнительные сведения об интерфейсе командной строки Орас
  • узнайте больше о орас Artifacts о том, как отправлять, обнаруживать, извлекать, копировать график артефактов цепочки поставок.